From b48de00cfefac61414b0ea568e5014f2794e50cd Mon Sep 17 00:00:00 2001 From: jcorgan Date: Fri, 20 Jun 2008 18:14:47 +0000 Subject: Merged -r8639:8641 from jcorgan/gruel into trunk. Adds libgruel, the GNU Radio Utility Etcetera Library. See README for description. git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@8642 221aa14e-8319-0410-a670-987f0aec2ac5 --- gruel/src/lib/Makefile.am | 39 ++++++++++++++++ gruel/src/lib/realtime.cc | 112 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 gruel/src/lib/Makefile.am create mode 100644 gruel/src/lib/realtime.cc (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/Makefile.am b/gruel/src/lib/Makefile.am new file mode 100644 index 000000000..972ff4ca9 --- /dev/null +++ b/gruel/src/lib/Makefile.am @@ -0,0 +1,39 @@ +# +# Copyright 2008 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GNU Radio is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +include $(top_srcdir)/Makefile.common + +AM_CPPFLAGS = $(DEFINES) $(BOOST_CFLAGS) $(GRUEL_INCLUDES) $(WITH_INCLUDES) + +lib_LTLIBRARIES = libgruel.la + +# These are the source files that go into the gruel shared library +libgruel_la_SOURCES = \ + realtime.cc + +# magic flags +libgruel_la_LDFLAGS = $(NO_UNDEFINED) + +# link the library against the c++ standard library +libgruel_la_LIBADD = \ + -lstdc++ + +noinst_HEADERS = diff --git a/gruel/src/lib/realtime.cc b/gruel/src/lib/realtime.cc new file mode 100644 index 000000000..bdcb31ab6 --- /dev/null +++ b/gruel/src/lib/realtime.cc @@ -0,0 +1,112 @@ +/* -*- c++ -*- */ +/* + * Copyright 2006,2007 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#ifdef HAVE_SCHED_H +#include +#endif + +#include +#include +#include + +#if defined(HAVE_SCHED_SETSCHEDULER) + +namespace gruel { + + rt_status_t + enable_realtime_scheduling() + { + int policy = SCHED_FIFO; + int pri = (sched_get_priority_max (policy) + sched_get_priority_min (policy)) / 2; + int pid = 0; // this process + + struct sched_param param; + memset(¶m, 0, sizeof(param)); + param.sched_priority = pri; + int result = sched_setscheduler(pid, policy, ¶m); + if (result != 0){ + if (errno == EPERM) + return RT_NO_PRIVS; + else { + perror ("sched_setscheduler: failed to set real time priority"); + return RT_OTHER_ERROR; + } + } + + //printf("SCHED_FIFO enabled with priority = %d\n", pri); + return RT_OK; + } + +} // namespace gruel + +#elif defined(HAVE_PTHREAD_SETSCHEDPARAM) + +#include +#include + +namespace gruel { + + rt_status_t + enable_realtime_scheduling() + { + int policy = SCHED_FIFO; + int pri = (sched_get_priority_max (policy) + + sched_get_priority_min (policy)) / 2; + pthread_t this_thread = pthread_self (); // this process + struct sched_param param; + memset (¶m, 0, sizeof (param)); + param.sched_priority = pri; + int result = pthread_setschedparam (this_thread, policy, ¶m); + if (result != 0) { + if (errno == EPERM) + return RT_NO_PRIVS; + else { + perror ("pthread_setschedparam: failed to set real time priority"); + return RT_OTHER_ERROR; + } + } + + //printf("SCHED_FIFO enabled with priority = %d\n", pri); + return RT_OK; + } +} // namespace gruel + +// #elif // could try negative niceness + +#else + +namespace gruel { + + rt_status_t + enable_realtime_scheduling() + { + return RT_NOT_IMPLEMENTED; + } +} // namespace gruel + +#endif -- cgit From 2c8ea58e4d76f54c98d71d3fcc64bc29da490908 Mon Sep 17 00:00:00 2001 From: eb Date: Tue, 19 Aug 2008 23:09:56 +0000 Subject: Merged features/mp-sched -r8915:9335 into the trunk. The trunk now contains the SMP aware scheduler. This changeset introduces a dependency on boost 1.35 or later. See source:gnuradio/trunk/README.building-boost for additional info. git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@9336 221aa14e-8319-0410-a670-987f0aec2ac5 --- gruel/src/lib/Makefile.am | 14 ++--- gruel/src/lib/thread_body_wrapper.cc | 85 +++++++++++++++++++++++++++++++ gruel/src/lib/thread_group.cc | 99 ++++++++++++++++++++++++++++++++++++ 3 files changed, 192 insertions(+), 6 deletions(-) create mode 100644 gruel/src/lib/thread_body_wrapper.cc create mode 100644 gruel/src/lib/thread_group.cc (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/Makefile.am b/gruel/src/lib/Makefile.am index 972ff4ca9..7181c9418 100644 --- a/gruel/src/lib/Makefile.am +++ b/gruel/src/lib/Makefile.am @@ -21,19 +21,21 @@ include $(top_srcdir)/Makefile.common -AM_CPPFLAGS = $(DEFINES) $(BOOST_CFLAGS) $(GRUEL_INCLUDES) $(WITH_INCLUDES) +AM_CPPFLAGS = $(DEFINES) $(BOOST_CPPFLAGS) $(GRUEL_INCLUDES) $(WITH_INCLUDES) lib_LTLIBRARIES = libgruel.la +# magic flags +libgruel_la_LDFLAGS = $(NO_UNDEFINED) $(BOOST_LDFLAGS) -version-info 0:0:0 + # These are the source files that go into the gruel shared library libgruel_la_SOURCES = \ - realtime.cc - -# magic flags -libgruel_la_LDFLAGS = $(NO_UNDEFINED) + realtime.cc \ + thread_body_wrapper.cc \ + thread_group.cc -# link the library against the c++ standard library libgruel_la_LIBADD = \ + $(BOOST_THREAD_LIB) -lstdc++ noinst_HEADERS = diff --git a/gruel/src/lib/thread_body_wrapper.cc b/gruel/src/lib/thread_body_wrapper.cc new file mode 100644 index 000000000..86c4edb5b --- /dev/null +++ b/gruel/src/lib/thread_body_wrapper.cc @@ -0,0 +1,85 @@ +/* -*- c++ -*- */ +/* + * Copyright 2008 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#ifdef HAVE_SIGNAL_H +#include +#endif +#include + +namespace gruel { + +#if defined(HAVE_PTHREAD_SIGMASK) && defined(HAVE_SIGNAL_H) + + void mask_signals() + { + sigset_t new_set; + int r; + + sigemptyset(&new_set); + sigaddset(&new_set, SIGHUP); // block these... + sigaddset(&new_set, SIGINT); + sigaddset(&new_set, SIGPIPE); + sigaddset(&new_set, SIGALRM); + sigaddset(&new_set, SIGTERM); + sigaddset(&new_set, SIGUSR1); + sigaddset(&new_set, SIGCHLD); +#ifdef SIGPOLL + sigaddset(&new_set, SIGPOLL); +#endif +#ifdef SIGPROF + sigaddset(&new_set, SIGPROF); +#endif +#ifdef SIGSYS + sigaddset(&new_set, SIGSYS); +#endif +#ifdef SIGTRAP + sigaddset(&new_set, SIGTRAP); +#endif +#ifdef SIGURG + sigaddset(&new_set, SIGURG); +#endif +#ifdef SIGVTALRM + sigaddset(&new_set, SIGVTALRM); +#endif +#ifdef SIGXCPU + sigaddset(&new_set, SIGXCPU); +#endif +#ifdef SIGXFSZ + sigaddset(&new_set, SIGXFSZ); +#endif + r = pthread_sigmask(SIG_BLOCK, &new_set, 0); + if (r != 0) + perror("pthread_sigmask"); + } + +#else + + void mask_signals() + { + } + +#endif + +}; diff --git a/gruel/src/lib/thread_group.cc b/gruel/src/lib/thread_group.cc new file mode 100644 index 000000000..fa78567ec --- /dev/null +++ b/gruel/src/lib/thread_group.cc @@ -0,0 +1,99 @@ +/* -*- c++ -*- */ +/* + * Copyright (C) 2001-2003 William E. Kempf + * Copyright (C) 2007 Anthony Williams + * Copyright 2008 Free Software Foundation, Inc. + * + * Distributed under the Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + */ + +/* + * This was extracted from Boost 1.35.0 and fixed. + */ + +#include + +namespace gruel +{ + thread_group::thread_group() + { + } + + thread_group::~thread_group() + { + // We shouldn't have to scoped_lock here, since referencing this object + // from another thread while we're deleting it in the current thread is + // going to lead to undefined behavior any way. + for (std::list::iterator it = m_threads.begin(); + it != m_threads.end(); ++it) + { + delete (*it); + } + } + + boost::thread* thread_group::create_thread(const boost::function0& threadfunc) + { + // No scoped_lock required here since the only "shared data" that's + // modified here occurs inside add_thread which does scoped_lock. + std::auto_ptr thrd(new boost::thread(threadfunc)); + add_thread(thrd.get()); + return thrd.release(); + } + + void thread_group::add_thread(boost::thread* thrd) + { + boost::lock_guard guard(m_mutex); + + // For now we'll simply ignore requests to add a thread object multiple + // times. Should we consider this an error and either throw or return an + // error value? + std::list::iterator it = std::find(m_threads.begin(), + m_threads.end(), thrd); + BOOST_ASSERT(it == m_threads.end()); + if (it == m_threads.end()) + m_threads.push_back(thrd); + } + + void thread_group::remove_thread(boost::thread* thrd) + { + boost::lock_guard guard(m_mutex); + + // For now we'll simply ignore requests to remove a thread object that's + // not in the group. Should we consider this an error and either throw or + // return an error value? + std::list::iterator it = std::find(m_threads.begin(), + m_threads.end(), thrd); + BOOST_ASSERT(it != m_threads.end()); + if (it != m_threads.end()) + m_threads.erase(it); + } + + void thread_group::join_all() + { + boost::shared_lock guard(m_mutex); + for (std::list::iterator it = m_threads.begin(); + it != m_threads.end(); ++it) + { + (*it)->join(); + } + } + + void thread_group::interrupt_all() + { + boost::shared_lock guard(m_mutex); + for(std::list::iterator it=m_threads.begin(),end=m_threads.end(); + it!=end; + ++it) + { + (*it)->interrupt(); + } + } + + size_t thread_group::size() const + { + boost::shared_lock guard(m_mutex); + return m_threads.size(); + } + +} // namespace gruel -- cgit From 8885c15d42ac21113c2bae0e9fc05b3194d75d68 Mon Sep 17 00:00:00 2001 From: eb Date: Fri, 19 Sep 2008 00:42:37 +0000 Subject: conditional debugging code git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@9605 221aa14e-8319-0410-a670-987f0aec2ac5 --- gruel/src/lib/realtime.cc | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/realtime.cc b/gruel/src/lib/realtime.cc index bdcb31ab6..b84117fb2 100644 --- a/gruel/src/lib/realtime.cc +++ b/gruel/src/lib/realtime.cc @@ -45,6 +45,13 @@ namespace gruel { int pri = (sched_get_priority_max (policy) + sched_get_priority_min (policy)) / 2; int pid = 0; // this process + if (0){ + fprintf(stderr, "sched_setscheduler version\n"); + fprintf(stderr, "pri_min(SCHED_FIFO) = %d\n", sched_get_priority_min(SCHED_FIFO)); + fprintf(stderr, "pri_max(SCHED_FIFO) = %d\n", sched_get_priority_max(SCHED_FIFO)); + fprintf(stderr, "pri = %d\n", pri); + } + struct sched_param param; memset(¶m, 0, sizeof(param)); param.sched_priority = pri; @@ -75,8 +82,15 @@ namespace gruel { enable_realtime_scheduling() { int policy = SCHED_FIFO; - int pri = (sched_get_priority_max (policy) + - sched_get_priority_min (policy)) / 2; + int pri = (sched_get_priority_max (policy) + sched_get_priority_min (policy)) / 2; + + if (0){ + fprintf(stderr, "pthread_setschedparam version\n"); + fprintf(stderr, "pri_min(SCHED_FIFO) = %d\n", sched_get_priority_min(SCHED_FIFO)); + fprintf(stderr, "pri_max(SCHED_FIFO) = %d\n", sched_get_priority_max(SCHED_FIFO)); + fprintf(stderr, "pri = %d\n", pri); + } + pthread_t this_thread = pthread_self (); // this process struct sched_param param; memset (¶m, 0, sizeof (param)); -- cgit From 8e1575e9bc9ab9b78ae1620c15b8bf7a9ce8c25f Mon Sep 17 00:00:00 2001 From: eb Date: Fri, 19 Sep 2008 21:47:55 +0000 Subject: extend gruel:enable_realtime_scheduling interface to allow pri/policy git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@9607 221aa14e-8319-0410-a670-987f0aec2ac5 --- gruel/src/lib/Makefile.am | 2 +- gruel/src/lib/realtime.cc | 93 +++++++++++++++++++++++++++-------------------- gruel/src/lib/sys_pri.cc | 61 +++++++++++++++++++++++++++++++ 3 files changed, 115 insertions(+), 41 deletions(-) create mode 100644 gruel/src/lib/sys_pri.cc (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/Makefile.am b/gruel/src/lib/Makefile.am index 7181c9418..c2a008e48 100644 --- a/gruel/src/lib/Makefile.am +++ b/gruel/src/lib/Makefile.am @@ -31,11 +31,11 @@ libgruel_la_LDFLAGS = $(NO_UNDEFINED) $(BOOST_LDFLAGS) -version-info 0:0:0 # These are the source files that go into the gruel shared library libgruel_la_SOURCES = \ realtime.cc \ + sys_pri.cc \ thread_body_wrapper.cc \ thread_group.cc libgruel_la_LIBADD = \ $(BOOST_THREAD_LIB) - -lstdc++ noinst_HEADERS = diff --git a/gruel/src/lib/realtime.cc b/gruel/src/lib/realtime.cc index b84117fb2..1de8b6dc0 100644 --- a/gruel/src/lib/realtime.cc +++ b/gruel/src/lib/realtime.cc @@ -30,94 +30,107 @@ #include #endif +#include +#include #include #include #include -#if defined(HAVE_SCHED_SETSCHEDULER) +#if defined(HAVE_PTHREAD_SETSCHEDPARAM) || defined(HAVE_SCHED_SETSCHEDULER) +#include namespace gruel { - rt_status_t - enable_realtime_scheduling() + /*! + * Rescale our virtual priority so that it maps to the middle 1/2 of + * the priorities given by min_real_pri and max_real_pri. + */ + static int + rescale_virtual_pri(int virtual_pri, int min_real_pri, int max_real_pri) { - int policy = SCHED_FIFO; - int pri = (sched_get_priority_max (policy) + sched_get_priority_min (policy)) / 2; - int pid = 0; // this process + float rmin = min_real_pri + (0.25 * (max_real_pri - min_real_pri)); + float rmax = min_real_pri + (0.75 * (max_real_pri - min_real_pri)); + float m = (rmax - rmin) / (rt_priority_max() - rt_priority_min()); + float y = m * (virtual_pri - rt_priority_min()) + rmin; + int y_int = static_cast(rint(y)); + return std::max(min_real_pri, std::min(max_real_pri, y_int)); + } - if (0){ - fprintf(stderr, "sched_setscheduler version\n"); - fprintf(stderr, "pri_min(SCHED_FIFO) = %d\n", sched_get_priority_min(SCHED_FIFO)); - fprintf(stderr, "pri_max(SCHED_FIFO) = %d\n", sched_get_priority_max(SCHED_FIFO)); - fprintf(stderr, "pri = %d\n", pri); - } +} // namespace gruel + +#endif + + +#if defined(HAVE_PTHREAD_SETSCHEDPARAM) + +namespace gruel { + rt_status_t + enable_realtime_scheduling(rt_sched_param p) + { + int policy = p.policy == RT_SCHED_FIFO ? SCHED_FIFO : SCHED_RR; + int min_real_pri = sched_get_priority_min(policy); + int max_real_pri = sched_get_priority_min(policy); + int pri = rescale_virtual_pri(p.priority, min_real_pri, max_real_pri); + + pthread_t this_thread = pthread_self (); // this process struct sched_param param; - memset(¶m, 0, sizeof(param)); + memset (¶m, 0, sizeof (param)); param.sched_priority = pri; - int result = sched_setscheduler(pid, policy, ¶m); - if (result != 0){ + int result = pthread_setschedparam (this_thread, policy, ¶m); + if (result != 0) { if (errno == EPERM) return RT_NO_PRIVS; else { - perror ("sched_setscheduler: failed to set real time priority"); + perror ("pthread_setschedparam: failed to set real time priority"); return RT_OTHER_ERROR; } } - + //printf("SCHED_FIFO enabled with priority = %d\n", pri); return RT_OK; } - } // namespace gruel -#elif defined(HAVE_PTHREAD_SETSCHEDPARAM) -#include -#include +#elif defined(HAVE_SCHED_SETSCHEDULER) namespace gruel { rt_status_t - enable_realtime_scheduling() + enable_realtime_scheduling(rt_sched_param p) { - int policy = SCHED_FIFO; - int pri = (sched_get_priority_max (policy) + sched_get_priority_min (policy)) / 2; - - if (0){ - fprintf(stderr, "pthread_setschedparam version\n"); - fprintf(stderr, "pri_min(SCHED_FIFO) = %d\n", sched_get_priority_min(SCHED_FIFO)); - fprintf(stderr, "pri_max(SCHED_FIFO) = %d\n", sched_get_priority_max(SCHED_FIFO)); - fprintf(stderr, "pri = %d\n", pri); - } + int policy = p.policy == RT_SCHED_FIFO ? SCHED_FIFO : SCHED_RR; + int min_real_pri = sched_get_priority_min(policy); + int max_real_pri = sched_get_priority_min(policy); + int pri = rescale_virtual_pri(p.priority, min_real_pri, max_real_pri); - pthread_t this_thread = pthread_self (); // this process + int pid = 0; // this process struct sched_param param; - memset (¶m, 0, sizeof (param)); + memset(¶m, 0, sizeof(param)); param.sched_priority = pri; - int result = pthread_setschedparam (this_thread, policy, ¶m); - if (result != 0) { + int result = sched_setscheduler(pid, policy, ¶m); + if (result != 0){ if (errno == EPERM) return RT_NO_PRIVS; else { - perror ("pthread_setschedparam: failed to set real time priority"); + perror ("sched_setscheduler: failed to set real time priority"); return RT_OTHER_ERROR; } } - + //printf("SCHED_FIFO enabled with priority = %d\n", pri); return RT_OK; } -} // namespace gruel -// #elif // could try negative niceness +} // namespace gruel #else namespace gruel { rt_status_t - enable_realtime_scheduling() + enable_realtime_scheduling(rt_sched_param p) { return RT_NOT_IMPLEMENTED; } diff --git a/gruel/src/lib/sys_pri.cc b/gruel/src/lib/sys_pri.cc new file mode 100644 index 000000000..dc0164d70 --- /dev/null +++ b/gruel/src/lib/sys_pri.cc @@ -0,0 +1,61 @@ +/* -*- c++ -*- */ +/* + * Copyright 2008 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include + +namespace gruel { + + /* + * These may need per-OS tweaking. + * + * Under linux virtual_pri -> system_pri + * 0 -> 0 + * 1 -> 5 + * 2 -> 10 + * 3 -> 15 + * 4 -> 20 // typically used by jack and pulse audio + * 5 -> 25 + * 6 -> 30 + * 7 -> 35 + * 8 -> 40 + * 9 -> 45 + * 10 -> 50 + * 11 -> 54 + * 12 -> 59 + * 13 -> 64 + * 14 -> 69 + * 15 -> 74 + */ + rt_sched_param + sys_pri::python() { return rt_sched_param(0, RT_SCHED_RR); } + + rt_sched_param + sys_pri::normal() { return rt_sched_param(2, RT_SCHED_RR); } + + rt_sched_param + sys_pri::gcell_event_handler(){ return rt_sched_param(5, RT_SCHED_FIFO); } + + rt_sched_param + sys_pri::usrp2_backend() { return rt_sched_param(6, RT_SCHED_FIFO); } +} -- cgit From 20f913ec2e71888a451250ba841c980638221c65 Mon Sep 17 00:00:00 2001 From: eb Date: Mon, 22 Sep 2008 21:53:29 +0000 Subject: fixed copy/paste problem and error handling git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@9639 221aa14e-8319-0410-a670-987f0aec2ac5 --- gruel/src/lib/realtime.cc | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/realtime.cc b/gruel/src/lib/realtime.cc index 1de8b6dc0..d1907b3c1 100644 --- a/gruel/src/lib/realtime.cc +++ b/gruel/src/lib/realtime.cc @@ -70,19 +70,20 @@ namespace gruel { { int policy = p.policy == RT_SCHED_FIFO ? SCHED_FIFO : SCHED_RR; int min_real_pri = sched_get_priority_min(policy); - int max_real_pri = sched_get_priority_min(policy); + int max_real_pri = sched_get_priority_max(policy); int pri = rescale_virtual_pri(p.priority, min_real_pri, max_real_pri); - pthread_t this_thread = pthread_self (); // this process struct sched_param param; memset (¶m, 0, sizeof (param)); param.sched_priority = pri; - int result = pthread_setschedparam (this_thread, policy, ¶m); + int result = pthread_setschedparam (pthread_self(), policy, ¶m); if (result != 0) { - if (errno == EPERM) + if (result == EPERM) // N.B., return value, not errno return RT_NO_PRIVS; else { - perror ("pthread_setschedparam: failed to set real time priority"); + fprintf(stderr, + "pthread_setschedparam: failed to set real time priority: %s\n", + strerror(result)); return RT_OTHER_ERROR; } } @@ -102,7 +103,7 @@ namespace gruel { { int policy = p.policy == RT_SCHED_FIFO ? SCHED_FIFO : SCHED_RR; int min_real_pri = sched_get_priority_min(policy); - int max_real_pri = sched_get_priority_min(policy); + int max_real_pri = sched_get_priority_max(policy); int pri = rescale_virtual_pri(p.priority, min_real_pri, max_real_pri); int pid = 0; // this process -- cgit From 801b22a99512ed3dfd2b92bfc597bfc3451ccbc9 Mon Sep 17 00:00:00 2001 From: eb Date: Tue, 23 Sep 2008 21:57:31 +0000 Subject: usrp2 work-in-progress git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@9643 221aa14e-8319-0410-a670-987f0aec2ac5 --- gruel/src/lib/realtime.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/realtime.cc b/gruel/src/lib/realtime.cc index d1907b3c1..7397cf3d3 100644 --- a/gruel/src/lib/realtime.cc +++ b/gruel/src/lib/realtime.cc @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2006,2007 Free Software Foundation, Inc. + * Copyright 2006,2007,2008 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -73,6 +73,9 @@ namespace gruel { int max_real_pri = sched_get_priority_max(policy); int pri = rescale_virtual_pri(p.priority, min_real_pri, max_real_pri); + // FIXME check hard and soft limits with getrlimit, and limit the value we ask for. + // fprintf(stderr, "pthread_setschedparam: policy = %d, pri = %d\n", policy, pri); + struct sched_param param; memset (¶m, 0, sizeof (param)); param.sched_priority = pri; @@ -106,6 +109,9 @@ namespace gruel { int max_real_pri = sched_get_priority_max(policy); int pri = rescale_virtual_pri(p.priority, min_real_pri, max_real_pri); + // FIXME check hard and soft limits with getrlimit, and limit the value we ask for. + // fprintf(stderr, "sched_setscheduler: policy = %d, pri = %d\n", policy, pri); + int pid = 0; // this process struct sched_param param; memset(¶m, 0, sizeof(param)); -- cgit From 6f50256f958ac60d5fc9212b24d86777c1b2ec0d Mon Sep 17 00:00:00 2001 From: jcorgan Date: Mon, 20 Jul 2009 03:47:14 +0000 Subject: Merged r11452:11459 from jcorgan/pmt-gruel into trunk. Trunk passes distcheck. * Merges libpmt into libgruel * Modifies libmblock to use libgruel gruel::pmt_t will be the fundamental msg content for the new message passing implemention for 3.3. git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@11460 221aa14e-8319-0410-a670-987f0aec2ac5 --- gruel/src/lib/Makefile.am | 97 +++- gruel/src/lib/generate_unv.py | 190 +++++++ gruel/src/lib/pmt.cc | 1041 ++++++++++++++++++++++++++++++++++++ gruel/src/lib/pmt_int.h | 227 ++++++++ gruel/src/lib/pmt_io.cc | 141 +++++ gruel/src/lib/pmt_pool.cc | 112 ++++ gruel/src/lib/pmt_serialize.cc | 357 +++++++++++++ gruel/src/lib/qa_pmt.cc | 40 ++ gruel/src/lib/qa_pmt.h | 36 ++ gruel/src/lib/qa_pmt_prims.cc | 438 +++++++++++++++ gruel/src/lib/qa_pmt_prims.h | 67 +++ gruel/src/lib/test_pmt.cc | 37 ++ gruel/src/lib/unv_qa_template.cc.t | 35 ++ gruel/src/lib/unv_template.cc.t | 122 +++++ gruel/src/lib/unv_template.h.t | 23 + 15 files changed, 2954 insertions(+), 9 deletions(-) create mode 100755 gruel/src/lib/generate_unv.py create mode 100644 gruel/src/lib/pmt.cc create mode 100644 gruel/src/lib/pmt_int.h create mode 100644 gruel/src/lib/pmt_io.cc create mode 100644 gruel/src/lib/pmt_pool.cc create mode 100644 gruel/src/lib/pmt_serialize.cc create mode 100644 gruel/src/lib/qa_pmt.cc create mode 100644 gruel/src/lib/qa_pmt.h create mode 100644 gruel/src/lib/qa_pmt_prims.cc create mode 100644 gruel/src/lib/qa_pmt_prims.h create mode 100644 gruel/src/lib/test_pmt.cc create mode 100644 gruel/src/lib/unv_qa_template.cc.t create mode 100644 gruel/src/lib/unv_template.cc.t create mode 100644 gruel/src/lib/unv_template.h.t (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/Makefile.am b/gruel/src/lib/Makefile.am index c2a008e48..2a968d25f 100644 --- a/gruel/src/lib/Makefile.am +++ b/gruel/src/lib/Makefile.am @@ -1,5 +1,5 @@ # -# Copyright 2008 Free Software Foundation, Inc. +# Copyright 2008,2009 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -21,21 +21,100 @@ include $(top_srcdir)/Makefile.common -AM_CPPFLAGS = $(DEFINES) $(BOOST_CPPFLAGS) $(GRUEL_INCLUDES) $(WITH_INCLUDES) +AM_CPPFLAGS = $(DEFINES) $(BOOST_CPPFLAGS) $(CPPUNIT_INCLUDES) $(GRUEL_INCLUDES) $(WITH_INCLUDES) + +TESTS = test_pmt lib_LTLIBRARIES = libgruel.la # magic flags libgruel_la_LDFLAGS = $(NO_UNDEFINED) $(BOOST_LDFLAGS) -version-info 0:0:0 +# ---------------------------------------------------------------- +# these scripts generate code + +code_generator = \ + generate_unv.py \ + unv_template.h.t \ + unv_template.cc.t \ + unv_qa_template.cc.t + +GENERATED_H = \ + pmt_unv_int.h \ + qa_pmt_unv.h + +GENERATED_CC = \ + pmt_unv.cc \ + qa_pmt_unv.cc + +python_built_sources = $(GENERATED_H) $(GENERATED_CC) + +PMT_SERIAL_TAGS_H = $(abs_top_builddir)/gruel/src/include/gruel/pmt_serial_tags.h +BUILT_SOURCES = $(python_built_sources) $(PMT_SERIAL_TAGS_H) + +EXTRA_DIST = $(code_generator) + +# ---------------------------------------------------------------- + # These are the source files that go into the gruel shared library -libgruel_la_SOURCES = \ - realtime.cc \ - sys_pri.cc \ - thread_body_wrapper.cc \ +libgruel_la_SOURCES = \ + pmt.cc \ + pmt_io.cc \ + pmt_pool.cc \ + pmt_serialize.cc \ + pmt_unv.cc \ + realtime.cc \ + sys_pri.cc \ + thread_body_wrapper.cc \ thread_group.cc -libgruel_la_LIBADD = \ - $(BOOST_THREAD_LIB) +libgruel_la_LIBADD = \ + $(BOOST_THREAD_LIB) \ + -lstdc++ + +noinst_HEADERS = \ + $(GENERATED_H) \ + pmt_int.h \ + qa_pmt.h \ + qa_pmt_prims.h + +# Build the qa code into its own library + +noinst_LTLIBRARIES = libpmt-qa.la + +libpmt_qa_la_SOURCES = \ + qa_pmt.cc \ + qa_pmt_prims.cc \ + qa_pmt_unv.cc + +# magic flags +libpmt_qa_la_LDFLAGS = $(NO_UNDEFINED) -avoid version + +libpmt_qa_la_LIBADD = \ + libgruel.la \ + $(CPPUNIT_LIBS) \ + -lstdc++ + +noinst_PROGRAMS = \ + test_pmt + + +LIBGRUEL = libgruel.la +LIBPMTQA = libpmt-qa.la $(LIBGRUEL) + +test_pmt_SOURCES = test_pmt.cc +test_pmt_LDADD = $(LIBPMTQA) + +# Do creation and inclusion of other Makefiles last + +# common way for generating sources from templates when using +# BUILT_SOURCES, using parallel build protection. +gen_sources = $(python_built_sources) +gen_sources_deps = $(core_generator) +par_gen_command = PYTHONPATH=$(top_srcdir)/gruel/src/lib srcdir=$(srcdir) $(PYTHON) $(srcdir)/generate_unv.py +include $(top_srcdir)/Makefile.par.gen -noinst_HEADERS = +# Rule to create the build header file using GUILE +# Doesn't need parallel protections because there is a single target +$(PMT_SERIAL_TAGS_H): $(srcdir)/../scheme/gnuradio/gen-serial-tags.scm $(srcdir)/../scheme/gnuradio/pmt-serial-tags.scm + $(RUN_GUILE) $(srcdir)/../scheme/gnuradio/gen-serial-tags.scm $(srcdir)/../scheme/gnuradio/pmt-serial-tags.scm $(PMT_SERIAL_TAGS_H) diff --git a/gruel/src/lib/generate_unv.py b/gruel/src/lib/generate_unv.py new file mode 100755 index 000000000..3a7305b40 --- /dev/null +++ b/gruel/src/lib/generate_unv.py @@ -0,0 +1,190 @@ +#!/usr/bin/env python +# +# Copyright 2006 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GNU Radio is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +""" +Generate code for uniform numeric vectors +""" + +import re, os, os.path + + +unv_types = ( + ('u8', 'uint8_t'), + ('s8', 'int8_t'), + ('u16', 'uint16_t'), + ('s16', 'int16_t'), + ('u32', 'uint32_t'), + ('s32', 'int32_t'), + ('u64', 'uint64_t'), + ('s64', 'int64_t'), + ('f32', 'float'), + ('f64', 'double'), + ('c32', 'std::complex'), + ('c64', 'std::complex') + ) + +header = """\ +/* -*- c++ -*- */ +/* + * Copyright 2006,2009 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ +""" + +guard_tail = """ +#endif +""" + +includes = """ +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include +#include "pmt_int.h" +""" + +qa_includes = """ +#include +#include +#include +#include + +using namespace gruel; +""" + + +# set srcdir to the directory that contains Makefile.am +try: + srcdir = os.environ['srcdir'] +except KeyError, e: + srcdir = "." +srcdir = srcdir + '/' + + +def open_src (name, mode): + global srcdir + return open(os.path.join (srcdir, name), mode) + + +def guard_name(filename): + return 'INCLUDED_' + re.sub('\.', '_', filename.upper()) + +def guard_head(filename): + guard = guard_name(filename) + return """ +#ifndef %s +#define %s +""" % (guard, guard) + + +def do_substitution (d, input, out_file): + def repl (match_obj): + key = match_obj.group (1) + # print key + return d[key] + + out = re.sub (r"@([a-zA-Z0-9_]+)@", repl, input) + out_file.write (out) + + +def generate_h(): + template = open_src('unv_template.h.t', 'r').read() + output_filename = 'pmt_unv_int.h' + output = open(output_filename, 'w') + output.write(header) + output.write(guard_head(output_filename)) + for tag, typ in unv_types: + d = { 'TAG' : tag, 'TYPE' : typ } + do_substitution(d, template, output) + output.write(guard_tail) + +def generate_cc(): + template = open_src('unv_template.cc.t', 'r').read() + output = open('pmt_unv.cc', 'w') + output.write(header) + output.write(includes) + for tag, typ in unv_types: + d = { 'TAG' : tag, 'TYPE' : typ } + do_substitution(d, template, output) + + +def generate_qa_h(): + output_filename = 'qa_pmt_unv.h' + output = open(output_filename, 'w') + output.write(header) + output.write(guard_head(output_filename)) + + output.write(''' +#include +#include + +class qa_pmt_unv : public CppUnit::TestCase { + + CPPUNIT_TEST_SUITE(qa_pmt_unv); +''') + for tag, typ in unv_types: + output.write(' CPPUNIT_TEST(test_%svector);\n' % (tag,)) + output.write('''\ + CPPUNIT_TEST_SUITE_END(); + + private: +''') + for tag, typ in unv_types: + output.write(' void test_%svector();\n' % (tag,)) + output.write('};\n') + output.write(guard_tail) + +def generate_qa_cc(): + template = open_src('unv_qa_template.cc.t', 'r').read() + output = open('qa_pmt_unv.cc', 'w') + output.write(header) + output.write(qa_includes) + for tag, typ in unv_types: + d = { 'TAG' : tag, 'TYPE' : typ } + do_substitution(d, template, output) + + +def main(): + generate_h() + generate_cc() + generate_qa_h() + generate_qa_cc() + +if __name__ == '__main__': + main() diff --git a/gruel/src/lib/pmt.cc b/gruel/src/lib/pmt.cc new file mode 100644 index 000000000..8e0c01625 --- /dev/null +++ b/gruel/src/lib/pmt.cc @@ -0,0 +1,1041 @@ +/* -*- c++ -*- */ +/* + * Copyright 2006 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include +#include "pmt_int.h" +#include +#include +#include + +namespace gruel { + +static const int CACHE_LINE_SIZE = 64; // good guess + +# if (PMT_LOCAL_ALLOCATOR) + +static pmt_pool global_pmt_pool(sizeof(pmt_pair), CACHE_LINE_SIZE); + +void * +pmt_base::operator new(size_t size) +{ + void *p = global_pmt_pool.malloc(); + + // fprintf(stderr, "pmt_base::new p = %p\n", p); + assert((reinterpret_cast(p) & (CACHE_LINE_SIZE - 1)) == 0); + return p; +} + +void +pmt_base::operator delete(void *p, size_t size) +{ + global_pmt_pool.free(p); +} + +#endif + + +pmt_base::~pmt_base() +{ + // nop -- out of line virtual destructor +} + +//////////////////////////////////////////////////////////////////////////// +// Exceptions +//////////////////////////////////////////////////////////////////////////// + +pmt_exception::pmt_exception(const std::string &msg, pmt_t obj) + : logic_error(msg + ": " + pmt_write_string(obj)) +{ +} + +pmt_wrong_type::pmt_wrong_type(const std::string &msg, pmt_t obj) + : pmt_exception(msg + ": wrong_type ", obj) +{ +} + +pmt_out_of_range::pmt_out_of_range(const std::string &msg, pmt_t obj) + : pmt_exception(msg + ": out of range ", obj) +{ +} + +pmt_notimplemented::pmt_notimplemented(const std::string &msg, pmt_t obj) + : pmt_exception(msg + ": notimplemented ", obj) +{ +} + +//////////////////////////////////////////////////////////////////////////// +// Dynamic Casts +//////////////////////////////////////////////////////////////////////////// + +static pmt_symbol * +_symbol(pmt_t x) +{ + return dynamic_cast(x.get()); +} + +static pmt_integer * +_integer(pmt_t x) +{ + return dynamic_cast(x.get()); +} + +static pmt_real * +_real(pmt_t x) +{ + return dynamic_cast(x.get()); +} + +static pmt_complex * +_complex(pmt_t x) +{ + return dynamic_cast(x.get()); +} + +static pmt_pair * +_pair(pmt_t x) +{ + return dynamic_cast(x.get()); +} + +static pmt_vector * +_vector(pmt_t x) +{ + return dynamic_cast(x.get()); +} + +static pmt_uniform_vector * +_uniform_vector(pmt_t x) +{ + return dynamic_cast(x.get()); +} + +static pmt_dict * +_dict(pmt_t x) +{ + return dynamic_cast(x.get()); +} + +static pmt_any * +_any(pmt_t x) +{ + return dynamic_cast(x.get()); +} + +//////////////////////////////////////////////////////////////////////////// +// Globals +//////////////////////////////////////////////////////////////////////////// + +const pmt_t PMT_T = pmt_t(new pmt_bool()); // singleton +const pmt_t PMT_F = pmt_t(new pmt_bool()); // singleton +const pmt_t PMT_NIL = pmt_t(new pmt_null()); // singleton +const pmt_t PMT_EOF = pmt_cons(PMT_NIL, PMT_NIL); // singleton + +//////////////////////////////////////////////////////////////////////////// +// Booleans +//////////////////////////////////////////////////////////////////////////// + +pmt_bool::pmt_bool(){} + +bool +pmt_is_true(pmt_t obj) +{ + return obj != PMT_F; +} + +bool +pmt_is_false(pmt_t obj) +{ + return obj == PMT_F; +} + +bool +pmt_is_bool(pmt_t obj) +{ + return obj->is_bool(); +} + +pmt_t +pmt_from_bool(bool val) +{ + return val ? PMT_T : PMT_F; +} + +bool +pmt_to_bool(pmt_t val) +{ + if (val == PMT_T) + return true; + if (val == PMT_F) + return false; + throw pmt_wrong_type("pmt_to_bool", val); +} + +//////////////////////////////////////////////////////////////////////////// +// Symbols +//////////////////////////////////////////////////////////////////////////// + +static const unsigned int SYMBOL_HASH_TABLE_SIZE = 701; +static std::vector s_symbol_hash_table(SYMBOL_HASH_TABLE_SIZE); + +pmt_symbol::pmt_symbol(const std::string &name) : d_name(name){} + + +static unsigned int +hash_string(const std::string &s) +{ + unsigned int h = 0; + unsigned int g = 0; + + for (std::string::const_iterator p = s.begin(); p != s.end(); ++p){ + h = (h << 4) + (*p & 0xff); + g = h & 0xf0000000; + if (g){ + h = h ^ (g >> 24); + h = h ^ g; + } + } + return h; +} + +bool +pmt_is_symbol(const pmt_t& obj) +{ + return obj->is_symbol(); +} + +pmt_t +pmt_string_to_symbol(const std::string &name) +{ + unsigned hash = hash_string(name) % SYMBOL_HASH_TABLE_SIZE; + + // Does a symbol with this name already exist? + for (pmt_t sym = s_symbol_hash_table[hash]; sym; sym = _symbol(sym)->next()){ + if (name == _symbol(sym)->name()) + return sym; // Yes. Return it + } + + // Nope. Make a new one. + pmt_t sym = pmt_t(new pmt_symbol(name)); + _symbol(sym)->set_next(s_symbol_hash_table[hash]); + s_symbol_hash_table[hash] = sym; + return sym; +} + +// alias... +pmt_t +pmt_intern(const std::string &name) +{ + return pmt_string_to_symbol(name); +} + +const std::string +pmt_symbol_to_string(const pmt_t& sym) +{ + if (!sym->is_symbol()) + throw pmt_wrong_type("pmt_symbol_to_string", sym); + + return _symbol(sym)->name(); +} + + + +//////////////////////////////////////////////////////////////////////////// +// Number +//////////////////////////////////////////////////////////////////////////// + +bool +pmt_is_number(pmt_t x) +{ + return x->is_number(); +} + +//////////////////////////////////////////////////////////////////////////// +// Integer +//////////////////////////////////////////////////////////////////////////// + +pmt_integer::pmt_integer(long value) : d_value(value) {} + +bool +pmt_is_integer(pmt_t x) +{ + return x->is_integer(); +} + + +pmt_t +pmt_from_long(long x) +{ + return pmt_t(new pmt_integer(x)); +} + +long +pmt_to_long(pmt_t x) +{ + pmt_integer* i = dynamic_cast(x.get()); + if ( i ) + return i->value(); + + throw pmt_wrong_type("pmt_to_long", x); +} + +//////////////////////////////////////////////////////////////////////////// +// Real +//////////////////////////////////////////////////////////////////////////// + +pmt_real::pmt_real(double value) : d_value(value) {} + +bool +pmt_is_real(pmt_t x) +{ + return x->is_real(); +} + +pmt_t +pmt_from_double(double x) +{ + return pmt_t(new pmt_real(x)); +} + +double +pmt_to_double(pmt_t x) +{ + if (x->is_real()) + return _real(x)->value(); + if (x->is_integer()) + return _integer(x)->value(); + + throw pmt_wrong_type("pmt_to_double", x); +} + +//////////////////////////////////////////////////////////////////////////// +// Complex +//////////////////////////////////////////////////////////////////////////// + +pmt_complex::pmt_complex(std::complex value) : d_value(value) {} + +bool +pmt_is_complex(pmt_t x) +{ + return x->is_complex(); +} + +pmt_t +pmt_make_rectangular(double re, double im) +{ + return pmt_t(new pmt_complex(std::complex(re, im))); +} + +std::complex +pmt_to_complex(pmt_t x) +{ + if (x->is_complex()) + return _complex(x)->value(); + if (x->is_real()) + return _real(x)->value(); + if (x->is_integer()) + return _integer(x)->value(); + + throw pmt_wrong_type("pmt_to_complex", x); +} + +//////////////////////////////////////////////////////////////////////////// +// Pairs +//////////////////////////////////////////////////////////////////////////// + +pmt_null::pmt_null() {} +pmt_pair::pmt_pair(const pmt_t& car, const pmt_t& cdr) : d_car(car), d_cdr(cdr) {} + +bool +pmt_is_null(const pmt_t& x) +{ + return x == PMT_NIL; +} + +bool +pmt_is_pair(const pmt_t& obj) +{ + return obj->is_pair(); +} + +pmt_t +pmt_cons(const pmt_t& x, const pmt_t& y) +{ + return pmt_t(new pmt_pair(x, y)); +} + +pmt_t +pmt_car(const pmt_t& pair) +{ + pmt_pair* p = dynamic_cast(pair.get()); + if ( p ) + return p->car(); + + throw pmt_wrong_type("pmt_car", pair); +} + +pmt_t +pmt_cdr(const pmt_t& pair) +{ + pmt_pair* p = dynamic_cast(pair.get()); + if ( p ) + return p->cdr(); + + throw pmt_wrong_type("pmt_cdr", pair); +} + +void +pmt_set_car(pmt_t pair, pmt_t obj) +{ + if (pair->is_pair()) + _pair(pair)->set_car(obj); + else + throw pmt_wrong_type("pmt_set_car", pair); +} + +void +pmt_set_cdr(pmt_t pair, pmt_t obj) +{ + if (pair->is_pair()) + _pair(pair)->set_cdr(obj); + else + throw pmt_wrong_type("pmt_set_cdr", pair); +} + +//////////////////////////////////////////////////////////////////////////// +// Vectors +//////////////////////////////////////////////////////////////////////////// + +pmt_vector::pmt_vector(size_t len, pmt_t fill) + : d_v(len) +{ + for (size_t i = 0; i < len; i++) + d_v[i] = fill; +} + +pmt_t +pmt_vector::ref(size_t k) const +{ + if (k >= length()) + throw pmt_out_of_range("pmt_vector_ref", pmt_from_long(k)); + return d_v[k]; +} + +void +pmt_vector::set(size_t k, pmt_t obj) +{ + if (k >= length()) + throw pmt_out_of_range("pmt_vector_set", pmt_from_long(k)); + d_v[k] = obj; +} + +void +pmt_vector::fill(pmt_t obj) +{ + for (size_t i = 0; i < length(); i++) + d_v[i] = obj; +} + +bool +pmt_is_vector(pmt_t obj) +{ + return obj->is_vector(); +} + +pmt_t +pmt_make_vector(size_t k, pmt_t fill) +{ + return pmt_t(new pmt_vector(k, fill)); +} + +pmt_t +pmt_vector_ref(pmt_t vector, size_t k) +{ + if (!vector->is_vector()) + throw pmt_wrong_type("pmt_vector_ref", vector); + return _vector(vector)->ref(k); +} + +void +pmt_vector_set(pmt_t vector, size_t k, pmt_t obj) +{ + if (!vector->is_vector()) + throw pmt_wrong_type("pmt_vector_set", vector); + _vector(vector)->set(k, obj); +} + +void +pmt_vector_fill(pmt_t vector, pmt_t obj) +{ + if (!vector->is_vector()) + throw pmt_wrong_type("pmt_vector_set", vector); + _vector(vector)->fill(obj); +} + +//////////////////////////////////////////////////////////////////////////// +// Uniform Numeric Vectors +//////////////////////////////////////////////////////////////////////////// + +bool +pmt_is_uniform_vector(pmt_t x) +{ + return x->is_uniform_vector(); +} + +const void * +pmt_uniform_vector_elements(pmt_t vector, size_t &len) +{ + if (!vector->is_uniform_vector()) + throw pmt_wrong_type("pmt_uniform_vector_elements", vector); + return _uniform_vector(vector)->uniform_elements(len); +} + +void * +pmt_uniform_vector_writable_elements(pmt_t vector, size_t &len) +{ + if (!vector->is_uniform_vector()) + throw pmt_wrong_type("pmt_uniform_vector_writable_elements", vector); + return _uniform_vector(vector)->uniform_writable_elements(len); +} + +//////////////////////////////////////////////////////////////////////////// +// Dictionaries +//////////////////////////////////////////////////////////////////////////// + +pmt_dict::pmt_dict() + : d_alist(PMT_NIL) +{ +} + +void +pmt_dict::set(pmt_t key, pmt_t value) +{ + pmt_t p = pmt_assv(key, d_alist); // look for (key . value) pair + if (pmt_is_pair(p)){ // found existing pair... + pmt_set_cdr(p, value); // overrwrite cdr with new value + } + else { // not in the dict + d_alist = pmt_cons(pmt_cons(key, value), d_alist); // add new (key . value) pair + } +} + +pmt_t +pmt_dict::ref(pmt_t key, pmt_t not_found) const +{ + pmt_t p = pmt_assv(key, d_alist); // look for (key . value) pair + if (pmt_is_pair(p)) + return pmt_cdr(p); + else + return not_found; +} + +bool +pmt_dict::has_key(pmt_t key) const +{ + return pmt_is_pair(pmt_assv(key, d_alist)); +} + +pmt_t +pmt_dict::items() const +{ + return d_alist; +} + +pmt_t +pmt_dict::keys() const +{ + return pmt_map(pmt_car, d_alist); +} + +pmt_t +pmt_dict::values() const +{ + return pmt_map(pmt_cdr, d_alist); +} + +bool +pmt_is_dict(pmt_t obj) +{ + return obj->is_dict(); +} + +pmt_t +pmt_make_dict() +{ + return pmt_t(new pmt_dict()); +} + +void +pmt_dict_set(pmt_t dict, pmt_t key, pmt_t value) +{ + pmt_dict* d = _dict(dict); + if (!d) + throw pmt_wrong_type("pmt_dict_set", dict); + + d->set(key, value); +} + +bool +pmt_dict_has_key(pmt_t dict, pmt_t key) +{ + pmt_dict* d = _dict(dict); + if (!d) + throw pmt_wrong_type("pmt_dict_has_key", dict); + + return d->has_key(key); +} + +pmt_t +pmt_dict_ref(pmt_t dict, pmt_t key, pmt_t not_found) +{ + pmt_dict* d = _dict(dict); + if (!d) + throw pmt_wrong_type("pmt_dict_ref", dict); + + return d->ref(key, not_found); +} + +pmt_t +pmt_dict_items(pmt_t dict) +{ + if (!dict->is_dict()) + throw pmt_wrong_type("pmt_dict_items", dict); + + return _dict(dict)->items(); +} + +pmt_t +pmt_dict_keys(pmt_t dict) +{ + if (!dict->is_dict()) + throw pmt_wrong_type("pmt_dict_keys", dict); + + return _dict(dict)->keys(); +} + +pmt_t +pmt_dict_values(pmt_t dict) +{ + if (!dict->is_dict()) + throw pmt_wrong_type("pmt_dict_values", dict); + + return _dict(dict)->values(); +} + +//////////////////////////////////////////////////////////////////////////// +// Any +//////////////////////////////////////////////////////////////////////////// + +pmt_any::pmt_any(const boost::any &any) : d_any(any) {} + +bool +pmt_is_any(pmt_t obj) +{ + return obj->is_any(); +} + +pmt_t +pmt_make_any(const boost::any &any) +{ + return pmt_t(new pmt_any(any)); +} + +boost::any +pmt_any_ref(pmt_t obj) +{ + if (!obj->is_any()) + throw pmt_wrong_type("pmt_any_ref", obj); + return _any(obj)->ref(); +} + +void +pmt_any_set(pmt_t obj, const boost::any &any) +{ + if (!obj->is_any()) + throw pmt_wrong_type("pmt_any_set", obj); + _any(obj)->set(any); +} + +//////////////////////////////////////////////////////////////////////////// +// General Functions +//////////////////////////////////////////////////////////////////////////// + +bool +pmt_eq(const pmt_t& x, const pmt_t& y) +{ + return x == y; +} + +bool +pmt_eqv(const pmt_t& x, const pmt_t& y) +{ + if (x == y) + return true; + + if (x->is_integer() && y->is_integer()) + return _integer(x)->value() == _integer(y)->value(); + + if (x->is_real() && y->is_real()) + return _real(x)->value() == _real(y)->value(); + + if (x->is_complex() && y->is_complex()) + return _complex(x)->value() == _complex(y)->value(); + + return false; +} + +bool +pmt_equal(const pmt_t& x, const pmt_t& y) +{ + if (pmt_eqv(x, y)) + return true; + + if (x->is_pair() && y->is_pair()) + return pmt_equal(pmt_car(x), pmt_car(y)) && pmt_equal(pmt_cdr(x), pmt_cdr(y)); + + if (x->is_vector() && y->is_vector()){ + pmt_vector *xv = _vector(x); + pmt_vector *yv = _vector(y); + if (xv->length() != yv->length()) + return false; + + for (unsigned i = 0; i < xv->length(); i++) + if (!pmt_equal(xv->_ref(i), yv->_ref(i))) + return false; + + return true; + } + + if (x->is_uniform_vector() && y->is_uniform_vector()){ + pmt_uniform_vector *xv = _uniform_vector(x); + pmt_uniform_vector *yv = _uniform_vector(y); + if (xv->length() != yv->length()) + return false; + + size_t len_x, len_y; + if (memcmp(xv->uniform_elements(len_x), + yv->uniform_elements(len_y), + len_x) == 0) + return true; + + return true; + } + + // FIXME add other cases here... + + return false; +} + +size_t +pmt_length(const pmt_t& x) +{ + if (x->is_vector()) + return _vector(x)->length(); + + if (x->is_uniform_vector()) + return _uniform_vector(x)->length(); + + if (x->is_null()) return 0; + + if (x->is_pair()) { + size_t length=1; + pmt_t it = pmt_cdr(x); + while (pmt_is_pair(it)){ + length++; + it = pmt_cdr(it); + } + if (pmt_is_null(it)) + return length; + + // not a proper list + throw pmt_wrong_type("pmt_length", x); + } + + // FIXME dictionary length (number of entries) + + throw pmt_wrong_type("pmt_length", x); +} + +pmt_t +pmt_assq(pmt_t obj, pmt_t alist) +{ + while (pmt_is_pair(alist)){ + pmt_t p = pmt_car(alist); + if (!pmt_is_pair(p)) // malformed alist + return PMT_F; + + if (pmt_eq(obj, pmt_car(p))) + return p; + + alist = pmt_cdr(alist); + } + return PMT_F; +} + +pmt_t +pmt_assv(pmt_t obj, pmt_t alist) +{ + while (pmt_is_pair(alist)){ + pmt_t p = pmt_car(alist); + if (!pmt_is_pair(p)) // malformed alist + return PMT_F; + + if (pmt_eqv(obj, pmt_car(p))) + return p; + + alist = pmt_cdr(alist); + } + return PMT_F; +} + +pmt_t +pmt_assoc(pmt_t obj, pmt_t alist) +{ + while (pmt_is_pair(alist)){ + pmt_t p = pmt_car(alist); + if (!pmt_is_pair(p)) // malformed alist + return PMT_F; + + if (pmt_equal(obj, pmt_car(p))) + return p; + + alist = pmt_cdr(alist); + } + return PMT_F; +} + +pmt_t +pmt_map(pmt_t proc(const pmt_t&), pmt_t list) +{ + pmt_t r = PMT_NIL; + + while(pmt_is_pair(list)){ + r = pmt_cons(proc(pmt_car(list)), r); + list = pmt_cdr(list); + } + + return pmt_reverse_x(r); +} + +pmt_t +pmt_reverse(pmt_t listx) +{ + pmt_t list = listx; + pmt_t r = PMT_NIL; + + while(pmt_is_pair(list)){ + r = pmt_cons(pmt_car(list), r); + list = pmt_cdr(list); + } + if (pmt_is_null(list)) + return r; + else + throw pmt_wrong_type("pmt_reverse", listx); +} + +pmt_t +pmt_reverse_x(pmt_t list) +{ + // FIXME do it destructively + return pmt_reverse(list); +} + +pmt_t +pmt_nth(size_t n, pmt_t list) +{ + pmt_t t = pmt_nthcdr(n, list); + if (pmt_is_pair(t)) + return pmt_car(t); + else + return PMT_NIL; +} + +pmt_t +pmt_nthcdr(size_t n, pmt_t list) +{ + if (!(pmt_is_pair(list) || pmt_is_null(list))) + throw pmt_wrong_type("pmt_nthcdr", list); + + while (n > 0){ + if (pmt_is_pair(list)){ + list = pmt_cdr(list); + n--; + continue; + } + if (pmt_is_null(list)) + return PMT_NIL; + else + throw pmt_wrong_type("pmt_nthcdr: not a LIST", list); + } + return list; +} + +pmt_t +pmt_memq(pmt_t obj, pmt_t list) +{ + while (pmt_is_pair(list)){ + if (pmt_eq(obj, pmt_car(list))) + return list; + list = pmt_cdr(list); + } + return PMT_F; +} + +pmt_t +pmt_memv(pmt_t obj, pmt_t list) +{ + while (pmt_is_pair(list)){ + if (pmt_eqv(obj, pmt_car(list))) + return list; + list = pmt_cdr(list); + } + return PMT_F; +} + +pmt_t +pmt_member(pmt_t obj, pmt_t list) +{ + while (pmt_is_pair(list)){ + if (pmt_equal(obj, pmt_car(list))) + return list; + list = pmt_cdr(list); + } + return PMT_F; +} + +bool +pmt_subsetp(pmt_t list1, pmt_t list2) +{ + while (pmt_is_pair(list1)){ + pmt_t p = pmt_car(list1); + if (pmt_is_false(pmt_memv(p, list2))) + return false; + list1 = pmt_cdr(list1); + } + return true; +} + +pmt_t +pmt_list1(const pmt_t& x1) +{ + return pmt_cons(x1, PMT_NIL); +} + +pmt_t +pmt_list2(const pmt_t& x1, const pmt_t& x2) +{ + return pmt_cons(x1, pmt_cons(x2, PMT_NIL)); +} + +pmt_t +pmt_list3(const pmt_t& x1, const pmt_t& x2, const pmt_t& x3) +{ + return pmt_cons(x1, pmt_cons(x2, pmt_cons(x3, PMT_NIL))); +} + +pmt_t +pmt_list4(const pmt_t& x1, const pmt_t& x2, const pmt_t& x3, const pmt_t& x4) +{ + return pmt_cons(x1, pmt_cons(x2, pmt_cons(x3, pmt_cons(x4, PMT_NIL)))); +} + +pmt_t +pmt_list5(const pmt_t& x1, const pmt_t& x2, const pmt_t& x3, const pmt_t& x4, const pmt_t& x5) +{ + return pmt_cons(x1, pmt_cons(x2, pmt_cons(x3, pmt_cons(x4, pmt_cons(x5, PMT_NIL))))); +} + +pmt_t +pmt_list6(const pmt_t& x1, const pmt_t& x2, const pmt_t& x3, const pmt_t& x4, const pmt_t& x5, const pmt_t& x6) +{ + return pmt_cons(x1, pmt_cons(x2, pmt_cons(x3, pmt_cons(x4, pmt_cons(x5, pmt_cons(x6, PMT_NIL)))))); +} + +pmt_t +pmt_list_add(pmt_t list, const pmt_t& item) +{ + return pmt_reverse(pmt_cons(item, pmt_reverse(list))); +} + +pmt_t +pmt_caar(pmt_t pair) +{ + return (pmt_car(pmt_car(pair))); +} + +pmt_t +pmt_cadr(pmt_t pair) +{ + return pmt_car(pmt_cdr(pair)); +} + +pmt_t +pmt_cdar(pmt_t pair) +{ + return pmt_cdr(pmt_car(pair)); +} + +pmt_t +pmt_cddr(pmt_t pair) +{ + return pmt_cdr(pmt_cdr(pair)); +} + +pmt_t +pmt_caddr(pmt_t pair) +{ + return pmt_car(pmt_cdr(pmt_cdr(pair))); +} + +pmt_t +pmt_cadddr(pmt_t pair) +{ + return pmt_car(pmt_cdr(pmt_cdr(pmt_cdr(pair)))); +} + +bool +pmt_is_eof_object(pmt_t obj) +{ + return pmt_eq(obj, PMT_EOF); +} + +void +pmt_dump_sizeof() +{ + printf("sizeof(pmt_t) = %3zd\n", sizeof(pmt_t)); + printf("sizeof(pmt_base) = %3zd\n", sizeof(pmt_base)); + printf("sizeof(pmt_bool) = %3zd\n", sizeof(pmt_bool)); + printf("sizeof(pmt_symbol) = %3zd\n", sizeof(pmt_symbol)); + printf("sizeof(pmt_integer) = %3zd\n", sizeof(pmt_integer)); + printf("sizeof(pmt_real) = %3zd\n", sizeof(pmt_real)); + printf("sizeof(pmt_complex) = %3zd\n", sizeof(pmt_complex)); + printf("sizeof(pmt_null) = %3zd\n", sizeof(pmt_null)); + printf("sizeof(pmt_pair) = %3zd\n", sizeof(pmt_pair)); + printf("sizeof(pmt_vector) = %3zd\n", sizeof(pmt_vector)); + printf("sizeof(pmt_dict) = %3zd\n", sizeof(pmt_dict)); + printf("sizeof(pmt_uniform_vector) = %3zd\n", sizeof(pmt_uniform_vector)); +} + +} /* namespace gruel */ diff --git a/gruel/src/lib/pmt_int.h b/gruel/src/lib/pmt_int.h new file mode 100644 index 000000000..03f0e555c --- /dev/null +++ b/gruel/src/lib/pmt_int.h @@ -0,0 +1,227 @@ +/* -*- c++ -*- */ +/* + * Copyright 2006,2009 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ +#ifndef INCLUDED_PMT_INT_H +#define INCLUDED_PMT_INT_H + +#include +#include + +/* + * EVERYTHING IN THIS FILE IS PRIVATE TO THE IMPLEMENTATION! + * + * See pmt.h for the public interface + */ + +#define PMT_LOCAL_ALLOCATOR 0 // define to 0 or 1 +namespace gruel { + +class pmt_base : boost::noncopyable { +protected: + pmt_base(){}; + virtual ~pmt_base(); + +public: + virtual bool is_bool() const { return false; } + virtual bool is_symbol() const { return false; } + virtual bool is_number() const { return false; } + virtual bool is_integer() const { return false; } + virtual bool is_real() const { return false; } + virtual bool is_complex() const { return false; } + virtual bool is_null() const { return false; } + virtual bool is_pair() const { return false; } + virtual bool is_vector() const { return false; } + virtual bool is_dict() const { return false; } + virtual bool is_any() const { return false; } + + virtual bool is_uniform_vector() const { return false; } + virtual bool is_u8vector() const { return false; } + virtual bool is_s8vector() const { return false; } + virtual bool is_u16vector() const { return false; } + virtual bool is_s16vector() const { return false; } + virtual bool is_u32vector() const { return false; } + virtual bool is_s32vector() const { return false; } + virtual bool is_u64vector() const { return false; } + virtual bool is_s64vector() const { return false; } + virtual bool is_f32vector() const { return false; } + virtual bool is_f64vector() const { return false; } + virtual bool is_c32vector() const { return false; } + virtual bool is_c64vector() const { return false; } + +# if (PMT_LOCAL_ALLOCATOR) + void *operator new(size_t); + void operator delete(void *, size_t); +#endif +}; + +class pmt_bool : public pmt_base +{ +public: + pmt_bool(); + //~pmt_bool(){} + + bool is_bool() const { return true; } +}; + + +class pmt_symbol : public pmt_base +{ + std::string d_name; + pmt_t d_next; + +public: + pmt_symbol(const std::string &name); + //~pmt_symbol(){} + + bool is_symbol() const { return true; } + const std::string name() { return d_name; } + + pmt_t next() { return d_next; } // symbol table link + void set_next(pmt_t next) { d_next = next; } +}; + +class pmt_integer : public pmt_base +{ + long d_value; + +public: + pmt_integer(long value); + //~pmt_integer(){} + + bool is_number() const { return true; } + bool is_integer() const { return true; } + long value() const { return d_value; } +}; + +class pmt_real : public pmt_base +{ + double d_value; + +public: + pmt_real(double value); + //~pmt_real(){} + + bool is_number() const { return true; } + bool is_real() const { return true; } + double value() const { return d_value; } +}; + +class pmt_complex : public pmt_base +{ + std::complex d_value; + +public: + pmt_complex(std::complex value); + //~pmt_complex(){} + + bool is_number() const { return true; } + bool is_complex() const { return true; } + std::complex value() const { return d_value; } +}; + +class pmt_null : public pmt_base +{ +public: + pmt_null(); + //~pmt_null(){} + + bool is_null() const { return true; } +}; + +class pmt_pair : public pmt_base +{ + pmt_t d_car; + pmt_t d_cdr; + +public: + pmt_pair(const pmt_t& car, const pmt_t& cdr); + //~pmt_pair(){}; + + bool is_pair() const { return true; } + pmt_t car() const { return d_car; } + pmt_t cdr() const { return d_cdr; } + + void set_car(pmt_t car) { d_car = car; } + void set_cdr(pmt_t cdr) { d_cdr = cdr; } +}; + +class pmt_vector : public pmt_base +{ + std::vector d_v; + +public: + pmt_vector(size_t len, pmt_t fill); + //~pmt_vector(); + + bool is_vector() const { return true; } + pmt_t ref(size_t k) const; + void set(size_t k, pmt_t obj); + void fill(pmt_t fill); + size_t length() const { return d_v.size(); } + + pmt_t _ref(size_t k) const { return d_v[k]; } +}; + +class pmt_dict : public pmt_base +{ + pmt_t d_alist; // list of (key . value) pairs + +public: + pmt_dict(); + //~pmt_dict(); + + bool is_dict() const { return true; } + void set(pmt_t key, pmt_t value); + pmt_t ref(pmt_t key, pmt_t default_value) const; + bool has_key(pmt_t key) const; + pmt_t items() const; + pmt_t keys() const; + pmt_t values() const; +}; + +class pmt_any : public pmt_base +{ + boost::any d_any; + +public: + pmt_any(const boost::any &any); + //~pmt_any(); + + bool is_any() const { return true; } + const boost::any &ref() const { return d_any; } + void set(const boost::any &any) { d_any = any; } +}; + + +class pmt_uniform_vector : public pmt_base +{ +public: + bool is_uniform_vector() const { return true; } + virtual const void *uniform_elements(size_t &len) = 0; + virtual void *uniform_writable_elements(size_t &len) = 0; + virtual size_t length() const = 0; +}; + +#include "pmt_unv_int.h" + +} /* namespace gruel */ + +#endif /* INCLUDED_PMT_INT_H */ diff --git a/gruel/src/lib/pmt_io.cc b/gruel/src/lib/pmt_io.cc new file mode 100644 index 000000000..e10ea7814 --- /dev/null +++ b/gruel/src/lib/pmt_io.cc @@ -0,0 +1,141 @@ +/* -*- c++ -*- */ +/* + * Copyright 2006,2009 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include +#include "pmt_int.h" +#include + +namespace gruel { + +static void +pmt_write_list_tail(pmt_t obj, std::ostream &port) +{ + pmt_write(pmt_car(obj), port); // write the car + obj = pmt_cdr(obj); // step to cdr + + if (pmt_is_null(obj)) // () + port << ")"; + + else if (pmt_is_pair(obj)){ // normal list + port << " "; + pmt_write_list_tail(obj, port); + } + else { // dotted pair + port << " . "; + pmt_write(obj, port); + port << ")"; + } +} + +void +pmt_write(pmt_t obj, std::ostream &port) +{ + if (pmt_is_bool(obj)){ + if (pmt_is_true(obj)) + port << "#t"; + else + port << "#f"; + } + else if (pmt_is_symbol(obj)){ + port << pmt_symbol_to_string(obj); + } + else if (pmt_is_number(obj)){ + if (pmt_is_integer(obj)) + port << pmt_to_long(obj); + else if (pmt_is_real(obj)) + port << pmt_to_double(obj); + else if (pmt_is_complex(obj)){ + std::complex c = pmt_to_complex(obj); + port << c.real() << '+' << c.imag() << 'i'; + } + else + goto error; + } + else if (pmt_is_null(obj)){ + port << "()"; + } + else if (pmt_is_pair(obj)){ + port << "("; + pmt_write_list_tail(obj, port); + } + else if (pmt_is_dict(obj)){ + // FIXME + // port << "#"; + port << "#"; + } + else if (pmt_is_vector(obj)){ + // FIXME + // port << "#"; + port << "#"; + } + else if (pmt_is_uniform_vector(obj)){ + // FIXME + // port << "#"; + port << "#"; + } + else { + error: + // FIXME + // port << "#<" << obj << ">"; + port << "#"; + } +} + +std::ostream& operator<<(std::ostream &os, pmt_t obj) +{ + pmt_write(obj, os); + return os; +} + +std::string +pmt_write_string(pmt_t obj) +{ + std::ostringstream s; + s << obj; + return s.str(); +} + +pmt_t +pmt_read(std::istream &port) +{ + throw pmt_notimplemented("notimplemented: pmt_read", PMT_NIL); +} + +void +pmt_serialize(pmt_t obj, std::ostream &sink) +{ + throw pmt_notimplemented("notimplemented: pmt_serialize", obj); +} + +/*! + * \brief Create obj from portable byte-serial representation + */ +pmt_t +pmt_deserialize(std::istream &source) +{ + throw pmt_notimplemented("notimplemented: pmt_deserialize", PMT_NIL); +} + +} /* namespace gruel */ diff --git a/gruel/src/lib/pmt_pool.cc b/gruel/src/lib/pmt_pool.cc new file mode 100644 index 000000000..79a22ea73 --- /dev/null +++ b/gruel/src/lib/pmt_pool.cc @@ -0,0 +1,112 @@ +/* -*- c++ -*- */ +/* + * Copyright 2007,2009 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include +#include + +namespace gruel { + +static inline size_t +ROUNDUP(size_t x, size_t stride) +{ + return ((((x) + (stride) - 1)/(stride)) * (stride)); +} + +pmt_pool::pmt_pool(size_t itemsize, size_t alignment, + size_t allocation_size, size_t max_items) + : d_itemsize(ROUNDUP(itemsize, alignment)), + d_alignment(alignment), + d_allocation_size(std::max(allocation_size, 16 * itemsize)), + d_max_items(max_items), d_n_items(0), + d_freelist(0) +{ +} + +pmt_pool::~pmt_pool() +{ + for (unsigned int i = 0; i < d_allocations.size(); i++){ + delete [] d_allocations[i]; + } +} + +void * +pmt_pool::malloc() +{ + scoped_lock guard(d_mutex); + item *p; + + if (d_max_items != 0){ + while (d_n_items >= d_max_items) + d_cond.wait(guard); + } + + if (d_freelist){ // got something? + p = d_freelist; + d_freelist = p->d_next; + d_n_items++; + return p; + } + + // allocate a new chunk + char *alloc = new char[d_allocation_size + d_alignment - 1]; + d_allocations.push_back(alloc); + + // get the alignment we require + char *start = (char *)(((uintptr_t)alloc + d_alignment-1) & -d_alignment); + char *end = alloc + d_allocation_size + d_alignment - 1; + size_t n = (end - start) / d_itemsize; + + // link the new items onto the free list. + p = (item *) start; + for (size_t i = 0; i < n; i++){ + p->d_next = d_freelist; + d_freelist = p; + p = (item *)((char *) p + d_itemsize); + } + + // now return the first one + p = d_freelist; + d_freelist = p->d_next; + d_n_items++; + return p; +} + +void +pmt_pool::free(void *foo) +{ + if (!foo) + return; + + scoped_lock guard(d_mutex); + + item *p = (item *) foo; + p->d_next = d_freelist; + d_freelist = p; + d_n_items--; + if (d_max_items != 0) + d_cond.notify_one(); +} + +} /* namespace gruel */ diff --git a/gruel/src/lib/pmt_serialize.cc b/gruel/src/lib/pmt_serialize.cc new file mode 100644 index 000000000..b7193e811 --- /dev/null +++ b/gruel/src/lib/pmt_serialize.cc @@ -0,0 +1,357 @@ +/* -*- c++ -*- */ +/* + * Copyright 2007,2009 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include +#include "pmt_int.h" +#include "gruel/pmt_serial_tags.h" + +namespace gruel { + +static pmt_t parse_pair(std::streambuf &sb); + +// ---------------------------------------------------------------- +// output primitives +// ---------------------------------------------------------------- + +static bool +serialize_untagged_u8(unsigned int i, std::streambuf &sb) +{ + return sb.sputc((i >> 0) & 0xff) != std::streambuf::traits_type::eof(); +} + +// always writes big-endian +static bool +serialize_untagged_u16(unsigned int i, std::streambuf &sb) +{ + sb.sputc((i >> 8) & 0xff); + return sb.sputc((i >> 0) & 0xff) != std::streambuf::traits_type::eof(); +} + +// always writes big-endian +static bool +serialize_untagged_u32(unsigned int i, std::streambuf &sb) +{ + sb.sputc((i >> 24) & 0xff); + sb.sputc((i >> 16) & 0xff); + sb.sputc((i >> 8) & 0xff); + return sb.sputc((i >> 0) & 0xff) != std::streambuf::traits_type::eof(); +} + +#if 0 +// always writes big-endian +static bool +serialize_untagged_u64(uint64_t i, std::streambuf &sb) +{ + sb.sputc((i >> 56) & 0xff); + sb.sputc((i >> 48) & 0xff); + sb.sputc((i >> 40) & 0xff); + sb.sputc((i >> 32) & 0xff); + sb.sputc((i >> 24) & 0xff); + sb.sputc((i >> 16) & 0xff); + sb.sputc((i >> 8) & 0xff); + return sb.sputc((i >> 0) & 0xff) != std::streambuf::traits_type::eof(); +} +#endif + +// ---------------------------------------------------------------- +// input primitives +// ---------------------------------------------------------------- + + +// always reads big-endian +static bool +deserialize_untagged_u8(uint8_t *ip, std::streambuf &sb) +{ + std::streambuf::traits_type::int_type t; + int i; + + t = sb.sbumpc(); + i = t & 0xff; + + *ip = i; + return t != std::streambuf::traits_type::eof(); +} + +// always reads big-endian +static bool +deserialize_untagged_u16(uint16_t *ip, std::streambuf &sb) +{ + std::streambuf::traits_type::int_type t; + int i; + + t = sb.sbumpc(); + i = t & 0xff; + + t = sb.sbumpc(); + i = (i << 8) | (t & 0xff); + + *ip = i; + return t != std::streambuf::traits_type::eof(); +} + +// always reads big-endian +static bool +deserialize_untagged_u32(uint32_t *ip, std::streambuf &sb) +{ + std::streambuf::traits_type::int_type t; + int i; + + t = sb.sbumpc(); + i = t & 0xff; + + t = sb.sbumpc(); + i = (i << 8) | (t & 0xff); + t = sb.sbumpc(); + i = (i << 8) | (t & 0xff); + t = sb.sbumpc(); + i = (i << 8) | (t & 0xff); + + *ip = i; + return t != std::streambuf::traits_type::eof(); +} + +#if 0 +// always reads big-endian +static bool +deserialize_untagged_u64(uint64_t *ip, std::streambuf &sb) +{ + std::streambuf::traits_type::int_type t; + uint64_t i; + + t = sb.sbumpc(); + i = t & 0xff; + + t = sb.sbumpc(); + i = (i << 8) | (t & 0xff); + t = sb.sbumpc(); + i = (i << 8) | (t & 0xff); + t = sb.sbumpc(); + i = (i << 8) | (t & 0xff); + t = sb.sbumpc(); + i = (i << 8) | (t & 0xff); + t = sb.sbumpc(); + i = (i << 8) | (t & 0xff); + t = sb.sbumpc(); + i = (i << 8) | (t & 0xff); + t = sb.sbumpc(); + i = (i << 8) | (t & 0xff); + + *ip = i; + return t != std::streambuf::traits_type::eof(); +} +#endif + +/* + * Write portable byte-serial representation of \p obj to \p sb + * + * N.B., Circular structures cause infinite recursion. + */ +bool +pmt_serialize(pmt_t obj, std::streambuf &sb) +{ + bool ok = true; + + tail_recursion: + + if (pmt_is_bool(obj)){ + if (pmt_eq(obj, PMT_T)) + return serialize_untagged_u8(PST_TRUE, sb); + else + return serialize_untagged_u8(PST_FALSE, sb); + } + + if (pmt_is_null(obj)) + return serialize_untagged_u8(PST_NULL, sb); + + if (pmt_is_symbol(obj)){ + const std::string s = pmt_symbol_to_string(obj); + size_t len = s.size(); + ok = serialize_untagged_u8(PST_SYMBOL, sb); + ok &= serialize_untagged_u16(len, sb); + for (size_t i = 0; i < len; i++) + ok &= serialize_untagged_u8(s[i], sb); + return ok; + } + + if (pmt_is_pair(obj)){ + ok = serialize_untagged_u8(PST_PAIR, sb); + ok &= pmt_serialize(pmt_car(obj), sb); + if (!ok) + return false; + obj = pmt_cdr(obj); + goto tail_recursion; + } + + if (pmt_is_number(obj)){ + + if (pmt_is_integer(obj)){ + long i = pmt_to_long(obj); + if (sizeof(long) > 4){ + if (i < -2147483647 || i > 2147483647) + throw pmt_notimplemented("pmt_serialize (64-bit integers)", obj); + } + ok = serialize_untagged_u8(PST_INT32, sb); + ok &= serialize_untagged_u32(i, sb); + return ok; + } + + if (pmt_is_real(obj)) + throw pmt_notimplemented("pmt_serialize (real)", obj); + + if (pmt_is_complex(obj)) + throw pmt_notimplemented("pmt_serialize (complex)", obj); + } + + if (pmt_is_vector(obj)) + throw pmt_notimplemented("pmt_serialize (vector)", obj); + + if (pmt_is_uniform_vector(obj)) + throw pmt_notimplemented("pmt_serialize (uniform-vector)", obj); + + if (pmt_is_dict(obj)) + throw pmt_notimplemented("pmt_serialize (dict)", obj); + + + throw pmt_notimplemented("pmt_serialize (?)", obj); +} + +/* + * Create obj from portable byte-serial representation + * + * Returns next obj from streambuf, or PMT_EOF at end of file. + * Throws exception on malformed input. + */ +pmt_t +pmt_deserialize(std::streambuf &sb) +{ + uint8_t tag; + //uint8_t u8; + uint16_t u16; + uint32_t u32; + //uint32_t u64; + static char tmpbuf[1024]; + + if (!deserialize_untagged_u8(&tag, sb)) + return PMT_EOF; + + switch (tag){ + case PST_TRUE: + return PMT_T; + + case PST_FALSE: + return PMT_F; + + case PST_NULL: + return PMT_NIL; + + case PST_SYMBOL: + if (!deserialize_untagged_u16(&u16, sb)) + goto error; + if (u16 > sizeof(tmpbuf)) + throw pmt_notimplemented("pmt_deserialize: very long symbol", + PMT_F); + if (sb.sgetn(tmpbuf, u16) != u16) + goto error; + return pmt_intern(std::string(tmpbuf, u16)); + + case PST_INT32: + if (!deserialize_untagged_u32(&u32, sb)) + goto error; + return pmt_from_long((int32_t) u32); + + case PST_PAIR: + return parse_pair(sb); + + case PST_DOUBLE: + case PST_COMPLEX: + case PST_VECTOR: + case PST_DICT: + case PST_UNIFORM_VECTOR: + case PST_COMMENT: + throw pmt_notimplemented("pmt_deserialize: tag value = ", + pmt_from_long(tag)); + + default: + throw pmt_exception("pmt_deserialize: malformed input stream, tag value = ", + pmt_from_long(tag)); + } + + error: + throw pmt_exception("pmt_deserialize: malformed input stream", PMT_F); +} + +/* + * This is a mostly non-recursive implementation that allows us to + * deserialize very long lists w/o exhausting the evaluation stack. + * + * On entry we've already eaten the PST_PAIR tag. + */ +pmt_t +parse_pair(std::streambuf &sb) +{ + uint8_t tag; + pmt_t val, expr, lastnptr, nptr; + + // + // Keep appending nodes until we get a non-PAIR cdr. + // + lastnptr = PMT_NIL; + while (1){ + expr = pmt_deserialize(sb); // read the car + + nptr = pmt_cons(expr, PMT_NIL); // build new cell + if (pmt_is_null(lastnptr)) + val = nptr; + else + pmt_set_cdr(lastnptr, nptr); + lastnptr = nptr; + + if (!deserialize_untagged_u8(&tag, sb)) // get tag of cdr + throw pmt_exception("pmt_deserialize: malformed input stream", PMT_F); + + if (tag == PST_PAIR) + continue; // keep on looping... + + if (tag == PST_NULL){ + expr = PMT_NIL; + break; + } + + // + // default: push tag back and use pmt_deserialize to get the cdr + // + sb.sungetc(); + expr = pmt_deserialize(sb); + break; + } + + // + // At this point, expr contains the value of the final cdr in the list. + // + pmt_set_cdr(lastnptr, expr); + return val; +} + +} /* namespace gruel */ diff --git a/gruel/src/lib/qa_pmt.cc b/gruel/src/lib/qa_pmt.cc new file mode 100644 index 000000000..250befafa --- /dev/null +++ b/gruel/src/lib/qa_pmt.cc @@ -0,0 +1,40 @@ +/* + * Copyright 2006 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +/* + * This class gathers together all the test cases for pmt into + * a single test suite. As you create new test cases, add them here. + */ + +#include +#include +#include + +CppUnit::TestSuite * +qa_pmt::suite () +{ + CppUnit::TestSuite *s = new CppUnit::TestSuite ("pmt"); + + s->addTest (qa_pmt_prims::suite ()); + s->addTest (qa_pmt_unv::suite ()); + + return s; +} diff --git a/gruel/src/lib/qa_pmt.h b/gruel/src/lib/qa_pmt.h new file mode 100644 index 000000000..43a6dbf67 --- /dev/null +++ b/gruel/src/lib/qa_pmt.h @@ -0,0 +1,36 @@ +/* -*- c++ -*- */ +/* + * Copyright 2006 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef INCLUDED_QA_PMT_H +#define INCLUDED_QA_PMT_H + +#include + +//! collect all the tests for pmt + +class qa_pmt { + public: + //! return suite of tests for all of pmt + static CppUnit::TestSuite *suite (); +}; + +#endif /* INCLUDED_QA_PMT_H */ diff --git a/gruel/src/lib/qa_pmt_prims.cc b/gruel/src/lib/qa_pmt_prims.cc new file mode 100644 index 000000000..ac93f8063 --- /dev/null +++ b/gruel/src/lib/qa_pmt_prims.cc @@ -0,0 +1,438 @@ +/* -*- c++ -*- */ +/* + * Copyright 2006,2009 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include +#include + +using namespace gruel; + +void +qa_pmt_prims::test_symbols() +{ + CPPUNIT_ASSERT(!pmt_is_symbol(PMT_T)); + CPPUNIT_ASSERT(!pmt_is_symbol(PMT_F)); + CPPUNIT_ASSERT_THROW(pmt_symbol_to_string(PMT_F), pmt_wrong_type); + + pmt_t sym1 = pmt_string_to_symbol("test"); + CPPUNIT_ASSERT(pmt_is_symbol(sym1)); + CPPUNIT_ASSERT_EQUAL(std::string("test"), pmt_symbol_to_string(sym1)); + CPPUNIT_ASSERT(pmt_is_true(sym1)); + CPPUNIT_ASSERT(!pmt_is_false(sym1)); + + pmt_t sym2 = pmt_string_to_symbol("foo"); + pmt_t sym3 = pmt_string_to_symbol("test"); + CPPUNIT_ASSERT_EQUAL(sym1, sym3); + CPPUNIT_ASSERT(sym1 != sym2); + CPPUNIT_ASSERT(sym1 == sym3); + + static const int N = 2048; + std::vector v1(N); + std::vector v2(N); + + // generate a bunch of symbols + for (int i = 0; i < N; i++){ + char buf[100]; + snprintf(buf, sizeof(buf), "test-%d", i); + v1[i] = pmt_string_to_symbol(buf); + } + + // confirm that they are all unique + for (int i = 0; i < N; i++) + for (int j = i + 1; j < N; j++) + CPPUNIT_ASSERT(v1[i] != v1[j]); + + // generate the same symbols again + for (int i = 0; i < N; i++){ + char buf[100]; + snprintf(buf, sizeof(buf), "test-%d", i); + v2[i] = pmt_string_to_symbol(buf); + } + + // confirm that we get the same ones back + for (int i = 0; i < N; i++) + CPPUNIT_ASSERT(v1[i] == v2[i]); +} + +void +qa_pmt_prims::test_booleans() +{ + pmt_t sym = pmt_string_to_symbol("test"); + CPPUNIT_ASSERT(pmt_is_bool(PMT_T)); + CPPUNIT_ASSERT(pmt_is_bool(PMT_F)); + CPPUNIT_ASSERT(!pmt_is_bool(sym)); + CPPUNIT_ASSERT_EQUAL(pmt_from_bool(false), PMT_F); + CPPUNIT_ASSERT_EQUAL(pmt_from_bool(true), PMT_T); + CPPUNIT_ASSERT_EQUAL(false, pmt_to_bool(PMT_F)); + CPPUNIT_ASSERT_EQUAL(true, pmt_to_bool(PMT_T)); + CPPUNIT_ASSERT_THROW(pmt_to_bool(sym), pmt_wrong_type); +} + +void +qa_pmt_prims::test_integers() +{ + pmt_t p1 = pmt_from_long(1); + pmt_t m1 = pmt_from_long(-1); + CPPUNIT_ASSERT(!pmt_is_integer(PMT_T)); + CPPUNIT_ASSERT(pmt_is_integer(p1)); + CPPUNIT_ASSERT(pmt_is_integer(m1)); + CPPUNIT_ASSERT_THROW(pmt_to_long(PMT_T), pmt_wrong_type); + CPPUNIT_ASSERT_EQUAL(-1L, pmt_to_long(m1)); + CPPUNIT_ASSERT_EQUAL(1L, pmt_to_long(p1)); +} + +void +qa_pmt_prims::test_reals() +{ + pmt_t p1 = pmt_from_double(1); + pmt_t m1 = pmt_from_double(-1); + CPPUNIT_ASSERT(!pmt_is_real(PMT_T)); + CPPUNIT_ASSERT(pmt_is_real(p1)); + CPPUNIT_ASSERT(pmt_is_real(m1)); + CPPUNIT_ASSERT_THROW(pmt_to_double(PMT_T), pmt_wrong_type); + CPPUNIT_ASSERT_EQUAL(-1.0, pmt_to_double(m1)); + CPPUNIT_ASSERT_EQUAL(1.0, pmt_to_double(p1)); + CPPUNIT_ASSERT_EQUAL(1.0, pmt_to_double(pmt_from_long(1))); +} + +void +qa_pmt_prims::test_complexes() +{ + pmt_t p1 = pmt_make_rectangular(2, -3); + pmt_t m1 = pmt_make_rectangular(-3, 2); + CPPUNIT_ASSERT(!pmt_is_complex(PMT_T)); + CPPUNIT_ASSERT(pmt_is_complex(p1)); + CPPUNIT_ASSERT(pmt_is_complex(m1)); + CPPUNIT_ASSERT_THROW(pmt_to_complex(PMT_T), pmt_wrong_type); + CPPUNIT_ASSERT_EQUAL(std::complex(2, -3), pmt_to_complex(p1)); + CPPUNIT_ASSERT_EQUAL(std::complex(-3, 2), pmt_to_complex(m1)); + CPPUNIT_ASSERT_EQUAL(std::complex(1.0, 0), pmt_to_complex(pmt_from_long(1))); + CPPUNIT_ASSERT_EQUAL(std::complex(1.0, 0), pmt_to_complex(pmt_from_double(1.0))); +} + +void +qa_pmt_prims::test_pairs() +{ + CPPUNIT_ASSERT(pmt_is_null(PMT_NIL)); + CPPUNIT_ASSERT(!pmt_is_pair(PMT_NIL)); + pmt_t s1 = pmt_string_to_symbol("s1"); + pmt_t s2 = pmt_string_to_symbol("s2"); + pmt_t s3 = pmt_string_to_symbol("s3"); + + + CPPUNIT_ASSERT_EQUAL((size_t)0, pmt_length(PMT_NIL)); + CPPUNIT_ASSERT_THROW(pmt_length(s1), pmt_wrong_type); + CPPUNIT_ASSERT_THROW(pmt_length(pmt_from_double(42)), pmt_wrong_type); + + pmt_t c1 = pmt_cons(s1, PMT_NIL); + CPPUNIT_ASSERT(pmt_is_pair(c1)); + CPPUNIT_ASSERT(!pmt_is_pair(s1)); + CPPUNIT_ASSERT_EQUAL(s1, pmt_car(c1)); + CPPUNIT_ASSERT_EQUAL(PMT_NIL, pmt_cdr(c1)); + CPPUNIT_ASSERT_EQUAL((size_t) 1, pmt_length(c1)); + + pmt_t c3 = pmt_cons(s3, PMT_NIL); + pmt_t c2 = pmt_cons(s2, c3); + pmt_set_cdr(c1, c2); + CPPUNIT_ASSERT_EQUAL(c2, pmt_cdr(c1)); + pmt_set_car(c1, s3); + CPPUNIT_ASSERT_EQUAL(s3, pmt_car(c1)); + CPPUNIT_ASSERT_EQUAL((size_t)1, pmt_length(c3)); + CPPUNIT_ASSERT_EQUAL((size_t)2, pmt_length(c2)); + + CPPUNIT_ASSERT_THROW(pmt_cdr(PMT_NIL), pmt_wrong_type); + CPPUNIT_ASSERT_THROW(pmt_car(PMT_NIL), pmt_wrong_type); + CPPUNIT_ASSERT_THROW(pmt_set_car(s1, PMT_NIL), pmt_wrong_type); + CPPUNIT_ASSERT_THROW(pmt_set_cdr(s1, PMT_NIL), pmt_wrong_type); +} + +void +qa_pmt_prims::test_vectors() +{ + static const size_t N = 3; + pmt_t v1 = pmt_make_vector(N, PMT_NIL); + CPPUNIT_ASSERT_EQUAL(N, pmt_length(v1)); + pmt_t s0 = pmt_string_to_symbol("s0"); + pmt_t s1 = pmt_string_to_symbol("s1"); + pmt_t s2 = pmt_string_to_symbol("s2"); + + pmt_vector_set(v1, 0, s0); + pmt_vector_set(v1, 1, s1); + pmt_vector_set(v1, 2, s2); + + CPPUNIT_ASSERT_EQUAL(s0, pmt_vector_ref(v1, 0)); + CPPUNIT_ASSERT_EQUAL(s1, pmt_vector_ref(v1, 1)); + CPPUNIT_ASSERT_EQUAL(s2, pmt_vector_ref(v1, 2)); + + CPPUNIT_ASSERT_THROW(pmt_vector_ref(v1, N), pmt_out_of_range); + CPPUNIT_ASSERT_THROW(pmt_vector_set(v1, N, PMT_NIL), pmt_out_of_range); + + pmt_vector_fill(v1, s0); + for (size_t i = 0; i < N; i++) + CPPUNIT_ASSERT_EQUAL(s0, pmt_vector_ref(v1, i)); +} + +void +qa_pmt_prims::test_equivalence() +{ + pmt_t s0 = pmt_string_to_symbol("s0"); + pmt_t s1 = pmt_string_to_symbol("s1"); + pmt_t s2 = pmt_string_to_symbol("s2"); + pmt_t list0 = pmt_cons(s0, pmt_cons(s1, pmt_cons(s2, PMT_NIL))); + pmt_t list1 = pmt_cons(s0, pmt_cons(s1, pmt_cons(s2, PMT_NIL))); + pmt_t i0 = pmt_from_long(42); + pmt_t i1 = pmt_from_long(42); + pmt_t r0 = pmt_from_double(42); + pmt_t r1 = pmt_from_double(42); + pmt_t r2 = pmt_from_double(43); + + CPPUNIT_ASSERT(pmt_eq(s0, s0)); + CPPUNIT_ASSERT(!pmt_eq(s0, s1)); + CPPUNIT_ASSERT(pmt_eqv(s0, s0)); + CPPUNIT_ASSERT(!pmt_eqv(s0, s1)); + + CPPUNIT_ASSERT(pmt_eqv(i0, i1)); + CPPUNIT_ASSERT(pmt_eqv(r0, r1)); + CPPUNIT_ASSERT(!pmt_eqv(r0, r2)); + CPPUNIT_ASSERT(!pmt_eqv(i0, r0)); + + CPPUNIT_ASSERT(!pmt_eq(list0, list1)); + CPPUNIT_ASSERT(!pmt_eqv(list0, list1)); + CPPUNIT_ASSERT(pmt_equal(list0, list1)); + + pmt_t v0 = pmt_make_vector(3, s0); + pmt_t v1 = pmt_make_vector(3, s0); + pmt_t v2 = pmt_make_vector(4, s0); + CPPUNIT_ASSERT(!pmt_eqv(v0, v1)); + CPPUNIT_ASSERT(pmt_equal(v0, v1)); + CPPUNIT_ASSERT(!pmt_equal(v0, v2)); + + pmt_vector_set(v0, 0, list0); + pmt_vector_set(v0, 1, list0); + pmt_vector_set(v1, 0, list1); + pmt_vector_set(v1, 1, list1); + CPPUNIT_ASSERT(pmt_equal(v0, v1)); +} + +void +qa_pmt_prims::test_misc() +{ + pmt_t k0 = pmt_string_to_symbol("k0"); + pmt_t k1 = pmt_string_to_symbol("k1"); + pmt_t k2 = pmt_string_to_symbol("k2"); + pmt_t k3 = pmt_string_to_symbol("k3"); + pmt_t v0 = pmt_string_to_symbol("v0"); + pmt_t v1 = pmt_string_to_symbol("v1"); + pmt_t v2 = pmt_string_to_symbol("v2"); + pmt_t p0 = pmt_cons(k0, v0); + pmt_t p1 = pmt_cons(k1, v1); + pmt_t p2 = pmt_cons(k2, v2); + + pmt_t alist = pmt_cons(p0, pmt_cons(p1, pmt_cons(p2, PMT_NIL))); + CPPUNIT_ASSERT(pmt_eq(p1, pmt_assv(k1, alist))); + CPPUNIT_ASSERT(pmt_eq(PMT_F, pmt_assv(k3, alist))); + + pmt_t keys = pmt_cons(k0, pmt_cons(k1, pmt_cons(k2, PMT_NIL))); + pmt_t vals = pmt_cons(v0, pmt_cons(v1, pmt_cons(v2, PMT_NIL))); + CPPUNIT_ASSERT(pmt_equal(keys, pmt_map(pmt_car, alist))); + CPPUNIT_ASSERT(pmt_equal(vals, pmt_map(pmt_cdr, alist))); +} + +void +qa_pmt_prims::test_dict() +{ + pmt_t dict = pmt_make_dict(); + CPPUNIT_ASSERT(pmt_is_dict(dict)); + + pmt_t k0 = pmt_string_to_symbol("k0"); + pmt_t k1 = pmt_string_to_symbol("k1"); + pmt_t k2 = pmt_string_to_symbol("k2"); + pmt_t k3 = pmt_string_to_symbol("k3"); + pmt_t v0 = pmt_string_to_symbol("v0"); + pmt_t v1 = pmt_string_to_symbol("v1"); + pmt_t v2 = pmt_string_to_symbol("v2"); + pmt_t v3 = pmt_string_to_symbol("v3"); + pmt_t not_found = pmt_cons(PMT_NIL, PMT_NIL); + + CPPUNIT_ASSERT(!pmt_dict_has_key(dict, k0)); + pmt_dict_set(dict, k0, v0); + CPPUNIT_ASSERT(pmt_dict_has_key(dict, k0)); + CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k0, not_found), v0)); + CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k1, not_found), not_found)); + pmt_dict_set(dict, k1, v1); + pmt_dict_set(dict, k2, v2); + CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k1, not_found), v1)); + pmt_dict_set(dict, k1, v3); + CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k1, not_found), v3)); + + pmt_t keys = pmt_cons(k2, pmt_cons(k1, pmt_cons(k0, PMT_NIL))); + pmt_t vals = pmt_cons(v2, pmt_cons(v3, pmt_cons(v0, PMT_NIL))); + CPPUNIT_ASSERT(pmt_equal(keys, pmt_dict_keys(dict))); + CPPUNIT_ASSERT(pmt_equal(vals, pmt_dict_values(dict))); +} + +void +qa_pmt_prims::test_io() +{ + pmt_t k0 = pmt_string_to_symbol("k0"); + pmt_t k1 = pmt_string_to_symbol("k1"); + pmt_t k2 = pmt_string_to_symbol("k2"); + pmt_t k3 = pmt_string_to_symbol("k3"); + + CPPUNIT_ASSERT_EQUAL(std::string("k0"), pmt_write_string(k0)); +} + +void +qa_pmt_prims::test_lists() +{ + pmt_t s0 = pmt_intern("s0"); + pmt_t s1 = pmt_intern("s1"); + pmt_t s2 = pmt_intern("s2"); + pmt_t s3 = pmt_intern("s3"); + + pmt_t l1 = pmt_list4(s0, s1, s2, s3); + pmt_t l2 = pmt_list3(s0, s1, s2); + pmt_t l3 = pmt_list_add(l2, s3); + CPPUNIT_ASSERT(pmt_equal(l1, l3)); +} + +// ------------------------------------------------------------------------ + +// class foo is used in test_any below. +// It can't be declared in the scope of test_any because of template +// namespace problems. + +class foo { +public: + double d_double; + int d_int; + foo(double d=0, int i=0) : d_double(d), d_int(i) {} +}; + +bool operator==(const foo &a, const foo &b) +{ + return a.d_double == b.d_double && a.d_int == b.d_int; +} + +std::ostream& operator<<(std::ostream &os, const foo obj) +{ + os << ""; + return os; +} + +void +qa_pmt_prims::test_any() +{ + boost::any a0; + boost::any a1; + boost::any a2; + + a0 = std::string("Hello!"); + a1 = 42; + a2 = foo(3.250, 21); + + pmt_t p0 = pmt_make_any(a0); + pmt_t p1 = pmt_make_any(a1); + pmt_t p2 = pmt_make_any(a2); + + CPPUNIT_ASSERT_EQUAL(std::string("Hello!"), + boost::any_cast(pmt_any_ref(p0))); + + CPPUNIT_ASSERT_EQUAL(42, + boost::any_cast(pmt_any_ref(p1))); + + CPPUNIT_ASSERT_EQUAL(foo(3.250, 21), + boost::any_cast(pmt_any_ref(p2))); +} + +// ------------------------------------------------------------------------ + +void +qa_pmt_prims::test_serialize() +{ + std::stringbuf sb; // fake channel + pmt_t a = pmt_intern("a"); + pmt_t b = pmt_intern("b"); + pmt_t c = pmt_intern("c"); + + sb.str(""); // reset channel to empty + + // write stuff to channel + + pmt_serialize(PMT_NIL, sb); + pmt_serialize(pmt_intern("foobarvia"), sb); + pmt_serialize(pmt_from_long(123456789), sb); + pmt_serialize(pmt_from_long(-123456789), sb); + pmt_serialize(pmt_cons(PMT_NIL, PMT_NIL), sb); + pmt_serialize(pmt_cons(a, b), sb); + pmt_serialize(pmt_list1(a), sb); + pmt_serialize(pmt_list2(a, b), sb); + pmt_serialize(pmt_list3(a, b, c), sb); + pmt_serialize(pmt_list3(a, pmt_list3(c, b, a), c), sb); + pmt_serialize(PMT_T, sb); + pmt_serialize(PMT_F, sb); + + // read it back + + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), PMT_NIL)); + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_intern("foobarvia"))); + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_from_long(123456789))); + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_from_long(-123456789))); + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_cons(PMT_NIL, PMT_NIL))); + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_cons(a, b))); + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_list1(a))); + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_list2(a, b))); + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_list3(a, b, c))); + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_list3(a, pmt_list3(c, b, a), c))); + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), PMT_T)); + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), PMT_F)); + + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), PMT_EOF)); // last item + + + // FIXME add tests for real, complex, vector, uniform-vector, dict + // FIXME add tests for malformed input too. + +} + +void +qa_pmt_prims::test_sets() +{ + pmt_t s1 = pmt_intern("s1"); + pmt_t s2 = pmt_intern("s2"); + pmt_t s3 = pmt_intern("s3"); + + pmt_t l1 = pmt_list1(s1); + pmt_t l2 = pmt_list2(s2,s3); + pmt_t l3 = pmt_list3(s1,s2,s3); + + CPPUNIT_ASSERT(pmt_is_pair(pmt_memq(s1,l1))); + CPPUNIT_ASSERT(pmt_is_false(pmt_memq(s3,l1))); + + CPPUNIT_ASSERT(pmt_subsetp(l1,l3)); + CPPUNIT_ASSERT(pmt_subsetp(l2,l3)); + CPPUNIT_ASSERT(!pmt_subsetp(l1,l2)); + CPPUNIT_ASSERT(!pmt_subsetp(l2,l1)); + CPPUNIT_ASSERT(!pmt_subsetp(l3,l2)); +} diff --git a/gruel/src/lib/qa_pmt_prims.h b/gruel/src/lib/qa_pmt_prims.h new file mode 100644 index 000000000..effb3a097 --- /dev/null +++ b/gruel/src/lib/qa_pmt_prims.h @@ -0,0 +1,67 @@ +/* -*- c++ -*- */ +/* + * Copyright 2006 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ +#ifndef INCLUDED_QA_PMT_PRIMS_H +#define INCLUDED_QA_PMT_PRIMS_H + +#include +#include + +class qa_pmt_prims : public CppUnit::TestCase { + + CPPUNIT_TEST_SUITE(qa_pmt_prims); + CPPUNIT_TEST(test_symbols); + CPPUNIT_TEST(test_booleans); + CPPUNIT_TEST(test_integers); + CPPUNIT_TEST(test_reals); + CPPUNIT_TEST(test_complexes); + CPPUNIT_TEST(test_pairs); + CPPUNIT_TEST(test_vectors); + CPPUNIT_TEST(test_equivalence); + CPPUNIT_TEST(test_misc); + CPPUNIT_TEST(test_dict); + CPPUNIT_TEST(test_any); + CPPUNIT_TEST(test_io); + CPPUNIT_TEST(test_lists); + CPPUNIT_TEST(test_serialize); + CPPUNIT_TEST(test_sets); + CPPUNIT_TEST_SUITE_END(); + + private: + void test_symbols(); + void test_booleans(); + void test_integers(); + void test_reals(); + void test_complexes(); + void test_pairs(); + void test_vectors(); + void test_equivalence(); + void test_misc(); + void test_dict(); + void test_any(); + void test_io(); + void test_lists(); + void test_serialize(); + void test_sets(); +}; + +#endif /* INCLUDED_QA_PMT_PRIMS_H */ + diff --git a/gruel/src/lib/test_pmt.cc b/gruel/src/lib/test_pmt.cc new file mode 100644 index 000000000..034785f4e --- /dev/null +++ b/gruel/src/lib/test_pmt.cc @@ -0,0 +1,37 @@ +/* -*- c++ -*- */ +/* + * Copyright 2006 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include +#include + +int +main(int argc, char **argv) +{ + + CppUnit::TextTestRunner runner; + + runner.addTest(qa_pmt::suite ()); + + bool was_successful = runner.run("", false); + + return was_successful ? 0 : 1; +} diff --git a/gruel/src/lib/unv_qa_template.cc.t b/gruel/src/lib/unv_qa_template.cc.t new file mode 100644 index 000000000..1e2c8e8eb --- /dev/null +++ b/gruel/src/lib/unv_qa_template.cc.t @@ -0,0 +1,35 @@ +void +qa_pmt_unv::test_@TAG@vector() +{ + static const size_t N = 3; + pmt_t v1 = pmt_make_@TAG@vector(N, 0); + CPPUNIT_ASSERT_EQUAL(N, pmt_length(v1)); + @TYPE@ s0 = @TYPE@(10); + @TYPE@ s1 = @TYPE@(20); + @TYPE@ s2 = @TYPE@(30); + + pmt_@TAG@vector_set(v1, 0, s0); + pmt_@TAG@vector_set(v1, 1, s1); + pmt_@TAG@vector_set(v1, 2, s2); + + CPPUNIT_ASSERT_EQUAL(s0, pmt_@TAG@vector_ref(v1, 0)); + CPPUNIT_ASSERT_EQUAL(s1, pmt_@TAG@vector_ref(v1, 1)); + CPPUNIT_ASSERT_EQUAL(s2, pmt_@TAG@vector_ref(v1, 2)); + + CPPUNIT_ASSERT_THROW(pmt_@TAG@vector_ref(v1, N), pmt_out_of_range); + CPPUNIT_ASSERT_THROW(pmt_@TAG@vector_set(v1, N, @TYPE@(0)), pmt_out_of_range); + + size_t len; + const @TYPE@ *rd = pmt_@TAG@vector_elements(v1, len); + CPPUNIT_ASSERT_EQUAL(len, N); + CPPUNIT_ASSERT_EQUAL(s0, rd[0]); + CPPUNIT_ASSERT_EQUAL(s1, rd[1]); + CPPUNIT_ASSERT_EQUAL(s2, rd[2]); + + @TYPE@ *wr = pmt_@TAG@vector_writable_elements(v1, len); + CPPUNIT_ASSERT_EQUAL(len, N); + wr[0] = @TYPE@(0); + CPPUNIT_ASSERT_EQUAL(@TYPE@(0), wr[0]); + CPPUNIT_ASSERT_EQUAL(s1, wr[1]); + CPPUNIT_ASSERT_EQUAL(s2, wr[2]); +} diff --git a/gruel/src/lib/unv_template.cc.t b/gruel/src/lib/unv_template.cc.t new file mode 100644 index 000000000..b19e32d27 --- /dev/null +++ b/gruel/src/lib/unv_template.cc.t @@ -0,0 +1,122 @@ +//////////////////////////////////////////////////////////////////////////// +// pmt_@TAG@vector +//////////////////////////////////////////////////////////////////////////// + +namespace gruel { + +static pmt_@TAG@vector * +_@TAG@vector(pmt_t x) +{ + return dynamic_cast(x.get()); +} + + +pmt_@TAG@vector::pmt_@TAG@vector(size_t k, @TYPE@ fill) + : d_v(k) +{ + for (size_t i = 0; i < k; i++) + d_v[i] = fill; +} + +pmt_@TAG@vector::pmt_@TAG@vector(size_t k, const @TYPE@ *data) + : d_v(k) +{ + for (size_t i = 0; i < k; i++) + d_v[i] = data[i]; +} + +@TYPE@ +pmt_@TAG@vector::ref(size_t k) const +{ + if (k >= length()) + throw pmt_out_of_range("pmt_@TAG@vector_ref", pmt_from_long(k)); + return d_v[k]; +} + +void +pmt_@TAG@vector::set(size_t k, @TYPE@ x) +{ + if (k >= length()) + throw pmt_out_of_range("pmt_@TAG@vector_set", pmt_from_long(k)); + d_v[k] = x; +} + +const @TYPE@ * +pmt_@TAG@vector::elements(size_t &len) +{ + len = length(); + return &d_v[0]; +} + +@TYPE@ * +pmt_@TAG@vector::writable_elements(size_t &len) +{ + len = length(); + return &d_v[0]; +} + +const void* +pmt_@TAG@vector::uniform_elements(size_t &len) +{ + len = length() * sizeof(@TYPE@); + return &d_v[0]; +} + +void* +pmt_@TAG@vector::uniform_writable_elements(size_t &len) +{ + len = length() * sizeof(@TYPE@); + return &d_v[0]; +} + +bool +pmt_is_@TAG@vector(pmt_t obj) +{ + return obj->is_@TAG@vector(); +} + +pmt_t +pmt_make_@TAG@vector(size_t k, @TYPE@ fill) +{ + return pmt_t(new pmt_@TAG@vector(k, fill)); +} + +pmt_t +pmt_init_@TAG@vector(size_t k, const @TYPE@ *data) +{ + return pmt_t(new pmt_@TAG@vector(k, data)); +} + +@TYPE@ +pmt_@TAG@vector_ref(pmt_t vector, size_t k) +{ + if (!vector->is_@TAG@vector()) + throw pmt_wrong_type("pmt_@TAG@vector_ref", vector); + return _@TAG@vector(vector)->ref(k); +} + +void +pmt_@TAG@vector_set(pmt_t vector, size_t k, @TYPE@ obj) +{ + if (!vector->is_@TAG@vector()) + throw pmt_wrong_type("pmt_@TAG@vector_set", vector); + _@TAG@vector(vector)->set(k, obj); +} + +const @TYPE@ * +pmt_@TAG@vector_elements(pmt_t vector, size_t &len) +{ + if (!vector->is_@TAG@vector()) + throw pmt_wrong_type("pmt_@TAG@vector_elements", vector); + return _@TAG@vector(vector)->elements(len); +} + +@TYPE@ * +pmt_@TAG@vector_writable_elements(pmt_t vector, size_t &len) +{ + if (!vector->is_@TAG@vector()) + throw pmt_wrong_type("pmt_@TAG@vector_writable_elements", vector); + return _@TAG@vector(vector)->writable_elements(len); +} + +} /* namespace gruel */ diff --git a/gruel/src/lib/unv_template.h.t b/gruel/src/lib/unv_template.h.t new file mode 100644 index 000000000..83ba0be0f --- /dev/null +++ b/gruel/src/lib/unv_template.h.t @@ -0,0 +1,23 @@ + +//////////////////////////////////////////////////////////////////////////// +// pmt_@TAG@vector +//////////////////////////////////////////////////////////////////////////// + +class pmt_@TAG@vector : public pmt_uniform_vector +{ + std::vector< @TYPE@ > d_v; + +public: + pmt_@TAG@vector(size_t k, @TYPE@ fill); + pmt_@TAG@vector(size_t k, const @TYPE@ *data); + // ~pmt_@TAG@vector(); + + bool is_@TAG@vector() const { return true; } + size_t length() const { return d_v.size(); } + @TYPE@ ref(size_t k) const; + void set(size_t k, @TYPE@ x); + const @TYPE@ *elements(size_t &len); + @TYPE@ *writable_elements(size_t &len); + const void *uniform_elements(size_t &len); + void *uniform_writable_elements(size_t &len); +}; -- cgit From 2bf2a8f2d2a4477818bfa91cae64fb663fdf88c3 Mon Sep 17 00:00:00 2001 From: jcorgan Date: Sun, 26 Jul 2009 20:01:02 +0000 Subject: Merged r11491:11494 from jcorgan/pmt into trunk. Moves pmt types functions into pmt:: from gruel:: Trunk passes distcheck. git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@11495 221aa14e-8319-0410-a670-987f0aec2ac5 --- gruel/src/lib/Makefile.am | 79 +-- gruel/src/lib/generate_unv.py | 190 ------ gruel/src/lib/pmt.cc | 1041 -------------------------------- gruel/src/lib/pmt/Makefile.am | 111 ++++ gruel/src/lib/pmt/generate_unv.py | 190 ++++++ gruel/src/lib/pmt/pmt.cc | 1041 ++++++++++++++++++++++++++++++++ gruel/src/lib/pmt/pmt_int.h | 227 +++++++ gruel/src/lib/pmt/pmt_io.cc | 141 +++++ gruel/src/lib/pmt/pmt_pool.cc | 112 ++++ gruel/src/lib/pmt/pmt_serialize.cc | 357 +++++++++++ gruel/src/lib/pmt/qa_pmt.cc | 40 ++ gruel/src/lib/pmt/qa_pmt.h | 36 ++ gruel/src/lib/pmt/qa_pmt_prims.cc | 438 ++++++++++++++ gruel/src/lib/pmt/qa_pmt_prims.h | 67 ++ gruel/src/lib/pmt/test_pmt.cc | 37 ++ gruel/src/lib/pmt/unv_qa_template.cc.t | 35 ++ gruel/src/lib/pmt/unv_template.cc.t | 122 ++++ gruel/src/lib/pmt/unv_template.h.t | 23 + gruel/src/lib/pmt_int.h | 227 ------- gruel/src/lib/pmt_io.cc | 141 ----- gruel/src/lib/pmt_pool.cc | 112 ---- gruel/src/lib/pmt_serialize.cc | 357 ----------- gruel/src/lib/qa_pmt.cc | 40 -- gruel/src/lib/qa_pmt.h | 36 -- gruel/src/lib/qa_pmt_prims.cc | 438 -------------- gruel/src/lib/qa_pmt_prims.h | 67 -- gruel/src/lib/test_pmt.cc | 37 -- gruel/src/lib/unv_qa_template.cc.t | 35 -- gruel/src/lib/unv_template.cc.t | 122 ---- gruel/src/lib/unv_template.h.t | 23 - 30 files changed, 2981 insertions(+), 2941 deletions(-) delete mode 100755 gruel/src/lib/generate_unv.py delete mode 100644 gruel/src/lib/pmt.cc create mode 100644 gruel/src/lib/pmt/Makefile.am create mode 100755 gruel/src/lib/pmt/generate_unv.py create mode 100644 gruel/src/lib/pmt/pmt.cc create mode 100644 gruel/src/lib/pmt/pmt_int.h create mode 100644 gruel/src/lib/pmt/pmt_io.cc create mode 100644 gruel/src/lib/pmt/pmt_pool.cc create mode 100644 gruel/src/lib/pmt/pmt_serialize.cc create mode 100644 gruel/src/lib/pmt/qa_pmt.cc create mode 100644 gruel/src/lib/pmt/qa_pmt.h create mode 100644 gruel/src/lib/pmt/qa_pmt_prims.cc create mode 100644 gruel/src/lib/pmt/qa_pmt_prims.h create mode 100644 gruel/src/lib/pmt/test_pmt.cc create mode 100644 gruel/src/lib/pmt/unv_qa_template.cc.t create mode 100644 gruel/src/lib/pmt/unv_template.cc.t create mode 100644 gruel/src/lib/pmt/unv_template.h.t delete mode 100644 gruel/src/lib/pmt_int.h delete mode 100644 gruel/src/lib/pmt_io.cc delete mode 100644 gruel/src/lib/pmt_pool.cc delete mode 100644 gruel/src/lib/pmt_serialize.cc delete mode 100644 gruel/src/lib/qa_pmt.cc delete mode 100644 gruel/src/lib/qa_pmt.h delete mode 100644 gruel/src/lib/qa_pmt_prims.cc delete mode 100644 gruel/src/lib/qa_pmt_prims.h delete mode 100644 gruel/src/lib/test_pmt.cc delete mode 100644 gruel/src/lib/unv_qa_template.cc.t delete mode 100644 gruel/src/lib/unv_template.cc.t delete mode 100644 gruel/src/lib/unv_template.h.t (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/Makefile.am b/gruel/src/lib/Makefile.am index 2a968d25f..bf1ae731a 100644 --- a/gruel/src/lib/Makefile.am +++ b/gruel/src/lib/Makefile.am @@ -21,9 +21,9 @@ include $(top_srcdir)/Makefile.common -AM_CPPFLAGS = $(DEFINES) $(BOOST_CPPFLAGS) $(CPPUNIT_INCLUDES) $(GRUEL_INCLUDES) $(WITH_INCLUDES) +SUBDIRS = pmt -TESTS = test_pmt +AM_CPPFLAGS = $(DEFINES) $(BOOST_CPPFLAGS) $(CPPUNIT_INCLUDES) $(GRUEL_INCLUDES) $(WITH_INCLUDES) lib_LTLIBRARIES = libgruel.la @@ -31,38 +31,11 @@ lib_LTLIBRARIES = libgruel.la libgruel_la_LDFLAGS = $(NO_UNDEFINED) $(BOOST_LDFLAGS) -version-info 0:0:0 # ---------------------------------------------------------------- -# these scripts generate code - -code_generator = \ - generate_unv.py \ - unv_template.h.t \ - unv_template.cc.t \ - unv_qa_template.cc.t - -GENERATED_H = \ - pmt_unv_int.h \ - qa_pmt_unv.h - -GENERATED_CC = \ - pmt_unv.cc \ - qa_pmt_unv.cc - -python_built_sources = $(GENERATED_H) $(GENERATED_CC) -PMT_SERIAL_TAGS_H = $(abs_top_builddir)/gruel/src/include/gruel/pmt_serial_tags.h -BUILT_SOURCES = $(python_built_sources) $(PMT_SERIAL_TAGS_H) - -EXTRA_DIST = $(code_generator) - -# ---------------------------------------------------------------- +PMT_LIB = pmt/libpmt.la # These are the source files that go into the gruel shared library libgruel_la_SOURCES = \ - pmt.cc \ - pmt_io.cc \ - pmt_pool.cc \ - pmt_serialize.cc \ - pmt_unv.cc \ realtime.cc \ sys_pri.cc \ thread_body_wrapper.cc \ @@ -70,51 +43,7 @@ libgruel_la_SOURCES = \ libgruel_la_LIBADD = \ $(BOOST_THREAD_LIB) \ + $(PMT_LIB) \ -lstdc++ -noinst_HEADERS = \ - $(GENERATED_H) \ - pmt_int.h \ - qa_pmt.h \ - qa_pmt_prims.h - -# Build the qa code into its own library - -noinst_LTLIBRARIES = libpmt-qa.la - -libpmt_qa_la_SOURCES = \ - qa_pmt.cc \ - qa_pmt_prims.cc \ - qa_pmt_unv.cc - -# magic flags -libpmt_qa_la_LDFLAGS = $(NO_UNDEFINED) -avoid version - -libpmt_qa_la_LIBADD = \ - libgruel.la \ - $(CPPUNIT_LIBS) \ - -lstdc++ - -noinst_PROGRAMS = \ - test_pmt - - -LIBGRUEL = libgruel.la -LIBPMTQA = libpmt-qa.la $(LIBGRUEL) - -test_pmt_SOURCES = test_pmt.cc -test_pmt_LDADD = $(LIBPMTQA) - -# Do creation and inclusion of other Makefiles last - -# common way for generating sources from templates when using -# BUILT_SOURCES, using parallel build protection. -gen_sources = $(python_built_sources) -gen_sources_deps = $(core_generator) -par_gen_command = PYTHONPATH=$(top_srcdir)/gruel/src/lib srcdir=$(srcdir) $(PYTHON) $(srcdir)/generate_unv.py -include $(top_srcdir)/Makefile.par.gen -# Rule to create the build header file using GUILE -# Doesn't need parallel protections because there is a single target -$(PMT_SERIAL_TAGS_H): $(srcdir)/../scheme/gnuradio/gen-serial-tags.scm $(srcdir)/../scheme/gnuradio/pmt-serial-tags.scm - $(RUN_GUILE) $(srcdir)/../scheme/gnuradio/gen-serial-tags.scm $(srcdir)/../scheme/gnuradio/pmt-serial-tags.scm $(PMT_SERIAL_TAGS_H) diff --git a/gruel/src/lib/generate_unv.py b/gruel/src/lib/generate_unv.py deleted file mode 100755 index 3a7305b40..000000000 --- a/gruel/src/lib/generate_unv.py +++ /dev/null @@ -1,190 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2006 Free Software Foundation, Inc. -# -# This file is part of GNU Radio -# -# GNU Radio is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3, or (at your option) -# any later version. -# -# GNU Radio is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Radio; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, -# Boston, MA 02110-1301, USA. -# - -""" -Generate code for uniform numeric vectors -""" - -import re, os, os.path - - -unv_types = ( - ('u8', 'uint8_t'), - ('s8', 'int8_t'), - ('u16', 'uint16_t'), - ('s16', 'int16_t'), - ('u32', 'uint32_t'), - ('s32', 'int32_t'), - ('u64', 'uint64_t'), - ('s64', 'int64_t'), - ('f32', 'float'), - ('f64', 'double'), - ('c32', 'std::complex'), - ('c64', 'std::complex') - ) - -header = """\ -/* -*- c++ -*- */ -/* - * Copyright 2006,2009 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ -""" - -guard_tail = """ -#endif -""" - -includes = """ -#ifdef HAVE_CONFIG_H -#include -#endif -#include -#include -#include "pmt_int.h" -""" - -qa_includes = """ -#include -#include -#include -#include - -using namespace gruel; -""" - - -# set srcdir to the directory that contains Makefile.am -try: - srcdir = os.environ['srcdir'] -except KeyError, e: - srcdir = "." -srcdir = srcdir + '/' - - -def open_src (name, mode): - global srcdir - return open(os.path.join (srcdir, name), mode) - - -def guard_name(filename): - return 'INCLUDED_' + re.sub('\.', '_', filename.upper()) - -def guard_head(filename): - guard = guard_name(filename) - return """ -#ifndef %s -#define %s -""" % (guard, guard) - - -def do_substitution (d, input, out_file): - def repl (match_obj): - key = match_obj.group (1) - # print key - return d[key] - - out = re.sub (r"@([a-zA-Z0-9_]+)@", repl, input) - out_file.write (out) - - -def generate_h(): - template = open_src('unv_template.h.t', 'r').read() - output_filename = 'pmt_unv_int.h' - output = open(output_filename, 'w') - output.write(header) - output.write(guard_head(output_filename)) - for tag, typ in unv_types: - d = { 'TAG' : tag, 'TYPE' : typ } - do_substitution(d, template, output) - output.write(guard_tail) - -def generate_cc(): - template = open_src('unv_template.cc.t', 'r').read() - output = open('pmt_unv.cc', 'w') - output.write(header) - output.write(includes) - for tag, typ in unv_types: - d = { 'TAG' : tag, 'TYPE' : typ } - do_substitution(d, template, output) - - -def generate_qa_h(): - output_filename = 'qa_pmt_unv.h' - output = open(output_filename, 'w') - output.write(header) - output.write(guard_head(output_filename)) - - output.write(''' -#include -#include - -class qa_pmt_unv : public CppUnit::TestCase { - - CPPUNIT_TEST_SUITE(qa_pmt_unv); -''') - for tag, typ in unv_types: - output.write(' CPPUNIT_TEST(test_%svector);\n' % (tag,)) - output.write('''\ - CPPUNIT_TEST_SUITE_END(); - - private: -''') - for tag, typ in unv_types: - output.write(' void test_%svector();\n' % (tag,)) - output.write('};\n') - output.write(guard_tail) - -def generate_qa_cc(): - template = open_src('unv_qa_template.cc.t', 'r').read() - output = open('qa_pmt_unv.cc', 'w') - output.write(header) - output.write(qa_includes) - for tag, typ in unv_types: - d = { 'TAG' : tag, 'TYPE' : typ } - do_substitution(d, template, output) - - -def main(): - generate_h() - generate_cc() - generate_qa_h() - generate_qa_cc() - -if __name__ == '__main__': - main() diff --git a/gruel/src/lib/pmt.cc b/gruel/src/lib/pmt.cc deleted file mode 100644 index 8e0c01625..000000000 --- a/gruel/src/lib/pmt.cc +++ /dev/null @@ -1,1041 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2006 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif -#include -#include -#include "pmt_int.h" -#include -#include -#include - -namespace gruel { - -static const int CACHE_LINE_SIZE = 64; // good guess - -# if (PMT_LOCAL_ALLOCATOR) - -static pmt_pool global_pmt_pool(sizeof(pmt_pair), CACHE_LINE_SIZE); - -void * -pmt_base::operator new(size_t size) -{ - void *p = global_pmt_pool.malloc(); - - // fprintf(stderr, "pmt_base::new p = %p\n", p); - assert((reinterpret_cast(p) & (CACHE_LINE_SIZE - 1)) == 0); - return p; -} - -void -pmt_base::operator delete(void *p, size_t size) -{ - global_pmt_pool.free(p); -} - -#endif - - -pmt_base::~pmt_base() -{ - // nop -- out of line virtual destructor -} - -//////////////////////////////////////////////////////////////////////////// -// Exceptions -//////////////////////////////////////////////////////////////////////////// - -pmt_exception::pmt_exception(const std::string &msg, pmt_t obj) - : logic_error(msg + ": " + pmt_write_string(obj)) -{ -} - -pmt_wrong_type::pmt_wrong_type(const std::string &msg, pmt_t obj) - : pmt_exception(msg + ": wrong_type ", obj) -{ -} - -pmt_out_of_range::pmt_out_of_range(const std::string &msg, pmt_t obj) - : pmt_exception(msg + ": out of range ", obj) -{ -} - -pmt_notimplemented::pmt_notimplemented(const std::string &msg, pmt_t obj) - : pmt_exception(msg + ": notimplemented ", obj) -{ -} - -//////////////////////////////////////////////////////////////////////////// -// Dynamic Casts -//////////////////////////////////////////////////////////////////////////// - -static pmt_symbol * -_symbol(pmt_t x) -{ - return dynamic_cast(x.get()); -} - -static pmt_integer * -_integer(pmt_t x) -{ - return dynamic_cast(x.get()); -} - -static pmt_real * -_real(pmt_t x) -{ - return dynamic_cast(x.get()); -} - -static pmt_complex * -_complex(pmt_t x) -{ - return dynamic_cast(x.get()); -} - -static pmt_pair * -_pair(pmt_t x) -{ - return dynamic_cast(x.get()); -} - -static pmt_vector * -_vector(pmt_t x) -{ - return dynamic_cast(x.get()); -} - -static pmt_uniform_vector * -_uniform_vector(pmt_t x) -{ - return dynamic_cast(x.get()); -} - -static pmt_dict * -_dict(pmt_t x) -{ - return dynamic_cast(x.get()); -} - -static pmt_any * -_any(pmt_t x) -{ - return dynamic_cast(x.get()); -} - -//////////////////////////////////////////////////////////////////////////// -// Globals -//////////////////////////////////////////////////////////////////////////// - -const pmt_t PMT_T = pmt_t(new pmt_bool()); // singleton -const pmt_t PMT_F = pmt_t(new pmt_bool()); // singleton -const pmt_t PMT_NIL = pmt_t(new pmt_null()); // singleton -const pmt_t PMT_EOF = pmt_cons(PMT_NIL, PMT_NIL); // singleton - -//////////////////////////////////////////////////////////////////////////// -// Booleans -//////////////////////////////////////////////////////////////////////////// - -pmt_bool::pmt_bool(){} - -bool -pmt_is_true(pmt_t obj) -{ - return obj != PMT_F; -} - -bool -pmt_is_false(pmt_t obj) -{ - return obj == PMT_F; -} - -bool -pmt_is_bool(pmt_t obj) -{ - return obj->is_bool(); -} - -pmt_t -pmt_from_bool(bool val) -{ - return val ? PMT_T : PMT_F; -} - -bool -pmt_to_bool(pmt_t val) -{ - if (val == PMT_T) - return true; - if (val == PMT_F) - return false; - throw pmt_wrong_type("pmt_to_bool", val); -} - -//////////////////////////////////////////////////////////////////////////// -// Symbols -//////////////////////////////////////////////////////////////////////////// - -static const unsigned int SYMBOL_HASH_TABLE_SIZE = 701; -static std::vector s_symbol_hash_table(SYMBOL_HASH_TABLE_SIZE); - -pmt_symbol::pmt_symbol(const std::string &name) : d_name(name){} - - -static unsigned int -hash_string(const std::string &s) -{ - unsigned int h = 0; - unsigned int g = 0; - - for (std::string::const_iterator p = s.begin(); p != s.end(); ++p){ - h = (h << 4) + (*p & 0xff); - g = h & 0xf0000000; - if (g){ - h = h ^ (g >> 24); - h = h ^ g; - } - } - return h; -} - -bool -pmt_is_symbol(const pmt_t& obj) -{ - return obj->is_symbol(); -} - -pmt_t -pmt_string_to_symbol(const std::string &name) -{ - unsigned hash = hash_string(name) % SYMBOL_HASH_TABLE_SIZE; - - // Does a symbol with this name already exist? - for (pmt_t sym = s_symbol_hash_table[hash]; sym; sym = _symbol(sym)->next()){ - if (name == _symbol(sym)->name()) - return sym; // Yes. Return it - } - - // Nope. Make a new one. - pmt_t sym = pmt_t(new pmt_symbol(name)); - _symbol(sym)->set_next(s_symbol_hash_table[hash]); - s_symbol_hash_table[hash] = sym; - return sym; -} - -// alias... -pmt_t -pmt_intern(const std::string &name) -{ - return pmt_string_to_symbol(name); -} - -const std::string -pmt_symbol_to_string(const pmt_t& sym) -{ - if (!sym->is_symbol()) - throw pmt_wrong_type("pmt_symbol_to_string", sym); - - return _symbol(sym)->name(); -} - - - -//////////////////////////////////////////////////////////////////////////// -// Number -//////////////////////////////////////////////////////////////////////////// - -bool -pmt_is_number(pmt_t x) -{ - return x->is_number(); -} - -//////////////////////////////////////////////////////////////////////////// -// Integer -//////////////////////////////////////////////////////////////////////////// - -pmt_integer::pmt_integer(long value) : d_value(value) {} - -bool -pmt_is_integer(pmt_t x) -{ - return x->is_integer(); -} - - -pmt_t -pmt_from_long(long x) -{ - return pmt_t(new pmt_integer(x)); -} - -long -pmt_to_long(pmt_t x) -{ - pmt_integer* i = dynamic_cast(x.get()); - if ( i ) - return i->value(); - - throw pmt_wrong_type("pmt_to_long", x); -} - -//////////////////////////////////////////////////////////////////////////// -// Real -//////////////////////////////////////////////////////////////////////////// - -pmt_real::pmt_real(double value) : d_value(value) {} - -bool -pmt_is_real(pmt_t x) -{ - return x->is_real(); -} - -pmt_t -pmt_from_double(double x) -{ - return pmt_t(new pmt_real(x)); -} - -double -pmt_to_double(pmt_t x) -{ - if (x->is_real()) - return _real(x)->value(); - if (x->is_integer()) - return _integer(x)->value(); - - throw pmt_wrong_type("pmt_to_double", x); -} - -//////////////////////////////////////////////////////////////////////////// -// Complex -//////////////////////////////////////////////////////////////////////////// - -pmt_complex::pmt_complex(std::complex value) : d_value(value) {} - -bool -pmt_is_complex(pmt_t x) -{ - return x->is_complex(); -} - -pmt_t -pmt_make_rectangular(double re, double im) -{ - return pmt_t(new pmt_complex(std::complex(re, im))); -} - -std::complex -pmt_to_complex(pmt_t x) -{ - if (x->is_complex()) - return _complex(x)->value(); - if (x->is_real()) - return _real(x)->value(); - if (x->is_integer()) - return _integer(x)->value(); - - throw pmt_wrong_type("pmt_to_complex", x); -} - -//////////////////////////////////////////////////////////////////////////// -// Pairs -//////////////////////////////////////////////////////////////////////////// - -pmt_null::pmt_null() {} -pmt_pair::pmt_pair(const pmt_t& car, const pmt_t& cdr) : d_car(car), d_cdr(cdr) {} - -bool -pmt_is_null(const pmt_t& x) -{ - return x == PMT_NIL; -} - -bool -pmt_is_pair(const pmt_t& obj) -{ - return obj->is_pair(); -} - -pmt_t -pmt_cons(const pmt_t& x, const pmt_t& y) -{ - return pmt_t(new pmt_pair(x, y)); -} - -pmt_t -pmt_car(const pmt_t& pair) -{ - pmt_pair* p = dynamic_cast(pair.get()); - if ( p ) - return p->car(); - - throw pmt_wrong_type("pmt_car", pair); -} - -pmt_t -pmt_cdr(const pmt_t& pair) -{ - pmt_pair* p = dynamic_cast(pair.get()); - if ( p ) - return p->cdr(); - - throw pmt_wrong_type("pmt_cdr", pair); -} - -void -pmt_set_car(pmt_t pair, pmt_t obj) -{ - if (pair->is_pair()) - _pair(pair)->set_car(obj); - else - throw pmt_wrong_type("pmt_set_car", pair); -} - -void -pmt_set_cdr(pmt_t pair, pmt_t obj) -{ - if (pair->is_pair()) - _pair(pair)->set_cdr(obj); - else - throw pmt_wrong_type("pmt_set_cdr", pair); -} - -//////////////////////////////////////////////////////////////////////////// -// Vectors -//////////////////////////////////////////////////////////////////////////// - -pmt_vector::pmt_vector(size_t len, pmt_t fill) - : d_v(len) -{ - for (size_t i = 0; i < len; i++) - d_v[i] = fill; -} - -pmt_t -pmt_vector::ref(size_t k) const -{ - if (k >= length()) - throw pmt_out_of_range("pmt_vector_ref", pmt_from_long(k)); - return d_v[k]; -} - -void -pmt_vector::set(size_t k, pmt_t obj) -{ - if (k >= length()) - throw pmt_out_of_range("pmt_vector_set", pmt_from_long(k)); - d_v[k] = obj; -} - -void -pmt_vector::fill(pmt_t obj) -{ - for (size_t i = 0; i < length(); i++) - d_v[i] = obj; -} - -bool -pmt_is_vector(pmt_t obj) -{ - return obj->is_vector(); -} - -pmt_t -pmt_make_vector(size_t k, pmt_t fill) -{ - return pmt_t(new pmt_vector(k, fill)); -} - -pmt_t -pmt_vector_ref(pmt_t vector, size_t k) -{ - if (!vector->is_vector()) - throw pmt_wrong_type("pmt_vector_ref", vector); - return _vector(vector)->ref(k); -} - -void -pmt_vector_set(pmt_t vector, size_t k, pmt_t obj) -{ - if (!vector->is_vector()) - throw pmt_wrong_type("pmt_vector_set", vector); - _vector(vector)->set(k, obj); -} - -void -pmt_vector_fill(pmt_t vector, pmt_t obj) -{ - if (!vector->is_vector()) - throw pmt_wrong_type("pmt_vector_set", vector); - _vector(vector)->fill(obj); -} - -//////////////////////////////////////////////////////////////////////////// -// Uniform Numeric Vectors -//////////////////////////////////////////////////////////////////////////// - -bool -pmt_is_uniform_vector(pmt_t x) -{ - return x->is_uniform_vector(); -} - -const void * -pmt_uniform_vector_elements(pmt_t vector, size_t &len) -{ - if (!vector->is_uniform_vector()) - throw pmt_wrong_type("pmt_uniform_vector_elements", vector); - return _uniform_vector(vector)->uniform_elements(len); -} - -void * -pmt_uniform_vector_writable_elements(pmt_t vector, size_t &len) -{ - if (!vector->is_uniform_vector()) - throw pmt_wrong_type("pmt_uniform_vector_writable_elements", vector); - return _uniform_vector(vector)->uniform_writable_elements(len); -} - -//////////////////////////////////////////////////////////////////////////// -// Dictionaries -//////////////////////////////////////////////////////////////////////////// - -pmt_dict::pmt_dict() - : d_alist(PMT_NIL) -{ -} - -void -pmt_dict::set(pmt_t key, pmt_t value) -{ - pmt_t p = pmt_assv(key, d_alist); // look for (key . value) pair - if (pmt_is_pair(p)){ // found existing pair... - pmt_set_cdr(p, value); // overrwrite cdr with new value - } - else { // not in the dict - d_alist = pmt_cons(pmt_cons(key, value), d_alist); // add new (key . value) pair - } -} - -pmt_t -pmt_dict::ref(pmt_t key, pmt_t not_found) const -{ - pmt_t p = pmt_assv(key, d_alist); // look for (key . value) pair - if (pmt_is_pair(p)) - return pmt_cdr(p); - else - return not_found; -} - -bool -pmt_dict::has_key(pmt_t key) const -{ - return pmt_is_pair(pmt_assv(key, d_alist)); -} - -pmt_t -pmt_dict::items() const -{ - return d_alist; -} - -pmt_t -pmt_dict::keys() const -{ - return pmt_map(pmt_car, d_alist); -} - -pmt_t -pmt_dict::values() const -{ - return pmt_map(pmt_cdr, d_alist); -} - -bool -pmt_is_dict(pmt_t obj) -{ - return obj->is_dict(); -} - -pmt_t -pmt_make_dict() -{ - return pmt_t(new pmt_dict()); -} - -void -pmt_dict_set(pmt_t dict, pmt_t key, pmt_t value) -{ - pmt_dict* d = _dict(dict); - if (!d) - throw pmt_wrong_type("pmt_dict_set", dict); - - d->set(key, value); -} - -bool -pmt_dict_has_key(pmt_t dict, pmt_t key) -{ - pmt_dict* d = _dict(dict); - if (!d) - throw pmt_wrong_type("pmt_dict_has_key", dict); - - return d->has_key(key); -} - -pmt_t -pmt_dict_ref(pmt_t dict, pmt_t key, pmt_t not_found) -{ - pmt_dict* d = _dict(dict); - if (!d) - throw pmt_wrong_type("pmt_dict_ref", dict); - - return d->ref(key, not_found); -} - -pmt_t -pmt_dict_items(pmt_t dict) -{ - if (!dict->is_dict()) - throw pmt_wrong_type("pmt_dict_items", dict); - - return _dict(dict)->items(); -} - -pmt_t -pmt_dict_keys(pmt_t dict) -{ - if (!dict->is_dict()) - throw pmt_wrong_type("pmt_dict_keys", dict); - - return _dict(dict)->keys(); -} - -pmt_t -pmt_dict_values(pmt_t dict) -{ - if (!dict->is_dict()) - throw pmt_wrong_type("pmt_dict_values", dict); - - return _dict(dict)->values(); -} - -//////////////////////////////////////////////////////////////////////////// -// Any -//////////////////////////////////////////////////////////////////////////// - -pmt_any::pmt_any(const boost::any &any) : d_any(any) {} - -bool -pmt_is_any(pmt_t obj) -{ - return obj->is_any(); -} - -pmt_t -pmt_make_any(const boost::any &any) -{ - return pmt_t(new pmt_any(any)); -} - -boost::any -pmt_any_ref(pmt_t obj) -{ - if (!obj->is_any()) - throw pmt_wrong_type("pmt_any_ref", obj); - return _any(obj)->ref(); -} - -void -pmt_any_set(pmt_t obj, const boost::any &any) -{ - if (!obj->is_any()) - throw pmt_wrong_type("pmt_any_set", obj); - _any(obj)->set(any); -} - -//////////////////////////////////////////////////////////////////////////// -// General Functions -//////////////////////////////////////////////////////////////////////////// - -bool -pmt_eq(const pmt_t& x, const pmt_t& y) -{ - return x == y; -} - -bool -pmt_eqv(const pmt_t& x, const pmt_t& y) -{ - if (x == y) - return true; - - if (x->is_integer() && y->is_integer()) - return _integer(x)->value() == _integer(y)->value(); - - if (x->is_real() && y->is_real()) - return _real(x)->value() == _real(y)->value(); - - if (x->is_complex() && y->is_complex()) - return _complex(x)->value() == _complex(y)->value(); - - return false; -} - -bool -pmt_equal(const pmt_t& x, const pmt_t& y) -{ - if (pmt_eqv(x, y)) - return true; - - if (x->is_pair() && y->is_pair()) - return pmt_equal(pmt_car(x), pmt_car(y)) && pmt_equal(pmt_cdr(x), pmt_cdr(y)); - - if (x->is_vector() && y->is_vector()){ - pmt_vector *xv = _vector(x); - pmt_vector *yv = _vector(y); - if (xv->length() != yv->length()) - return false; - - for (unsigned i = 0; i < xv->length(); i++) - if (!pmt_equal(xv->_ref(i), yv->_ref(i))) - return false; - - return true; - } - - if (x->is_uniform_vector() && y->is_uniform_vector()){ - pmt_uniform_vector *xv = _uniform_vector(x); - pmt_uniform_vector *yv = _uniform_vector(y); - if (xv->length() != yv->length()) - return false; - - size_t len_x, len_y; - if (memcmp(xv->uniform_elements(len_x), - yv->uniform_elements(len_y), - len_x) == 0) - return true; - - return true; - } - - // FIXME add other cases here... - - return false; -} - -size_t -pmt_length(const pmt_t& x) -{ - if (x->is_vector()) - return _vector(x)->length(); - - if (x->is_uniform_vector()) - return _uniform_vector(x)->length(); - - if (x->is_null()) return 0; - - if (x->is_pair()) { - size_t length=1; - pmt_t it = pmt_cdr(x); - while (pmt_is_pair(it)){ - length++; - it = pmt_cdr(it); - } - if (pmt_is_null(it)) - return length; - - // not a proper list - throw pmt_wrong_type("pmt_length", x); - } - - // FIXME dictionary length (number of entries) - - throw pmt_wrong_type("pmt_length", x); -} - -pmt_t -pmt_assq(pmt_t obj, pmt_t alist) -{ - while (pmt_is_pair(alist)){ - pmt_t p = pmt_car(alist); - if (!pmt_is_pair(p)) // malformed alist - return PMT_F; - - if (pmt_eq(obj, pmt_car(p))) - return p; - - alist = pmt_cdr(alist); - } - return PMT_F; -} - -pmt_t -pmt_assv(pmt_t obj, pmt_t alist) -{ - while (pmt_is_pair(alist)){ - pmt_t p = pmt_car(alist); - if (!pmt_is_pair(p)) // malformed alist - return PMT_F; - - if (pmt_eqv(obj, pmt_car(p))) - return p; - - alist = pmt_cdr(alist); - } - return PMT_F; -} - -pmt_t -pmt_assoc(pmt_t obj, pmt_t alist) -{ - while (pmt_is_pair(alist)){ - pmt_t p = pmt_car(alist); - if (!pmt_is_pair(p)) // malformed alist - return PMT_F; - - if (pmt_equal(obj, pmt_car(p))) - return p; - - alist = pmt_cdr(alist); - } - return PMT_F; -} - -pmt_t -pmt_map(pmt_t proc(const pmt_t&), pmt_t list) -{ - pmt_t r = PMT_NIL; - - while(pmt_is_pair(list)){ - r = pmt_cons(proc(pmt_car(list)), r); - list = pmt_cdr(list); - } - - return pmt_reverse_x(r); -} - -pmt_t -pmt_reverse(pmt_t listx) -{ - pmt_t list = listx; - pmt_t r = PMT_NIL; - - while(pmt_is_pair(list)){ - r = pmt_cons(pmt_car(list), r); - list = pmt_cdr(list); - } - if (pmt_is_null(list)) - return r; - else - throw pmt_wrong_type("pmt_reverse", listx); -} - -pmt_t -pmt_reverse_x(pmt_t list) -{ - // FIXME do it destructively - return pmt_reverse(list); -} - -pmt_t -pmt_nth(size_t n, pmt_t list) -{ - pmt_t t = pmt_nthcdr(n, list); - if (pmt_is_pair(t)) - return pmt_car(t); - else - return PMT_NIL; -} - -pmt_t -pmt_nthcdr(size_t n, pmt_t list) -{ - if (!(pmt_is_pair(list) || pmt_is_null(list))) - throw pmt_wrong_type("pmt_nthcdr", list); - - while (n > 0){ - if (pmt_is_pair(list)){ - list = pmt_cdr(list); - n--; - continue; - } - if (pmt_is_null(list)) - return PMT_NIL; - else - throw pmt_wrong_type("pmt_nthcdr: not a LIST", list); - } - return list; -} - -pmt_t -pmt_memq(pmt_t obj, pmt_t list) -{ - while (pmt_is_pair(list)){ - if (pmt_eq(obj, pmt_car(list))) - return list; - list = pmt_cdr(list); - } - return PMT_F; -} - -pmt_t -pmt_memv(pmt_t obj, pmt_t list) -{ - while (pmt_is_pair(list)){ - if (pmt_eqv(obj, pmt_car(list))) - return list; - list = pmt_cdr(list); - } - return PMT_F; -} - -pmt_t -pmt_member(pmt_t obj, pmt_t list) -{ - while (pmt_is_pair(list)){ - if (pmt_equal(obj, pmt_car(list))) - return list; - list = pmt_cdr(list); - } - return PMT_F; -} - -bool -pmt_subsetp(pmt_t list1, pmt_t list2) -{ - while (pmt_is_pair(list1)){ - pmt_t p = pmt_car(list1); - if (pmt_is_false(pmt_memv(p, list2))) - return false; - list1 = pmt_cdr(list1); - } - return true; -} - -pmt_t -pmt_list1(const pmt_t& x1) -{ - return pmt_cons(x1, PMT_NIL); -} - -pmt_t -pmt_list2(const pmt_t& x1, const pmt_t& x2) -{ - return pmt_cons(x1, pmt_cons(x2, PMT_NIL)); -} - -pmt_t -pmt_list3(const pmt_t& x1, const pmt_t& x2, const pmt_t& x3) -{ - return pmt_cons(x1, pmt_cons(x2, pmt_cons(x3, PMT_NIL))); -} - -pmt_t -pmt_list4(const pmt_t& x1, const pmt_t& x2, const pmt_t& x3, const pmt_t& x4) -{ - return pmt_cons(x1, pmt_cons(x2, pmt_cons(x3, pmt_cons(x4, PMT_NIL)))); -} - -pmt_t -pmt_list5(const pmt_t& x1, const pmt_t& x2, const pmt_t& x3, const pmt_t& x4, const pmt_t& x5) -{ - return pmt_cons(x1, pmt_cons(x2, pmt_cons(x3, pmt_cons(x4, pmt_cons(x5, PMT_NIL))))); -} - -pmt_t -pmt_list6(const pmt_t& x1, const pmt_t& x2, const pmt_t& x3, const pmt_t& x4, const pmt_t& x5, const pmt_t& x6) -{ - return pmt_cons(x1, pmt_cons(x2, pmt_cons(x3, pmt_cons(x4, pmt_cons(x5, pmt_cons(x6, PMT_NIL)))))); -} - -pmt_t -pmt_list_add(pmt_t list, const pmt_t& item) -{ - return pmt_reverse(pmt_cons(item, pmt_reverse(list))); -} - -pmt_t -pmt_caar(pmt_t pair) -{ - return (pmt_car(pmt_car(pair))); -} - -pmt_t -pmt_cadr(pmt_t pair) -{ - return pmt_car(pmt_cdr(pair)); -} - -pmt_t -pmt_cdar(pmt_t pair) -{ - return pmt_cdr(pmt_car(pair)); -} - -pmt_t -pmt_cddr(pmt_t pair) -{ - return pmt_cdr(pmt_cdr(pair)); -} - -pmt_t -pmt_caddr(pmt_t pair) -{ - return pmt_car(pmt_cdr(pmt_cdr(pair))); -} - -pmt_t -pmt_cadddr(pmt_t pair) -{ - return pmt_car(pmt_cdr(pmt_cdr(pmt_cdr(pair)))); -} - -bool -pmt_is_eof_object(pmt_t obj) -{ - return pmt_eq(obj, PMT_EOF); -} - -void -pmt_dump_sizeof() -{ - printf("sizeof(pmt_t) = %3zd\n", sizeof(pmt_t)); - printf("sizeof(pmt_base) = %3zd\n", sizeof(pmt_base)); - printf("sizeof(pmt_bool) = %3zd\n", sizeof(pmt_bool)); - printf("sizeof(pmt_symbol) = %3zd\n", sizeof(pmt_symbol)); - printf("sizeof(pmt_integer) = %3zd\n", sizeof(pmt_integer)); - printf("sizeof(pmt_real) = %3zd\n", sizeof(pmt_real)); - printf("sizeof(pmt_complex) = %3zd\n", sizeof(pmt_complex)); - printf("sizeof(pmt_null) = %3zd\n", sizeof(pmt_null)); - printf("sizeof(pmt_pair) = %3zd\n", sizeof(pmt_pair)); - printf("sizeof(pmt_vector) = %3zd\n", sizeof(pmt_vector)); - printf("sizeof(pmt_dict) = %3zd\n", sizeof(pmt_dict)); - printf("sizeof(pmt_uniform_vector) = %3zd\n", sizeof(pmt_uniform_vector)); -} - -} /* namespace gruel */ diff --git a/gruel/src/lib/pmt/Makefile.am b/gruel/src/lib/pmt/Makefile.am new file mode 100644 index 000000000..5e9f2fac9 --- /dev/null +++ b/gruel/src/lib/pmt/Makefile.am @@ -0,0 +1,111 @@ +# +# Copyright 2008,2009 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GNU Radio is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +include $(top_srcdir)/Makefile.common + +AM_CPPFLAGS = $(DEFINES) $(BOOST_CPPFLAGS) $(CPPUNIT_INCLUDES) $(GRUEL_INCLUDES) $(WITH_INCLUDES) + +TESTS = test_pmt + +noinst_LTLIBRARIES = libpmt.la + +# ---------------------------------------------------------------- +# these scripts generate code + +code_generator = \ + generate_unv.py \ + unv_template.h.t \ + unv_template.cc.t \ + unv_qa_template.cc.t + +GENERATED_H = \ + pmt_unv_int.h \ + qa_pmt_unv.h + +GENERATED_CC = \ + pmt_unv.cc \ + qa_pmt_unv.cc + +python_built_sources = $(GENERATED_H) $(GENERATED_CC) + +PMT_SERIAL_TAGS_H = $(abs_top_builddir)/gruel/src/include/gruel/pmt_serial_tags.h +BUILT_SOURCES = $(python_built_sources) $(PMT_SERIAL_TAGS_H) + +EXTRA_DIST = $(code_generator) + +# ---------------------------------------------------------------- + +libpmt_la_SOURCES = \ + pmt.cc \ + pmt_io.cc \ + pmt_pool.cc \ + pmt_serialize.cc \ + pmt_unv.cc + +libpmt_la_LIBADD = \ + $(BOOST_THREAD_LIB) \ + -lstdc++ + +noinst_HEADERS = \ + $(GENERATED_H) \ + pmt_int.h \ + qa_pmt.h \ + qa_pmt_prims.h + +# Build the qa code into its own library + +noinst_LTLIBRARIES += libpmt-qa.la + +libpmt_qa_la_SOURCES = \ + qa_pmt.cc \ + qa_pmt_prims.cc \ + qa_pmt_unv.cc + +# magic flags +libpmt_qa_la_LDFLAGS = $(NO_UNDEFINED) -avoid version + +libpmt_qa_la_LIBADD = \ + libpmt.la \ + $(CPPUNIT_LIBS) \ + -lstdc++ + +noinst_PROGRAMS = \ + test_pmt + + +LIBPMTQA = libpmt-qa.la + +test_pmt_SOURCES = test_pmt.cc +test_pmt_LDADD = $(LIBPMTQA) + +# Do creation and inclusion of other Makefiles last + +# common way for generating sources from templates when using +# BUILT_SOURCES, using parallel build protection. +gen_sources = $(python_built_sources) +gen_sources_deps = $(core_generator) +par_gen_command = PYTHONPATH=$(top_srcdir)/gruel/src/lib/pmt srcdir=$(srcdir) $(PYTHON) $(srcdir)/generate_unv.py +include $(top_srcdir)/Makefile.par.gen + +# Rule to create the build header file using GUILE +# Doesn't need parallel protections because there is a single target +$(PMT_SERIAL_TAGS_H): $(srcdir)/../../scheme/gnuradio/gen-serial-tags.scm $(srcdir)/../../scheme/gnuradio/pmt-serial-tags.scm + $(RUN_GUILE) $(srcdir)/../../scheme/gnuradio/gen-serial-tags.scm $(srcdir)/../../scheme/gnuradio/pmt-serial-tags.scm $(PMT_SERIAL_TAGS_H) diff --git a/gruel/src/lib/pmt/generate_unv.py b/gruel/src/lib/pmt/generate_unv.py new file mode 100755 index 000000000..02aace250 --- /dev/null +++ b/gruel/src/lib/pmt/generate_unv.py @@ -0,0 +1,190 @@ +#!/usr/bin/env python +# +# Copyright 2006,2009 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GNU Radio is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +""" +Generate code for uniform numeric vectors +""" + +import re, os, os.path + + +unv_types = ( + ('u8', 'uint8_t'), + ('s8', 'int8_t'), + ('u16', 'uint16_t'), + ('s16', 'int16_t'), + ('u32', 'uint32_t'), + ('s32', 'int32_t'), + ('u64', 'uint64_t'), + ('s64', 'int64_t'), + ('f32', 'float'), + ('f64', 'double'), + ('c32', 'std::complex'), + ('c64', 'std::complex') + ) + +header = """\ +/* -*- c++ -*- */ +/* + * Copyright 2006,2009 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ +""" + +guard_tail = """ +#endif +""" + +includes = """ +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include +#include "pmt_int.h" +""" + +qa_includes = """ +#include +#include +#include +#include + +using namespace pmt; +""" + + +# set srcdir to the directory that contains Makefile.am +try: + srcdir = os.environ['srcdir'] +except KeyError, e: + srcdir = "." +srcdir = srcdir + '/' + + +def open_src (name, mode): + global srcdir + return open(os.path.join (srcdir, name), mode) + + +def guard_name(filename): + return 'INCLUDED_' + re.sub('\.', '_', filename.upper()) + +def guard_head(filename): + guard = guard_name(filename) + return """ +#ifndef %s +#define %s +""" % (guard, guard) + + +def do_substitution (d, input, out_file): + def repl (match_obj): + key = match_obj.group (1) + # print key + return d[key] + + out = re.sub (r"@([a-zA-Z0-9_]+)@", repl, input) + out_file.write (out) + + +def generate_h(): + template = open_src('unv_template.h.t', 'r').read() + output_filename = 'pmt_unv_int.h' + output = open(output_filename, 'w') + output.write(header) + output.write(guard_head(output_filename)) + for tag, typ in unv_types: + d = { 'TAG' : tag, 'TYPE' : typ } + do_substitution(d, template, output) + output.write(guard_tail) + +def generate_cc(): + template = open_src('unv_template.cc.t', 'r').read() + output = open('pmt_unv.cc', 'w') + output.write(header) + output.write(includes) + for tag, typ in unv_types: + d = { 'TAG' : tag, 'TYPE' : typ } + do_substitution(d, template, output) + + +def generate_qa_h(): + output_filename = 'qa_pmt_unv.h' + output = open(output_filename, 'w') + output.write(header) + output.write(guard_head(output_filename)) + + output.write(''' +#include +#include + +class qa_pmt_unv : public CppUnit::TestCase { + + CPPUNIT_TEST_SUITE(qa_pmt_unv); +''') + for tag, typ in unv_types: + output.write(' CPPUNIT_TEST(test_%svector);\n' % (tag,)) + output.write('''\ + CPPUNIT_TEST_SUITE_END(); + + private: +''') + for tag, typ in unv_types: + output.write(' void test_%svector();\n' % (tag,)) + output.write('};\n') + output.write(guard_tail) + +def generate_qa_cc(): + template = open_src('unv_qa_template.cc.t', 'r').read() + output = open('qa_pmt_unv.cc', 'w') + output.write(header) + output.write(qa_includes) + for tag, typ in unv_types: + d = { 'TAG' : tag, 'TYPE' : typ } + do_substitution(d, template, output) + + +def main(): + generate_h() + generate_cc() + generate_qa_h() + generate_qa_cc() + +if __name__ == '__main__': + main() diff --git a/gruel/src/lib/pmt/pmt.cc b/gruel/src/lib/pmt/pmt.cc new file mode 100644 index 000000000..fbf557be1 --- /dev/null +++ b/gruel/src/lib/pmt/pmt.cc @@ -0,0 +1,1041 @@ +/* -*- c++ -*- */ +/* + * Copyright 2006,2009 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include +#include "pmt_int.h" +#include +#include +#include + +namespace pmt { + +static const int CACHE_LINE_SIZE = 64; // good guess + +# if (PMT_LOCAL_ALLOCATOR) + +static pmt_pool global_pmt_pool(sizeof(pmt_pair), CACHE_LINE_SIZE); + +void * +pmt_base::operator new(size_t size) +{ + void *p = global_pmt_pool.malloc(); + + // fprintf(stderr, "pmt_base::new p = %p\n", p); + assert((reinterpret_cast(p) & (CACHE_LINE_SIZE - 1)) == 0); + return p; +} + +void +pmt_base::operator delete(void *p, size_t size) +{ + global_pmt_pool.free(p); +} + +#endif + + +pmt_base::~pmt_base() +{ + // nop -- out of line virtual destructor +} + +//////////////////////////////////////////////////////////////////////////// +// Exceptions +//////////////////////////////////////////////////////////////////////////// + +pmt_exception::pmt_exception(const std::string &msg, pmt_t obj) + : logic_error(msg + ": " + pmt_write_string(obj)) +{ +} + +pmt_wrong_type::pmt_wrong_type(const std::string &msg, pmt_t obj) + : pmt_exception(msg + ": wrong_type ", obj) +{ +} + +pmt_out_of_range::pmt_out_of_range(const std::string &msg, pmt_t obj) + : pmt_exception(msg + ": out of range ", obj) +{ +} + +pmt_notimplemented::pmt_notimplemented(const std::string &msg, pmt_t obj) + : pmt_exception(msg + ": notimplemented ", obj) +{ +} + +//////////////////////////////////////////////////////////////////////////// +// Dynamic Casts +//////////////////////////////////////////////////////////////////////////// + +static pmt_symbol * +_symbol(pmt_t x) +{ + return dynamic_cast(x.get()); +} + +static pmt_integer * +_integer(pmt_t x) +{ + return dynamic_cast(x.get()); +} + +static pmt_real * +_real(pmt_t x) +{ + return dynamic_cast(x.get()); +} + +static pmt_complex * +_complex(pmt_t x) +{ + return dynamic_cast(x.get()); +} + +static pmt_pair * +_pair(pmt_t x) +{ + return dynamic_cast(x.get()); +} + +static pmt_vector * +_vector(pmt_t x) +{ + return dynamic_cast(x.get()); +} + +static pmt_uniform_vector * +_uniform_vector(pmt_t x) +{ + return dynamic_cast(x.get()); +} + +static pmt_dict * +_dict(pmt_t x) +{ + return dynamic_cast(x.get()); +} + +static pmt_any * +_any(pmt_t x) +{ + return dynamic_cast(x.get()); +} + +//////////////////////////////////////////////////////////////////////////// +// Globals +//////////////////////////////////////////////////////////////////////////// + +const pmt_t PMT_T = pmt_t(new pmt_bool()); // singleton +const pmt_t PMT_F = pmt_t(new pmt_bool()); // singleton +const pmt_t PMT_NIL = pmt_t(new pmt_null()); // singleton +const pmt_t PMT_EOF = pmt_cons(PMT_NIL, PMT_NIL); // singleton + +//////////////////////////////////////////////////////////////////////////// +// Booleans +//////////////////////////////////////////////////////////////////////////// + +pmt_bool::pmt_bool(){} + +bool +pmt_is_true(pmt_t obj) +{ + return obj != PMT_F; +} + +bool +pmt_is_false(pmt_t obj) +{ + return obj == PMT_F; +} + +bool +pmt_is_bool(pmt_t obj) +{ + return obj->is_bool(); +} + +pmt_t +pmt_from_bool(bool val) +{ + return val ? PMT_T : PMT_F; +} + +bool +pmt_to_bool(pmt_t val) +{ + if (val == PMT_T) + return true; + if (val == PMT_F) + return false; + throw pmt_wrong_type("pmt_to_bool", val); +} + +//////////////////////////////////////////////////////////////////////////// +// Symbols +//////////////////////////////////////////////////////////////////////////// + +static const unsigned int SYMBOL_HASH_TABLE_SIZE = 701; +static std::vector s_symbol_hash_table(SYMBOL_HASH_TABLE_SIZE); + +pmt_symbol::pmt_symbol(const std::string &name) : d_name(name){} + + +static unsigned int +hash_string(const std::string &s) +{ + unsigned int h = 0; + unsigned int g = 0; + + for (std::string::const_iterator p = s.begin(); p != s.end(); ++p){ + h = (h << 4) + (*p & 0xff); + g = h & 0xf0000000; + if (g){ + h = h ^ (g >> 24); + h = h ^ g; + } + } + return h; +} + +bool +pmt_is_symbol(const pmt_t& obj) +{ + return obj->is_symbol(); +} + +pmt_t +pmt_string_to_symbol(const std::string &name) +{ + unsigned hash = hash_string(name) % SYMBOL_HASH_TABLE_SIZE; + + // Does a symbol with this name already exist? + for (pmt_t sym = s_symbol_hash_table[hash]; sym; sym = _symbol(sym)->next()){ + if (name == _symbol(sym)->name()) + return sym; // Yes. Return it + } + + // Nope. Make a new one. + pmt_t sym = pmt_t(new pmt_symbol(name)); + _symbol(sym)->set_next(s_symbol_hash_table[hash]); + s_symbol_hash_table[hash] = sym; + return sym; +} + +// alias... +pmt_t +pmt_intern(const std::string &name) +{ + return pmt_string_to_symbol(name); +} + +const std::string +pmt_symbol_to_string(const pmt_t& sym) +{ + if (!sym->is_symbol()) + throw pmt_wrong_type("pmt_symbol_to_string", sym); + + return _symbol(sym)->name(); +} + + + +//////////////////////////////////////////////////////////////////////////// +// Number +//////////////////////////////////////////////////////////////////////////// + +bool +pmt_is_number(pmt_t x) +{ + return x->is_number(); +} + +//////////////////////////////////////////////////////////////////////////// +// Integer +//////////////////////////////////////////////////////////////////////////// + +pmt_integer::pmt_integer(long value) : d_value(value) {} + +bool +pmt_is_integer(pmt_t x) +{ + return x->is_integer(); +} + + +pmt_t +pmt_from_long(long x) +{ + return pmt_t(new pmt_integer(x)); +} + +long +pmt_to_long(pmt_t x) +{ + pmt_integer* i = dynamic_cast(x.get()); + if ( i ) + return i->value(); + + throw pmt_wrong_type("pmt_to_long", x); +} + +//////////////////////////////////////////////////////////////////////////// +// Real +//////////////////////////////////////////////////////////////////////////// + +pmt_real::pmt_real(double value) : d_value(value) {} + +bool +pmt_is_real(pmt_t x) +{ + return x->is_real(); +} + +pmt_t +pmt_from_double(double x) +{ + return pmt_t(new pmt_real(x)); +} + +double +pmt_to_double(pmt_t x) +{ + if (x->is_real()) + return _real(x)->value(); + if (x->is_integer()) + return _integer(x)->value(); + + throw pmt_wrong_type("pmt_to_double", x); +} + +//////////////////////////////////////////////////////////////////////////// +// Complex +//////////////////////////////////////////////////////////////////////////// + +pmt_complex::pmt_complex(std::complex value) : d_value(value) {} + +bool +pmt_is_complex(pmt_t x) +{ + return x->is_complex(); +} + +pmt_t +pmt_make_rectangular(double re, double im) +{ + return pmt_t(new pmt_complex(std::complex(re, im))); +} + +std::complex +pmt_to_complex(pmt_t x) +{ + if (x->is_complex()) + return _complex(x)->value(); + if (x->is_real()) + return _real(x)->value(); + if (x->is_integer()) + return _integer(x)->value(); + + throw pmt_wrong_type("pmt_to_complex", x); +} + +//////////////////////////////////////////////////////////////////////////// +// Pairs +//////////////////////////////////////////////////////////////////////////// + +pmt_null::pmt_null() {} +pmt_pair::pmt_pair(const pmt_t& car, const pmt_t& cdr) : d_car(car), d_cdr(cdr) {} + +bool +pmt_is_null(const pmt_t& x) +{ + return x == PMT_NIL; +} + +bool +pmt_is_pair(const pmt_t& obj) +{ + return obj->is_pair(); +} + +pmt_t +pmt_cons(const pmt_t& x, const pmt_t& y) +{ + return pmt_t(new pmt_pair(x, y)); +} + +pmt_t +pmt_car(const pmt_t& pair) +{ + pmt_pair* p = dynamic_cast(pair.get()); + if ( p ) + return p->car(); + + throw pmt_wrong_type("pmt_car", pair); +} + +pmt_t +pmt_cdr(const pmt_t& pair) +{ + pmt_pair* p = dynamic_cast(pair.get()); + if ( p ) + return p->cdr(); + + throw pmt_wrong_type("pmt_cdr", pair); +} + +void +pmt_set_car(pmt_t pair, pmt_t obj) +{ + if (pair->is_pair()) + _pair(pair)->set_car(obj); + else + throw pmt_wrong_type("pmt_set_car", pair); +} + +void +pmt_set_cdr(pmt_t pair, pmt_t obj) +{ + if (pair->is_pair()) + _pair(pair)->set_cdr(obj); + else + throw pmt_wrong_type("pmt_set_cdr", pair); +} + +//////////////////////////////////////////////////////////////////////////// +// Vectors +//////////////////////////////////////////////////////////////////////////// + +pmt_vector::pmt_vector(size_t len, pmt_t fill) + : d_v(len) +{ + for (size_t i = 0; i < len; i++) + d_v[i] = fill; +} + +pmt_t +pmt_vector::ref(size_t k) const +{ + if (k >= length()) + throw pmt_out_of_range("pmt_vector_ref", pmt_from_long(k)); + return d_v[k]; +} + +void +pmt_vector::set(size_t k, pmt_t obj) +{ + if (k >= length()) + throw pmt_out_of_range("pmt_vector_set", pmt_from_long(k)); + d_v[k] = obj; +} + +void +pmt_vector::fill(pmt_t obj) +{ + for (size_t i = 0; i < length(); i++) + d_v[i] = obj; +} + +bool +pmt_is_vector(pmt_t obj) +{ + return obj->is_vector(); +} + +pmt_t +pmt_make_vector(size_t k, pmt_t fill) +{ + return pmt_t(new pmt_vector(k, fill)); +} + +pmt_t +pmt_vector_ref(pmt_t vector, size_t k) +{ + if (!vector->is_vector()) + throw pmt_wrong_type("pmt_vector_ref", vector); + return _vector(vector)->ref(k); +} + +void +pmt_vector_set(pmt_t vector, size_t k, pmt_t obj) +{ + if (!vector->is_vector()) + throw pmt_wrong_type("pmt_vector_set", vector); + _vector(vector)->set(k, obj); +} + +void +pmt_vector_fill(pmt_t vector, pmt_t obj) +{ + if (!vector->is_vector()) + throw pmt_wrong_type("pmt_vector_set", vector); + _vector(vector)->fill(obj); +} + +//////////////////////////////////////////////////////////////////////////// +// Uniform Numeric Vectors +//////////////////////////////////////////////////////////////////////////// + +bool +pmt_is_uniform_vector(pmt_t x) +{ + return x->is_uniform_vector(); +} + +const void * +pmt_uniform_vector_elements(pmt_t vector, size_t &len) +{ + if (!vector->is_uniform_vector()) + throw pmt_wrong_type("pmt_uniform_vector_elements", vector); + return _uniform_vector(vector)->uniform_elements(len); +} + +void * +pmt_uniform_vector_writable_elements(pmt_t vector, size_t &len) +{ + if (!vector->is_uniform_vector()) + throw pmt_wrong_type("pmt_uniform_vector_writable_elements", vector); + return _uniform_vector(vector)->uniform_writable_elements(len); +} + +//////////////////////////////////////////////////////////////////////////// +// Dictionaries +//////////////////////////////////////////////////////////////////////////// + +pmt_dict::pmt_dict() + : d_alist(PMT_NIL) +{ +} + +void +pmt_dict::set(pmt_t key, pmt_t value) +{ + pmt_t p = pmt_assv(key, d_alist); // look for (key . value) pair + if (pmt_is_pair(p)){ // found existing pair... + pmt_set_cdr(p, value); // overrwrite cdr with new value + } + else { // not in the dict + d_alist = pmt_cons(pmt_cons(key, value), d_alist); // add new (key . value) pair + } +} + +pmt_t +pmt_dict::ref(pmt_t key, pmt_t not_found) const +{ + pmt_t p = pmt_assv(key, d_alist); // look for (key . value) pair + if (pmt_is_pair(p)) + return pmt_cdr(p); + else + return not_found; +} + +bool +pmt_dict::has_key(pmt_t key) const +{ + return pmt_is_pair(pmt_assv(key, d_alist)); +} + +pmt_t +pmt_dict::items() const +{ + return d_alist; +} + +pmt_t +pmt_dict::keys() const +{ + return pmt_map(pmt_car, d_alist); +} + +pmt_t +pmt_dict::values() const +{ + return pmt_map(pmt_cdr, d_alist); +} + +bool +pmt_is_dict(pmt_t obj) +{ + return obj->is_dict(); +} + +pmt_t +pmt_make_dict() +{ + return pmt_t(new pmt_dict()); +} + +void +pmt_dict_set(pmt_t dict, pmt_t key, pmt_t value) +{ + pmt_dict* d = _dict(dict); + if (!d) + throw pmt_wrong_type("pmt_dict_set", dict); + + d->set(key, value); +} + +bool +pmt_dict_has_key(pmt_t dict, pmt_t key) +{ + pmt_dict* d = _dict(dict); + if (!d) + throw pmt_wrong_type("pmt_dict_has_key", dict); + + return d->has_key(key); +} + +pmt_t +pmt_dict_ref(pmt_t dict, pmt_t key, pmt_t not_found) +{ + pmt_dict* d = _dict(dict); + if (!d) + throw pmt_wrong_type("pmt_dict_ref", dict); + + return d->ref(key, not_found); +} + +pmt_t +pmt_dict_items(pmt_t dict) +{ + if (!dict->is_dict()) + throw pmt_wrong_type("pmt_dict_items", dict); + + return _dict(dict)->items(); +} + +pmt_t +pmt_dict_keys(pmt_t dict) +{ + if (!dict->is_dict()) + throw pmt_wrong_type("pmt_dict_keys", dict); + + return _dict(dict)->keys(); +} + +pmt_t +pmt_dict_values(pmt_t dict) +{ + if (!dict->is_dict()) + throw pmt_wrong_type("pmt_dict_values", dict); + + return _dict(dict)->values(); +} + +//////////////////////////////////////////////////////////////////////////// +// Any +//////////////////////////////////////////////////////////////////////////// + +pmt_any::pmt_any(const boost::any &any) : d_any(any) {} + +bool +pmt_is_any(pmt_t obj) +{ + return obj->is_any(); +} + +pmt_t +pmt_make_any(const boost::any &any) +{ + return pmt_t(new pmt_any(any)); +} + +boost::any +pmt_any_ref(pmt_t obj) +{ + if (!obj->is_any()) + throw pmt_wrong_type("pmt_any_ref", obj); + return _any(obj)->ref(); +} + +void +pmt_any_set(pmt_t obj, const boost::any &any) +{ + if (!obj->is_any()) + throw pmt_wrong_type("pmt_any_set", obj); + _any(obj)->set(any); +} + +//////////////////////////////////////////////////////////////////////////// +// General Functions +//////////////////////////////////////////////////////////////////////////// + +bool +pmt_eq(const pmt_t& x, const pmt_t& y) +{ + return x == y; +} + +bool +pmt_eqv(const pmt_t& x, const pmt_t& y) +{ + if (x == y) + return true; + + if (x->is_integer() && y->is_integer()) + return _integer(x)->value() == _integer(y)->value(); + + if (x->is_real() && y->is_real()) + return _real(x)->value() == _real(y)->value(); + + if (x->is_complex() && y->is_complex()) + return _complex(x)->value() == _complex(y)->value(); + + return false; +} + +bool +pmt_equal(const pmt_t& x, const pmt_t& y) +{ + if (pmt_eqv(x, y)) + return true; + + if (x->is_pair() && y->is_pair()) + return pmt_equal(pmt_car(x), pmt_car(y)) && pmt_equal(pmt_cdr(x), pmt_cdr(y)); + + if (x->is_vector() && y->is_vector()){ + pmt_vector *xv = _vector(x); + pmt_vector *yv = _vector(y); + if (xv->length() != yv->length()) + return false; + + for (unsigned i = 0; i < xv->length(); i++) + if (!pmt_equal(xv->_ref(i), yv->_ref(i))) + return false; + + return true; + } + + if (x->is_uniform_vector() && y->is_uniform_vector()){ + pmt_uniform_vector *xv = _uniform_vector(x); + pmt_uniform_vector *yv = _uniform_vector(y); + if (xv->length() != yv->length()) + return false; + + size_t len_x, len_y; + if (memcmp(xv->uniform_elements(len_x), + yv->uniform_elements(len_y), + len_x) == 0) + return true; + + return true; + } + + // FIXME add other cases here... + + return false; +} + +size_t +pmt_length(const pmt_t& x) +{ + if (x->is_vector()) + return _vector(x)->length(); + + if (x->is_uniform_vector()) + return _uniform_vector(x)->length(); + + if (x->is_null()) return 0; + + if (x->is_pair()) { + size_t length=1; + pmt_t it = pmt_cdr(x); + while (pmt_is_pair(it)){ + length++; + it = pmt_cdr(it); + } + if (pmt_is_null(it)) + return length; + + // not a proper list + throw pmt_wrong_type("pmt_length", x); + } + + // FIXME dictionary length (number of entries) + + throw pmt_wrong_type("pmt_length", x); +} + +pmt_t +pmt_assq(pmt_t obj, pmt_t alist) +{ + while (pmt_is_pair(alist)){ + pmt_t p = pmt_car(alist); + if (!pmt_is_pair(p)) // malformed alist + return PMT_F; + + if (pmt_eq(obj, pmt_car(p))) + return p; + + alist = pmt_cdr(alist); + } + return PMT_F; +} + +pmt_t +pmt_assv(pmt_t obj, pmt_t alist) +{ + while (pmt_is_pair(alist)){ + pmt_t p = pmt_car(alist); + if (!pmt_is_pair(p)) // malformed alist + return PMT_F; + + if (pmt_eqv(obj, pmt_car(p))) + return p; + + alist = pmt_cdr(alist); + } + return PMT_F; +} + +pmt_t +pmt_assoc(pmt_t obj, pmt_t alist) +{ + while (pmt_is_pair(alist)){ + pmt_t p = pmt_car(alist); + if (!pmt_is_pair(p)) // malformed alist + return PMT_F; + + if (pmt_equal(obj, pmt_car(p))) + return p; + + alist = pmt_cdr(alist); + } + return PMT_F; +} + +pmt_t +pmt_map(pmt_t proc(const pmt_t&), pmt_t list) +{ + pmt_t r = PMT_NIL; + + while(pmt_is_pair(list)){ + r = pmt_cons(proc(pmt_car(list)), r); + list = pmt_cdr(list); + } + + return pmt_reverse_x(r); +} + +pmt_t +pmt_reverse(pmt_t listx) +{ + pmt_t list = listx; + pmt_t r = PMT_NIL; + + while(pmt_is_pair(list)){ + r = pmt_cons(pmt_car(list), r); + list = pmt_cdr(list); + } + if (pmt_is_null(list)) + return r; + else + throw pmt_wrong_type("pmt_reverse", listx); +} + +pmt_t +pmt_reverse_x(pmt_t list) +{ + // FIXME do it destructively + return pmt_reverse(list); +} + +pmt_t +pmt_nth(size_t n, pmt_t list) +{ + pmt_t t = pmt_nthcdr(n, list); + if (pmt_is_pair(t)) + return pmt_car(t); + else + return PMT_NIL; +} + +pmt_t +pmt_nthcdr(size_t n, pmt_t list) +{ + if (!(pmt_is_pair(list) || pmt_is_null(list))) + throw pmt_wrong_type("pmt_nthcdr", list); + + while (n > 0){ + if (pmt_is_pair(list)){ + list = pmt_cdr(list); + n--; + continue; + } + if (pmt_is_null(list)) + return PMT_NIL; + else + throw pmt_wrong_type("pmt_nthcdr: not a LIST", list); + } + return list; +} + +pmt_t +pmt_memq(pmt_t obj, pmt_t list) +{ + while (pmt_is_pair(list)){ + if (pmt_eq(obj, pmt_car(list))) + return list; + list = pmt_cdr(list); + } + return PMT_F; +} + +pmt_t +pmt_memv(pmt_t obj, pmt_t list) +{ + while (pmt_is_pair(list)){ + if (pmt_eqv(obj, pmt_car(list))) + return list; + list = pmt_cdr(list); + } + return PMT_F; +} + +pmt_t +pmt_member(pmt_t obj, pmt_t list) +{ + while (pmt_is_pair(list)){ + if (pmt_equal(obj, pmt_car(list))) + return list; + list = pmt_cdr(list); + } + return PMT_F; +} + +bool +pmt_subsetp(pmt_t list1, pmt_t list2) +{ + while (pmt_is_pair(list1)){ + pmt_t p = pmt_car(list1); + if (pmt_is_false(pmt_memv(p, list2))) + return false; + list1 = pmt_cdr(list1); + } + return true; +} + +pmt_t +pmt_list1(const pmt_t& x1) +{ + return pmt_cons(x1, PMT_NIL); +} + +pmt_t +pmt_list2(const pmt_t& x1, const pmt_t& x2) +{ + return pmt_cons(x1, pmt_cons(x2, PMT_NIL)); +} + +pmt_t +pmt_list3(const pmt_t& x1, const pmt_t& x2, const pmt_t& x3) +{ + return pmt_cons(x1, pmt_cons(x2, pmt_cons(x3, PMT_NIL))); +} + +pmt_t +pmt_list4(const pmt_t& x1, const pmt_t& x2, const pmt_t& x3, const pmt_t& x4) +{ + return pmt_cons(x1, pmt_cons(x2, pmt_cons(x3, pmt_cons(x4, PMT_NIL)))); +} + +pmt_t +pmt_list5(const pmt_t& x1, const pmt_t& x2, const pmt_t& x3, const pmt_t& x4, const pmt_t& x5) +{ + return pmt_cons(x1, pmt_cons(x2, pmt_cons(x3, pmt_cons(x4, pmt_cons(x5, PMT_NIL))))); +} + +pmt_t +pmt_list6(const pmt_t& x1, const pmt_t& x2, const pmt_t& x3, const pmt_t& x4, const pmt_t& x5, const pmt_t& x6) +{ + return pmt_cons(x1, pmt_cons(x2, pmt_cons(x3, pmt_cons(x4, pmt_cons(x5, pmt_cons(x6, PMT_NIL)))))); +} + +pmt_t +pmt_list_add(pmt_t list, const pmt_t& item) +{ + return pmt_reverse(pmt_cons(item, pmt_reverse(list))); +} + +pmt_t +pmt_caar(pmt_t pair) +{ + return (pmt_car(pmt_car(pair))); +} + +pmt_t +pmt_cadr(pmt_t pair) +{ + return pmt_car(pmt_cdr(pair)); +} + +pmt_t +pmt_cdar(pmt_t pair) +{ + return pmt_cdr(pmt_car(pair)); +} + +pmt_t +pmt_cddr(pmt_t pair) +{ + return pmt_cdr(pmt_cdr(pair)); +} + +pmt_t +pmt_caddr(pmt_t pair) +{ + return pmt_car(pmt_cdr(pmt_cdr(pair))); +} + +pmt_t +pmt_cadddr(pmt_t pair) +{ + return pmt_car(pmt_cdr(pmt_cdr(pmt_cdr(pair)))); +} + +bool +pmt_is_eof_object(pmt_t obj) +{ + return pmt_eq(obj, PMT_EOF); +} + +void +pmt_dump_sizeof() +{ + printf("sizeof(pmt_t) = %3zd\n", sizeof(pmt_t)); + printf("sizeof(pmt_base) = %3zd\n", sizeof(pmt_base)); + printf("sizeof(pmt_bool) = %3zd\n", sizeof(pmt_bool)); + printf("sizeof(pmt_symbol) = %3zd\n", sizeof(pmt_symbol)); + printf("sizeof(pmt_integer) = %3zd\n", sizeof(pmt_integer)); + printf("sizeof(pmt_real) = %3zd\n", sizeof(pmt_real)); + printf("sizeof(pmt_complex) = %3zd\n", sizeof(pmt_complex)); + printf("sizeof(pmt_null) = %3zd\n", sizeof(pmt_null)); + printf("sizeof(pmt_pair) = %3zd\n", sizeof(pmt_pair)); + printf("sizeof(pmt_vector) = %3zd\n", sizeof(pmt_vector)); + printf("sizeof(pmt_dict) = %3zd\n", sizeof(pmt_dict)); + printf("sizeof(pmt_uniform_vector) = %3zd\n", sizeof(pmt_uniform_vector)); +} + +} /* namespace pmt */ diff --git a/gruel/src/lib/pmt/pmt_int.h b/gruel/src/lib/pmt/pmt_int.h new file mode 100644 index 000000000..9aac322a7 --- /dev/null +++ b/gruel/src/lib/pmt/pmt_int.h @@ -0,0 +1,227 @@ +/* -*- c++ -*- */ +/* + * Copyright 2006,2009 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ +#ifndef INCLUDED_PMT_INT_H +#define INCLUDED_PMT_INT_H + +#include +#include + +/* + * EVERYTHING IN THIS FILE IS PRIVATE TO THE IMPLEMENTATION! + * + * See pmt.h for the public interface + */ + +#define PMT_LOCAL_ALLOCATOR 0 // define to 0 or 1 +namespace pmt { + +class pmt_base : boost::noncopyable { +protected: + pmt_base(){}; + virtual ~pmt_base(); + +public: + virtual bool is_bool() const { return false; } + virtual bool is_symbol() const { return false; } + virtual bool is_number() const { return false; } + virtual bool is_integer() const { return false; } + virtual bool is_real() const { return false; } + virtual bool is_complex() const { return false; } + virtual bool is_null() const { return false; } + virtual bool is_pair() const { return false; } + virtual bool is_vector() const { return false; } + virtual bool is_dict() const { return false; } + virtual bool is_any() const { return false; } + + virtual bool is_uniform_vector() const { return false; } + virtual bool is_u8vector() const { return false; } + virtual bool is_s8vector() const { return false; } + virtual bool is_u16vector() const { return false; } + virtual bool is_s16vector() const { return false; } + virtual bool is_u32vector() const { return false; } + virtual bool is_s32vector() const { return false; } + virtual bool is_u64vector() const { return false; } + virtual bool is_s64vector() const { return false; } + virtual bool is_f32vector() const { return false; } + virtual bool is_f64vector() const { return false; } + virtual bool is_c32vector() const { return false; } + virtual bool is_c64vector() const { return false; } + +# if (PMT_LOCAL_ALLOCATOR) + void *operator new(size_t); + void operator delete(void *, size_t); +#endif +}; + +class pmt_bool : public pmt_base +{ +public: + pmt_bool(); + //~pmt_bool(){} + + bool is_bool() const { return true; } +}; + + +class pmt_symbol : public pmt_base +{ + std::string d_name; + pmt_t d_next; + +public: + pmt_symbol(const std::string &name); + //~pmt_symbol(){} + + bool is_symbol() const { return true; } + const std::string name() { return d_name; } + + pmt_t next() { return d_next; } // symbol table link + void set_next(pmt_t next) { d_next = next; } +}; + +class pmt_integer : public pmt_base +{ + long d_value; + +public: + pmt_integer(long value); + //~pmt_integer(){} + + bool is_number() const { return true; } + bool is_integer() const { return true; } + long value() const { return d_value; } +}; + +class pmt_real : public pmt_base +{ + double d_value; + +public: + pmt_real(double value); + //~pmt_real(){} + + bool is_number() const { return true; } + bool is_real() const { return true; } + double value() const { return d_value; } +}; + +class pmt_complex : public pmt_base +{ + std::complex d_value; + +public: + pmt_complex(std::complex value); + //~pmt_complex(){} + + bool is_number() const { return true; } + bool is_complex() const { return true; } + std::complex value() const { return d_value; } +}; + +class pmt_null : public pmt_base +{ +public: + pmt_null(); + //~pmt_null(){} + + bool is_null() const { return true; } +}; + +class pmt_pair : public pmt_base +{ + pmt_t d_car; + pmt_t d_cdr; + +public: + pmt_pair(const pmt_t& car, const pmt_t& cdr); + //~pmt_pair(){}; + + bool is_pair() const { return true; } + pmt_t car() const { return d_car; } + pmt_t cdr() const { return d_cdr; } + + void set_car(pmt_t car) { d_car = car; } + void set_cdr(pmt_t cdr) { d_cdr = cdr; } +}; + +class pmt_vector : public pmt_base +{ + std::vector d_v; + +public: + pmt_vector(size_t len, pmt_t fill); + //~pmt_vector(); + + bool is_vector() const { return true; } + pmt_t ref(size_t k) const; + void set(size_t k, pmt_t obj); + void fill(pmt_t fill); + size_t length() const { return d_v.size(); } + + pmt_t _ref(size_t k) const { return d_v[k]; } +}; + +class pmt_dict : public pmt_base +{ + pmt_t d_alist; // list of (key . value) pairs + +public: + pmt_dict(); + //~pmt_dict(); + + bool is_dict() const { return true; } + void set(pmt_t key, pmt_t value); + pmt_t ref(pmt_t key, pmt_t default_value) const; + bool has_key(pmt_t key) const; + pmt_t items() const; + pmt_t keys() const; + pmt_t values() const; +}; + +class pmt_any : public pmt_base +{ + boost::any d_any; + +public: + pmt_any(const boost::any &any); + //~pmt_any(); + + bool is_any() const { return true; } + const boost::any &ref() const { return d_any; } + void set(const boost::any &any) { d_any = any; } +}; + + +class pmt_uniform_vector : public pmt_base +{ +public: + bool is_uniform_vector() const { return true; } + virtual const void *uniform_elements(size_t &len) = 0; + virtual void *uniform_writable_elements(size_t &len) = 0; + virtual size_t length() const = 0; +}; + +#include "pmt_unv_int.h" + +} /* namespace pmt */ + +#endif /* INCLUDED_PMT_INT_H */ diff --git a/gruel/src/lib/pmt/pmt_io.cc b/gruel/src/lib/pmt/pmt_io.cc new file mode 100644 index 000000000..f5a82de0e --- /dev/null +++ b/gruel/src/lib/pmt/pmt_io.cc @@ -0,0 +1,141 @@ +/* -*- c++ -*- */ +/* + * Copyright 2006,2009 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include +#include "pmt_int.h" +#include + +namespace pmt { + +static void +pmt_write_list_tail(pmt_t obj, std::ostream &port) +{ + pmt_write(pmt_car(obj), port); // write the car + obj = pmt_cdr(obj); // step to cdr + + if (pmt_is_null(obj)) // () + port << ")"; + + else if (pmt_is_pair(obj)){ // normal list + port << " "; + pmt_write_list_tail(obj, port); + } + else { // dotted pair + port << " . "; + pmt_write(obj, port); + port << ")"; + } +} + +void +pmt_write(pmt_t obj, std::ostream &port) +{ + if (pmt_is_bool(obj)){ + if (pmt_is_true(obj)) + port << "#t"; + else + port << "#f"; + } + else if (pmt_is_symbol(obj)){ + port << pmt_symbol_to_string(obj); + } + else if (pmt_is_number(obj)){ + if (pmt_is_integer(obj)) + port << pmt_to_long(obj); + else if (pmt_is_real(obj)) + port << pmt_to_double(obj); + else if (pmt_is_complex(obj)){ + std::complex c = pmt_to_complex(obj); + port << c.real() << '+' << c.imag() << 'i'; + } + else + goto error; + } + else if (pmt_is_null(obj)){ + port << "()"; + } + else if (pmt_is_pair(obj)){ + port << "("; + pmt_write_list_tail(obj, port); + } + else if (pmt_is_dict(obj)){ + // FIXME + // port << "#"; + port << "#"; + } + else if (pmt_is_vector(obj)){ + // FIXME + // port << "#"; + port << "#"; + } + else if (pmt_is_uniform_vector(obj)){ + // FIXME + // port << "#"; + port << "#"; + } + else { + error: + // FIXME + // port << "#<" << obj << ">"; + port << "#"; + } +} + +std::ostream& operator<<(std::ostream &os, pmt_t obj) +{ + pmt_write(obj, os); + return os; +} + +std::string +pmt_write_string(pmt_t obj) +{ + std::ostringstream s; + s << obj; + return s.str(); +} + +pmt_t +pmt_read(std::istream &port) +{ + throw pmt_notimplemented("notimplemented: pmt_read", PMT_NIL); +} + +void +pmt_serialize(pmt_t obj, std::ostream &sink) +{ + throw pmt_notimplemented("notimplemented: pmt_serialize", obj); +} + +/*! + * \brief Create obj from portable byte-serial representation + */ +pmt_t +pmt_deserialize(std::istream &source) +{ + throw pmt_notimplemented("notimplemented: pmt_deserialize", PMT_NIL); +} + +} /* namespace pmt */ diff --git a/gruel/src/lib/pmt/pmt_pool.cc b/gruel/src/lib/pmt/pmt_pool.cc new file mode 100644 index 000000000..731d28ca7 --- /dev/null +++ b/gruel/src/lib/pmt/pmt_pool.cc @@ -0,0 +1,112 @@ +/* -*- c++ -*- */ +/* + * Copyright 2007,2009 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include +#include + +namespace pmt { + +static inline size_t +ROUNDUP(size_t x, size_t stride) +{ + return ((((x) + (stride) - 1)/(stride)) * (stride)); +} + +pmt_pool::pmt_pool(size_t itemsize, size_t alignment, + size_t allocation_size, size_t max_items) + : d_itemsize(ROUNDUP(itemsize, alignment)), + d_alignment(alignment), + d_allocation_size(std::max(allocation_size, 16 * itemsize)), + d_max_items(max_items), d_n_items(0), + d_freelist(0) +{ +} + +pmt_pool::~pmt_pool() +{ + for (unsigned int i = 0; i < d_allocations.size(); i++){ + delete [] d_allocations[i]; + } +} + +void * +pmt_pool::malloc() +{ + scoped_lock guard(d_mutex); + item *p; + + if (d_max_items != 0){ + while (d_n_items >= d_max_items) + d_cond.wait(guard); + } + + if (d_freelist){ // got something? + p = d_freelist; + d_freelist = p->d_next; + d_n_items++; + return p; + } + + // allocate a new chunk + char *alloc = new char[d_allocation_size + d_alignment - 1]; + d_allocations.push_back(alloc); + + // get the alignment we require + char *start = (char *)(((uintptr_t)alloc + d_alignment-1) & -d_alignment); + char *end = alloc + d_allocation_size + d_alignment - 1; + size_t n = (end - start) / d_itemsize; + + // link the new items onto the free list. + p = (item *) start; + for (size_t i = 0; i < n; i++){ + p->d_next = d_freelist; + d_freelist = p; + p = (item *)((char *) p + d_itemsize); + } + + // now return the first one + p = d_freelist; + d_freelist = p->d_next; + d_n_items++; + return p; +} + +void +pmt_pool::free(void *foo) +{ + if (!foo) + return; + + scoped_lock guard(d_mutex); + + item *p = (item *) foo; + p->d_next = d_freelist; + d_freelist = p; + d_n_items--; + if (d_max_items != 0) + d_cond.notify_one(); +} + +} /* namespace pmt */ diff --git a/gruel/src/lib/pmt/pmt_serialize.cc b/gruel/src/lib/pmt/pmt_serialize.cc new file mode 100644 index 000000000..937423a93 --- /dev/null +++ b/gruel/src/lib/pmt/pmt_serialize.cc @@ -0,0 +1,357 @@ +/* -*- c++ -*- */ +/* + * Copyright 2007,2009 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include +#include "pmt_int.h" +#include "gruel/pmt_serial_tags.h" + +namespace pmt { + +static pmt_t parse_pair(std::streambuf &sb); + +// ---------------------------------------------------------------- +// output primitives +// ---------------------------------------------------------------- + +static bool +serialize_untagged_u8(unsigned int i, std::streambuf &sb) +{ + return sb.sputc((i >> 0) & 0xff) != std::streambuf::traits_type::eof(); +} + +// always writes big-endian +static bool +serialize_untagged_u16(unsigned int i, std::streambuf &sb) +{ + sb.sputc((i >> 8) & 0xff); + return sb.sputc((i >> 0) & 0xff) != std::streambuf::traits_type::eof(); +} + +// always writes big-endian +static bool +serialize_untagged_u32(unsigned int i, std::streambuf &sb) +{ + sb.sputc((i >> 24) & 0xff); + sb.sputc((i >> 16) & 0xff); + sb.sputc((i >> 8) & 0xff); + return sb.sputc((i >> 0) & 0xff) != std::streambuf::traits_type::eof(); +} + +#if 0 +// always writes big-endian +static bool +serialize_untagged_u64(uint64_t i, std::streambuf &sb) +{ + sb.sputc((i >> 56) & 0xff); + sb.sputc((i >> 48) & 0xff); + sb.sputc((i >> 40) & 0xff); + sb.sputc((i >> 32) & 0xff); + sb.sputc((i >> 24) & 0xff); + sb.sputc((i >> 16) & 0xff); + sb.sputc((i >> 8) & 0xff); + return sb.sputc((i >> 0) & 0xff) != std::streambuf::traits_type::eof(); +} +#endif + +// ---------------------------------------------------------------- +// input primitives +// ---------------------------------------------------------------- + + +// always reads big-endian +static bool +deserialize_untagged_u8(uint8_t *ip, std::streambuf &sb) +{ + std::streambuf::traits_type::int_type t; + int i; + + t = sb.sbumpc(); + i = t & 0xff; + + *ip = i; + return t != std::streambuf::traits_type::eof(); +} + +// always reads big-endian +static bool +deserialize_untagged_u16(uint16_t *ip, std::streambuf &sb) +{ + std::streambuf::traits_type::int_type t; + int i; + + t = sb.sbumpc(); + i = t & 0xff; + + t = sb.sbumpc(); + i = (i << 8) | (t & 0xff); + + *ip = i; + return t != std::streambuf::traits_type::eof(); +} + +// always reads big-endian +static bool +deserialize_untagged_u32(uint32_t *ip, std::streambuf &sb) +{ + std::streambuf::traits_type::int_type t; + int i; + + t = sb.sbumpc(); + i = t & 0xff; + + t = sb.sbumpc(); + i = (i << 8) | (t & 0xff); + t = sb.sbumpc(); + i = (i << 8) | (t & 0xff); + t = sb.sbumpc(); + i = (i << 8) | (t & 0xff); + + *ip = i; + return t != std::streambuf::traits_type::eof(); +} + +#if 0 +// always reads big-endian +static bool +deserialize_untagged_u64(uint64_t *ip, std::streambuf &sb) +{ + std::streambuf::traits_type::int_type t; + uint64_t i; + + t = sb.sbumpc(); + i = t & 0xff; + + t = sb.sbumpc(); + i = (i << 8) | (t & 0xff); + t = sb.sbumpc(); + i = (i << 8) | (t & 0xff); + t = sb.sbumpc(); + i = (i << 8) | (t & 0xff); + t = sb.sbumpc(); + i = (i << 8) | (t & 0xff); + t = sb.sbumpc(); + i = (i << 8) | (t & 0xff); + t = sb.sbumpc(); + i = (i << 8) | (t & 0xff); + t = sb.sbumpc(); + i = (i << 8) | (t & 0xff); + + *ip = i; + return t != std::streambuf::traits_type::eof(); +} +#endif + +/* + * Write portable byte-serial representation of \p obj to \p sb + * + * N.B., Circular structures cause infinite recursion. + */ +bool +pmt_serialize(pmt_t obj, std::streambuf &sb) +{ + bool ok = true; + + tail_recursion: + + if (pmt_is_bool(obj)){ + if (pmt_eq(obj, PMT_T)) + return serialize_untagged_u8(PST_TRUE, sb); + else + return serialize_untagged_u8(PST_FALSE, sb); + } + + if (pmt_is_null(obj)) + return serialize_untagged_u8(PST_NULL, sb); + + if (pmt_is_symbol(obj)){ + const std::string s = pmt_symbol_to_string(obj); + size_t len = s.size(); + ok = serialize_untagged_u8(PST_SYMBOL, sb); + ok &= serialize_untagged_u16(len, sb); + for (size_t i = 0; i < len; i++) + ok &= serialize_untagged_u8(s[i], sb); + return ok; + } + + if (pmt_is_pair(obj)){ + ok = serialize_untagged_u8(PST_PAIR, sb); + ok &= pmt_serialize(pmt_car(obj), sb); + if (!ok) + return false; + obj = pmt_cdr(obj); + goto tail_recursion; + } + + if (pmt_is_number(obj)){ + + if (pmt_is_integer(obj)){ + long i = pmt_to_long(obj); + if (sizeof(long) > 4){ + if (i < -2147483647 || i > 2147483647) + throw pmt_notimplemented("pmt_serialize (64-bit integers)", obj); + } + ok = serialize_untagged_u8(PST_INT32, sb); + ok &= serialize_untagged_u32(i, sb); + return ok; + } + + if (pmt_is_real(obj)) + throw pmt_notimplemented("pmt_serialize (real)", obj); + + if (pmt_is_complex(obj)) + throw pmt_notimplemented("pmt_serialize (complex)", obj); + } + + if (pmt_is_vector(obj)) + throw pmt_notimplemented("pmt_serialize (vector)", obj); + + if (pmt_is_uniform_vector(obj)) + throw pmt_notimplemented("pmt_serialize (uniform-vector)", obj); + + if (pmt_is_dict(obj)) + throw pmt_notimplemented("pmt_serialize (dict)", obj); + + + throw pmt_notimplemented("pmt_serialize (?)", obj); +} + +/* + * Create obj from portable byte-serial representation + * + * Returns next obj from streambuf, or PMT_EOF at end of file. + * Throws exception on malformed input. + */ +pmt_t +pmt_deserialize(std::streambuf &sb) +{ + uint8_t tag; + //uint8_t u8; + uint16_t u16; + uint32_t u32; + //uint32_t u64; + static char tmpbuf[1024]; + + if (!deserialize_untagged_u8(&tag, sb)) + return PMT_EOF; + + switch (tag){ + case PST_TRUE: + return PMT_T; + + case PST_FALSE: + return PMT_F; + + case PST_NULL: + return PMT_NIL; + + case PST_SYMBOL: + if (!deserialize_untagged_u16(&u16, sb)) + goto error; + if (u16 > sizeof(tmpbuf)) + throw pmt_notimplemented("pmt_deserialize: very long symbol", + PMT_F); + if (sb.sgetn(tmpbuf, u16) != u16) + goto error; + return pmt_intern(std::string(tmpbuf, u16)); + + case PST_INT32: + if (!deserialize_untagged_u32(&u32, sb)) + goto error; + return pmt_from_long((int32_t) u32); + + case PST_PAIR: + return parse_pair(sb); + + case PST_DOUBLE: + case PST_COMPLEX: + case PST_VECTOR: + case PST_DICT: + case PST_UNIFORM_VECTOR: + case PST_COMMENT: + throw pmt_notimplemented("pmt_deserialize: tag value = ", + pmt_from_long(tag)); + + default: + throw pmt_exception("pmt_deserialize: malformed input stream, tag value = ", + pmt_from_long(tag)); + } + + error: + throw pmt_exception("pmt_deserialize: malformed input stream", PMT_F); +} + +/* + * This is a mostly non-recursive implementation that allows us to + * deserialize very long lists w/o exhausting the evaluation stack. + * + * On entry we've already eaten the PST_PAIR tag. + */ +pmt_t +parse_pair(std::streambuf &sb) +{ + uint8_t tag; + pmt_t val, expr, lastnptr, nptr; + + // + // Keep appending nodes until we get a non-PAIR cdr. + // + lastnptr = PMT_NIL; + while (1){ + expr = pmt_deserialize(sb); // read the car + + nptr = pmt_cons(expr, PMT_NIL); // build new cell + if (pmt_is_null(lastnptr)) + val = nptr; + else + pmt_set_cdr(lastnptr, nptr); + lastnptr = nptr; + + if (!deserialize_untagged_u8(&tag, sb)) // get tag of cdr + throw pmt_exception("pmt_deserialize: malformed input stream", PMT_F); + + if (tag == PST_PAIR) + continue; // keep on looping... + + if (tag == PST_NULL){ + expr = PMT_NIL; + break; + } + + // + // default: push tag back and use pmt_deserialize to get the cdr + // + sb.sungetc(); + expr = pmt_deserialize(sb); + break; + } + + // + // At this point, expr contains the value of the final cdr in the list. + // + pmt_set_cdr(lastnptr, expr); + return val; +} + +} /* namespace pmt */ diff --git a/gruel/src/lib/pmt/qa_pmt.cc b/gruel/src/lib/pmt/qa_pmt.cc new file mode 100644 index 000000000..250befafa --- /dev/null +++ b/gruel/src/lib/pmt/qa_pmt.cc @@ -0,0 +1,40 @@ +/* + * Copyright 2006 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +/* + * This class gathers together all the test cases for pmt into + * a single test suite. As you create new test cases, add them here. + */ + +#include +#include +#include + +CppUnit::TestSuite * +qa_pmt::suite () +{ + CppUnit::TestSuite *s = new CppUnit::TestSuite ("pmt"); + + s->addTest (qa_pmt_prims::suite ()); + s->addTest (qa_pmt_unv::suite ()); + + return s; +} diff --git a/gruel/src/lib/pmt/qa_pmt.h b/gruel/src/lib/pmt/qa_pmt.h new file mode 100644 index 000000000..43a6dbf67 --- /dev/null +++ b/gruel/src/lib/pmt/qa_pmt.h @@ -0,0 +1,36 @@ +/* -*- c++ -*- */ +/* + * Copyright 2006 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef INCLUDED_QA_PMT_H +#define INCLUDED_QA_PMT_H + +#include + +//! collect all the tests for pmt + +class qa_pmt { + public: + //! return suite of tests for all of pmt + static CppUnit::TestSuite *suite (); +}; + +#endif /* INCLUDED_QA_PMT_H */ diff --git a/gruel/src/lib/pmt/qa_pmt_prims.cc b/gruel/src/lib/pmt/qa_pmt_prims.cc new file mode 100644 index 000000000..b81354721 --- /dev/null +++ b/gruel/src/lib/pmt/qa_pmt_prims.cc @@ -0,0 +1,438 @@ +/* -*- c++ -*- */ +/* + * Copyright 2006,2009 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include +#include + +using namespace pmt; + +void +qa_pmt_prims::test_symbols() +{ + CPPUNIT_ASSERT(!pmt_is_symbol(PMT_T)); + CPPUNIT_ASSERT(!pmt_is_symbol(PMT_F)); + CPPUNIT_ASSERT_THROW(pmt_symbol_to_string(PMT_F), pmt_wrong_type); + + pmt_t sym1 = pmt_string_to_symbol("test"); + CPPUNIT_ASSERT(pmt_is_symbol(sym1)); + CPPUNIT_ASSERT_EQUAL(std::string("test"), pmt_symbol_to_string(sym1)); + CPPUNIT_ASSERT(pmt_is_true(sym1)); + CPPUNIT_ASSERT(!pmt_is_false(sym1)); + + pmt_t sym2 = pmt_string_to_symbol("foo"); + pmt_t sym3 = pmt_string_to_symbol("test"); + CPPUNIT_ASSERT_EQUAL(sym1, sym3); + CPPUNIT_ASSERT(sym1 != sym2); + CPPUNIT_ASSERT(sym1 == sym3); + + static const int N = 2048; + std::vector v1(N); + std::vector v2(N); + + // generate a bunch of symbols + for (int i = 0; i < N; i++){ + char buf[100]; + snprintf(buf, sizeof(buf), "test-%d", i); + v1[i] = pmt_string_to_symbol(buf); + } + + // confirm that they are all unique + for (int i = 0; i < N; i++) + for (int j = i + 1; j < N; j++) + CPPUNIT_ASSERT(v1[i] != v1[j]); + + // generate the same symbols again + for (int i = 0; i < N; i++){ + char buf[100]; + snprintf(buf, sizeof(buf), "test-%d", i); + v2[i] = pmt_string_to_symbol(buf); + } + + // confirm that we get the same ones back + for (int i = 0; i < N; i++) + CPPUNIT_ASSERT(v1[i] == v2[i]); +} + +void +qa_pmt_prims::test_booleans() +{ + pmt_t sym = pmt_string_to_symbol("test"); + CPPUNIT_ASSERT(pmt_is_bool(PMT_T)); + CPPUNIT_ASSERT(pmt_is_bool(PMT_F)); + CPPUNIT_ASSERT(!pmt_is_bool(sym)); + CPPUNIT_ASSERT_EQUAL(pmt_from_bool(false), PMT_F); + CPPUNIT_ASSERT_EQUAL(pmt_from_bool(true), PMT_T); + CPPUNIT_ASSERT_EQUAL(false, pmt_to_bool(PMT_F)); + CPPUNIT_ASSERT_EQUAL(true, pmt_to_bool(PMT_T)); + CPPUNIT_ASSERT_THROW(pmt_to_bool(sym), pmt_wrong_type); +} + +void +qa_pmt_prims::test_integers() +{ + pmt_t p1 = pmt_from_long(1); + pmt_t m1 = pmt_from_long(-1); + CPPUNIT_ASSERT(!pmt_is_integer(PMT_T)); + CPPUNIT_ASSERT(pmt_is_integer(p1)); + CPPUNIT_ASSERT(pmt_is_integer(m1)); + CPPUNIT_ASSERT_THROW(pmt_to_long(PMT_T), pmt_wrong_type); + CPPUNIT_ASSERT_EQUAL(-1L, pmt_to_long(m1)); + CPPUNIT_ASSERT_EQUAL(1L, pmt_to_long(p1)); +} + +void +qa_pmt_prims::test_reals() +{ + pmt_t p1 = pmt_from_double(1); + pmt_t m1 = pmt_from_double(-1); + CPPUNIT_ASSERT(!pmt_is_real(PMT_T)); + CPPUNIT_ASSERT(pmt_is_real(p1)); + CPPUNIT_ASSERT(pmt_is_real(m1)); + CPPUNIT_ASSERT_THROW(pmt_to_double(PMT_T), pmt_wrong_type); + CPPUNIT_ASSERT_EQUAL(-1.0, pmt_to_double(m1)); + CPPUNIT_ASSERT_EQUAL(1.0, pmt_to_double(p1)); + CPPUNIT_ASSERT_EQUAL(1.0, pmt_to_double(pmt_from_long(1))); +} + +void +qa_pmt_prims::test_complexes() +{ + pmt_t p1 = pmt_make_rectangular(2, -3); + pmt_t m1 = pmt_make_rectangular(-3, 2); + CPPUNIT_ASSERT(!pmt_is_complex(PMT_T)); + CPPUNIT_ASSERT(pmt_is_complex(p1)); + CPPUNIT_ASSERT(pmt_is_complex(m1)); + CPPUNIT_ASSERT_THROW(pmt_to_complex(PMT_T), pmt_wrong_type); + CPPUNIT_ASSERT_EQUAL(std::complex(2, -3), pmt_to_complex(p1)); + CPPUNIT_ASSERT_EQUAL(std::complex(-3, 2), pmt_to_complex(m1)); + CPPUNIT_ASSERT_EQUAL(std::complex(1.0, 0), pmt_to_complex(pmt_from_long(1))); + CPPUNIT_ASSERT_EQUAL(std::complex(1.0, 0), pmt_to_complex(pmt_from_double(1.0))); +} + +void +qa_pmt_prims::test_pairs() +{ + CPPUNIT_ASSERT(pmt_is_null(PMT_NIL)); + CPPUNIT_ASSERT(!pmt_is_pair(PMT_NIL)); + pmt_t s1 = pmt_string_to_symbol("s1"); + pmt_t s2 = pmt_string_to_symbol("s2"); + pmt_t s3 = pmt_string_to_symbol("s3"); + + + CPPUNIT_ASSERT_EQUAL((size_t)0, pmt_length(PMT_NIL)); + CPPUNIT_ASSERT_THROW(pmt_length(s1), pmt_wrong_type); + CPPUNIT_ASSERT_THROW(pmt_length(pmt_from_double(42)), pmt_wrong_type); + + pmt_t c1 = pmt_cons(s1, PMT_NIL); + CPPUNIT_ASSERT(pmt_is_pair(c1)); + CPPUNIT_ASSERT(!pmt_is_pair(s1)); + CPPUNIT_ASSERT_EQUAL(s1, pmt_car(c1)); + CPPUNIT_ASSERT_EQUAL(PMT_NIL, pmt_cdr(c1)); + CPPUNIT_ASSERT_EQUAL((size_t) 1, pmt_length(c1)); + + pmt_t c3 = pmt_cons(s3, PMT_NIL); + pmt_t c2 = pmt_cons(s2, c3); + pmt_set_cdr(c1, c2); + CPPUNIT_ASSERT_EQUAL(c2, pmt_cdr(c1)); + pmt_set_car(c1, s3); + CPPUNIT_ASSERT_EQUAL(s3, pmt_car(c1)); + CPPUNIT_ASSERT_EQUAL((size_t)1, pmt_length(c3)); + CPPUNIT_ASSERT_EQUAL((size_t)2, pmt_length(c2)); + + CPPUNIT_ASSERT_THROW(pmt_cdr(PMT_NIL), pmt_wrong_type); + CPPUNIT_ASSERT_THROW(pmt_car(PMT_NIL), pmt_wrong_type); + CPPUNIT_ASSERT_THROW(pmt_set_car(s1, PMT_NIL), pmt_wrong_type); + CPPUNIT_ASSERT_THROW(pmt_set_cdr(s1, PMT_NIL), pmt_wrong_type); +} + +void +qa_pmt_prims::test_vectors() +{ + static const size_t N = 3; + pmt_t v1 = pmt_make_vector(N, PMT_NIL); + CPPUNIT_ASSERT_EQUAL(N, pmt_length(v1)); + pmt_t s0 = pmt_string_to_symbol("s0"); + pmt_t s1 = pmt_string_to_symbol("s1"); + pmt_t s2 = pmt_string_to_symbol("s2"); + + pmt_vector_set(v1, 0, s0); + pmt_vector_set(v1, 1, s1); + pmt_vector_set(v1, 2, s2); + + CPPUNIT_ASSERT_EQUAL(s0, pmt_vector_ref(v1, 0)); + CPPUNIT_ASSERT_EQUAL(s1, pmt_vector_ref(v1, 1)); + CPPUNIT_ASSERT_EQUAL(s2, pmt_vector_ref(v1, 2)); + + CPPUNIT_ASSERT_THROW(pmt_vector_ref(v1, N), pmt_out_of_range); + CPPUNIT_ASSERT_THROW(pmt_vector_set(v1, N, PMT_NIL), pmt_out_of_range); + + pmt_vector_fill(v1, s0); + for (size_t i = 0; i < N; i++) + CPPUNIT_ASSERT_EQUAL(s0, pmt_vector_ref(v1, i)); +} + +void +qa_pmt_prims::test_equivalence() +{ + pmt_t s0 = pmt_string_to_symbol("s0"); + pmt_t s1 = pmt_string_to_symbol("s1"); + pmt_t s2 = pmt_string_to_symbol("s2"); + pmt_t list0 = pmt_cons(s0, pmt_cons(s1, pmt_cons(s2, PMT_NIL))); + pmt_t list1 = pmt_cons(s0, pmt_cons(s1, pmt_cons(s2, PMT_NIL))); + pmt_t i0 = pmt_from_long(42); + pmt_t i1 = pmt_from_long(42); + pmt_t r0 = pmt_from_double(42); + pmt_t r1 = pmt_from_double(42); + pmt_t r2 = pmt_from_double(43); + + CPPUNIT_ASSERT(pmt_eq(s0, s0)); + CPPUNIT_ASSERT(!pmt_eq(s0, s1)); + CPPUNIT_ASSERT(pmt_eqv(s0, s0)); + CPPUNIT_ASSERT(!pmt_eqv(s0, s1)); + + CPPUNIT_ASSERT(pmt_eqv(i0, i1)); + CPPUNIT_ASSERT(pmt_eqv(r0, r1)); + CPPUNIT_ASSERT(!pmt_eqv(r0, r2)); + CPPUNIT_ASSERT(!pmt_eqv(i0, r0)); + + CPPUNIT_ASSERT(!pmt_eq(list0, list1)); + CPPUNIT_ASSERT(!pmt_eqv(list0, list1)); + CPPUNIT_ASSERT(pmt_equal(list0, list1)); + + pmt_t v0 = pmt_make_vector(3, s0); + pmt_t v1 = pmt_make_vector(3, s0); + pmt_t v2 = pmt_make_vector(4, s0); + CPPUNIT_ASSERT(!pmt_eqv(v0, v1)); + CPPUNIT_ASSERT(pmt_equal(v0, v1)); + CPPUNIT_ASSERT(!pmt_equal(v0, v2)); + + pmt_vector_set(v0, 0, list0); + pmt_vector_set(v0, 1, list0); + pmt_vector_set(v1, 0, list1); + pmt_vector_set(v1, 1, list1); + CPPUNIT_ASSERT(pmt_equal(v0, v1)); +} + +void +qa_pmt_prims::test_misc() +{ + pmt_t k0 = pmt_string_to_symbol("k0"); + pmt_t k1 = pmt_string_to_symbol("k1"); + pmt_t k2 = pmt_string_to_symbol("k2"); + pmt_t k3 = pmt_string_to_symbol("k3"); + pmt_t v0 = pmt_string_to_symbol("v0"); + pmt_t v1 = pmt_string_to_symbol("v1"); + pmt_t v2 = pmt_string_to_symbol("v2"); + pmt_t p0 = pmt_cons(k0, v0); + pmt_t p1 = pmt_cons(k1, v1); + pmt_t p2 = pmt_cons(k2, v2); + + pmt_t alist = pmt_cons(p0, pmt_cons(p1, pmt_cons(p2, PMT_NIL))); + CPPUNIT_ASSERT(pmt_eq(p1, pmt_assv(k1, alist))); + CPPUNIT_ASSERT(pmt_eq(PMT_F, pmt_assv(k3, alist))); + + pmt_t keys = pmt_cons(k0, pmt_cons(k1, pmt_cons(k2, PMT_NIL))); + pmt_t vals = pmt_cons(v0, pmt_cons(v1, pmt_cons(v2, PMT_NIL))); + CPPUNIT_ASSERT(pmt_equal(keys, pmt_map(pmt_car, alist))); + CPPUNIT_ASSERT(pmt_equal(vals, pmt_map(pmt_cdr, alist))); +} + +void +qa_pmt_prims::test_dict() +{ + pmt_t dict = pmt_make_dict(); + CPPUNIT_ASSERT(pmt_is_dict(dict)); + + pmt_t k0 = pmt_string_to_symbol("k0"); + pmt_t k1 = pmt_string_to_symbol("k1"); + pmt_t k2 = pmt_string_to_symbol("k2"); + pmt_t k3 = pmt_string_to_symbol("k3"); + pmt_t v0 = pmt_string_to_symbol("v0"); + pmt_t v1 = pmt_string_to_symbol("v1"); + pmt_t v2 = pmt_string_to_symbol("v2"); + pmt_t v3 = pmt_string_to_symbol("v3"); + pmt_t not_found = pmt_cons(PMT_NIL, PMT_NIL); + + CPPUNIT_ASSERT(!pmt_dict_has_key(dict, k0)); + pmt_dict_set(dict, k0, v0); + CPPUNIT_ASSERT(pmt_dict_has_key(dict, k0)); + CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k0, not_found), v0)); + CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k1, not_found), not_found)); + pmt_dict_set(dict, k1, v1); + pmt_dict_set(dict, k2, v2); + CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k1, not_found), v1)); + pmt_dict_set(dict, k1, v3); + CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k1, not_found), v3)); + + pmt_t keys = pmt_cons(k2, pmt_cons(k1, pmt_cons(k0, PMT_NIL))); + pmt_t vals = pmt_cons(v2, pmt_cons(v3, pmt_cons(v0, PMT_NIL))); + CPPUNIT_ASSERT(pmt_equal(keys, pmt_dict_keys(dict))); + CPPUNIT_ASSERT(pmt_equal(vals, pmt_dict_values(dict))); +} + +void +qa_pmt_prims::test_io() +{ + pmt_t k0 = pmt_string_to_symbol("k0"); + pmt_t k1 = pmt_string_to_symbol("k1"); + pmt_t k2 = pmt_string_to_symbol("k2"); + pmt_t k3 = pmt_string_to_symbol("k3"); + + CPPUNIT_ASSERT_EQUAL(std::string("k0"), pmt_write_string(k0)); +} + +void +qa_pmt_prims::test_lists() +{ + pmt_t s0 = pmt_intern("s0"); + pmt_t s1 = pmt_intern("s1"); + pmt_t s2 = pmt_intern("s2"); + pmt_t s3 = pmt_intern("s3"); + + pmt_t l1 = pmt_list4(s0, s1, s2, s3); + pmt_t l2 = pmt_list3(s0, s1, s2); + pmt_t l3 = pmt_list_add(l2, s3); + CPPUNIT_ASSERT(pmt_equal(l1, l3)); +} + +// ------------------------------------------------------------------------ + +// class foo is used in test_any below. +// It can't be declared in the scope of test_any because of template +// namespace problems. + +class foo { +public: + double d_double; + int d_int; + foo(double d=0, int i=0) : d_double(d), d_int(i) {} +}; + +bool operator==(const foo &a, const foo &b) +{ + return a.d_double == b.d_double && a.d_int == b.d_int; +} + +std::ostream& operator<<(std::ostream &os, const foo obj) +{ + os << ""; + return os; +} + +void +qa_pmt_prims::test_any() +{ + boost::any a0; + boost::any a1; + boost::any a2; + + a0 = std::string("Hello!"); + a1 = 42; + a2 = foo(3.250, 21); + + pmt_t p0 = pmt_make_any(a0); + pmt_t p1 = pmt_make_any(a1); + pmt_t p2 = pmt_make_any(a2); + + CPPUNIT_ASSERT_EQUAL(std::string("Hello!"), + boost::any_cast(pmt_any_ref(p0))); + + CPPUNIT_ASSERT_EQUAL(42, + boost::any_cast(pmt_any_ref(p1))); + + CPPUNIT_ASSERT_EQUAL(foo(3.250, 21), + boost::any_cast(pmt_any_ref(p2))); +} + +// ------------------------------------------------------------------------ + +void +qa_pmt_prims::test_serialize() +{ + std::stringbuf sb; // fake channel + pmt_t a = pmt_intern("a"); + pmt_t b = pmt_intern("b"); + pmt_t c = pmt_intern("c"); + + sb.str(""); // reset channel to empty + + // write stuff to channel + + pmt_serialize(PMT_NIL, sb); + pmt_serialize(pmt_intern("foobarvia"), sb); + pmt_serialize(pmt_from_long(123456789), sb); + pmt_serialize(pmt_from_long(-123456789), sb); + pmt_serialize(pmt_cons(PMT_NIL, PMT_NIL), sb); + pmt_serialize(pmt_cons(a, b), sb); + pmt_serialize(pmt_list1(a), sb); + pmt_serialize(pmt_list2(a, b), sb); + pmt_serialize(pmt_list3(a, b, c), sb); + pmt_serialize(pmt_list3(a, pmt_list3(c, b, a), c), sb); + pmt_serialize(PMT_T, sb); + pmt_serialize(PMT_F, sb); + + // read it back + + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), PMT_NIL)); + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_intern("foobarvia"))); + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_from_long(123456789))); + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_from_long(-123456789))); + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_cons(PMT_NIL, PMT_NIL))); + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_cons(a, b))); + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_list1(a))); + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_list2(a, b))); + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_list3(a, b, c))); + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_list3(a, pmt_list3(c, b, a), c))); + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), PMT_T)); + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), PMT_F)); + + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), PMT_EOF)); // last item + + + // FIXME add tests for real, complex, vector, uniform-vector, dict + // FIXME add tests for malformed input too. + +} + +void +qa_pmt_prims::test_sets() +{ + pmt_t s1 = pmt_intern("s1"); + pmt_t s2 = pmt_intern("s2"); + pmt_t s3 = pmt_intern("s3"); + + pmt_t l1 = pmt_list1(s1); + pmt_t l2 = pmt_list2(s2,s3); + pmt_t l3 = pmt_list3(s1,s2,s3); + + CPPUNIT_ASSERT(pmt_is_pair(pmt_memq(s1,l1))); + CPPUNIT_ASSERT(pmt_is_false(pmt_memq(s3,l1))); + + CPPUNIT_ASSERT(pmt_subsetp(l1,l3)); + CPPUNIT_ASSERT(pmt_subsetp(l2,l3)); + CPPUNIT_ASSERT(!pmt_subsetp(l1,l2)); + CPPUNIT_ASSERT(!pmt_subsetp(l2,l1)); + CPPUNIT_ASSERT(!pmt_subsetp(l3,l2)); +} diff --git a/gruel/src/lib/pmt/qa_pmt_prims.h b/gruel/src/lib/pmt/qa_pmt_prims.h new file mode 100644 index 000000000..effb3a097 --- /dev/null +++ b/gruel/src/lib/pmt/qa_pmt_prims.h @@ -0,0 +1,67 @@ +/* -*- c++ -*- */ +/* + * Copyright 2006 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ +#ifndef INCLUDED_QA_PMT_PRIMS_H +#define INCLUDED_QA_PMT_PRIMS_H + +#include +#include + +class qa_pmt_prims : public CppUnit::TestCase { + + CPPUNIT_TEST_SUITE(qa_pmt_prims); + CPPUNIT_TEST(test_symbols); + CPPUNIT_TEST(test_booleans); + CPPUNIT_TEST(test_integers); + CPPUNIT_TEST(test_reals); + CPPUNIT_TEST(test_complexes); + CPPUNIT_TEST(test_pairs); + CPPUNIT_TEST(test_vectors); + CPPUNIT_TEST(test_equivalence); + CPPUNIT_TEST(test_misc); + CPPUNIT_TEST(test_dict); + CPPUNIT_TEST(test_any); + CPPUNIT_TEST(test_io); + CPPUNIT_TEST(test_lists); + CPPUNIT_TEST(test_serialize); + CPPUNIT_TEST(test_sets); + CPPUNIT_TEST_SUITE_END(); + + private: + void test_symbols(); + void test_booleans(); + void test_integers(); + void test_reals(); + void test_complexes(); + void test_pairs(); + void test_vectors(); + void test_equivalence(); + void test_misc(); + void test_dict(); + void test_any(); + void test_io(); + void test_lists(); + void test_serialize(); + void test_sets(); +}; + +#endif /* INCLUDED_QA_PMT_PRIMS_H */ + diff --git a/gruel/src/lib/pmt/test_pmt.cc b/gruel/src/lib/pmt/test_pmt.cc new file mode 100644 index 000000000..034785f4e --- /dev/null +++ b/gruel/src/lib/pmt/test_pmt.cc @@ -0,0 +1,37 @@ +/* -*- c++ -*- */ +/* + * Copyright 2006 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include +#include + +int +main(int argc, char **argv) +{ + + CppUnit::TextTestRunner runner; + + runner.addTest(qa_pmt::suite ()); + + bool was_successful = runner.run("", false); + + return was_successful ? 0 : 1; +} diff --git a/gruel/src/lib/pmt/unv_qa_template.cc.t b/gruel/src/lib/pmt/unv_qa_template.cc.t new file mode 100644 index 000000000..1e2c8e8eb --- /dev/null +++ b/gruel/src/lib/pmt/unv_qa_template.cc.t @@ -0,0 +1,35 @@ +void +qa_pmt_unv::test_@TAG@vector() +{ + static const size_t N = 3; + pmt_t v1 = pmt_make_@TAG@vector(N, 0); + CPPUNIT_ASSERT_EQUAL(N, pmt_length(v1)); + @TYPE@ s0 = @TYPE@(10); + @TYPE@ s1 = @TYPE@(20); + @TYPE@ s2 = @TYPE@(30); + + pmt_@TAG@vector_set(v1, 0, s0); + pmt_@TAG@vector_set(v1, 1, s1); + pmt_@TAG@vector_set(v1, 2, s2); + + CPPUNIT_ASSERT_EQUAL(s0, pmt_@TAG@vector_ref(v1, 0)); + CPPUNIT_ASSERT_EQUAL(s1, pmt_@TAG@vector_ref(v1, 1)); + CPPUNIT_ASSERT_EQUAL(s2, pmt_@TAG@vector_ref(v1, 2)); + + CPPUNIT_ASSERT_THROW(pmt_@TAG@vector_ref(v1, N), pmt_out_of_range); + CPPUNIT_ASSERT_THROW(pmt_@TAG@vector_set(v1, N, @TYPE@(0)), pmt_out_of_range); + + size_t len; + const @TYPE@ *rd = pmt_@TAG@vector_elements(v1, len); + CPPUNIT_ASSERT_EQUAL(len, N); + CPPUNIT_ASSERT_EQUAL(s0, rd[0]); + CPPUNIT_ASSERT_EQUAL(s1, rd[1]); + CPPUNIT_ASSERT_EQUAL(s2, rd[2]); + + @TYPE@ *wr = pmt_@TAG@vector_writable_elements(v1, len); + CPPUNIT_ASSERT_EQUAL(len, N); + wr[0] = @TYPE@(0); + CPPUNIT_ASSERT_EQUAL(@TYPE@(0), wr[0]); + CPPUNIT_ASSERT_EQUAL(s1, wr[1]); + CPPUNIT_ASSERT_EQUAL(s2, wr[2]); +} diff --git a/gruel/src/lib/pmt/unv_template.cc.t b/gruel/src/lib/pmt/unv_template.cc.t new file mode 100644 index 000000000..148965c09 --- /dev/null +++ b/gruel/src/lib/pmt/unv_template.cc.t @@ -0,0 +1,122 @@ +//////////////////////////////////////////////////////////////////////////// +// pmt_@TAG@vector +//////////////////////////////////////////////////////////////////////////// + +namespace pmt { + +static pmt_@TAG@vector * +_@TAG@vector(pmt_t x) +{ + return dynamic_cast(x.get()); +} + + +pmt_@TAG@vector::pmt_@TAG@vector(size_t k, @TYPE@ fill) + : d_v(k) +{ + for (size_t i = 0; i < k; i++) + d_v[i] = fill; +} + +pmt_@TAG@vector::pmt_@TAG@vector(size_t k, const @TYPE@ *data) + : d_v(k) +{ + for (size_t i = 0; i < k; i++) + d_v[i] = data[i]; +} + +@TYPE@ +pmt_@TAG@vector::ref(size_t k) const +{ + if (k >= length()) + throw pmt_out_of_range("pmt_@TAG@vector_ref", pmt_from_long(k)); + return d_v[k]; +} + +void +pmt_@TAG@vector::set(size_t k, @TYPE@ x) +{ + if (k >= length()) + throw pmt_out_of_range("pmt_@TAG@vector_set", pmt_from_long(k)); + d_v[k] = x; +} + +const @TYPE@ * +pmt_@TAG@vector::elements(size_t &len) +{ + len = length(); + return &d_v[0]; +} + +@TYPE@ * +pmt_@TAG@vector::writable_elements(size_t &len) +{ + len = length(); + return &d_v[0]; +} + +const void* +pmt_@TAG@vector::uniform_elements(size_t &len) +{ + len = length() * sizeof(@TYPE@); + return &d_v[0]; +} + +void* +pmt_@TAG@vector::uniform_writable_elements(size_t &len) +{ + len = length() * sizeof(@TYPE@); + return &d_v[0]; +} + +bool +pmt_is_@TAG@vector(pmt_t obj) +{ + return obj->is_@TAG@vector(); +} + +pmt_t +pmt_make_@TAG@vector(size_t k, @TYPE@ fill) +{ + return pmt_t(new pmt_@TAG@vector(k, fill)); +} + +pmt_t +pmt_init_@TAG@vector(size_t k, const @TYPE@ *data) +{ + return pmt_t(new pmt_@TAG@vector(k, data)); +} + +@TYPE@ +pmt_@TAG@vector_ref(pmt_t vector, size_t k) +{ + if (!vector->is_@TAG@vector()) + throw pmt_wrong_type("pmt_@TAG@vector_ref", vector); + return _@TAG@vector(vector)->ref(k); +} + +void +pmt_@TAG@vector_set(pmt_t vector, size_t k, @TYPE@ obj) +{ + if (!vector->is_@TAG@vector()) + throw pmt_wrong_type("pmt_@TAG@vector_set", vector); + _@TAG@vector(vector)->set(k, obj); +} + +const @TYPE@ * +pmt_@TAG@vector_elements(pmt_t vector, size_t &len) +{ + if (!vector->is_@TAG@vector()) + throw pmt_wrong_type("pmt_@TAG@vector_elements", vector); + return _@TAG@vector(vector)->elements(len); +} + +@TYPE@ * +pmt_@TAG@vector_writable_elements(pmt_t vector, size_t &len) +{ + if (!vector->is_@TAG@vector()) + throw pmt_wrong_type("pmt_@TAG@vector_writable_elements", vector); + return _@TAG@vector(vector)->writable_elements(len); +} + +} /* namespace pmt */ diff --git a/gruel/src/lib/pmt/unv_template.h.t b/gruel/src/lib/pmt/unv_template.h.t new file mode 100644 index 000000000..83ba0be0f --- /dev/null +++ b/gruel/src/lib/pmt/unv_template.h.t @@ -0,0 +1,23 @@ + +//////////////////////////////////////////////////////////////////////////// +// pmt_@TAG@vector +//////////////////////////////////////////////////////////////////////////// + +class pmt_@TAG@vector : public pmt_uniform_vector +{ + std::vector< @TYPE@ > d_v; + +public: + pmt_@TAG@vector(size_t k, @TYPE@ fill); + pmt_@TAG@vector(size_t k, const @TYPE@ *data); + // ~pmt_@TAG@vector(); + + bool is_@TAG@vector() const { return true; } + size_t length() const { return d_v.size(); } + @TYPE@ ref(size_t k) const; + void set(size_t k, @TYPE@ x); + const @TYPE@ *elements(size_t &len); + @TYPE@ *writable_elements(size_t &len); + const void *uniform_elements(size_t &len); + void *uniform_writable_elements(size_t &len); +}; diff --git a/gruel/src/lib/pmt_int.h b/gruel/src/lib/pmt_int.h deleted file mode 100644 index 03f0e555c..000000000 --- a/gruel/src/lib/pmt_int.h +++ /dev/null @@ -1,227 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2006,2009 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDED_PMT_INT_H -#define INCLUDED_PMT_INT_H - -#include -#include - -/* - * EVERYTHING IN THIS FILE IS PRIVATE TO THE IMPLEMENTATION! - * - * See pmt.h for the public interface - */ - -#define PMT_LOCAL_ALLOCATOR 0 // define to 0 or 1 -namespace gruel { - -class pmt_base : boost::noncopyable { -protected: - pmt_base(){}; - virtual ~pmt_base(); - -public: - virtual bool is_bool() const { return false; } - virtual bool is_symbol() const { return false; } - virtual bool is_number() const { return false; } - virtual bool is_integer() const { return false; } - virtual bool is_real() const { return false; } - virtual bool is_complex() const { return false; } - virtual bool is_null() const { return false; } - virtual bool is_pair() const { return false; } - virtual bool is_vector() const { return false; } - virtual bool is_dict() const { return false; } - virtual bool is_any() const { return false; } - - virtual bool is_uniform_vector() const { return false; } - virtual bool is_u8vector() const { return false; } - virtual bool is_s8vector() const { return false; } - virtual bool is_u16vector() const { return false; } - virtual bool is_s16vector() const { return false; } - virtual bool is_u32vector() const { return false; } - virtual bool is_s32vector() const { return false; } - virtual bool is_u64vector() const { return false; } - virtual bool is_s64vector() const { return false; } - virtual bool is_f32vector() const { return false; } - virtual bool is_f64vector() const { return false; } - virtual bool is_c32vector() const { return false; } - virtual bool is_c64vector() const { return false; } - -# if (PMT_LOCAL_ALLOCATOR) - void *operator new(size_t); - void operator delete(void *, size_t); -#endif -}; - -class pmt_bool : public pmt_base -{ -public: - pmt_bool(); - //~pmt_bool(){} - - bool is_bool() const { return true; } -}; - - -class pmt_symbol : public pmt_base -{ - std::string d_name; - pmt_t d_next; - -public: - pmt_symbol(const std::string &name); - //~pmt_symbol(){} - - bool is_symbol() const { return true; } - const std::string name() { return d_name; } - - pmt_t next() { return d_next; } // symbol table link - void set_next(pmt_t next) { d_next = next; } -}; - -class pmt_integer : public pmt_base -{ - long d_value; - -public: - pmt_integer(long value); - //~pmt_integer(){} - - bool is_number() const { return true; } - bool is_integer() const { return true; } - long value() const { return d_value; } -}; - -class pmt_real : public pmt_base -{ - double d_value; - -public: - pmt_real(double value); - //~pmt_real(){} - - bool is_number() const { return true; } - bool is_real() const { return true; } - double value() const { return d_value; } -}; - -class pmt_complex : public pmt_base -{ - std::complex d_value; - -public: - pmt_complex(std::complex value); - //~pmt_complex(){} - - bool is_number() const { return true; } - bool is_complex() const { return true; } - std::complex value() const { return d_value; } -}; - -class pmt_null : public pmt_base -{ -public: - pmt_null(); - //~pmt_null(){} - - bool is_null() const { return true; } -}; - -class pmt_pair : public pmt_base -{ - pmt_t d_car; - pmt_t d_cdr; - -public: - pmt_pair(const pmt_t& car, const pmt_t& cdr); - //~pmt_pair(){}; - - bool is_pair() const { return true; } - pmt_t car() const { return d_car; } - pmt_t cdr() const { return d_cdr; } - - void set_car(pmt_t car) { d_car = car; } - void set_cdr(pmt_t cdr) { d_cdr = cdr; } -}; - -class pmt_vector : public pmt_base -{ - std::vector d_v; - -public: - pmt_vector(size_t len, pmt_t fill); - //~pmt_vector(); - - bool is_vector() const { return true; } - pmt_t ref(size_t k) const; - void set(size_t k, pmt_t obj); - void fill(pmt_t fill); - size_t length() const { return d_v.size(); } - - pmt_t _ref(size_t k) const { return d_v[k]; } -}; - -class pmt_dict : public pmt_base -{ - pmt_t d_alist; // list of (key . value) pairs - -public: - pmt_dict(); - //~pmt_dict(); - - bool is_dict() const { return true; } - void set(pmt_t key, pmt_t value); - pmt_t ref(pmt_t key, pmt_t default_value) const; - bool has_key(pmt_t key) const; - pmt_t items() const; - pmt_t keys() const; - pmt_t values() const; -}; - -class pmt_any : public pmt_base -{ - boost::any d_any; - -public: - pmt_any(const boost::any &any); - //~pmt_any(); - - bool is_any() const { return true; } - const boost::any &ref() const { return d_any; } - void set(const boost::any &any) { d_any = any; } -}; - - -class pmt_uniform_vector : public pmt_base -{ -public: - bool is_uniform_vector() const { return true; } - virtual const void *uniform_elements(size_t &len) = 0; - virtual void *uniform_writable_elements(size_t &len) = 0; - virtual size_t length() const = 0; -}; - -#include "pmt_unv_int.h" - -} /* namespace gruel */ - -#endif /* INCLUDED_PMT_INT_H */ diff --git a/gruel/src/lib/pmt_io.cc b/gruel/src/lib/pmt_io.cc deleted file mode 100644 index e10ea7814..000000000 --- a/gruel/src/lib/pmt_io.cc +++ /dev/null @@ -1,141 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2006,2009 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif -#include -#include -#include "pmt_int.h" -#include - -namespace gruel { - -static void -pmt_write_list_tail(pmt_t obj, std::ostream &port) -{ - pmt_write(pmt_car(obj), port); // write the car - obj = pmt_cdr(obj); // step to cdr - - if (pmt_is_null(obj)) // () - port << ")"; - - else if (pmt_is_pair(obj)){ // normal list - port << " "; - pmt_write_list_tail(obj, port); - } - else { // dotted pair - port << " . "; - pmt_write(obj, port); - port << ")"; - } -} - -void -pmt_write(pmt_t obj, std::ostream &port) -{ - if (pmt_is_bool(obj)){ - if (pmt_is_true(obj)) - port << "#t"; - else - port << "#f"; - } - else if (pmt_is_symbol(obj)){ - port << pmt_symbol_to_string(obj); - } - else if (pmt_is_number(obj)){ - if (pmt_is_integer(obj)) - port << pmt_to_long(obj); - else if (pmt_is_real(obj)) - port << pmt_to_double(obj); - else if (pmt_is_complex(obj)){ - std::complex c = pmt_to_complex(obj); - port << c.real() << '+' << c.imag() << 'i'; - } - else - goto error; - } - else if (pmt_is_null(obj)){ - port << "()"; - } - else if (pmt_is_pair(obj)){ - port << "("; - pmt_write_list_tail(obj, port); - } - else if (pmt_is_dict(obj)){ - // FIXME - // port << "#"; - port << "#"; - } - else if (pmt_is_vector(obj)){ - // FIXME - // port << "#"; - port << "#"; - } - else if (pmt_is_uniform_vector(obj)){ - // FIXME - // port << "#"; - port << "#"; - } - else { - error: - // FIXME - // port << "#<" << obj << ">"; - port << "#"; - } -} - -std::ostream& operator<<(std::ostream &os, pmt_t obj) -{ - pmt_write(obj, os); - return os; -} - -std::string -pmt_write_string(pmt_t obj) -{ - std::ostringstream s; - s << obj; - return s.str(); -} - -pmt_t -pmt_read(std::istream &port) -{ - throw pmt_notimplemented("notimplemented: pmt_read", PMT_NIL); -} - -void -pmt_serialize(pmt_t obj, std::ostream &sink) -{ - throw pmt_notimplemented("notimplemented: pmt_serialize", obj); -} - -/*! - * \brief Create obj from portable byte-serial representation - */ -pmt_t -pmt_deserialize(std::istream &source) -{ - throw pmt_notimplemented("notimplemented: pmt_deserialize", PMT_NIL); -} - -} /* namespace gruel */ diff --git a/gruel/src/lib/pmt_pool.cc b/gruel/src/lib/pmt_pool.cc deleted file mode 100644 index 79a22ea73..000000000 --- a/gruel/src/lib/pmt_pool.cc +++ /dev/null @@ -1,112 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2007,2009 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif -#include -#include -#include - -namespace gruel { - -static inline size_t -ROUNDUP(size_t x, size_t stride) -{ - return ((((x) + (stride) - 1)/(stride)) * (stride)); -} - -pmt_pool::pmt_pool(size_t itemsize, size_t alignment, - size_t allocation_size, size_t max_items) - : d_itemsize(ROUNDUP(itemsize, alignment)), - d_alignment(alignment), - d_allocation_size(std::max(allocation_size, 16 * itemsize)), - d_max_items(max_items), d_n_items(0), - d_freelist(0) -{ -} - -pmt_pool::~pmt_pool() -{ - for (unsigned int i = 0; i < d_allocations.size(); i++){ - delete [] d_allocations[i]; - } -} - -void * -pmt_pool::malloc() -{ - scoped_lock guard(d_mutex); - item *p; - - if (d_max_items != 0){ - while (d_n_items >= d_max_items) - d_cond.wait(guard); - } - - if (d_freelist){ // got something? - p = d_freelist; - d_freelist = p->d_next; - d_n_items++; - return p; - } - - // allocate a new chunk - char *alloc = new char[d_allocation_size + d_alignment - 1]; - d_allocations.push_back(alloc); - - // get the alignment we require - char *start = (char *)(((uintptr_t)alloc + d_alignment-1) & -d_alignment); - char *end = alloc + d_allocation_size + d_alignment - 1; - size_t n = (end - start) / d_itemsize; - - // link the new items onto the free list. - p = (item *) start; - for (size_t i = 0; i < n; i++){ - p->d_next = d_freelist; - d_freelist = p; - p = (item *)((char *) p + d_itemsize); - } - - // now return the first one - p = d_freelist; - d_freelist = p->d_next; - d_n_items++; - return p; -} - -void -pmt_pool::free(void *foo) -{ - if (!foo) - return; - - scoped_lock guard(d_mutex); - - item *p = (item *) foo; - p->d_next = d_freelist; - d_freelist = p; - d_n_items--; - if (d_max_items != 0) - d_cond.notify_one(); -} - -} /* namespace gruel */ diff --git a/gruel/src/lib/pmt_serialize.cc b/gruel/src/lib/pmt_serialize.cc deleted file mode 100644 index b7193e811..000000000 --- a/gruel/src/lib/pmt_serialize.cc +++ /dev/null @@ -1,357 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2007,2009 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif -#include -#include -#include "pmt_int.h" -#include "gruel/pmt_serial_tags.h" - -namespace gruel { - -static pmt_t parse_pair(std::streambuf &sb); - -// ---------------------------------------------------------------- -// output primitives -// ---------------------------------------------------------------- - -static bool -serialize_untagged_u8(unsigned int i, std::streambuf &sb) -{ - return sb.sputc((i >> 0) & 0xff) != std::streambuf::traits_type::eof(); -} - -// always writes big-endian -static bool -serialize_untagged_u16(unsigned int i, std::streambuf &sb) -{ - sb.sputc((i >> 8) & 0xff); - return sb.sputc((i >> 0) & 0xff) != std::streambuf::traits_type::eof(); -} - -// always writes big-endian -static bool -serialize_untagged_u32(unsigned int i, std::streambuf &sb) -{ - sb.sputc((i >> 24) & 0xff); - sb.sputc((i >> 16) & 0xff); - sb.sputc((i >> 8) & 0xff); - return sb.sputc((i >> 0) & 0xff) != std::streambuf::traits_type::eof(); -} - -#if 0 -// always writes big-endian -static bool -serialize_untagged_u64(uint64_t i, std::streambuf &sb) -{ - sb.sputc((i >> 56) & 0xff); - sb.sputc((i >> 48) & 0xff); - sb.sputc((i >> 40) & 0xff); - sb.sputc((i >> 32) & 0xff); - sb.sputc((i >> 24) & 0xff); - sb.sputc((i >> 16) & 0xff); - sb.sputc((i >> 8) & 0xff); - return sb.sputc((i >> 0) & 0xff) != std::streambuf::traits_type::eof(); -} -#endif - -// ---------------------------------------------------------------- -// input primitives -// ---------------------------------------------------------------- - - -// always reads big-endian -static bool -deserialize_untagged_u8(uint8_t *ip, std::streambuf &sb) -{ - std::streambuf::traits_type::int_type t; - int i; - - t = sb.sbumpc(); - i = t & 0xff; - - *ip = i; - return t != std::streambuf::traits_type::eof(); -} - -// always reads big-endian -static bool -deserialize_untagged_u16(uint16_t *ip, std::streambuf &sb) -{ - std::streambuf::traits_type::int_type t; - int i; - - t = sb.sbumpc(); - i = t & 0xff; - - t = sb.sbumpc(); - i = (i << 8) | (t & 0xff); - - *ip = i; - return t != std::streambuf::traits_type::eof(); -} - -// always reads big-endian -static bool -deserialize_untagged_u32(uint32_t *ip, std::streambuf &sb) -{ - std::streambuf::traits_type::int_type t; - int i; - - t = sb.sbumpc(); - i = t & 0xff; - - t = sb.sbumpc(); - i = (i << 8) | (t & 0xff); - t = sb.sbumpc(); - i = (i << 8) | (t & 0xff); - t = sb.sbumpc(); - i = (i << 8) | (t & 0xff); - - *ip = i; - return t != std::streambuf::traits_type::eof(); -} - -#if 0 -// always reads big-endian -static bool -deserialize_untagged_u64(uint64_t *ip, std::streambuf &sb) -{ - std::streambuf::traits_type::int_type t; - uint64_t i; - - t = sb.sbumpc(); - i = t & 0xff; - - t = sb.sbumpc(); - i = (i << 8) | (t & 0xff); - t = sb.sbumpc(); - i = (i << 8) | (t & 0xff); - t = sb.sbumpc(); - i = (i << 8) | (t & 0xff); - t = sb.sbumpc(); - i = (i << 8) | (t & 0xff); - t = sb.sbumpc(); - i = (i << 8) | (t & 0xff); - t = sb.sbumpc(); - i = (i << 8) | (t & 0xff); - t = sb.sbumpc(); - i = (i << 8) | (t & 0xff); - - *ip = i; - return t != std::streambuf::traits_type::eof(); -} -#endif - -/* - * Write portable byte-serial representation of \p obj to \p sb - * - * N.B., Circular structures cause infinite recursion. - */ -bool -pmt_serialize(pmt_t obj, std::streambuf &sb) -{ - bool ok = true; - - tail_recursion: - - if (pmt_is_bool(obj)){ - if (pmt_eq(obj, PMT_T)) - return serialize_untagged_u8(PST_TRUE, sb); - else - return serialize_untagged_u8(PST_FALSE, sb); - } - - if (pmt_is_null(obj)) - return serialize_untagged_u8(PST_NULL, sb); - - if (pmt_is_symbol(obj)){ - const std::string s = pmt_symbol_to_string(obj); - size_t len = s.size(); - ok = serialize_untagged_u8(PST_SYMBOL, sb); - ok &= serialize_untagged_u16(len, sb); - for (size_t i = 0; i < len; i++) - ok &= serialize_untagged_u8(s[i], sb); - return ok; - } - - if (pmt_is_pair(obj)){ - ok = serialize_untagged_u8(PST_PAIR, sb); - ok &= pmt_serialize(pmt_car(obj), sb); - if (!ok) - return false; - obj = pmt_cdr(obj); - goto tail_recursion; - } - - if (pmt_is_number(obj)){ - - if (pmt_is_integer(obj)){ - long i = pmt_to_long(obj); - if (sizeof(long) > 4){ - if (i < -2147483647 || i > 2147483647) - throw pmt_notimplemented("pmt_serialize (64-bit integers)", obj); - } - ok = serialize_untagged_u8(PST_INT32, sb); - ok &= serialize_untagged_u32(i, sb); - return ok; - } - - if (pmt_is_real(obj)) - throw pmt_notimplemented("pmt_serialize (real)", obj); - - if (pmt_is_complex(obj)) - throw pmt_notimplemented("pmt_serialize (complex)", obj); - } - - if (pmt_is_vector(obj)) - throw pmt_notimplemented("pmt_serialize (vector)", obj); - - if (pmt_is_uniform_vector(obj)) - throw pmt_notimplemented("pmt_serialize (uniform-vector)", obj); - - if (pmt_is_dict(obj)) - throw pmt_notimplemented("pmt_serialize (dict)", obj); - - - throw pmt_notimplemented("pmt_serialize (?)", obj); -} - -/* - * Create obj from portable byte-serial representation - * - * Returns next obj from streambuf, or PMT_EOF at end of file. - * Throws exception on malformed input. - */ -pmt_t -pmt_deserialize(std::streambuf &sb) -{ - uint8_t tag; - //uint8_t u8; - uint16_t u16; - uint32_t u32; - //uint32_t u64; - static char tmpbuf[1024]; - - if (!deserialize_untagged_u8(&tag, sb)) - return PMT_EOF; - - switch (tag){ - case PST_TRUE: - return PMT_T; - - case PST_FALSE: - return PMT_F; - - case PST_NULL: - return PMT_NIL; - - case PST_SYMBOL: - if (!deserialize_untagged_u16(&u16, sb)) - goto error; - if (u16 > sizeof(tmpbuf)) - throw pmt_notimplemented("pmt_deserialize: very long symbol", - PMT_F); - if (sb.sgetn(tmpbuf, u16) != u16) - goto error; - return pmt_intern(std::string(tmpbuf, u16)); - - case PST_INT32: - if (!deserialize_untagged_u32(&u32, sb)) - goto error; - return pmt_from_long((int32_t) u32); - - case PST_PAIR: - return parse_pair(sb); - - case PST_DOUBLE: - case PST_COMPLEX: - case PST_VECTOR: - case PST_DICT: - case PST_UNIFORM_VECTOR: - case PST_COMMENT: - throw pmt_notimplemented("pmt_deserialize: tag value = ", - pmt_from_long(tag)); - - default: - throw pmt_exception("pmt_deserialize: malformed input stream, tag value = ", - pmt_from_long(tag)); - } - - error: - throw pmt_exception("pmt_deserialize: malformed input stream", PMT_F); -} - -/* - * This is a mostly non-recursive implementation that allows us to - * deserialize very long lists w/o exhausting the evaluation stack. - * - * On entry we've already eaten the PST_PAIR tag. - */ -pmt_t -parse_pair(std::streambuf &sb) -{ - uint8_t tag; - pmt_t val, expr, lastnptr, nptr; - - // - // Keep appending nodes until we get a non-PAIR cdr. - // - lastnptr = PMT_NIL; - while (1){ - expr = pmt_deserialize(sb); // read the car - - nptr = pmt_cons(expr, PMT_NIL); // build new cell - if (pmt_is_null(lastnptr)) - val = nptr; - else - pmt_set_cdr(lastnptr, nptr); - lastnptr = nptr; - - if (!deserialize_untagged_u8(&tag, sb)) // get tag of cdr - throw pmt_exception("pmt_deserialize: malformed input stream", PMT_F); - - if (tag == PST_PAIR) - continue; // keep on looping... - - if (tag == PST_NULL){ - expr = PMT_NIL; - break; - } - - // - // default: push tag back and use pmt_deserialize to get the cdr - // - sb.sungetc(); - expr = pmt_deserialize(sb); - break; - } - - // - // At this point, expr contains the value of the final cdr in the list. - // - pmt_set_cdr(lastnptr, expr); - return val; -} - -} /* namespace gruel */ diff --git a/gruel/src/lib/qa_pmt.cc b/gruel/src/lib/qa_pmt.cc deleted file mode 100644 index 250befafa..000000000 --- a/gruel/src/lib/qa_pmt.cc +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2006 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -/* - * This class gathers together all the test cases for pmt into - * a single test suite. As you create new test cases, add them here. - */ - -#include -#include -#include - -CppUnit::TestSuite * -qa_pmt::suite () -{ - CppUnit::TestSuite *s = new CppUnit::TestSuite ("pmt"); - - s->addTest (qa_pmt_prims::suite ()); - s->addTest (qa_pmt_unv::suite ()); - - return s; -} diff --git a/gruel/src/lib/qa_pmt.h b/gruel/src/lib/qa_pmt.h deleted file mode 100644 index 43a6dbf67..000000000 --- a/gruel/src/lib/qa_pmt.h +++ /dev/null @@ -1,36 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2006 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef INCLUDED_QA_PMT_H -#define INCLUDED_QA_PMT_H - -#include - -//! collect all the tests for pmt - -class qa_pmt { - public: - //! return suite of tests for all of pmt - static CppUnit::TestSuite *suite (); -}; - -#endif /* INCLUDED_QA_PMT_H */ diff --git a/gruel/src/lib/qa_pmt_prims.cc b/gruel/src/lib/qa_pmt_prims.cc deleted file mode 100644 index ac93f8063..000000000 --- a/gruel/src/lib/qa_pmt_prims.cc +++ /dev/null @@ -1,438 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2006,2009 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include -#include -#include -#include -#include - -using namespace gruel; - -void -qa_pmt_prims::test_symbols() -{ - CPPUNIT_ASSERT(!pmt_is_symbol(PMT_T)); - CPPUNIT_ASSERT(!pmt_is_symbol(PMT_F)); - CPPUNIT_ASSERT_THROW(pmt_symbol_to_string(PMT_F), pmt_wrong_type); - - pmt_t sym1 = pmt_string_to_symbol("test"); - CPPUNIT_ASSERT(pmt_is_symbol(sym1)); - CPPUNIT_ASSERT_EQUAL(std::string("test"), pmt_symbol_to_string(sym1)); - CPPUNIT_ASSERT(pmt_is_true(sym1)); - CPPUNIT_ASSERT(!pmt_is_false(sym1)); - - pmt_t sym2 = pmt_string_to_symbol("foo"); - pmt_t sym3 = pmt_string_to_symbol("test"); - CPPUNIT_ASSERT_EQUAL(sym1, sym3); - CPPUNIT_ASSERT(sym1 != sym2); - CPPUNIT_ASSERT(sym1 == sym3); - - static const int N = 2048; - std::vector v1(N); - std::vector v2(N); - - // generate a bunch of symbols - for (int i = 0; i < N; i++){ - char buf[100]; - snprintf(buf, sizeof(buf), "test-%d", i); - v1[i] = pmt_string_to_symbol(buf); - } - - // confirm that they are all unique - for (int i = 0; i < N; i++) - for (int j = i + 1; j < N; j++) - CPPUNIT_ASSERT(v1[i] != v1[j]); - - // generate the same symbols again - for (int i = 0; i < N; i++){ - char buf[100]; - snprintf(buf, sizeof(buf), "test-%d", i); - v2[i] = pmt_string_to_symbol(buf); - } - - // confirm that we get the same ones back - for (int i = 0; i < N; i++) - CPPUNIT_ASSERT(v1[i] == v2[i]); -} - -void -qa_pmt_prims::test_booleans() -{ - pmt_t sym = pmt_string_to_symbol("test"); - CPPUNIT_ASSERT(pmt_is_bool(PMT_T)); - CPPUNIT_ASSERT(pmt_is_bool(PMT_F)); - CPPUNIT_ASSERT(!pmt_is_bool(sym)); - CPPUNIT_ASSERT_EQUAL(pmt_from_bool(false), PMT_F); - CPPUNIT_ASSERT_EQUAL(pmt_from_bool(true), PMT_T); - CPPUNIT_ASSERT_EQUAL(false, pmt_to_bool(PMT_F)); - CPPUNIT_ASSERT_EQUAL(true, pmt_to_bool(PMT_T)); - CPPUNIT_ASSERT_THROW(pmt_to_bool(sym), pmt_wrong_type); -} - -void -qa_pmt_prims::test_integers() -{ - pmt_t p1 = pmt_from_long(1); - pmt_t m1 = pmt_from_long(-1); - CPPUNIT_ASSERT(!pmt_is_integer(PMT_T)); - CPPUNIT_ASSERT(pmt_is_integer(p1)); - CPPUNIT_ASSERT(pmt_is_integer(m1)); - CPPUNIT_ASSERT_THROW(pmt_to_long(PMT_T), pmt_wrong_type); - CPPUNIT_ASSERT_EQUAL(-1L, pmt_to_long(m1)); - CPPUNIT_ASSERT_EQUAL(1L, pmt_to_long(p1)); -} - -void -qa_pmt_prims::test_reals() -{ - pmt_t p1 = pmt_from_double(1); - pmt_t m1 = pmt_from_double(-1); - CPPUNIT_ASSERT(!pmt_is_real(PMT_T)); - CPPUNIT_ASSERT(pmt_is_real(p1)); - CPPUNIT_ASSERT(pmt_is_real(m1)); - CPPUNIT_ASSERT_THROW(pmt_to_double(PMT_T), pmt_wrong_type); - CPPUNIT_ASSERT_EQUAL(-1.0, pmt_to_double(m1)); - CPPUNIT_ASSERT_EQUAL(1.0, pmt_to_double(p1)); - CPPUNIT_ASSERT_EQUAL(1.0, pmt_to_double(pmt_from_long(1))); -} - -void -qa_pmt_prims::test_complexes() -{ - pmt_t p1 = pmt_make_rectangular(2, -3); - pmt_t m1 = pmt_make_rectangular(-3, 2); - CPPUNIT_ASSERT(!pmt_is_complex(PMT_T)); - CPPUNIT_ASSERT(pmt_is_complex(p1)); - CPPUNIT_ASSERT(pmt_is_complex(m1)); - CPPUNIT_ASSERT_THROW(pmt_to_complex(PMT_T), pmt_wrong_type); - CPPUNIT_ASSERT_EQUAL(std::complex(2, -3), pmt_to_complex(p1)); - CPPUNIT_ASSERT_EQUAL(std::complex(-3, 2), pmt_to_complex(m1)); - CPPUNIT_ASSERT_EQUAL(std::complex(1.0, 0), pmt_to_complex(pmt_from_long(1))); - CPPUNIT_ASSERT_EQUAL(std::complex(1.0, 0), pmt_to_complex(pmt_from_double(1.0))); -} - -void -qa_pmt_prims::test_pairs() -{ - CPPUNIT_ASSERT(pmt_is_null(PMT_NIL)); - CPPUNIT_ASSERT(!pmt_is_pair(PMT_NIL)); - pmt_t s1 = pmt_string_to_symbol("s1"); - pmt_t s2 = pmt_string_to_symbol("s2"); - pmt_t s3 = pmt_string_to_symbol("s3"); - - - CPPUNIT_ASSERT_EQUAL((size_t)0, pmt_length(PMT_NIL)); - CPPUNIT_ASSERT_THROW(pmt_length(s1), pmt_wrong_type); - CPPUNIT_ASSERT_THROW(pmt_length(pmt_from_double(42)), pmt_wrong_type); - - pmt_t c1 = pmt_cons(s1, PMT_NIL); - CPPUNIT_ASSERT(pmt_is_pair(c1)); - CPPUNIT_ASSERT(!pmt_is_pair(s1)); - CPPUNIT_ASSERT_EQUAL(s1, pmt_car(c1)); - CPPUNIT_ASSERT_EQUAL(PMT_NIL, pmt_cdr(c1)); - CPPUNIT_ASSERT_EQUAL((size_t) 1, pmt_length(c1)); - - pmt_t c3 = pmt_cons(s3, PMT_NIL); - pmt_t c2 = pmt_cons(s2, c3); - pmt_set_cdr(c1, c2); - CPPUNIT_ASSERT_EQUAL(c2, pmt_cdr(c1)); - pmt_set_car(c1, s3); - CPPUNIT_ASSERT_EQUAL(s3, pmt_car(c1)); - CPPUNIT_ASSERT_EQUAL((size_t)1, pmt_length(c3)); - CPPUNIT_ASSERT_EQUAL((size_t)2, pmt_length(c2)); - - CPPUNIT_ASSERT_THROW(pmt_cdr(PMT_NIL), pmt_wrong_type); - CPPUNIT_ASSERT_THROW(pmt_car(PMT_NIL), pmt_wrong_type); - CPPUNIT_ASSERT_THROW(pmt_set_car(s1, PMT_NIL), pmt_wrong_type); - CPPUNIT_ASSERT_THROW(pmt_set_cdr(s1, PMT_NIL), pmt_wrong_type); -} - -void -qa_pmt_prims::test_vectors() -{ - static const size_t N = 3; - pmt_t v1 = pmt_make_vector(N, PMT_NIL); - CPPUNIT_ASSERT_EQUAL(N, pmt_length(v1)); - pmt_t s0 = pmt_string_to_symbol("s0"); - pmt_t s1 = pmt_string_to_symbol("s1"); - pmt_t s2 = pmt_string_to_symbol("s2"); - - pmt_vector_set(v1, 0, s0); - pmt_vector_set(v1, 1, s1); - pmt_vector_set(v1, 2, s2); - - CPPUNIT_ASSERT_EQUAL(s0, pmt_vector_ref(v1, 0)); - CPPUNIT_ASSERT_EQUAL(s1, pmt_vector_ref(v1, 1)); - CPPUNIT_ASSERT_EQUAL(s2, pmt_vector_ref(v1, 2)); - - CPPUNIT_ASSERT_THROW(pmt_vector_ref(v1, N), pmt_out_of_range); - CPPUNIT_ASSERT_THROW(pmt_vector_set(v1, N, PMT_NIL), pmt_out_of_range); - - pmt_vector_fill(v1, s0); - for (size_t i = 0; i < N; i++) - CPPUNIT_ASSERT_EQUAL(s0, pmt_vector_ref(v1, i)); -} - -void -qa_pmt_prims::test_equivalence() -{ - pmt_t s0 = pmt_string_to_symbol("s0"); - pmt_t s1 = pmt_string_to_symbol("s1"); - pmt_t s2 = pmt_string_to_symbol("s2"); - pmt_t list0 = pmt_cons(s0, pmt_cons(s1, pmt_cons(s2, PMT_NIL))); - pmt_t list1 = pmt_cons(s0, pmt_cons(s1, pmt_cons(s2, PMT_NIL))); - pmt_t i0 = pmt_from_long(42); - pmt_t i1 = pmt_from_long(42); - pmt_t r0 = pmt_from_double(42); - pmt_t r1 = pmt_from_double(42); - pmt_t r2 = pmt_from_double(43); - - CPPUNIT_ASSERT(pmt_eq(s0, s0)); - CPPUNIT_ASSERT(!pmt_eq(s0, s1)); - CPPUNIT_ASSERT(pmt_eqv(s0, s0)); - CPPUNIT_ASSERT(!pmt_eqv(s0, s1)); - - CPPUNIT_ASSERT(pmt_eqv(i0, i1)); - CPPUNIT_ASSERT(pmt_eqv(r0, r1)); - CPPUNIT_ASSERT(!pmt_eqv(r0, r2)); - CPPUNIT_ASSERT(!pmt_eqv(i0, r0)); - - CPPUNIT_ASSERT(!pmt_eq(list0, list1)); - CPPUNIT_ASSERT(!pmt_eqv(list0, list1)); - CPPUNIT_ASSERT(pmt_equal(list0, list1)); - - pmt_t v0 = pmt_make_vector(3, s0); - pmt_t v1 = pmt_make_vector(3, s0); - pmt_t v2 = pmt_make_vector(4, s0); - CPPUNIT_ASSERT(!pmt_eqv(v0, v1)); - CPPUNIT_ASSERT(pmt_equal(v0, v1)); - CPPUNIT_ASSERT(!pmt_equal(v0, v2)); - - pmt_vector_set(v0, 0, list0); - pmt_vector_set(v0, 1, list0); - pmt_vector_set(v1, 0, list1); - pmt_vector_set(v1, 1, list1); - CPPUNIT_ASSERT(pmt_equal(v0, v1)); -} - -void -qa_pmt_prims::test_misc() -{ - pmt_t k0 = pmt_string_to_symbol("k0"); - pmt_t k1 = pmt_string_to_symbol("k1"); - pmt_t k2 = pmt_string_to_symbol("k2"); - pmt_t k3 = pmt_string_to_symbol("k3"); - pmt_t v0 = pmt_string_to_symbol("v0"); - pmt_t v1 = pmt_string_to_symbol("v1"); - pmt_t v2 = pmt_string_to_symbol("v2"); - pmt_t p0 = pmt_cons(k0, v0); - pmt_t p1 = pmt_cons(k1, v1); - pmt_t p2 = pmt_cons(k2, v2); - - pmt_t alist = pmt_cons(p0, pmt_cons(p1, pmt_cons(p2, PMT_NIL))); - CPPUNIT_ASSERT(pmt_eq(p1, pmt_assv(k1, alist))); - CPPUNIT_ASSERT(pmt_eq(PMT_F, pmt_assv(k3, alist))); - - pmt_t keys = pmt_cons(k0, pmt_cons(k1, pmt_cons(k2, PMT_NIL))); - pmt_t vals = pmt_cons(v0, pmt_cons(v1, pmt_cons(v2, PMT_NIL))); - CPPUNIT_ASSERT(pmt_equal(keys, pmt_map(pmt_car, alist))); - CPPUNIT_ASSERT(pmt_equal(vals, pmt_map(pmt_cdr, alist))); -} - -void -qa_pmt_prims::test_dict() -{ - pmt_t dict = pmt_make_dict(); - CPPUNIT_ASSERT(pmt_is_dict(dict)); - - pmt_t k0 = pmt_string_to_symbol("k0"); - pmt_t k1 = pmt_string_to_symbol("k1"); - pmt_t k2 = pmt_string_to_symbol("k2"); - pmt_t k3 = pmt_string_to_symbol("k3"); - pmt_t v0 = pmt_string_to_symbol("v0"); - pmt_t v1 = pmt_string_to_symbol("v1"); - pmt_t v2 = pmt_string_to_symbol("v2"); - pmt_t v3 = pmt_string_to_symbol("v3"); - pmt_t not_found = pmt_cons(PMT_NIL, PMT_NIL); - - CPPUNIT_ASSERT(!pmt_dict_has_key(dict, k0)); - pmt_dict_set(dict, k0, v0); - CPPUNIT_ASSERT(pmt_dict_has_key(dict, k0)); - CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k0, not_found), v0)); - CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k1, not_found), not_found)); - pmt_dict_set(dict, k1, v1); - pmt_dict_set(dict, k2, v2); - CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k1, not_found), v1)); - pmt_dict_set(dict, k1, v3); - CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k1, not_found), v3)); - - pmt_t keys = pmt_cons(k2, pmt_cons(k1, pmt_cons(k0, PMT_NIL))); - pmt_t vals = pmt_cons(v2, pmt_cons(v3, pmt_cons(v0, PMT_NIL))); - CPPUNIT_ASSERT(pmt_equal(keys, pmt_dict_keys(dict))); - CPPUNIT_ASSERT(pmt_equal(vals, pmt_dict_values(dict))); -} - -void -qa_pmt_prims::test_io() -{ - pmt_t k0 = pmt_string_to_symbol("k0"); - pmt_t k1 = pmt_string_to_symbol("k1"); - pmt_t k2 = pmt_string_to_symbol("k2"); - pmt_t k3 = pmt_string_to_symbol("k3"); - - CPPUNIT_ASSERT_EQUAL(std::string("k0"), pmt_write_string(k0)); -} - -void -qa_pmt_prims::test_lists() -{ - pmt_t s0 = pmt_intern("s0"); - pmt_t s1 = pmt_intern("s1"); - pmt_t s2 = pmt_intern("s2"); - pmt_t s3 = pmt_intern("s3"); - - pmt_t l1 = pmt_list4(s0, s1, s2, s3); - pmt_t l2 = pmt_list3(s0, s1, s2); - pmt_t l3 = pmt_list_add(l2, s3); - CPPUNIT_ASSERT(pmt_equal(l1, l3)); -} - -// ------------------------------------------------------------------------ - -// class foo is used in test_any below. -// It can't be declared in the scope of test_any because of template -// namespace problems. - -class foo { -public: - double d_double; - int d_int; - foo(double d=0, int i=0) : d_double(d), d_int(i) {} -}; - -bool operator==(const foo &a, const foo &b) -{ - return a.d_double == b.d_double && a.d_int == b.d_int; -} - -std::ostream& operator<<(std::ostream &os, const foo obj) -{ - os << ""; - return os; -} - -void -qa_pmt_prims::test_any() -{ - boost::any a0; - boost::any a1; - boost::any a2; - - a0 = std::string("Hello!"); - a1 = 42; - a2 = foo(3.250, 21); - - pmt_t p0 = pmt_make_any(a0); - pmt_t p1 = pmt_make_any(a1); - pmt_t p2 = pmt_make_any(a2); - - CPPUNIT_ASSERT_EQUAL(std::string("Hello!"), - boost::any_cast(pmt_any_ref(p0))); - - CPPUNIT_ASSERT_EQUAL(42, - boost::any_cast(pmt_any_ref(p1))); - - CPPUNIT_ASSERT_EQUAL(foo(3.250, 21), - boost::any_cast(pmt_any_ref(p2))); -} - -// ------------------------------------------------------------------------ - -void -qa_pmt_prims::test_serialize() -{ - std::stringbuf sb; // fake channel - pmt_t a = pmt_intern("a"); - pmt_t b = pmt_intern("b"); - pmt_t c = pmt_intern("c"); - - sb.str(""); // reset channel to empty - - // write stuff to channel - - pmt_serialize(PMT_NIL, sb); - pmt_serialize(pmt_intern("foobarvia"), sb); - pmt_serialize(pmt_from_long(123456789), sb); - pmt_serialize(pmt_from_long(-123456789), sb); - pmt_serialize(pmt_cons(PMT_NIL, PMT_NIL), sb); - pmt_serialize(pmt_cons(a, b), sb); - pmt_serialize(pmt_list1(a), sb); - pmt_serialize(pmt_list2(a, b), sb); - pmt_serialize(pmt_list3(a, b, c), sb); - pmt_serialize(pmt_list3(a, pmt_list3(c, b, a), c), sb); - pmt_serialize(PMT_T, sb); - pmt_serialize(PMT_F, sb); - - // read it back - - CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), PMT_NIL)); - CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_intern("foobarvia"))); - CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_from_long(123456789))); - CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_from_long(-123456789))); - CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_cons(PMT_NIL, PMT_NIL))); - CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_cons(a, b))); - CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_list1(a))); - CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_list2(a, b))); - CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_list3(a, b, c))); - CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_list3(a, pmt_list3(c, b, a), c))); - CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), PMT_T)); - CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), PMT_F)); - - CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), PMT_EOF)); // last item - - - // FIXME add tests for real, complex, vector, uniform-vector, dict - // FIXME add tests for malformed input too. - -} - -void -qa_pmt_prims::test_sets() -{ - pmt_t s1 = pmt_intern("s1"); - pmt_t s2 = pmt_intern("s2"); - pmt_t s3 = pmt_intern("s3"); - - pmt_t l1 = pmt_list1(s1); - pmt_t l2 = pmt_list2(s2,s3); - pmt_t l3 = pmt_list3(s1,s2,s3); - - CPPUNIT_ASSERT(pmt_is_pair(pmt_memq(s1,l1))); - CPPUNIT_ASSERT(pmt_is_false(pmt_memq(s3,l1))); - - CPPUNIT_ASSERT(pmt_subsetp(l1,l3)); - CPPUNIT_ASSERT(pmt_subsetp(l2,l3)); - CPPUNIT_ASSERT(!pmt_subsetp(l1,l2)); - CPPUNIT_ASSERT(!pmt_subsetp(l2,l1)); - CPPUNIT_ASSERT(!pmt_subsetp(l3,l2)); -} diff --git a/gruel/src/lib/qa_pmt_prims.h b/gruel/src/lib/qa_pmt_prims.h deleted file mode 100644 index effb3a097..000000000 --- a/gruel/src/lib/qa_pmt_prims.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2006 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ -#ifndef INCLUDED_QA_PMT_PRIMS_H -#define INCLUDED_QA_PMT_PRIMS_H - -#include -#include - -class qa_pmt_prims : public CppUnit::TestCase { - - CPPUNIT_TEST_SUITE(qa_pmt_prims); - CPPUNIT_TEST(test_symbols); - CPPUNIT_TEST(test_booleans); - CPPUNIT_TEST(test_integers); - CPPUNIT_TEST(test_reals); - CPPUNIT_TEST(test_complexes); - CPPUNIT_TEST(test_pairs); - CPPUNIT_TEST(test_vectors); - CPPUNIT_TEST(test_equivalence); - CPPUNIT_TEST(test_misc); - CPPUNIT_TEST(test_dict); - CPPUNIT_TEST(test_any); - CPPUNIT_TEST(test_io); - CPPUNIT_TEST(test_lists); - CPPUNIT_TEST(test_serialize); - CPPUNIT_TEST(test_sets); - CPPUNIT_TEST_SUITE_END(); - - private: - void test_symbols(); - void test_booleans(); - void test_integers(); - void test_reals(); - void test_complexes(); - void test_pairs(); - void test_vectors(); - void test_equivalence(); - void test_misc(); - void test_dict(); - void test_any(); - void test_io(); - void test_lists(); - void test_serialize(); - void test_sets(); -}; - -#endif /* INCLUDED_QA_PMT_PRIMS_H */ - diff --git a/gruel/src/lib/test_pmt.cc b/gruel/src/lib/test_pmt.cc deleted file mode 100644 index 034785f4e..000000000 --- a/gruel/src/lib/test_pmt.cc +++ /dev/null @@ -1,37 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2006 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include -#include - -int -main(int argc, char **argv) -{ - - CppUnit::TextTestRunner runner; - - runner.addTest(qa_pmt::suite ()); - - bool was_successful = runner.run("", false); - - return was_successful ? 0 : 1; -} diff --git a/gruel/src/lib/unv_qa_template.cc.t b/gruel/src/lib/unv_qa_template.cc.t deleted file mode 100644 index 1e2c8e8eb..000000000 --- a/gruel/src/lib/unv_qa_template.cc.t +++ /dev/null @@ -1,35 +0,0 @@ -void -qa_pmt_unv::test_@TAG@vector() -{ - static const size_t N = 3; - pmt_t v1 = pmt_make_@TAG@vector(N, 0); - CPPUNIT_ASSERT_EQUAL(N, pmt_length(v1)); - @TYPE@ s0 = @TYPE@(10); - @TYPE@ s1 = @TYPE@(20); - @TYPE@ s2 = @TYPE@(30); - - pmt_@TAG@vector_set(v1, 0, s0); - pmt_@TAG@vector_set(v1, 1, s1); - pmt_@TAG@vector_set(v1, 2, s2); - - CPPUNIT_ASSERT_EQUAL(s0, pmt_@TAG@vector_ref(v1, 0)); - CPPUNIT_ASSERT_EQUAL(s1, pmt_@TAG@vector_ref(v1, 1)); - CPPUNIT_ASSERT_EQUAL(s2, pmt_@TAG@vector_ref(v1, 2)); - - CPPUNIT_ASSERT_THROW(pmt_@TAG@vector_ref(v1, N), pmt_out_of_range); - CPPUNIT_ASSERT_THROW(pmt_@TAG@vector_set(v1, N, @TYPE@(0)), pmt_out_of_range); - - size_t len; - const @TYPE@ *rd = pmt_@TAG@vector_elements(v1, len); - CPPUNIT_ASSERT_EQUAL(len, N); - CPPUNIT_ASSERT_EQUAL(s0, rd[0]); - CPPUNIT_ASSERT_EQUAL(s1, rd[1]); - CPPUNIT_ASSERT_EQUAL(s2, rd[2]); - - @TYPE@ *wr = pmt_@TAG@vector_writable_elements(v1, len); - CPPUNIT_ASSERT_EQUAL(len, N); - wr[0] = @TYPE@(0); - CPPUNIT_ASSERT_EQUAL(@TYPE@(0), wr[0]); - CPPUNIT_ASSERT_EQUAL(s1, wr[1]); - CPPUNIT_ASSERT_EQUAL(s2, wr[2]); -} diff --git a/gruel/src/lib/unv_template.cc.t b/gruel/src/lib/unv_template.cc.t deleted file mode 100644 index b19e32d27..000000000 --- a/gruel/src/lib/unv_template.cc.t +++ /dev/null @@ -1,122 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// pmt_@TAG@vector -//////////////////////////////////////////////////////////////////////////// - -namespace gruel { - -static pmt_@TAG@vector * -_@TAG@vector(pmt_t x) -{ - return dynamic_cast(x.get()); -} - - -pmt_@TAG@vector::pmt_@TAG@vector(size_t k, @TYPE@ fill) - : d_v(k) -{ - for (size_t i = 0; i < k; i++) - d_v[i] = fill; -} - -pmt_@TAG@vector::pmt_@TAG@vector(size_t k, const @TYPE@ *data) - : d_v(k) -{ - for (size_t i = 0; i < k; i++) - d_v[i] = data[i]; -} - -@TYPE@ -pmt_@TAG@vector::ref(size_t k) const -{ - if (k >= length()) - throw pmt_out_of_range("pmt_@TAG@vector_ref", pmt_from_long(k)); - return d_v[k]; -} - -void -pmt_@TAG@vector::set(size_t k, @TYPE@ x) -{ - if (k >= length()) - throw pmt_out_of_range("pmt_@TAG@vector_set", pmt_from_long(k)); - d_v[k] = x; -} - -const @TYPE@ * -pmt_@TAG@vector::elements(size_t &len) -{ - len = length(); - return &d_v[0]; -} - -@TYPE@ * -pmt_@TAG@vector::writable_elements(size_t &len) -{ - len = length(); - return &d_v[0]; -} - -const void* -pmt_@TAG@vector::uniform_elements(size_t &len) -{ - len = length() * sizeof(@TYPE@); - return &d_v[0]; -} - -void* -pmt_@TAG@vector::uniform_writable_elements(size_t &len) -{ - len = length() * sizeof(@TYPE@); - return &d_v[0]; -} - -bool -pmt_is_@TAG@vector(pmt_t obj) -{ - return obj->is_@TAG@vector(); -} - -pmt_t -pmt_make_@TAG@vector(size_t k, @TYPE@ fill) -{ - return pmt_t(new pmt_@TAG@vector(k, fill)); -} - -pmt_t -pmt_init_@TAG@vector(size_t k, const @TYPE@ *data) -{ - return pmt_t(new pmt_@TAG@vector(k, data)); -} - -@TYPE@ -pmt_@TAG@vector_ref(pmt_t vector, size_t k) -{ - if (!vector->is_@TAG@vector()) - throw pmt_wrong_type("pmt_@TAG@vector_ref", vector); - return _@TAG@vector(vector)->ref(k); -} - -void -pmt_@TAG@vector_set(pmt_t vector, size_t k, @TYPE@ obj) -{ - if (!vector->is_@TAG@vector()) - throw pmt_wrong_type("pmt_@TAG@vector_set", vector); - _@TAG@vector(vector)->set(k, obj); -} - -const @TYPE@ * -pmt_@TAG@vector_elements(pmt_t vector, size_t &len) -{ - if (!vector->is_@TAG@vector()) - throw pmt_wrong_type("pmt_@TAG@vector_elements", vector); - return _@TAG@vector(vector)->elements(len); -} - -@TYPE@ * -pmt_@TAG@vector_writable_elements(pmt_t vector, size_t &len) -{ - if (!vector->is_@TAG@vector()) - throw pmt_wrong_type("pmt_@TAG@vector_writable_elements", vector); - return _@TAG@vector(vector)->writable_elements(len); -} - -} /* namespace gruel */ diff --git a/gruel/src/lib/unv_template.h.t b/gruel/src/lib/unv_template.h.t deleted file mode 100644 index 83ba0be0f..000000000 --- a/gruel/src/lib/unv_template.h.t +++ /dev/null @@ -1,23 +0,0 @@ - -//////////////////////////////////////////////////////////////////////////// -// pmt_@TAG@vector -//////////////////////////////////////////////////////////////////////////// - -class pmt_@TAG@vector : public pmt_uniform_vector -{ - std::vector< @TYPE@ > d_v; - -public: - pmt_@TAG@vector(size_t k, @TYPE@ fill); - pmt_@TAG@vector(size_t k, const @TYPE@ *data); - // ~pmt_@TAG@vector(); - - bool is_@TAG@vector() const { return true; } - size_t length() const { return d_v.size(); } - @TYPE@ ref(size_t k) const; - void set(size_t k, @TYPE@ x); - const @TYPE@ *elements(size_t &len); - @TYPE@ *writable_elements(size_t &len); - const void *uniform_elements(size_t &len); - void *uniform_writable_elements(size_t &len); -}; -- cgit From d25d747afb4f2bd404720d690677a5401449c0df Mon Sep 17 00:00:00 2001 From: eb Date: Mon, 27 Jul 2009 04:09:21 +0000 Subject: Fix for test_pmt when using --with-boost= git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@11504 221aa14e-8319-0410-a670-987f0aec2ac5 --- gruel/src/lib/pmt/Makefile.am | 3 +++ 1 file changed, 3 insertions(+) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/Makefile.am b/gruel/src/lib/pmt/Makefile.am index 5e9f2fac9..2b710a598 100644 --- a/gruel/src/lib/pmt/Makefile.am +++ b/gruel/src/lib/pmt/Makefile.am @@ -64,6 +64,9 @@ libpmt_la_LIBADD = \ $(BOOST_THREAD_LIB) \ -lstdc++ +libpmt_la_LDFLAGS = \ + $(BOOST_LDFLAGS) + noinst_HEADERS = \ $(GENERATED_H) \ pmt_int.h \ -- cgit From 3556ef4080be8b0fe569d28cae6568b761edbd7b Mon Sep 17 00:00:00 2001 From: jcorgan Date: Sat, 1 Aug 2009 14:56:28 +0000 Subject: Merged r11500:11506 from features/msg-passing into trunk. Work-in-progress, passes distcheck. git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@11524 221aa14e-8319-0410-a670-987f0aec2ac5 --- gruel/src/lib/Makefile.am | 6 +- gruel/src/lib/msg/Makefile.am | 32 ++++++++++ gruel/src/lib/msg/msg_accepter.cc | 36 ++++++++++++ gruel/src/lib/msg/msg_accepter_msgq.cc | 48 +++++++++++++++ gruel/src/lib/msg/msg_queue.cc | 103 +++++++++++++++++++++++++++++++++ 5 files changed, 222 insertions(+), 3 deletions(-) create mode 100644 gruel/src/lib/msg/Makefile.am create mode 100644 gruel/src/lib/msg/msg_accepter.cc create mode 100644 gruel/src/lib/msg/msg_accepter_msgq.cc create mode 100644 gruel/src/lib/msg/msg_queue.cc (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/Makefile.am b/gruel/src/lib/Makefile.am index bf1ae731a..6dfb6787c 100644 --- a/gruel/src/lib/Makefile.am +++ b/gruel/src/lib/Makefile.am @@ -21,7 +21,7 @@ include $(top_srcdir)/Makefile.common -SUBDIRS = pmt +SUBDIRS = pmt msg AM_CPPFLAGS = $(DEFINES) $(BOOST_CPPFLAGS) $(CPPUNIT_INCLUDES) $(GRUEL_INCLUDES) $(WITH_INCLUDES) @@ -33,6 +33,7 @@ libgruel_la_LDFLAGS = $(NO_UNDEFINED) $(BOOST_LDFLAGS) -version-info 0:0:0 # ---------------------------------------------------------------- PMT_LIB = pmt/libpmt.la +MSG_LIB = msg/libmsg.la # These are the source files that go into the gruel shared library libgruel_la_SOURCES = \ @@ -44,6 +45,5 @@ libgruel_la_SOURCES = \ libgruel_la_LIBADD = \ $(BOOST_THREAD_LIB) \ $(PMT_LIB) \ + $(MSG_LIB) \ -lstdc++ - - diff --git a/gruel/src/lib/msg/Makefile.am b/gruel/src/lib/msg/Makefile.am new file mode 100644 index 000000000..13a657067 --- /dev/null +++ b/gruel/src/lib/msg/Makefile.am @@ -0,0 +1,32 @@ +# +# Copyright 2009 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GNU Radio is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +include $(top_srcdir)/Makefile.common + +AM_CPPFLAGS = $(DEFINES) $(BOOST_CPPFLAGS) $(GRUEL_INCLUDES) $(WITH_INCLUDES) + +noinst_LTLIBRARIES = libmsg.la + +libmsg_la_SOURCES = \ + msg_accepter.cc \ + msg_accepter_msgq.cc \ + msg_queue.cc + diff --git a/gruel/src/lib/msg/msg_accepter.cc b/gruel/src/lib/msg/msg_accepter.cc new file mode 100644 index 000000000..64878f737 --- /dev/null +++ b/gruel/src/lib/msg/msg_accepter.cc @@ -0,0 +1,36 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +namespace gruel { + + msg_accepter::~msg_accepter() + { + // NOP, required as virtual destructor + } + +} /* namespace gruel */ diff --git a/gruel/src/lib/msg/msg_accepter_msgq.cc b/gruel/src/lib/msg/msg_accepter_msgq.cc new file mode 100644 index 000000000..64fe501d1 --- /dev/null +++ b/gruel/src/lib/msg/msg_accepter_msgq.cc @@ -0,0 +1,48 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#if HAVE_CONFIG_H +#include +#endif + +#include + +using namespace pmt; + +namespace gruel { + + msg_accepter_msgq::msg_accepter_msgq(msg_queue_sptr msgq) + : d_msg_queue(msgq) + { + } + + msg_accepter_msgq::~msg_accepter_msgq() + { + // NOP, required as virtual destructor + } + + void + msg_accepter_msgq::post(pmt_t msg) + { + d_msg_queue->insert_tail(msg); + } + +} /* namespace gruel */ diff --git a/gruel/src/lib/msg/msg_queue.cc b/gruel/src/lib/msg/msg_queue.cc new file mode 100644 index 000000000..8d15f08c5 --- /dev/null +++ b/gruel/src/lib/msg/msg_queue.cc @@ -0,0 +1,103 @@ +/* -*- c++ -*- */ +/* + * Copyright 2009 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +using namespace pmt; + +namespace gruel { + + msg_queue_sptr + make_msg_queue(unsigned int limit) + { + return msg_queue_sptr(new msg_queue(limit)); + } + + msg_queue::msg_queue(unsigned int limit) + : d_limit(limit) + { + } + + msg_queue::~msg_queue() + { + flush(); + } + + void + msg_queue::insert_tail(pmt_t msg) + { + gruel::scoped_lock guard(d_mutex); + + while (full_p()) + d_not_full.wait(guard); + + d_msgs.push_back(msg); + d_not_empty.notify_one(); + } + + pmt_t + msg_queue::delete_head() + { + gruel::scoped_lock guard(d_mutex); + + while (empty_p()) + d_not_empty.wait(guard); + + pmt_t m(d_msgs.front()); + d_msgs.pop_front(); + + if (d_limit > 0) // Unlimited length queues never block on write + d_not_full.notify_one(); + + return m; + } + + pmt_t + msg_queue::delete_head_nowait() + { + gruel::scoped_lock guard(d_mutex); + + if (empty_p()) + return pmt_t(); + + pmt_t m(d_msgs.front()); + d_msgs.pop_front(); + + if (d_limit > 0) // Unlimited length queues never block on write + d_not_full.notify_one(); + + return m; + } + + void + msg_queue::flush() + { + while (delete_head_nowait() != pmt_t()) + ; + } + +} /* namespace gruel */ -- cgit From f15982950e4674f0cad53d25d36409253661af34 Mon Sep 17 00:00:00 2001 From: git repository hosting Date: Thu, 13 Aug 2009 22:26:53 -0600 Subject: Added git ignore files auto created from svn:ignore properties. --- gruel/src/lib/.gitignore | 4 ++++ gruel/src/lib/msg/.gitignore | 4 ++++ gruel/src/lib/pmt/.gitignore | 10 ++++++++++ 3 files changed, 18 insertions(+) create mode 100644 gruel/src/lib/.gitignore create mode 100644 gruel/src/lib/msg/.gitignore create mode 100644 gruel/src/lib/pmt/.gitignore (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/.gitignore b/gruel/src/lib/.gitignore new file mode 100644 index 000000000..89a768d46 --- /dev/null +++ b/gruel/src/lib/.gitignore @@ -0,0 +1,4 @@ +/Makefile +/Makefile.in +/.libs +/.deps diff --git a/gruel/src/lib/msg/.gitignore b/gruel/src/lib/msg/.gitignore new file mode 100644 index 000000000..c026fd667 --- /dev/null +++ b/gruel/src/lib/msg/.gitignore @@ -0,0 +1,4 @@ +/Makefile +/Makefile.in +/.deps +/.libs diff --git a/gruel/src/lib/pmt/.gitignore b/gruel/src/lib/pmt/.gitignore new file mode 100644 index 000000000..035c0316b --- /dev/null +++ b/gruel/src/lib/pmt/.gitignore @@ -0,0 +1,10 @@ +/Makefile +/Makefile.in +/.libs +/.deps +/test_pmt +/qa_pmt_unv.cc +/qa_pmt_unv.h +/pmt_unv_int.h +/pmt_unv.cc +/stamp-sources-generate -- cgit From 253018c6cdb114f5662a2d7ba8ed748c6e68e3a7 Mon Sep 17 00:00:00 2001 From: git Date: Fri, 14 Aug 2009 18:10:11 +0000 Subject: Added git ignore files auto created from svn:ignore properties. git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@11592 221aa14e-8319-0410-a670-987f0aec2ac5 --- gruel/src/lib/.gitignore | 4 ++++ gruel/src/lib/msg/.gitignore | 4 ++++ gruel/src/lib/pmt/.gitignore | 10 ++++++++++ 3 files changed, 18 insertions(+) create mode 100644 gruel/src/lib/.gitignore create mode 100644 gruel/src/lib/msg/.gitignore create mode 100644 gruel/src/lib/pmt/.gitignore (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/.gitignore b/gruel/src/lib/.gitignore new file mode 100644 index 000000000..89a768d46 --- /dev/null +++ b/gruel/src/lib/.gitignore @@ -0,0 +1,4 @@ +/Makefile +/Makefile.in +/.libs +/.deps diff --git a/gruel/src/lib/msg/.gitignore b/gruel/src/lib/msg/.gitignore new file mode 100644 index 000000000..c026fd667 --- /dev/null +++ b/gruel/src/lib/msg/.gitignore @@ -0,0 +1,4 @@ +/Makefile +/Makefile.in +/.deps +/.libs diff --git a/gruel/src/lib/pmt/.gitignore b/gruel/src/lib/pmt/.gitignore new file mode 100644 index 000000000..035c0316b --- /dev/null +++ b/gruel/src/lib/pmt/.gitignore @@ -0,0 +1,10 @@ +/Makefile +/Makefile.in +/.libs +/.deps +/test_pmt +/qa_pmt_unv.cc +/qa_pmt_unv.h +/pmt_unv_int.h +/pmt_unv.cc +/stamp-sources-generate -- cgit From ad36dccd88eafec6efb8f2428fb21f54d6894cfc Mon Sep 17 00:00:00 2001 From: Johnathan Corgan Date: Fri, 14 Aug 2009 14:04:11 -0700 Subject: Applied patch c1258.diff from Stephan Bruns (ticket:359) This patch changes pmt_t to use boost intrusive pointers. Patch was modified to apply to new pmt location since the original patch was created, and add missing include file. Signed-off-by: Johnathan Corgan --- gruel/src/lib/pmt/pmt.cc | 2 ++ gruel/src/lib/pmt/pmt_int.h | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/pmt.cc b/gruel/src/lib/pmt/pmt.cc index fbf557be1..fd4035f75 100644 --- a/gruel/src/lib/pmt/pmt.cc +++ b/gruel/src/lib/pmt/pmt.cc @@ -56,6 +56,8 @@ pmt_base::operator delete(void *p, size_t size) #endif +void intrusive_ptr_add_ref(pmt_base* p) { ++(p->count_); } +void intrusive_ptr_release(pmt_base* p) { if (--(p->count_) == 0 ) delete p; } pmt_base::~pmt_base() { diff --git a/gruel/src/lib/pmt/pmt_int.h b/gruel/src/lib/pmt/pmt_int.h index 9aac322a7..ba865b418 100644 --- a/gruel/src/lib/pmt/pmt_int.h +++ b/gruel/src/lib/pmt/pmt_int.h @@ -24,6 +24,7 @@ #include #include +#include /* * EVERYTHING IN THIS FILE IS PRIVATE TO THE IMPLEMENTATION! @@ -35,8 +36,10 @@ namespace pmt { class pmt_base : boost::noncopyable { + mutable boost::detail::atomic_count count_; + protected: - pmt_base(){}; + pmt_base() : count_(0) {}; virtual ~pmt_base(); public: @@ -66,6 +69,9 @@ public: virtual bool is_c32vector() const { return false; } virtual bool is_c64vector() const { return false; } + friend void intrusive_ptr_add_ref(pmt_base* p); + friend void intrusive_ptr_release(pmt_base* p); + # if (PMT_LOCAL_ALLOCATOR) void *operator new(size_t); void operator delete(void *, size_t); -- cgit From 7ca21b2eb16ed1495001cdd62d58a9d51dd3f436 Mon Sep 17 00:00:00 2001 From: Eric Blossom Date: Fri, 14 Aug 2009 18:53:35 -0700 Subject: Added most of the support for a new PMT type: tuple. More QA code coming soon. --- gruel/src/lib/pmt/pmt.cc | 208 +++++++++++++++++++++++++++++++++++++- gruel/src/lib/pmt/pmt_int.h | 17 ++++ gruel/src/lib/pmt/qa_pmt_prims.cc | 64 ++++++++++++ gruel/src/lib/pmt/qa_pmt_prims.h | 2 + 4 files changed, 289 insertions(+), 2 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/pmt.cc b/gruel/src/lib/pmt/pmt.cc index fbf557be1..8bf5b2dea 100644 --- a/gruel/src/lib/pmt/pmt.cc +++ b/gruel/src/lib/pmt/pmt.cc @@ -126,6 +126,12 @@ _vector(pmt_t x) return dynamic_cast(x.get()); } +static pmt_tuple * +_tuple(pmt_t x) +{ + return dynamic_cast(x.get()); +} + static pmt_uniform_vector * _uniform_vector(pmt_t x) { @@ -494,6 +500,200 @@ pmt_vector_fill(pmt_t vector, pmt_t obj) _vector(vector)->fill(obj); } +//////////////////////////////////////////////////////////////////////////// +// Tuples +//////////////////////////////////////////////////////////////////////////// + +pmt_tuple::pmt_tuple(size_t len) + : d_v(len) +{ +} + +pmt_t +pmt_tuple::ref(size_t k) const +{ + if (k >= length()) + throw pmt_out_of_range("pmt_tuple_ref", pmt_from_long(k)); + return d_v[k]; +} + +bool +pmt_is_tuple(pmt_t obj) +{ + return obj->is_tuple(); +} + +pmt_t +pmt_tuple_ref(const pmt_t &tuple, size_t k) +{ + if (!tuple->is_tuple()) + throw pmt_wrong_type("pmt_tuple_ref", tuple); + return _tuple(tuple)->ref(k); +} + +// for (i=0; i < 10; i++) +// make_constructor() + +pmt_t +pmt_make_tuple() +{ + return pmt_t(new pmt_tuple(0)); +} + +pmt_t +pmt_make_tuple(const pmt_t &e0) +{ + pmt_tuple *t = new pmt_tuple(1); + t->_set(0, e0); + return pmt_t(t); +} + +pmt_t +pmt_make_tuple(const pmt_t &e0, const pmt_t &e1) +{ + pmt_tuple *t = new pmt_tuple(2); + t->_set(0, e0); + t->_set(1, e1); + return pmt_t(t); +} + +pmt_t +pmt_make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2) +{ + pmt_tuple *t = new pmt_tuple(3); + t->_set(0, e0); + t->_set(1, e1); + t->_set(2, e2); + return pmt_t(t); +} + +pmt_t +pmt_make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3) +{ + pmt_tuple *t = new pmt_tuple(4); + t->_set(0, e0); + t->_set(1, e1); + t->_set(2, e2); + t->_set(3, e3); + return pmt_t(t); +} + +pmt_t +pmt_make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3, const pmt_t &e4) +{ + pmt_tuple *t = new pmt_tuple(5); + t->_set(0, e0); + t->_set(1, e1); + t->_set(2, e2); + t->_set(3, e3); + t->_set(4, e4); + return pmt_t(t); +} + +pmt_t +pmt_make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3, const pmt_t &e4, const pmt_t &e5) +{ + pmt_tuple *t = new pmt_tuple(6); + t->_set(0, e0); + t->_set(1, e1); + t->_set(2, e2); + t->_set(3, e3); + t->_set(4, e4); + t->_set(5, e5); + return pmt_t(t); +} + +pmt_t +pmt_make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3, const pmt_t &e4, const pmt_t &e5, const pmt_t &e6) +{ + pmt_tuple *t = new pmt_tuple(7); + t->_set(0, e0); + t->_set(1, e1); + t->_set(2, e2); + t->_set(3, e3); + t->_set(4, e4); + t->_set(5, e5); + t->_set(6, e6); + return pmt_t(t); +} + +pmt_t +pmt_make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3, const pmt_t &e4, const pmt_t &e5, const pmt_t &e6, const pmt_t &e7) +{ + pmt_tuple *t = new pmt_tuple(8); + t->_set(0, e0); + t->_set(1, e1); + t->_set(2, e2); + t->_set(3, e3); + t->_set(4, e4); + t->_set(5, e5); + t->_set(6, e6); + t->_set(7, e7); + return pmt_t(t); +} + +pmt_t +pmt_make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3, const pmt_t &e4, const pmt_t &e5, const pmt_t &e6, const pmt_t &e7, const pmt_t &e8) +{ + pmt_tuple *t = new pmt_tuple(9); + t->_set(0, e0); + t->_set(1, e1); + t->_set(2, e2); + t->_set(3, e3); + t->_set(4, e4); + t->_set(5, e5); + t->_set(6, e6); + t->_set(7, e7); + t->_set(8, e8); + return pmt_t(t); +} + +pmt_t +pmt_make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3, const pmt_t &e4, const pmt_t &e5, const pmt_t &e6, const pmt_t &e7, const pmt_t &e8, const pmt_t &e9) +{ + pmt_tuple *t = new pmt_tuple(10); + t->_set(0, e0); + t->_set(1, e1); + t->_set(2, e2); + t->_set(3, e3); + t->_set(4, e4); + t->_set(5, e5); + t->_set(6, e6); + t->_set(7, e7); + t->_set(8, e8); + t->_set(9, e9); + return pmt_t(t); +} + +pmt_t +pmt_to_tuple(const pmt_t &x) +{ + if (x->is_tuple()) // already one + return x; + + size_t len = pmt_length(x); + pmt_tuple *t = new pmt_tuple(len); + + if (x->is_vector()){ + for (size_t i = 0; i < len; i++) + t->_set(i, _vector(x)->ref(i)); + return pmt_t(t); + } + + if (x->is_pair()){ + pmt_t y = x; + for (size_t i = 0; i < len; i++){ + t->_set(i, pmt_car(y)); + y = pmt_cdr(x); + } + return pmt_t(t); + } + + throw pmt_wrong_type("pmt_to_tuple", x); +} + + + //////////////////////////////////////////////////////////////////////////// // Uniform Numeric Vectors //////////////////////////////////////////////////////////////////////////// @@ -757,11 +957,15 @@ pmt_length(const pmt_t& x) if (x->is_uniform_vector()) return _uniform_vector(x)->length(); - if (x->is_null()) return 0; + if (x->is_tuple()) + return _tuple(x)->length(); + + if (x->is_null()) + return 0; if (x->is_pair()) { size_t length=1; - pmt_t it = pmt_cdr(x); + pmt_t it = pmt_cdr(x); while (pmt_is_pair(it)){ length++; it = pmt_cdr(it); diff --git a/gruel/src/lib/pmt/pmt_int.h b/gruel/src/lib/pmt/pmt_int.h index 9aac322a7..ed47249b1 100644 --- a/gruel/src/lib/pmt/pmt_int.h +++ b/gruel/src/lib/pmt/pmt_int.h @@ -48,6 +48,7 @@ public: virtual bool is_complex() const { return false; } virtual bool is_null() const { return false; } virtual bool is_pair() const { return false; } + virtual bool is_tuple() const { return false; } virtual bool is_vector() const { return false; } virtual bool is_dict() const { return false; } virtual bool is_any() const { return false; } @@ -180,6 +181,22 @@ public: pmt_t _ref(size_t k) const { return d_v[k]; } }; +class pmt_tuple : public pmt_base +{ + std::vector d_v; + +public: + pmt_tuple(size_t len); + //~pmt_tuple(); + + bool is_tuple() const { return true; } + pmt_t ref(size_t k) const; + size_t length() const { return d_v.size(); } + + pmt_t _ref(size_t k) const { return d_v[k]; } + void _set(size_t k, pmt_t v) { d_v[k] = v; } +}; + class pmt_dict : public pmt_base { pmt_t d_alist; // list of (key . value) pairs diff --git a/gruel/src/lib/pmt/qa_pmt_prims.cc b/gruel/src/lib/pmt/qa_pmt_prims.cc index b81354721..d31e3fabf 100644 --- a/gruel/src/lib/pmt/qa_pmt_prims.cc +++ b/gruel/src/lib/pmt/qa_pmt_prims.cc @@ -193,6 +193,69 @@ qa_pmt_prims::test_vectors() CPPUNIT_ASSERT_EQUAL(s0, pmt_vector_ref(v1, i)); } +static void +check_tuple(size_t len, const std::vector &s, pmt_t t) +{ + CPPUNIT_ASSERT_EQUAL(true, pmt_is_tuple(t)); + CPPUNIT_ASSERT_EQUAL(len, pmt_length(t)); + + for (size_t i = 0; i < len; i++) + CPPUNIT_ASSERT_EQUAL(s[i], pmt_tuple_ref(t, i)); + +} + +void +qa_pmt_prims::test_tuples() +{ + pmt_t t0 = pmt_make_tuple(); + CPPUNIT_ASSERT_EQUAL(size_t(0), pmt_length(t0)); + + std::vector s(10); + for (size_t i = 0; i < 10; i++){ + std::ostringstream os; + os << "s" << i; + s[i] = pmt_string_to_symbol(os.str()); + } + + pmt_t t; + + t = pmt_make_tuple(); + check_tuple(0, s, t); + + t = pmt_make_tuple(s[0]); + check_tuple(1, s, t); + + t = pmt_make_tuple(s[0], s[1]); + check_tuple(2, s, t); + + t = pmt_make_tuple(s[0], s[1], s[2]); + check_tuple(3, s, t); + + t = pmt_make_tuple(s[0], s[1], s[2], s[3]); + check_tuple(4, s, t); + + t = pmt_make_tuple(s[0], s[1], s[2], s[3], s[4]); + check_tuple(5, s, t); + + t = pmt_make_tuple(s[0], s[1], s[2], s[3], s[4], s[5]); + check_tuple(6, s, t); + + t = pmt_make_tuple(s[0], s[1], s[2], s[3], s[4], s[5], s[6]); + check_tuple(7, s, t); + + t = pmt_make_tuple(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7]); + check_tuple(8, s, t); + + t = pmt_make_tuple(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8]); + check_tuple(9, s, t); + + t = pmt_make_tuple(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9]); + check_tuple(10, s, t); + + t = pmt_make_tuple(s[0], s[1], s[2]); + CPPUNIT_ASSERT_THROW(pmt_tuple_ref(t, 3), pmt_out_of_range); +} + void qa_pmt_prims::test_equivalence() { @@ -436,3 +499,4 @@ qa_pmt_prims::test_sets() CPPUNIT_ASSERT(!pmt_subsetp(l2,l1)); CPPUNIT_ASSERT(!pmt_subsetp(l3,l2)); } + diff --git a/gruel/src/lib/pmt/qa_pmt_prims.h b/gruel/src/lib/pmt/qa_pmt_prims.h index effb3a097..2fe473c43 100644 --- a/gruel/src/lib/pmt/qa_pmt_prims.h +++ b/gruel/src/lib/pmt/qa_pmt_prims.h @@ -35,6 +35,7 @@ class qa_pmt_prims : public CppUnit::TestCase { CPPUNIT_TEST(test_complexes); CPPUNIT_TEST(test_pairs); CPPUNIT_TEST(test_vectors); + CPPUNIT_TEST(test_tuples); CPPUNIT_TEST(test_equivalence); CPPUNIT_TEST(test_misc); CPPUNIT_TEST(test_dict); @@ -53,6 +54,7 @@ class qa_pmt_prims : public CppUnit::TestCase { void test_complexes(); void test_pairs(); void test_vectors(); + void test_tuples(); void test_equivalence(); void test_misc(); void test_dict(); -- cgit From f8f85dcf9de45cbb42ee46b6f6e3d1e685b0103a Mon Sep 17 00:00:00 2001 From: Eric Blossom Date: Sat, 15 Aug 2009 01:02:15 -0700 Subject: Additional QA for tuple. --- gruel/src/lib/pmt/pmt.cc | 20 +++++++++++++++++--- gruel/src/lib/pmt/pmt_io.cc | 5 +++++ gruel/src/lib/pmt/qa_pmt_prims.cc | 19 ++++++++++++++++--- 3 files changed, 38 insertions(+), 6 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/pmt.cc b/gruel/src/lib/pmt/pmt.cc index 8bf5b2dea..20dc4e42c 100644 --- a/gruel/src/lib/pmt/pmt.cc +++ b/gruel/src/lib/pmt/pmt.cc @@ -673,20 +673,21 @@ pmt_to_tuple(const pmt_t &x) size_t len = pmt_length(x); pmt_tuple *t = new pmt_tuple(len); + pmt_t r = pmt_t(t); if (x->is_vector()){ for (size_t i = 0; i < len; i++) t->_set(i, _vector(x)->ref(i)); - return pmt_t(t); + return r; } if (x->is_pair()){ pmt_t y = x; for (size_t i = 0; i < len; i++){ t->_set(i, pmt_car(y)); - y = pmt_cdr(x); + y = pmt_cdr(y); } - return pmt_t(t); + return r; } throw pmt_wrong_type("pmt_to_tuple", x); @@ -928,6 +929,19 @@ pmt_equal(const pmt_t& x, const pmt_t& y) return true; } + if (x->is_tuple() && y->is_tuple()){ + pmt_tuple *xv = _tuple(x); + pmt_tuple *yv = _tuple(y); + if (xv->length() != yv->length()) + return false; + + for (unsigned i = 0; i < xv->length(); i++) + if (!pmt_equal(xv->_ref(i), yv->_ref(i))) + return false; + + return true; + } + if (x->is_uniform_vector() && y->is_uniform_vector()){ pmt_uniform_vector *xv = _uniform_vector(x); pmt_uniform_vector *yv = _uniform_vector(y); diff --git a/gruel/src/lib/pmt/pmt_io.cc b/gruel/src/lib/pmt/pmt_io.cc index f5a82de0e..fbc556ab0 100644 --- a/gruel/src/lib/pmt/pmt_io.cc +++ b/gruel/src/lib/pmt/pmt_io.cc @@ -90,6 +90,11 @@ pmt_write(pmt_t obj, std::ostream &port) // port << "#"; port << "#"; } + else if (pmt_is_tuple(obj)){ + // FIXME + // port << "#"; + port << "#"; + } else if (pmt_is_uniform_vector(obj)){ // FIXME // port << "#"; diff --git a/gruel/src/lib/pmt/qa_pmt_prims.cc b/gruel/src/lib/pmt/qa_pmt_prims.cc index d31e3fabf..cf1ee0142 100644 --- a/gruel/src/lib/pmt/qa_pmt_prims.cc +++ b/gruel/src/lib/pmt/qa_pmt_prims.cc @@ -207,14 +207,13 @@ check_tuple(size_t len, const std::vector &s, pmt_t t) void qa_pmt_prims::test_tuples() { - pmt_t t0 = pmt_make_tuple(); - CPPUNIT_ASSERT_EQUAL(size_t(0), pmt_length(t0)); - + pmt_t v = pmt_make_vector(10, PMT_NIL); std::vector s(10); for (size_t i = 0; i < 10; i++){ std::ostringstream os; os << "s" << i; s[i] = pmt_string_to_symbol(os.str()); + pmt_vector_set(v, i, s[i]); } pmt_t t; @@ -254,6 +253,20 @@ qa_pmt_prims::test_tuples() t = pmt_make_tuple(s[0], s[1], s[2]); CPPUNIT_ASSERT_THROW(pmt_tuple_ref(t, 3), pmt_out_of_range); + + t = pmt_make_tuple(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9]); + check_tuple(10, s, t); + + pmt_t t2 = pmt_to_tuple(v); + CPPUNIT_ASSERT_EQUAL(size_t(10), pmt_length(v)); + CPPUNIT_ASSERT(pmt_equal(t, t2)); + + t = pmt_make_tuple(s[0], s[1], s[2]); + pmt_t list0 = pmt_list3(s[0], s[1], s[2]); + CPPUNIT_ASSERT_EQUAL(size_t(3), pmt_length(list0)); + t2 = pmt_to_tuple(list0); + CPPUNIT_ASSERT_EQUAL(size_t(3), pmt_length(t2)); + CPPUNIT_ASSERT(pmt_equal(t, t2)); } void -- cgit From 381ae7f53d9628dae5ac79bb580e1f8e62e7571b Mon Sep 17 00:00:00 2001 From: Eric Blossom Date: Sat, 15 Aug 2009 01:45:52 -0700 Subject: pmt_write now displays vector and tuple elements. --- gruel/src/lib/pmt/pmt_io.cc | 30 ++++++++++++++++++++---------- gruel/src/lib/pmt/qa_pmt_prims.cc | 13 +++++++++++-- 2 files changed, 31 insertions(+), 12 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/pmt_io.cc b/gruel/src/lib/pmt/pmt_io.cc index fbc556ab0..179e6b72c 100644 --- a/gruel/src/lib/pmt/pmt_io.cc +++ b/gruel/src/lib/pmt/pmt_io.cc @@ -80,20 +80,30 @@ pmt_write(pmt_t obj, std::ostream &port) port << "("; pmt_write_list_tail(obj, port); } - else if (pmt_is_dict(obj)){ - // FIXME - // port << "#"; - port << "#"; + else if (pmt_is_tuple(obj)){ + port << "{"; + size_t len = pmt_length(obj); + if (len > 0){ + port << pmt_tuple_ref(obj, 0); + for (size_t i = 1; i < len; i++) + port << " " << pmt_tuple_ref(obj, i); + } + port << "}"; } else if (pmt_is_vector(obj)){ - // FIXME - // port << "#"; - port << "#"; + port << "#("; + size_t len = pmt_length(obj); + if (len > 0){ + port << pmt_vector_ref(obj, 0); + for (size_t i = 1; i < len; i++) + port << " " << pmt_vector_ref(obj, i); + } + port << ")"; } - else if (pmt_is_tuple(obj)){ + else if (pmt_is_dict(obj)){ // FIXME - // port << "#"; - port << "#"; + // port << "#"; + port << "#"; } else if (pmt_is_uniform_vector(obj)){ // FIXME diff --git a/gruel/src/lib/pmt/qa_pmt_prims.cc b/gruel/src/lib/pmt/qa_pmt_prims.cc index cf1ee0142..899674bbb 100644 --- a/gruel/src/lib/pmt/qa_pmt_prims.cc +++ b/gruel/src/lib/pmt/qa_pmt_prims.cc @@ -216,6 +216,7 @@ qa_pmt_prims::test_tuples() pmt_vector_set(v, i, s[i]); } + pmt_t t; t = pmt_make_tuple(); @@ -224,6 +225,11 @@ qa_pmt_prims::test_tuples() t = pmt_make_tuple(s[0]); check_tuple(1, s, t); + CPPUNIT_ASSERT(pmt_is_vector(v)); + CPPUNIT_ASSERT(!pmt_is_tuple(v)); + CPPUNIT_ASSERT(pmt_is_tuple(t)); + CPPUNIT_ASSERT(!pmt_is_vector(t)); + t = pmt_make_tuple(s[0], s[1]); check_tuple(2, s, t); @@ -253,13 +259,16 @@ qa_pmt_prims::test_tuples() t = pmt_make_tuple(s[0], s[1], s[2]); CPPUNIT_ASSERT_THROW(pmt_tuple_ref(t, 3), pmt_out_of_range); + CPPUNIT_ASSERT_THROW(pmt_vector_ref(t, 0), pmt_wrong_type); + CPPUNIT_ASSERT_THROW(pmt_tuple_ref(v, 0), pmt_wrong_type); t = pmt_make_tuple(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9]); - check_tuple(10, s, t); - pmt_t t2 = pmt_to_tuple(v); CPPUNIT_ASSERT_EQUAL(size_t(10), pmt_length(v)); CPPUNIT_ASSERT(pmt_equal(t, t2)); + //std::cout << v << std::endl; + //std::cout << t2 << std::endl; + t = pmt_make_tuple(s[0], s[1], s[2]); pmt_t list0 = pmt_list3(s[0], s[1], s[2]); -- cgit From 0f90ae17548c89a9ccde112948a6b57b54c2a01c Mon Sep 17 00:00:00 2001 From: Eric Blossom Date: Tue, 18 Aug 2009 17:39:02 -0700 Subject: Add pmt type that wraps a gruel::msg_accepter. QA code doesn't link because pmt depends on msg and vice versa --- gruel/src/lib/pmt/pmt.cc | 33 ++++++++++++++++++++++++++++++++- gruel/src/lib/pmt/qa_pmt_prims.cc | 31 +++++++++++++++++++++++++++++++ gruel/src/lib/pmt/qa_pmt_prims.h | 2 ++ 3 files changed, 65 insertions(+), 1 deletion(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/pmt.cc b/gruel/src/lib/pmt/pmt.cc index f0e3c30a2..5301529b2 100644 --- a/gruel/src/lib/pmt/pmt.cc +++ b/gruel/src/lib/pmt/pmt.cc @@ -26,8 +26,9 @@ #include #include #include "pmt_int.h" -#include +#include #include +#include #include namespace pmt { @@ -881,6 +882,36 @@ pmt_any_set(pmt_t obj, const boost::any &any) _any(obj)->set(any); } +//////////////////////////////////////////////////////////////////////////// +// msg_accepter -- built from "any" +//////////////////////////////////////////////////////////////////////////// + +bool +pmt_is_msg_accepter(const pmt_t &obj) +{ + if (!pmt_is_any(obj)) + return false; + + boost::any r = pmt_any_ref(obj); + return boost::any_cast(&r) != 0; +} + +//! make a msg_accepter +pmt_t +pmt_make_msg_accepter(gruel::msg_accepter_sptr ma) +{ + return pmt_make_any(ma); +} + +//! Return underlying msg_accepter +gruel::msg_accepter_sptr +pmt_msg_accepter_ref(const pmt_t &obj) +{ + return boost::any_cast(pmt_any_ref(obj)); +} + + + //////////////////////////////////////////////////////////////////////////// // General Functions //////////////////////////////////////////////////////////////////////////// diff --git a/gruel/src/lib/pmt/qa_pmt_prims.cc b/gruel/src/lib/pmt/qa_pmt_prims.cc index 899674bbb..2c66b8fdb 100644 --- a/gruel/src/lib/pmt/qa_pmt_prims.cc +++ b/gruel/src/lib/pmt/qa_pmt_prims.cc @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -453,6 +454,36 @@ qa_pmt_prims::test_any() // ------------------------------------------------------------------------ +class qa_pmt_msg_accepter_nop : public gruel::msg_accepter { +public: + qa_pmt_msg_accepter_nop(); + ~qa_pmt_msg_accepter_nop(); + void post(pmt_t) { }; +}; + +qa_pmt_msg_accepter_nop::~qa_pmt_msg_accepter_nop(){} + +void +qa_pmt_prims::test_msg_accepter() +{ + pmt_t sym = pmt_intern("my-symbol"); + + boost::any a0; + a0 = std::string("Hello!"); + pmt_t p0 = pmt_make_any(a0); + + gruel::msg_accepter_sptr ma0 = gruel::msg_accepter_sptr(new qa_pmt_msg_accepter_nop()); + pmt_t p1 = pmt_make_msg_accepter(ma0); + + CPPUNIT_ASSERT_EQUAL(ma0.get(), pmt_msg_accepter_ref(p1).get()); + + CPPUNIT_ASSERT_THROW(pmt_msg_accepter_ref(sym), pmt_wrong_type); + CPPUNIT_ASSERT_THROW(pmt_msg_accepter_ref(p0), pmt_wrong_type); // FIXME + +} + +// ------------------------------------------------------------------------ + void qa_pmt_prims::test_serialize() { diff --git a/gruel/src/lib/pmt/qa_pmt_prims.h b/gruel/src/lib/pmt/qa_pmt_prims.h index 2fe473c43..fd6f70c8e 100644 --- a/gruel/src/lib/pmt/qa_pmt_prims.h +++ b/gruel/src/lib/pmt/qa_pmt_prims.h @@ -40,6 +40,7 @@ class qa_pmt_prims : public CppUnit::TestCase { CPPUNIT_TEST(test_misc); CPPUNIT_TEST(test_dict); CPPUNIT_TEST(test_any); + CPPUNIT_TEST(test_msg_accepter); CPPUNIT_TEST(test_io); CPPUNIT_TEST(test_lists); CPPUNIT_TEST(test_serialize); @@ -59,6 +60,7 @@ class qa_pmt_prims : public CppUnit::TestCase { void test_misc(); void test_dict(); void test_any(); + void test_msg_accepter(); void test_io(); void test_lists(); void test_serialize(); -- cgit From f7bc7ed21decef03737effa69402d127e1cb54d9 Mon Sep 17 00:00:00 2001 From: Eric Blossom Date: Tue, 18 Aug 2009 18:57:33 -0700 Subject: QA code now works. --- gruel/src/lib/Makefile.am | 13 +++++++++++++ gruel/src/lib/pmt/Makefile.am | 9 --------- gruel/src/lib/pmt/pmt.cc | 8 ++++++-- gruel/src/lib/pmt/qa_pmt_prims.cc | 7 +++---- gruel/src/lib/pmt/test_pmt.cc | 37 ------------------------------------- gruel/src/lib/test_gruel.cc | 37 +++++++++++++++++++++++++++++++++++++ 6 files changed, 59 insertions(+), 52 deletions(-) delete mode 100644 gruel/src/lib/pmt/test_pmt.cc create mode 100644 gruel/src/lib/test_gruel.cc (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/Makefile.am b/gruel/src/lib/Makefile.am index 6dfb6787c..9afa0d292 100644 --- a/gruel/src/lib/Makefile.am +++ b/gruel/src/lib/Makefile.am @@ -25,6 +25,12 @@ SUBDIRS = pmt msg AM_CPPFLAGS = $(DEFINES) $(BOOST_CPPFLAGS) $(CPPUNIT_INCLUDES) $(GRUEL_INCLUDES) $(WITH_INCLUDES) + +TESTS = test_gruel + +noinst_PROGRAMS = test_gruel + + lib_LTLIBRARIES = libgruel.la # magic flags @@ -47,3 +53,10 @@ libgruel_la_LIBADD = \ $(PMT_LIB) \ $(MSG_LIB) \ -lstdc++ + + +# ---------------------------------------------------------------- + +test_gruel_SOURCES = test_gruel.cc +test_gruel_LDADD = libgruel.la pmt/libpmt-qa.la + diff --git a/gruel/src/lib/pmt/Makefile.am b/gruel/src/lib/pmt/Makefile.am index 2b710a598..8750cbdf8 100644 --- a/gruel/src/lib/pmt/Makefile.am +++ b/gruel/src/lib/pmt/Makefile.am @@ -23,7 +23,6 @@ include $(top_srcdir)/Makefile.common AM_CPPFLAGS = $(DEFINES) $(BOOST_CPPFLAGS) $(CPPUNIT_INCLUDES) $(GRUEL_INCLUDES) $(WITH_INCLUDES) -TESTS = test_pmt noinst_LTLIBRARIES = libpmt.la @@ -90,14 +89,6 @@ libpmt_qa_la_LIBADD = \ $(CPPUNIT_LIBS) \ -lstdc++ -noinst_PROGRAMS = \ - test_pmt - - -LIBPMTQA = libpmt-qa.la - -test_pmt_SOURCES = test_pmt.cc -test_pmt_LDADD = $(LIBPMTQA) # Do creation and inclusion of other Makefiles last diff --git a/gruel/src/lib/pmt/pmt.cc b/gruel/src/lib/pmt/pmt.cc index 5301529b2..42f25b9de 100644 --- a/gruel/src/lib/pmt/pmt.cc +++ b/gruel/src/lib/pmt/pmt.cc @@ -907,11 +907,15 @@ pmt_make_msg_accepter(gruel::msg_accepter_sptr ma) gruel::msg_accepter_sptr pmt_msg_accepter_ref(const pmt_t &obj) { - return boost::any_cast(pmt_any_ref(obj)); + try { + return boost::any_cast(pmt_any_ref(obj)); + } + catch (boost::bad_any_cast &e){ + throw pmt_wrong_type("pmt_msg_accepter_ref", obj); + } } - //////////////////////////////////////////////////////////////////////////// // General Functions //////////////////////////////////////////////////////////////////////////// diff --git a/gruel/src/lib/pmt/qa_pmt_prims.cc b/gruel/src/lib/pmt/qa_pmt_prims.cc index 2c66b8fdb..e2d6ec4c6 100644 --- a/gruel/src/lib/pmt/qa_pmt_prims.cc +++ b/gruel/src/lib/pmt/qa_pmt_prims.cc @@ -456,9 +456,9 @@ qa_pmt_prims::test_any() class qa_pmt_msg_accepter_nop : public gruel::msg_accepter { public: - qa_pmt_msg_accepter_nop(); + qa_pmt_msg_accepter_nop(){}; ~qa_pmt_msg_accepter_nop(); - void post(pmt_t) { }; + void post(pmt_t){}; }; qa_pmt_msg_accepter_nop::~qa_pmt_msg_accepter_nop(){} @@ -478,8 +478,7 @@ qa_pmt_prims::test_msg_accepter() CPPUNIT_ASSERT_EQUAL(ma0.get(), pmt_msg_accepter_ref(p1).get()); CPPUNIT_ASSERT_THROW(pmt_msg_accepter_ref(sym), pmt_wrong_type); - CPPUNIT_ASSERT_THROW(pmt_msg_accepter_ref(p0), pmt_wrong_type); // FIXME - + CPPUNIT_ASSERT_THROW(pmt_msg_accepter_ref(p0), pmt_wrong_type); } // ------------------------------------------------------------------------ diff --git a/gruel/src/lib/pmt/test_pmt.cc b/gruel/src/lib/pmt/test_pmt.cc deleted file mode 100644 index 034785f4e..000000000 --- a/gruel/src/lib/pmt/test_pmt.cc +++ /dev/null @@ -1,37 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2006 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include -#include - -int -main(int argc, char **argv) -{ - - CppUnit::TextTestRunner runner; - - runner.addTest(qa_pmt::suite ()); - - bool was_successful = runner.run("", false); - - return was_successful ? 0 : 1; -} diff --git a/gruel/src/lib/test_gruel.cc b/gruel/src/lib/test_gruel.cc new file mode 100644 index 000000000..669303447 --- /dev/null +++ b/gruel/src/lib/test_gruel.cc @@ -0,0 +1,37 @@ +/* -*- c++ -*- */ +/* + * Copyright 2006,2009 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include +#include "pmt/qa_pmt.h" + +int +main(int argc, char **argv) +{ + + CppUnit::TextTestRunner runner; + + runner.addTest(qa_pmt::suite ()); + + bool was_successful = runner.run("", false); + + return was_successful ? 0 : 1; +} -- cgit From 4425cea2297d29f7cb90ac045b39928358cff1e4 Mon Sep 17 00:00:00 2001 From: Eric Blossom Date: Tue, 18 Aug 2009 21:02:13 -0700 Subject: gruel::send can now send to a pmt. --- gruel/src/lib/pmt/qa_pmt_prims.cc | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/qa_pmt_prims.cc b/gruel/src/lib/pmt/qa_pmt_prims.cc index e2d6ec4c6..04fdc1a43 100644 --- a/gruel/src/lib/pmt/qa_pmt_prims.cc +++ b/gruel/src/lib/pmt/qa_pmt_prims.cc @@ -22,8 +22,7 @@ #include #include -#include -#include +#include #include #include @@ -479,6 +478,12 @@ qa_pmt_prims::test_msg_accepter() CPPUNIT_ASSERT_THROW(pmt_msg_accepter_ref(sym), pmt_wrong_type); CPPUNIT_ASSERT_THROW(pmt_msg_accepter_ref(p0), pmt_wrong_type); + + // just confirm interfaces on send are OK + gruel::send(ma0.get(), sym); + gruel::send(ma0, sym); + gruel::send(p1, sym); + } // ------------------------------------------------------------------------ -- cgit From 6213d97eba31b66f8234357c6f030124f417f74d Mon Sep 17 00:00:00 2001 From: Eric Blossom Date: Tue, 18 Aug 2009 22:44:05 -0700 Subject: Add blobs and shorthand pmt pseudo-constructors. blobs == Binary Large Object. Very handy for passing around uninterpreted data. The shorthand constructors were implemented by overloading the pmt_t mp(foo) function in the pmt namespace. I originally called "mp" "pmt", but that caused a conflict with the pmt namespace. --- gruel/src/lib/pmt/pmt.cc | 33 +++++++++++++++++++++++++++++++++ gruel/src/lib/pmt/qa_pmt_prims.cc | 19 ++++++++++++++++++- gruel/src/lib/pmt/qa_pmt_prims.h | 2 ++ 3 files changed, 53 insertions(+), 1 deletion(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/pmt.cc b/gruel/src/lib/pmt/pmt.cc index 42f25b9de..e50e21838 100644 --- a/gruel/src/lib/pmt/pmt.cc +++ b/gruel/src/lib/pmt/pmt.cc @@ -916,6 +916,39 @@ pmt_msg_accepter_ref(const pmt_t &obj) } +//////////////////////////////////////////////////////////////////////////// +// Binary Large Object -- currently a u8vector +//////////////////////////////////////////////////////////////////////////// + +bool +pmt_is_blob(pmt_t x) +{ + // return pmt_is_u8vector(x); + return pmt_is_uniform_vector(x); +} + +pmt_t +pmt_make_blob(const void *buf, size_t len_in_bytes) +{ + return pmt_init_u8vector(len_in_bytes, (const uint8_t *) buf); +} + +const void * +pmt_blob_data(pmt_t blob) +{ + size_t len; + return pmt_uniform_vector_elements(blob, len); +} + +size_t +pmt_blob_length(pmt_t blob) +{ + size_t len; + pmt_uniform_vector_elements(blob, len); + return len; +} + + //////////////////////////////////////////////////////////////////////////// // General Functions //////////////////////////////////////////////////////////////////////////// diff --git a/gruel/src/lib/pmt/qa_pmt_prims.cc b/gruel/src/lib/pmt/qa_pmt_prims.cc index 04fdc1a43..59d9e14d3 100644 --- a/gruel/src/lib/pmt/qa_pmt_prims.cc +++ b/gruel/src/lib/pmt/qa_pmt_prims.cc @@ -23,7 +23,8 @@ #include #include #include -#include +#include +#include #include using namespace pmt; @@ -557,3 +558,19 @@ qa_pmt_prims::test_sets() CPPUNIT_ASSERT(!pmt_subsetp(l3,l2)); } +void +qa_pmt_prims::test_sugar() +{ + CPPUNIT_ASSERT(pmt_is_symbol(mp("my-symbol"))); + CPPUNIT_ASSERT_EQUAL((long) 10, pmt_to_long(mp(10))); + CPPUNIT_ASSERT_EQUAL((double) 1e6, pmt_to_double(mp(1e6))); + CPPUNIT_ASSERT_EQUAL(std::complex(2, 3), + pmt_to_complex(mp(std::complex(2, 3)))); + + int buf[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + pmt_t blob = mp(buf, sizeof(buf)); + const void *data = pmt_blob_data(blob); + size_t nbytes = pmt_blob_length(blob); + CPPUNIT_ASSERT_EQUAL(sizeof(buf), nbytes); + CPPUNIT_ASSERT(memcmp(buf, data, nbytes) == 0); +} diff --git a/gruel/src/lib/pmt/qa_pmt_prims.h b/gruel/src/lib/pmt/qa_pmt_prims.h index fd6f70c8e..29ba02f11 100644 --- a/gruel/src/lib/pmt/qa_pmt_prims.h +++ b/gruel/src/lib/pmt/qa_pmt_prims.h @@ -45,6 +45,7 @@ class qa_pmt_prims : public CppUnit::TestCase { CPPUNIT_TEST(test_lists); CPPUNIT_TEST(test_serialize); CPPUNIT_TEST(test_sets); + CPPUNIT_TEST(test_sugar); CPPUNIT_TEST_SUITE_END(); private: @@ -65,6 +66,7 @@ class qa_pmt_prims : public CppUnit::TestCase { void test_lists(); void test_serialize(); void test_sets(); + void test_sugar(); }; #endif /* INCLUDED_QA_PMT_PRIMS_H */ -- cgit From 84d50d0f6ea9f3950afe0c543c983eb9a048a6fb Mon Sep 17 00:00:00 2001 From: Johnathan Corgan Date: Wed, 9 Sep 2009 17:09:44 -0700 Subject: Added missing file to ignores. --- gruel/src/lib/.gitignore | 1 + 1 file changed, 1 insertion(+) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/.gitignore b/gruel/src/lib/.gitignore index 89a768d46..165e179d6 100644 --- a/gruel/src/lib/.gitignore +++ b/gruel/src/lib/.gitignore @@ -2,3 +2,4 @@ /Makefile.in /.libs /.deps +test_gruel -- cgit From 30e016dd9cf7c148d3119f01ba7dd4d6474efa50 Mon Sep 17 00:00:00 2001 From: Johnathan Corgan Date: Wed, 7 Oct 2009 09:11:13 -0700 Subject: Applied patch from Don Ward for Cygwin platform Add *.exe to .gitignore Restore ac_compiler in gr_fortran.m4 even when no Fortran was found Add $(NO_UNDEFINED) to LDFLAGS in atsc Makefile.am, so shared libraries will be built Change the order of searching pmt/libpmt-qa.la and libgruel.la in gruel Makefile.am so references to libgruel from limpmt-qa will be resolved --- gruel/src/lib/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/Makefile.am b/gruel/src/lib/Makefile.am index 9afa0d292..b21f8023c 100644 --- a/gruel/src/lib/Makefile.am +++ b/gruel/src/lib/Makefile.am @@ -58,5 +58,5 @@ libgruel_la_LIBADD = \ # ---------------------------------------------------------------- test_gruel_SOURCES = test_gruel.cc -test_gruel_LDADD = libgruel.la pmt/libpmt-qa.la +test_gruel_LDADD = pmt/libpmt-qa.la libgruel.la -- cgit From cbbe4816f99ac934427823c43d2f6f3f1c5f7995 Mon Sep 17 00:00:00 2001 From: Eric Blossom Date: Mon, 8 Mar 2010 17:08:09 -0800 Subject: Convert pmt_dict type into an immutable data structure. This change allows us to safely pass dicts in messages. --- gruel/src/lib/pmt/pmt.cc | 176 ++++++++++++++++++++------------------ gruel/src/lib/pmt/pmt_int.h | 27 ++---- gruel/src/lib/pmt/qa_pmt_prims.cc | 30 ++++--- 3 files changed, 114 insertions(+), 119 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/pmt.cc b/gruel/src/lib/pmt/pmt.cc index e50e21838..aa1688d24 100644 --- a/gruel/src/lib/pmt/pmt.cc +++ b/gruel/src/lib/pmt/pmt.cc @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2006,2009 Free Software Foundation, Inc. + * Copyright 2006,2009,2010 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -141,12 +141,6 @@ _uniform_vector(pmt_t x) return dynamic_cast(x.get()); } -static pmt_dict * -_dict(pmt_t x) -{ - return dynamic_cast(x.get()); -} - static pmt_any * _any(pmt_t x) { @@ -728,124 +722,91 @@ pmt_uniform_vector_writable_elements(pmt_t vector, size_t &len) // Dictionaries //////////////////////////////////////////////////////////////////////////// -pmt_dict::pmt_dict() - : d_alist(PMT_NIL) -{ -} - -void -pmt_dict::set(pmt_t key, pmt_t value) -{ - pmt_t p = pmt_assv(key, d_alist); // look for (key . value) pair - if (pmt_is_pair(p)){ // found existing pair... - pmt_set_cdr(p, value); // overrwrite cdr with new value - } - else { // not in the dict - d_alist = pmt_cons(pmt_cons(key, value), d_alist); // add new (key . value) pair - } -} - -pmt_t -pmt_dict::ref(pmt_t key, pmt_t not_found) const -{ - pmt_t p = pmt_assv(key, d_alist); // look for (key . value) pair - if (pmt_is_pair(p)) - return pmt_cdr(p); - else - return not_found; -} +/* + * This is an a-list implementation. + * + * When we need better performance for large dictionaries, consider implementing + * persistent Red-Black trees as described in "Purely Functional Data Structures", + * Chris Okasaki, 1998, section 3.3. + */ bool -pmt_dict::has_key(pmt_t key) const +pmt_is_dict(const pmt_t &obj) { - return pmt_is_pair(pmt_assv(key, d_alist)); + return pmt_is_null(obj) || pmt_is_pair(obj); } pmt_t -pmt_dict::items() const +pmt_make_dict() { - return d_alist; + return PMT_NIL; } pmt_t -pmt_dict::keys() const +pmt_dict_add(const pmt_t &dict, const pmt_t &key, const pmt_t &value) { - return pmt_map(pmt_car, d_alist); -} + if (pmt_is_null(dict)) + return pmt_acons(key, value, PMT_NIL); -pmt_t -pmt_dict::values() const -{ - return pmt_map(pmt_cdr, d_alist); -} + if (pmt_dict_has_key(dict, key)) + return pmt_acons(key, value, pmt_dict_delete(dict, key)); -bool -pmt_is_dict(pmt_t obj) -{ - return obj->is_dict(); + return pmt_acons(key, value, dict); } pmt_t -pmt_make_dict() +pmt_dict_delete(const pmt_t &dict, const pmt_t &key) { - return pmt_t(new pmt_dict()); + if (pmt_is_null(dict)) + return dict; + + if (pmt_eqv(pmt_caar(dict), key)) + return pmt_cdr(dict); + + return pmt_cons(pmt_car(dict), pmt_dict_delete(pmt_cdr(dict), key)); } -void -pmt_dict_set(pmt_t dict, pmt_t key, pmt_t value) +pmt_t +pmt_dict_ref(const pmt_t &dict, const pmt_t &key, const pmt_t ¬_found) { - pmt_dict* d = _dict(dict); - if (!d) - throw pmt_wrong_type("pmt_dict_set", dict); - - d->set(key, value); + pmt_t p = pmt_assv(key, dict); // look for (key . value) pair + if (pmt_is_pair(p)) + return pmt_cdr(p); + else + return not_found; } bool -pmt_dict_has_key(pmt_t dict, pmt_t key) +pmt_dict_has_key(const pmt_t &dict, const pmt_t &key) { - pmt_dict* d = _dict(dict); - if (!d) - throw pmt_wrong_type("pmt_dict_has_key", dict); - - return d->has_key(key); -} - -pmt_t -pmt_dict_ref(pmt_t dict, pmt_t key, pmt_t not_found) -{ - pmt_dict* d = _dict(dict); - if (!d) - throw pmt_wrong_type("pmt_dict_ref", dict); - - return d->ref(key, not_found); + return pmt_is_pair(pmt_assv(key, dict)); } pmt_t pmt_dict_items(pmt_t dict) { - if (!dict->is_dict()) - throw pmt_wrong_type("pmt_dict_items", dict); + if (!pmt_is_dict(dict)) + throw pmt_wrong_type("pmt_dict_values", dict); - return _dict(dict)->items(); + return dict; // equivalent to dict in the a-list case } pmt_t pmt_dict_keys(pmt_t dict) { - if (!dict->is_dict()) + if (!pmt_is_dict(dict)) throw pmt_wrong_type("pmt_dict_keys", dict); - return _dict(dict)->keys(); + return pmt_map(pmt_car, dict); } pmt_t pmt_dict_values(pmt_t dict) { - if (!dict->is_dict()) - throw pmt_wrong_type("pmt_dict_values", dict); + if (!pmt_is_dict(dict)) + throw pmt_wrong_type("pmt_dict_keys", dict); - return _dict(dict)->values(); + return pmt_map(pmt_cdr, dict); } //////////////////////////////////////////////////////////////////////////// @@ -977,6 +938,24 @@ pmt_eqv(const pmt_t& x, const pmt_t& y) return false; } +bool +pmt_eqv_raw(pmt_base *x, pmt_base *y) +{ + if (x == y) + return true; + + if (x->is_integer() && y->is_integer()) + return _integer(x)->value() == _integer(y)->value(); + + if (x->is_real() && y->is_real()) + return _real(x)->value() == _real(y)->value(); + + if (x->is_complex() && y->is_complex()) + return _complex(x)->value() == _complex(y)->value(); + + return false; +} + bool pmt_equal(const pmt_t& x, const pmt_t& y) { @@ -1082,6 +1061,35 @@ pmt_assq(pmt_t obj, pmt_t alist) return PMT_F; } +/* + * This avoids a bunch of shared_pointer reference count manipulation. + */ +pmt_t +pmt_assv_raw(pmt_base *obj, pmt_base *alist) +{ + while (alist->is_pair()){ + pmt_base *p = ((pmt_pair *)alist)->d_car.get(); + if (!p->is_pair()) // malformed alist + return PMT_F; + + if (pmt_eqv_raw(obj, ((pmt_pair *)p)->d_car.get())) + return ((pmt_pair *)alist)->d_car; + + alist = (((pmt_pair *)alist)->d_cdr).get(); + } + return PMT_F; +} + +#if 1 + +pmt_t +pmt_assv(pmt_t obj, pmt_t alist) +{ + return pmt_assv_raw(obj.get(), alist.get()); +} + +#else + pmt_t pmt_assv(pmt_t obj, pmt_t alist) { @@ -1098,6 +1106,9 @@ pmt_assv(pmt_t obj, pmt_t alist) return PMT_F; } +#endif + + pmt_t pmt_assoc(pmt_t obj, pmt_t alist) { @@ -1322,7 +1333,6 @@ pmt_dump_sizeof() printf("sizeof(pmt_null) = %3zd\n", sizeof(pmt_null)); printf("sizeof(pmt_pair) = %3zd\n", sizeof(pmt_pair)); printf("sizeof(pmt_vector) = %3zd\n", sizeof(pmt_vector)); - printf("sizeof(pmt_dict) = %3zd\n", sizeof(pmt_dict)); printf("sizeof(pmt_uniform_vector) = %3zd\n", sizeof(pmt_uniform_vector)); } diff --git a/gruel/src/lib/pmt/pmt_int.h b/gruel/src/lib/pmt/pmt_int.h index 7581845f8..50683ffb5 100644 --- a/gruel/src/lib/pmt/pmt_int.h +++ b/gruel/src/lib/pmt/pmt_int.h @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2006,2009 Free Software Foundation, Inc. + * Copyright 2006,2009,2010 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -107,9 +107,9 @@ public: class pmt_integer : public pmt_base { +public: long d_value; -public: pmt_integer(long value); //~pmt_integer(){} @@ -120,9 +120,9 @@ public: class pmt_real : public pmt_base { +public: double d_value; -public: pmt_real(double value); //~pmt_real(){} @@ -133,9 +133,9 @@ public: class pmt_complex : public pmt_base { +public: std::complex d_value; -public: pmt_complex(std::complex value); //~pmt_complex(){} @@ -155,10 +155,10 @@ public: class pmt_pair : public pmt_base { +public: pmt_t d_car; pmt_t d_cdr; -public: pmt_pair(const pmt_t& car, const pmt_t& cdr); //~pmt_pair(){}; @@ -203,23 +203,6 @@ public: void _set(size_t k, pmt_t v) { d_v[k] = v; } }; -class pmt_dict : public pmt_base -{ - pmt_t d_alist; // list of (key . value) pairs - -public: - pmt_dict(); - //~pmt_dict(); - - bool is_dict() const { return true; } - void set(pmt_t key, pmt_t value); - pmt_t ref(pmt_t key, pmt_t default_value) const; - bool has_key(pmt_t key) const; - pmt_t items() const; - pmt_t keys() const; - pmt_t values() const; -}; - class pmt_any : public pmt_base { boost::any d_any; diff --git a/gruel/src/lib/pmt/qa_pmt_prims.cc b/gruel/src/lib/pmt/qa_pmt_prims.cc index 59d9e14d3..3f6e2688b 100644 --- a/gruel/src/lib/pmt/qa_pmt_prims.cc +++ b/gruel/src/lib/pmt/qa_pmt_prims.cc @@ -351,29 +351,31 @@ qa_pmt_prims::test_dict() pmt_t dict = pmt_make_dict(); CPPUNIT_ASSERT(pmt_is_dict(dict)); - pmt_t k0 = pmt_string_to_symbol("k0"); - pmt_t k1 = pmt_string_to_symbol("k1"); - pmt_t k2 = pmt_string_to_symbol("k2"); - pmt_t k3 = pmt_string_to_symbol("k3"); - pmt_t v0 = pmt_string_to_symbol("v0"); - pmt_t v1 = pmt_string_to_symbol("v1"); - pmt_t v2 = pmt_string_to_symbol("v2"); - pmt_t v3 = pmt_string_to_symbol("v3"); + pmt_t k0 = mp("k0"); + pmt_t k1 = mp("k1"); + pmt_t k2 = mp("k2"); + pmt_t k3 = mp("k3"); + pmt_t v0 = mp("v0"); + pmt_t v1 = mp("v1"); + pmt_t v2 = mp("v2"); + pmt_t v3 = mp("v3"); pmt_t not_found = pmt_cons(PMT_NIL, PMT_NIL); CPPUNIT_ASSERT(!pmt_dict_has_key(dict, k0)); - pmt_dict_set(dict, k0, v0); + dict = pmt_dict_add(dict, k0, v0); CPPUNIT_ASSERT(pmt_dict_has_key(dict, k0)); CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k0, not_found), v0)); CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k1, not_found), not_found)); - pmt_dict_set(dict, k1, v1); - pmt_dict_set(dict, k2, v2); + dict = pmt_dict_add(dict, k1, v1); + dict = pmt_dict_add(dict, k2, v2); CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k1, not_found), v1)); - pmt_dict_set(dict, k1, v3); + dict = pmt_dict_add(dict, k1, v3); CPPUNIT_ASSERT(pmt_eqv(pmt_dict_ref(dict, k1, not_found), v3)); - pmt_t keys = pmt_cons(k2, pmt_cons(k1, pmt_cons(k0, PMT_NIL))); - pmt_t vals = pmt_cons(v2, pmt_cons(v3, pmt_cons(v0, PMT_NIL))); + pmt_t keys = pmt_list3(k1, k2, k0); + pmt_t vals = pmt_list3(v3, v2, v0); + //std::cout << "pmt_dict_keys: " << pmt_dict_keys(dict) << std::endl; + //std::cout << "pmt_dict_values: " << pmt_dict_values(dict) << std::endl; CPPUNIT_ASSERT(pmt_equal(keys, pmt_dict_keys(dict))); CPPUNIT_ASSERT(pmt_equal(vals, pmt_dict_values(dict))); } -- cgit From 18ecca1b9e57f047130a124bd8cc90cbe34feff0 Mon Sep 17 00:00:00 2001 From: Eric Blossom Date: Mon, 8 Mar 2010 17:21:43 -0800 Subject: Replace some calls to pmt constructors with mp(foo) shorthand. --- gruel/src/lib/pmt/qa_pmt_prims.cc | 82 +++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 41 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/qa_pmt_prims.cc b/gruel/src/lib/pmt/qa_pmt_prims.cc index 3f6e2688b..f2414c72c 100644 --- a/gruel/src/lib/pmt/qa_pmt_prims.cc +++ b/gruel/src/lib/pmt/qa_pmt_prims.cc @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2006,2009 Free Software Foundation, Inc. + * Copyright 2006,2009,2010 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -36,14 +36,14 @@ qa_pmt_prims::test_symbols() CPPUNIT_ASSERT(!pmt_is_symbol(PMT_F)); CPPUNIT_ASSERT_THROW(pmt_symbol_to_string(PMT_F), pmt_wrong_type); - pmt_t sym1 = pmt_string_to_symbol("test"); + pmt_t sym1 = mp("test"); CPPUNIT_ASSERT(pmt_is_symbol(sym1)); CPPUNIT_ASSERT_EQUAL(std::string("test"), pmt_symbol_to_string(sym1)); CPPUNIT_ASSERT(pmt_is_true(sym1)); CPPUNIT_ASSERT(!pmt_is_false(sym1)); - pmt_t sym2 = pmt_string_to_symbol("foo"); - pmt_t sym3 = pmt_string_to_symbol("test"); + pmt_t sym2 = mp("foo"); + pmt_t sym3 = mp("test"); CPPUNIT_ASSERT_EQUAL(sym1, sym3); CPPUNIT_ASSERT(sym1 != sym2); CPPUNIT_ASSERT(sym1 == sym3); @@ -56,7 +56,7 @@ qa_pmt_prims::test_symbols() for (int i = 0; i < N; i++){ char buf[100]; snprintf(buf, sizeof(buf), "test-%d", i); - v1[i] = pmt_string_to_symbol(buf); + v1[i] = mp(buf); } // confirm that they are all unique @@ -68,7 +68,7 @@ qa_pmt_prims::test_symbols() for (int i = 0; i < N; i++){ char buf[100]; snprintf(buf, sizeof(buf), "test-%d", i); - v2[i] = pmt_string_to_symbol(buf); + v2[i] = mp(buf); } // confirm that we get the same ones back @@ -79,7 +79,7 @@ qa_pmt_prims::test_symbols() void qa_pmt_prims::test_booleans() { - pmt_t sym = pmt_string_to_symbol("test"); + pmt_t sym = mp("test"); CPPUNIT_ASSERT(pmt_is_bool(PMT_T)); CPPUNIT_ASSERT(pmt_is_bool(PMT_F)); CPPUNIT_ASSERT(!pmt_is_bool(sym)); @@ -137,9 +137,9 @@ qa_pmt_prims::test_pairs() { CPPUNIT_ASSERT(pmt_is_null(PMT_NIL)); CPPUNIT_ASSERT(!pmt_is_pair(PMT_NIL)); - pmt_t s1 = pmt_string_to_symbol("s1"); - pmt_t s2 = pmt_string_to_symbol("s2"); - pmt_t s3 = pmt_string_to_symbol("s3"); + pmt_t s1 = mp("s1"); + pmt_t s2 = mp("s2"); + pmt_t s3 = mp("s3"); CPPUNIT_ASSERT_EQUAL((size_t)0, pmt_length(PMT_NIL)); @@ -174,9 +174,9 @@ qa_pmt_prims::test_vectors() static const size_t N = 3; pmt_t v1 = pmt_make_vector(N, PMT_NIL); CPPUNIT_ASSERT_EQUAL(N, pmt_length(v1)); - pmt_t s0 = pmt_string_to_symbol("s0"); - pmt_t s1 = pmt_string_to_symbol("s1"); - pmt_t s2 = pmt_string_to_symbol("s2"); + pmt_t s0 = mp("s0"); + pmt_t s1 = mp("s1"); + pmt_t s2 = mp("s2"); pmt_vector_set(v1, 0, s0); pmt_vector_set(v1, 1, s1); @@ -213,7 +213,7 @@ qa_pmt_prims::test_tuples() for (size_t i = 0; i < 10; i++){ std::ostringstream os; os << "s" << i; - s[i] = pmt_string_to_symbol(os.str()); + s[i] = mp(os.str()); pmt_vector_set(v, i, s[i]); } @@ -282,9 +282,9 @@ qa_pmt_prims::test_tuples() void qa_pmt_prims::test_equivalence() { - pmt_t s0 = pmt_string_to_symbol("s0"); - pmt_t s1 = pmt_string_to_symbol("s1"); - pmt_t s2 = pmt_string_to_symbol("s2"); + pmt_t s0 = mp("s0"); + pmt_t s1 = mp("s1"); + pmt_t s2 = mp("s2"); pmt_t list0 = pmt_cons(s0, pmt_cons(s1, pmt_cons(s2, PMT_NIL))); pmt_t list1 = pmt_cons(s0, pmt_cons(s1, pmt_cons(s2, PMT_NIL))); pmt_t i0 = pmt_from_long(42); @@ -324,13 +324,13 @@ qa_pmt_prims::test_equivalence() void qa_pmt_prims::test_misc() { - pmt_t k0 = pmt_string_to_symbol("k0"); - pmt_t k1 = pmt_string_to_symbol("k1"); - pmt_t k2 = pmt_string_to_symbol("k2"); - pmt_t k3 = pmt_string_to_symbol("k3"); - pmt_t v0 = pmt_string_to_symbol("v0"); - pmt_t v1 = pmt_string_to_symbol("v1"); - pmt_t v2 = pmt_string_to_symbol("v2"); + pmt_t k0 = mp("k0"); + pmt_t k1 = mp("k1"); + pmt_t k2 = mp("k2"); + pmt_t k3 = mp("k3"); + pmt_t v0 = mp("v0"); + pmt_t v1 = mp("v1"); + pmt_t v2 = mp("v2"); pmt_t p0 = pmt_cons(k0, v0); pmt_t p1 = pmt_cons(k1, v1); pmt_t p2 = pmt_cons(k2, v2); @@ -383,10 +383,10 @@ qa_pmt_prims::test_dict() void qa_pmt_prims::test_io() { - pmt_t k0 = pmt_string_to_symbol("k0"); - pmt_t k1 = pmt_string_to_symbol("k1"); - pmt_t k2 = pmt_string_to_symbol("k2"); - pmt_t k3 = pmt_string_to_symbol("k3"); + pmt_t k0 = mp("k0"); + pmt_t k1 = mp("k1"); + pmt_t k2 = mp("k2"); + pmt_t k3 = mp("k3"); CPPUNIT_ASSERT_EQUAL(std::string("k0"), pmt_write_string(k0)); } @@ -394,10 +394,10 @@ qa_pmt_prims::test_io() void qa_pmt_prims::test_lists() { - pmt_t s0 = pmt_intern("s0"); - pmt_t s1 = pmt_intern("s1"); - pmt_t s2 = pmt_intern("s2"); - pmt_t s3 = pmt_intern("s3"); + pmt_t s0 = mp("s0"); + pmt_t s1 = mp("s1"); + pmt_t s2 = mp("s2"); + pmt_t s3 = mp("s3"); pmt_t l1 = pmt_list4(s0, s1, s2, s3); pmt_t l2 = pmt_list3(s0, s1, s2); @@ -468,7 +468,7 @@ qa_pmt_msg_accepter_nop::~qa_pmt_msg_accepter_nop(){} void qa_pmt_prims::test_msg_accepter() { - pmt_t sym = pmt_intern("my-symbol"); + pmt_t sym = mp("my-symbol"); boost::any a0; a0 = std::string("Hello!"); @@ -495,16 +495,16 @@ void qa_pmt_prims::test_serialize() { std::stringbuf sb; // fake channel - pmt_t a = pmt_intern("a"); - pmt_t b = pmt_intern("b"); - pmt_t c = pmt_intern("c"); + pmt_t a = mp("a"); + pmt_t b = mp("b"); + pmt_t c = mp("c"); sb.str(""); // reset channel to empty // write stuff to channel pmt_serialize(PMT_NIL, sb); - pmt_serialize(pmt_intern("foobarvia"), sb); + pmt_serialize(mp("foobarvia"), sb); pmt_serialize(pmt_from_long(123456789), sb); pmt_serialize(pmt_from_long(-123456789), sb); pmt_serialize(pmt_cons(PMT_NIL, PMT_NIL), sb); @@ -519,7 +519,7 @@ qa_pmt_prims::test_serialize() // read it back CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), PMT_NIL)); - CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_intern("foobarvia"))); + CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), mp("foobarvia"))); CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_from_long(123456789))); CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_from_long(-123456789))); CPPUNIT_ASSERT(pmt_equal(pmt_deserialize(sb), pmt_cons(PMT_NIL, PMT_NIL))); @@ -542,9 +542,9 @@ qa_pmt_prims::test_serialize() void qa_pmt_prims::test_sets() { - pmt_t s1 = pmt_intern("s1"); - pmt_t s2 = pmt_intern("s2"); - pmt_t s3 = pmt_intern("s3"); + pmt_t s1 = mp("s1"); + pmt_t s2 = mp("s2"); + pmt_t s3 = mp("s3"); pmt_t l1 = pmt_list1(s1); pmt_t l2 = pmt_list2(s2,s3); -- cgit From 290fc2315a6b7f2d2bc6b98318783e3278a97453 Mon Sep 17 00:00:00 2001 From: Johnathan Corgan Date: Sun, 11 Apr 2010 13:30:45 -0700 Subject: Removed omnithreads dependency from libusrp2 --- gruel/src/lib/Makefile.am | 3 ++- gruel/src/lib/thread.cc | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 gruel/src/lib/thread.cc (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/Makefile.am b/gruel/src/lib/Makefile.am index b21f8023c..6bde9ee27 100644 --- a/gruel/src/lib/Makefile.am +++ b/gruel/src/lib/Makefile.am @@ -1,5 +1,5 @@ # -# Copyright 2008,2009 Free Software Foundation, Inc. +# Copyright 2008,2009,2010 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -45,6 +45,7 @@ MSG_LIB = msg/libmsg.la libgruel_la_SOURCES = \ realtime.cc \ sys_pri.cc \ + thread.cc \ thread_body_wrapper.cc \ thread_group.cc diff --git a/gruel/src/lib/thread.cc b/gruel/src/lib/thread.cc new file mode 100644 index 000000000..d8f77b506 --- /dev/null +++ b/gruel/src/lib/thread.cc @@ -0,0 +1,35 @@ +/* -*- c++ -*- */ +/* + * Copyright 2010 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include + +namespace gruel { + + boost::system_time + get_new_timeout(double secs) + { + return boost::get_system_time() + boost::posix_time::milliseconds(long(secs*1e3)); + } + +} -- cgit From ad13c00ae8cba6327851652a7d0c94a6d6316916 Mon Sep 17 00:00:00 2001 From: Johnathan Corgan Date: Fri, 28 May 2010 20:02:38 -0700 Subject: Make C++ shared libraries versioned --- gruel/src/lib/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/Makefile.am b/gruel/src/lib/Makefile.am index 6bde9ee27..1bcd26e90 100644 --- a/gruel/src/lib/Makefile.am +++ b/gruel/src/lib/Makefile.am @@ -34,7 +34,7 @@ noinst_PROGRAMS = test_gruel lib_LTLIBRARIES = libgruel.la # magic flags -libgruel_la_LDFLAGS = $(NO_UNDEFINED) $(BOOST_LDFLAGS) -version-info 0:0:0 +libgruel_la_LDFLAGS = $(NO_UNDEFINED) $(BOOST_LDFLAGS) $(LTVERSIONFLAGS) # ---------------------------------------------------------------- -- cgit From c986a2add25920eabacfd620a1a2132cd7e4981d Mon Sep 17 00:00:00 2001 From: Eric Blossom Date: Sat, 11 Sep 2010 13:06:10 -0700 Subject: Add support for uint64_t to pmt. --- gruel/src/lib/pmt/pmt.cc | 47 +++++++++++++++++++++++++++++++++++++++ gruel/src/lib/pmt/pmt_int.h | 14 ++++++++++++ gruel/src/lib/pmt/pmt_io.cc | 2 ++ gruel/src/lib/pmt/qa_pmt_prims.cc | 13 +++++++++++ gruel/src/lib/pmt/qa_pmt_prims.h | 2 ++ 5 files changed, 78 insertions(+) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/pmt.cc b/gruel/src/lib/pmt/pmt.cc index aa1688d24..f9cf6b4bf 100644 --- a/gruel/src/lib/pmt/pmt.cc +++ b/gruel/src/lib/pmt/pmt.cc @@ -105,6 +105,12 @@ _integer(pmt_t x) return dynamic_cast(x.get()); } +static pmt_uint64 * +_uint64(pmt_t x) +{ + return dynamic_cast(x.get()); +} + static pmt_real * _real(pmt_t x) { @@ -304,6 +310,40 @@ pmt_to_long(pmt_t x) throw pmt_wrong_type("pmt_to_long", x); } +//////////////////////////////////////////////////////////////////////////// +// Uint64 +//////////////////////////////////////////////////////////////////////////// + +pmt_uint64::pmt_uint64(uint64_t value) : d_value(value) {} + +bool +pmt_is_uint64(pmt_t x) +{ + return x->is_uint64(); +} + + +pmt_t +pmt_from_uint64(uint64_t x) +{ + return pmt_t(new pmt_uint64(x)); +} + +uint64_t +pmt_to_uint64(pmt_t x) +{ + if(x->is_uint64()) + return _uint64(x)->value(); + if(x->is_integer()) + { + long tmp = _integer(x)->value(); + if(tmp >= 0) + return (uint64_t) tmp; + } + + throw pmt_wrong_type("pmt_to_uint64", x); +} + //////////////////////////////////////////////////////////////////////////// // Real //////////////////////////////////////////////////////////////////////////// @@ -929,6 +969,9 @@ pmt_eqv(const pmt_t& x, const pmt_t& y) if (x->is_integer() && y->is_integer()) return _integer(x)->value() == _integer(y)->value(); + if (x->is_uint64() && y->is_uint64()) + return _uint64(x)->value() == _uint64(y)->value(); + if (x->is_real() && y->is_real()) return _real(x)->value() == _real(y)->value(); @@ -947,6 +990,9 @@ pmt_eqv_raw(pmt_base *x, pmt_base *y) if (x->is_integer() && y->is_integer()) return _integer(x)->value() == _integer(y)->value(); + if (x->is_uint64() && y->is_uint64()) + return _uint64(x)->value() == _uint64(y)->value(); + if (x->is_real() && y->is_real()) return _real(x)->value() == _real(y)->value(); @@ -1328,6 +1374,7 @@ pmt_dump_sizeof() printf("sizeof(pmt_bool) = %3zd\n", sizeof(pmt_bool)); printf("sizeof(pmt_symbol) = %3zd\n", sizeof(pmt_symbol)); printf("sizeof(pmt_integer) = %3zd\n", sizeof(pmt_integer)); + printf("sizeof(pmt_uint64) = %3zd\n", sizeof(pmt_uint64)); printf("sizeof(pmt_real) = %3zd\n", sizeof(pmt_real)); printf("sizeof(pmt_complex) = %3zd\n", sizeof(pmt_complex)); printf("sizeof(pmt_null) = %3zd\n", sizeof(pmt_null)); diff --git a/gruel/src/lib/pmt/pmt_int.h b/gruel/src/lib/pmt/pmt_int.h index 50683ffb5..ea28e37b4 100644 --- a/gruel/src/lib/pmt/pmt_int.h +++ b/gruel/src/lib/pmt/pmt_int.h @@ -47,6 +47,7 @@ public: virtual bool is_symbol() const { return false; } virtual bool is_number() const { return false; } virtual bool is_integer() const { return false; } + virtual bool is_uint64() const { return false; } virtual bool is_real() const { return false; } virtual bool is_complex() const { return false; } virtual bool is_null() const { return false; } @@ -118,6 +119,19 @@ public: long value() const { return d_value; } }; +class pmt_uint64 : public pmt_base +{ +public: + uint64_t d_value; + + pmt_uint64(uint64_t value); + //~pmt_uint64(){} + + bool is_number() const { return true; } + bool is_uint64() const { return true; } + uint64_t value() const { return d_value; } +}; + class pmt_real : public pmt_base { public: diff --git a/gruel/src/lib/pmt/pmt_io.cc b/gruel/src/lib/pmt/pmt_io.cc index 179e6b72c..b909c1b64 100644 --- a/gruel/src/lib/pmt/pmt_io.cc +++ b/gruel/src/lib/pmt/pmt_io.cc @@ -64,6 +64,8 @@ pmt_write(pmt_t obj, std::ostream &port) else if (pmt_is_number(obj)){ if (pmt_is_integer(obj)) port << pmt_to_long(obj); + else if (pmt_is_uint64(obj)) + port << pmt_to_uint64(obj); else if (pmt_is_real(obj)) port << pmt_to_double(obj); else if (pmt_is_complex(obj)){ diff --git a/gruel/src/lib/pmt/qa_pmt_prims.cc b/gruel/src/lib/pmt/qa_pmt_prims.cc index f2414c72c..985361f13 100644 --- a/gruel/src/lib/pmt/qa_pmt_prims.cc +++ b/gruel/src/lib/pmt/qa_pmt_prims.cc @@ -103,6 +103,19 @@ qa_pmt_prims::test_integers() CPPUNIT_ASSERT_EQUAL(1L, pmt_to_long(p1)); } +void +qa_pmt_prims::test_uint64s() +{ + pmt_t p1 = pmt_from_uint64((uint64_t)1); + pmt_t m1 = pmt_from_uint64((uint64_t)8589934592ULL); + CPPUNIT_ASSERT(!pmt_is_uint64(PMT_T)); + CPPUNIT_ASSERT(pmt_is_uint64(p1)); + CPPUNIT_ASSERT(pmt_is_uint64(m1)); + CPPUNIT_ASSERT_THROW(pmt_to_uint64(PMT_T), pmt_wrong_type); + CPPUNIT_ASSERT_EQUAL((uint64_t)8589934592ULL, (uint64_t)pmt_to_uint64(m1)); + CPPUNIT_ASSERT_EQUAL((uint64_t)1ULL, (uint64_t)pmt_to_uint64(p1)); +} + void qa_pmt_prims::test_reals() { diff --git a/gruel/src/lib/pmt/qa_pmt_prims.h b/gruel/src/lib/pmt/qa_pmt_prims.h index 29ba02f11..efc5c6050 100644 --- a/gruel/src/lib/pmt/qa_pmt_prims.h +++ b/gruel/src/lib/pmt/qa_pmt_prims.h @@ -31,6 +31,7 @@ class qa_pmt_prims : public CppUnit::TestCase { CPPUNIT_TEST(test_symbols); CPPUNIT_TEST(test_booleans); CPPUNIT_TEST(test_integers); + CPPUNIT_TEST(test_uint64s); CPPUNIT_TEST(test_reals); CPPUNIT_TEST(test_complexes); CPPUNIT_TEST(test_pairs); @@ -52,6 +53,7 @@ class qa_pmt_prims : public CppUnit::TestCase { void test_symbols(); void test_booleans(); void test_integers(); + void test_uint64s(); void test_reals(); void test_complexes(); void test_pairs(); -- cgit From 036a42c08eadbd0a2c462ca61d9d883996be8042 Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Thu, 30 Sep 2010 16:08:53 -0400 Subject: Adding an XML outputter for the CPP Unit tests. This is to a) store the output information but also b) for integration with Hudson for logging and displaying the results during the build stages. This only covers a few cases so far and I need to define a better place to save the output files. --- gruel/src/lib/test_gruel.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/test_gruel.cc b/gruel/src/lib/test_gruel.cc index 669303447..cb5f2d36b 100644 --- a/gruel/src/lib/test_gruel.cc +++ b/gruel/src/lib/test_gruel.cc @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2006,2009 Free Software Foundation, Inc. + * Copyright 2006,2009,2010 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -21,6 +21,7 @@ */ #include +#include #include "pmt/qa_pmt.h" int @@ -28,8 +29,11 @@ main(int argc, char **argv) { CppUnit::TextTestRunner runner; + std::ofstream xmlfile("cppunit_gruel.xml"); + CppUnit::XmlOutputter *xmlout = new CppUnit::XmlOutputter(&runner.result(), xmlfile); runner.addTest(qa_pmt::suite ()); + runner.setOutputter(xmlout); bool was_successful = runner.run("", false); -- cgit From 2b8bd0d2fa7c76282a772b75cb99e7bd5f2be13f Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Sat, 2 Oct 2010 17:16:04 -0400 Subject: Moving XML output files from cppunit tests to $HOME/.gnuradio/unittests. This also adds a new utility gr_unittests.h, which sets up the path for output files. --- gruel/src/lib/test_gruel.cc | 53 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/test_gruel.cc b/gruel/src/lib/test_gruel.cc index cb5f2d36b..f4b9fc4e2 100644 --- a/gruel/src/lib/test_gruel.cc +++ b/gruel/src/lib/test_gruel.cc @@ -22,14 +22,22 @@ #include #include + +#include +#include + #include "pmt/qa_pmt.h" +static void get_unittest_path (const char *filename, char *fullpath, size_t pathsize); + int main(int argc, char **argv) { + char path[200]; + get_unittest_path ("gruel.xml", path, 200); - CppUnit::TextTestRunner runner; - std::ofstream xmlfile("cppunit_gruel.xml"); + CppUnit::TextTestRunner runner; + std::ofstream xmlfile(path); CppUnit::XmlOutputter *xmlout = new CppUnit::XmlOutputter(&runner.result(), xmlfile); runner.addTest(qa_pmt::suite ()); @@ -39,3 +47,44 @@ main(int argc, char **argv) return was_successful ? 0 : 1; } + + +// NOTE: These are defined in gr_unittest.h for the rest of the project; +// rewriting here since we don't depend on gnuradio-core in gruel + +#ifdef MKDIR_TAKES_ONE_ARG +#define gr_mkdir(pathname, mode) mkdir(pathname) +#else +#define gr_mkdir(pathname, mode) mkdir((pathname), (mode)) +#endif + +/* + * Mostly taken from gr_preferences.cc/h + * The simplest thing that could possibly work: + * the key is the filename; the value is the file contents. + */ + +static void +ensure_unittest_path (const char *grpath, const char *path) +{ + struct stat statbuf; + if (stat (path, &statbuf) == 0 && S_ISDIR (statbuf.st_mode)) + return; + + // blindly try to make it // FIXME make this robust. C++ SUCKS! + gr_mkdir (grpath, 0750); + gr_mkdir (path, 0750); +} + +static void +get_unittest_path (const char *filename, char *fullpath, size_t pathsize) +{ + char path[200]; + char grpath[200]; + snprintf (grpath, sizeof(grpath), "%s/.gnuradio", getenv ("HOME")); + snprintf (path, sizeof(path), "%s/unittests", grpath); + snprintf (fullpath, pathsize, "%s/%s", path, filename); + + ensure_unittest_path(grpath, path); +} + -- cgit From cb2fa9a58c9a52f3501881964ee4f59992c5d84d Mon Sep 17 00:00:00 2001 From: Michael Dickens Date: Sat, 9 Oct 2010 16:11:03 -0400 Subject: rearrange includes to always be: internal GR, external, with GR. --- gruel/src/lib/Makefile.am | 4 ++-- gruel/src/lib/msg/Makefile.am | 5 +++-- gruel/src/lib/pmt/Makefile.am | 6 +++--- 3 files changed, 8 insertions(+), 7 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/Makefile.am b/gruel/src/lib/Makefile.am index 1bcd26e90..5c3302f19 100644 --- a/gruel/src/lib/Makefile.am +++ b/gruel/src/lib/Makefile.am @@ -23,8 +23,8 @@ include $(top_srcdir)/Makefile.common SUBDIRS = pmt msg -AM_CPPFLAGS = $(DEFINES) $(BOOST_CPPFLAGS) $(CPPUNIT_INCLUDES) $(GRUEL_INCLUDES) $(WITH_INCLUDES) - +AM_CPPFLAGS = $(DEFINES) $(GRUEL_INCLUDES) $(BOOST_CPPFLAGS) \ + $(CPPUNIT_INCLUDES) $(WITH_INCLUDES) TESTS = test_gruel diff --git a/gruel/src/lib/msg/Makefile.am b/gruel/src/lib/msg/Makefile.am index 13a657067..9dbaf10f5 100644 --- a/gruel/src/lib/msg/Makefile.am +++ b/gruel/src/lib/msg/Makefile.am @@ -1,5 +1,5 @@ # -# Copyright 2009 Free Software Foundation, Inc. +# Copyright 2009,2010 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -21,7 +21,8 @@ include $(top_srcdir)/Makefile.common -AM_CPPFLAGS = $(DEFINES) $(BOOST_CPPFLAGS) $(GRUEL_INCLUDES) $(WITH_INCLUDES) +AM_CPPFLAGS = $(DEFINES) $(GRUEL_INCLUDES) \ + $(BOOST_CPPFLAGS) $(WITH_INCLUDES) noinst_LTLIBRARIES = libmsg.la diff --git a/gruel/src/lib/pmt/Makefile.am b/gruel/src/lib/pmt/Makefile.am index 8750cbdf8..d3efc1afa 100644 --- a/gruel/src/lib/pmt/Makefile.am +++ b/gruel/src/lib/pmt/Makefile.am @@ -1,5 +1,5 @@ # -# Copyright 2008,2009 Free Software Foundation, Inc. +# Copyright 2008,2009,2010 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -21,8 +21,8 @@ include $(top_srcdir)/Makefile.common -AM_CPPFLAGS = $(DEFINES) $(BOOST_CPPFLAGS) $(CPPUNIT_INCLUDES) $(GRUEL_INCLUDES) $(WITH_INCLUDES) - +AM_CPPFLAGS = $(DEFINES) $(GRUEL_INCLUDES) $(BOOST_CPPFLAGS) \ + $(CPPUNIT_INCLUDES) $(WITH_INCLUDES) noinst_LTLIBRARIES = libpmt.la -- cgit From d692a41f98e7b888c745efbb9fcbbb0400f39025 Mon Sep 17 00:00:00 2001 From: Eric Blossom Date: Wed, 24 Nov 2010 17:29:11 -0800 Subject: Major Makefile.am housecleaning. Passes distcheck. Move all occurrences of swig_built_sources out of Makefile.am's. Move all SWIG related use of BUILT_SOURCES out of Makefile.am's. Clean up 'if PYTHON' conditionalization in gr-* Still left to do: fix Makefile.swig CLEANFILES and no_dist_files such that they remove exactly the generated files. --- gruel/src/lib/pmt/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/Makefile.am b/gruel/src/lib/pmt/Makefile.am index d3efc1afa..7a1f2e7d4 100644 --- a/gruel/src/lib/pmt/Makefile.am +++ b/gruel/src/lib/pmt/Makefile.am @@ -48,7 +48,7 @@ python_built_sources = $(GENERATED_H) $(GENERATED_CC) PMT_SERIAL_TAGS_H = $(abs_top_builddir)/gruel/src/include/gruel/pmt_serial_tags.h BUILT_SOURCES = $(python_built_sources) $(PMT_SERIAL_TAGS_H) -EXTRA_DIST = $(code_generator) +EXTRA_DIST += $(code_generator) # ---------------------------------------------------------------- -- cgit From 153de8c41caa9c478bec2f10b8a1167952809eed Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Thu, 23 Dec 2010 18:31:28 -0500 Subject: Modifying the unittest output. XML files are no longer written outside of the build tree. --- gruel/src/lib/test_gruel.cc | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/test_gruel.cc b/gruel/src/lib/test_gruel.cc index f4b9fc4e2..2c9528b0a 100644 --- a/gruel/src/lib/test_gruel.cc +++ b/gruel/src/lib/test_gruel.cc @@ -65,14 +65,13 @@ main(int argc, char **argv) */ static void -ensure_unittest_path (const char *grpath, const char *path) +ensure_unittest_path (const char *path) { struct stat statbuf; if (stat (path, &statbuf) == 0 && S_ISDIR (statbuf.st_mode)) return; // blindly try to make it // FIXME make this robust. C++ SUCKS! - gr_mkdir (grpath, 0750); gr_mkdir (path, 0750); } @@ -80,11 +79,9 @@ static void get_unittest_path (const char *filename, char *fullpath, size_t pathsize) { char path[200]; - char grpath[200]; - snprintf (grpath, sizeof(grpath), "%s/.gnuradio", getenv ("HOME")); - snprintf (path, sizeof(path), "%s/unittests", grpath); + snprintf (path, sizeof(path), "./.unittests"); snprintf (fullpath, pathsize, "%s/%s", path, filename); - ensure_unittest_path(grpath, path); + ensure_unittest_path(path); } -- cgit From 05cc02cec03507c47846a668c92e6dcc4ba2e71e Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Tue, 18 Jan 2011 01:00:15 -0800 Subject: cleanup mkdir usage with boost filesystem: Replaced copy/pasted code and MKDIR_TAKES_ONE_ARG #ifdefs with portable boost filesystem path and directory creation. Gets the correct home directory on windows systems: APPDATA. Replaces large amounts of copypasta with single lines of code. Removes MKDIR_TAKES_ONE_ARG configuration checks from m4 files. Adds boost filesystem and system library as build dependencies. --- gruel/src/lib/Makefile.am | 2 ++ gruel/src/lib/test_gruel.cc | 51 +++++++-------------------------------------- 2 files changed, 10 insertions(+), 43 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/Makefile.am b/gruel/src/lib/Makefile.am index 5c3302f19..876e7ab3d 100644 --- a/gruel/src/lib/Makefile.am +++ b/gruel/src/lib/Makefile.am @@ -51,6 +51,8 @@ libgruel_la_SOURCES = \ libgruel_la_LIBADD = \ $(BOOST_THREAD_LIB) \ + $(BOOST_SYSTEM_LIB) \ + $(BOOST_FILESYSTEM_LIB) \ $(PMT_LIB) \ $(MSG_LIB) \ -lstdc++ diff --git a/gruel/src/lib/test_gruel.cc b/gruel/src/lib/test_gruel.cc index 2c9528b0a..efb6cb777 100644 --- a/gruel/src/lib/test_gruel.cc +++ b/gruel/src/lib/test_gruel.cc @@ -28,16 +28,19 @@ #include "pmt/qa_pmt.h" -static void get_unittest_path (const char *filename, char *fullpath, size_t pathsize); +#include +#include +namespace fs = boost::filesystem; int main(int argc, char **argv) { - char path[200]; - get_unittest_path ("gruel.xml", path, 200); - + fs::path path = fs::current_path() / ".unittests"; + if (!fs::is_directory(path)) fs::create_directory(path); + path = path / "gruel.xml"; + CppUnit::TextTestRunner runner; - std::ofstream xmlfile(path); + std::ofstream xmlfile(path.string().c_str()); CppUnit::XmlOutputter *xmlout = new CppUnit::XmlOutputter(&runner.result(), xmlfile); runner.addTest(qa_pmt::suite ()); @@ -47,41 +50,3 @@ main(int argc, char **argv) return was_successful ? 0 : 1; } - - -// NOTE: These are defined in gr_unittest.h for the rest of the project; -// rewriting here since we don't depend on gnuradio-core in gruel - -#ifdef MKDIR_TAKES_ONE_ARG -#define gr_mkdir(pathname, mode) mkdir(pathname) -#else -#define gr_mkdir(pathname, mode) mkdir((pathname), (mode)) -#endif - -/* - * Mostly taken from gr_preferences.cc/h - * The simplest thing that could possibly work: - * the key is the filename; the value is the file contents. - */ - -static void -ensure_unittest_path (const char *path) -{ - struct stat statbuf; - if (stat (path, &statbuf) == 0 && S_ISDIR (statbuf.st_mode)) - return; - - // blindly try to make it // FIXME make this robust. C++ SUCKS! - gr_mkdir (path, 0750); -} - -static void -get_unittest_path (const char *filename, char *fullpath, size_t pathsize) -{ - char path[200]; - snprintf (path, sizeof(path), "./.unittests"); - snprintf (fullpath, pathsize, "%s/%s", path, filename); - - ensure_unittest_path(path); -} - -- cgit From ebb0f56da62e9ff16928b32cc525f24c93a99e0b Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Sat, 22 Jan 2011 14:54:20 -0500 Subject: Updating copyright. --- gruel/src/lib/Makefile.am | 2 +- gruel/src/lib/test_gruel.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/Makefile.am b/gruel/src/lib/Makefile.am index 876e7ab3d..b9b35ae10 100644 --- a/gruel/src/lib/Makefile.am +++ b/gruel/src/lib/Makefile.am @@ -1,5 +1,5 @@ # -# Copyright 2008,2009,2010 Free Software Foundation, Inc. +# Copyright 2008,2009,2010,2011 Free Software Foundation, Inc. # # This file is part of GNU Radio # diff --git a/gruel/src/lib/test_gruel.cc b/gruel/src/lib/test_gruel.cc index efb6cb777..7ef3520e6 100644 --- a/gruel/src/lib/test_gruel.cc +++ b/gruel/src/lib/test_gruel.cc @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2006,2009,2010 Free Software Foundation, Inc. + * Copyright 2006,2009,2010,2011 Free Software Foundation, Inc. * * This file is part of GNU Radio * -- cgit From cb35c3e28f277717d8f9f849636768d57720487f Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Wed, 2 Feb 2011 19:40:16 -0800 Subject: gruel: generate pmt_serial_tags with python, removes guile dependency --- gruel/src/lib/pmt/Makefile.am | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/Makefile.am b/gruel/src/lib/pmt/Makefile.am index 7a1f2e7d4..0c8e12dc3 100644 --- a/gruel/src/lib/pmt/Makefile.am +++ b/gruel/src/lib/pmt/Makefile.am @@ -1,5 +1,5 @@ # -# Copyright 2008,2009,2010 Free Software Foundation, Inc. +# Copyright 2008,2009,2010,2011 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -99,7 +99,7 @@ gen_sources_deps = $(core_generator) par_gen_command = PYTHONPATH=$(top_srcdir)/gruel/src/lib/pmt srcdir=$(srcdir) $(PYTHON) $(srcdir)/generate_unv.py include $(top_srcdir)/Makefile.par.gen -# Rule to create the build header file using GUILE +# Rule to create the build header file using python # Doesn't need parallel protections because there is a single target -$(PMT_SERIAL_TAGS_H): $(srcdir)/../../scheme/gnuradio/gen-serial-tags.scm $(srcdir)/../../scheme/gnuradio/pmt-serial-tags.scm - $(RUN_GUILE) $(srcdir)/../../scheme/gnuradio/gen-serial-tags.scm $(srcdir)/../../scheme/gnuradio/pmt-serial-tags.scm $(PMT_SERIAL_TAGS_H) +$(PMT_SERIAL_TAGS_H): $(top_srcdir)/gruel/src/scheme/gnuradio/gen-serial-tags.py $(top_srcdir)/gruel/src/scheme/gnuradio/pmt-serial-tags.scm + $(PYTHON) $^ $@ -- cgit From e73c25fb9226029f0e50052b1ffacedb3a78622b Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Mon, 24 Jan 2011 00:34:28 -0800 Subject: gruel thread simplification: Removed get_new_timeout from thread.h (usrp2_vrt carryover) Basically it was created because of a misunderstanding of the time types; and its only ever called once. This also removes thread.cc Call posix_time::milliseconds in usrp2 control.cc. Notice that it passes a time_duration rather than a ptime (aka system time). Added #include to gr_buffer.h. It turns out that boost posix_time.hpp implicitly included the deque header which was missing from gr_buffer.h Replaced the include for thread.hpp with only the includes for the boost thread types mentioned in gruel/thread.h. Also, making use of the scoped_lock typedef that comes with boost thread locks. boost 3.5 safe. --- gruel/src/lib/Makefile.am | 1 - gruel/src/lib/thread.cc | 35 ----------------------------------- 2 files changed, 36 deletions(-) delete mode 100644 gruel/src/lib/thread.cc (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/Makefile.am b/gruel/src/lib/Makefile.am index b9b35ae10..f37ab27a1 100644 --- a/gruel/src/lib/Makefile.am +++ b/gruel/src/lib/Makefile.am @@ -45,7 +45,6 @@ MSG_LIB = msg/libmsg.la libgruel_la_SOURCES = \ realtime.cc \ sys_pri.cc \ - thread.cc \ thread_body_wrapper.cc \ thread_group.cc diff --git a/gruel/src/lib/thread.cc b/gruel/src/lib/thread.cc deleted file mode 100644 index d8f77b506..000000000 --- a/gruel/src/lib/thread.cc +++ /dev/null @@ -1,35 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2010 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif -#include - -namespace gruel { - - boost::system_time - get_new_timeout(double secs) - { - return boost::get_system_time() + boost::posix_time::milliseconds(long(secs*1e3)); - } - -} -- cgit From a611da7044175fede5f8ecfe13a055f5680fd3f9 Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Mon, 14 Mar 2011 19:33:03 -0400 Subject: gruel: SWIGing Gruel into Python to access PMTs. --- gruel/src/lib/pmt/pmt_io.cc | 10 ++++ gruel/src/lib/pmt/pmt_serialize.cc | 107 +++++++++++++++++++++++++++++++++++-- 2 files changed, 112 insertions(+), 5 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/pmt_io.cc b/gruel/src/lib/pmt/pmt_io.cc index b909c1b64..1214ff588 100644 --- a/gruel/src/lib/pmt/pmt_io.cc +++ b/gruel/src/lib/pmt/pmt_io.cc @@ -26,6 +26,7 @@ #include #include "pmt_int.h" #include +#include namespace pmt { @@ -156,3 +157,12 @@ pmt_deserialize(std::istream &source) } } /* namespace pmt */ + + +void +pmt::pmt_print(pmt_t v) +{ + std::cout << pmt_write_string(v) << std::endl; +} + + diff --git a/gruel/src/lib/pmt/pmt_serialize.cc b/gruel/src/lib/pmt/pmt_serialize.cc index 937423a93..184a31e6b 100644 --- a/gruel/src/lib/pmt/pmt_serialize.cc +++ b/gruel/src/lib/pmt/pmt_serialize.cc @@ -59,6 +59,26 @@ serialize_untagged_u32(unsigned int i, std::streambuf &sb) return sb.sputc((i >> 0) & 0xff) != std::streambuf::traits_type::eof(); } +static bool +serialize_untagged_f64(double i, std::streambuf &sb) +{ + typedef union { + double id; + uint64_t ii; + } iu_t; + iu_t iu; + iu.id = i; + sb.sputc((iu.ii >> 56) & 0xff); + sb.sputc((iu.ii >> 48) & 0xff); + sb.sputc((iu.ii >> 40) & 0xff); + sb.sputc((iu.ii >> 32) & 0xff); + sb.sputc((iu.ii >> 24) & 0xff); + sb.sputc((iu.ii >> 16) & 0xff); + sb.sputc((iu.ii >> 8) & 0xff); + return sb.sputc((iu.ii >> 0) & 0xff) != std::streambuf::traits_type::eof(); +} + + #if 0 // always writes big-endian static bool @@ -163,6 +183,41 @@ deserialize_untagged_u64(uint64_t *ip, std::streambuf &sb) } #endif +static bool +deserialize_untagged_f64(double *ip, std::streambuf &sb) +{ + std::streambuf::traits_type::int_type t; + + typedef union { + double id; + uint64_t ii; + } iu_t; + + iu_t iu; + + t = sb.sbumpc(); + iu.ii = t & 0xff; + + t = sb.sbumpc(); + iu.ii = (iu.ii<<8) | (t & 0xff); + t = sb.sbumpc(); + iu.ii = (iu.ii<<8) | (t & 0xff); + t = sb.sbumpc(); + iu.ii = (iu.ii<<8) | (t & 0xff); + t = sb.sbumpc(); + iu.ii = (iu.ii<<8) | (t & 0xff); + t = sb.sbumpc(); + iu.ii = (iu.ii<<8) | (t & 0xff); + t = sb.sbumpc(); + iu.ii = (iu.ii<<8) | (t & 0xff); + t = sb.sbumpc(); + iu.ii = (iu.ii<<8) | (t & 0xff); + + *ip = iu.id; + return t != std::streambuf::traits_type::eof(); +} + + /* * Write portable byte-serial representation of \p obj to \p sb * @@ -172,7 +227,7 @@ bool pmt_serialize(pmt_t obj, std::streambuf &sb) { bool ok = true; - + tail_recursion: if (pmt_is_bool(obj)){ @@ -217,11 +272,21 @@ pmt_serialize(pmt_t obj, std::streambuf &sb) return ok; } - if (pmt_is_real(obj)) - throw pmt_notimplemented("pmt_serialize (real)", obj); + if (pmt_is_real(obj)){ + float i = pmt_to_double(obj); + ok = serialize_untagged_u8(PST_DOUBLE, sb); + ok &= serialize_untagged_f64(i, sb); + return ok; + } + + if (pmt_is_complex(obj)){ + std::complex i = pmt_to_complex(obj); + ok = serialize_untagged_u8(PST_COMPLEX, sb); + ok &= serialize_untagged_f64(i.real(), sb); + ok &= serialize_untagged_f64(i.imag(), sb); + return ok; + } - if (pmt_is_complex(obj)) - throw pmt_notimplemented("pmt_serialize (complex)", obj); } if (pmt_is_vector(obj)) @@ -251,6 +316,7 @@ pmt_deserialize(std::streambuf &sb) uint16_t u16; uint32_t u32; //uint32_t u64; + double f64; static char tmpbuf[1024]; if (!deserialize_untagged_u8(&tag, sb)) @@ -285,7 +351,18 @@ pmt_deserialize(std::streambuf &sb) return parse_pair(sb); case PST_DOUBLE: + if(!deserialize_untagged_f64(&f64, sb)) + goto error; + return pmt_from_double( f64 ); + case PST_COMPLEX: + { + double r,i; + if(!deserialize_untagged_f64(&r, sb) && !deserialize_untagged_f64(&i, sb)) + goto error; + return pmt_make_rectangular( r,i ); + } + case PST_VECTOR: case PST_DICT: case PST_UNIFORM_VECTOR: @@ -302,6 +379,26 @@ pmt_deserialize(std::streambuf &sb) throw pmt_exception("pmt_deserialize: malformed input stream", PMT_F); } + +/* + * provide a simple string accessor to the serialized pmt form + */ +std::string pmt_serialize_str(pmt_t obj){ + std::stringbuf sb; + pmt_serialize(obj, sb); + return sb.str(); +} + + +/* + * provide a simple string accessor to the deserialized pmt form + */ +pmt_t pmt_deserialize_str(std::string s){ + std::stringbuf sb(s); + return pmt_deserialize(sb); +} + + /* * This is a mostly non-recursive implementation that allows us to * deserialize very long lists w/o exhausting the evaluation stack. -- cgit From 0966037079d9e2af5778f1418c17d29352286406 Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Fri, 1 Apr 2011 10:02:21 -0400 Subject: build: updating Makefiles for newer linker requirements. --- gruel/src/lib/Makefile.am | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/Makefile.am b/gruel/src/lib/Makefile.am index f37ab27a1..773f3aefd 100644 --- a/gruel/src/lib/Makefile.am +++ b/gruel/src/lib/Makefile.am @@ -60,5 +60,9 @@ libgruel_la_LIBADD = \ # ---------------------------------------------------------------- test_gruel_SOURCES = test_gruel.cc -test_gruel_LDADD = pmt/libpmt-qa.la libgruel.la +test_gruel_LDADD = \ + $(BOOST_THREAD_LIB) \ + $(BOOST_SYSTEM_LIB) \ + $(BOOST_FILESYSTEM_LIB) \ + pmt/libpmt-qa.la libgruel.la -- cgit From 2ed243a36f9f19d10a552a350f856726e8e64b30 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Wed, 20 Jul 2011 12:20:40 -0700 Subject: gr: replaced uses of snprintf with boost format in common code build by MSVC --- gruel/src/lib/pmt/qa_pmt_prims.cc | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/qa_pmt_prims.cc b/gruel/src/lib/pmt/qa_pmt_prims.cc index 985361f13..7dec30d56 100644 --- a/gruel/src/lib/pmt/qa_pmt_prims.cc +++ b/gruel/src/lib/pmt/qa_pmt_prims.cc @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -54,9 +55,8 @@ qa_pmt_prims::test_symbols() // generate a bunch of symbols for (int i = 0; i < N; i++){ - char buf[100]; - snprintf(buf, sizeof(buf), "test-%d", i); - v1[i] = mp(buf); + std::string buf = str(boost::format("test-%d") % i); + v1[i] = mp(buf.c_str()); } // confirm that they are all unique @@ -66,9 +66,8 @@ qa_pmt_prims::test_symbols() // generate the same symbols again for (int i = 0; i < N; i++){ - char buf[100]; - snprintf(buf, sizeof(buf), "test-%d", i); - v2[i] = mp(buf); + std::string buf = str(boost::format("test-%d") % i); + v2[i] = mp(buf.c_str()); } // confirm that we get the same ones back -- cgit From 947ae1cf5c16f5b3c6222b6ee9ad1a3b4075dd25 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Wed, 20 Jul 2011 17:55:28 -0700 Subject: gruel: API declaration macros for gruel class and function symbols --- gruel/src/lib/Makefile.am | 2 +- gruel/src/lib/pmt/pmt_int.h | 2 +- gruel/src/lib/pmt/qa_pmt.h | 3 ++- gruel/src/lib/pmt/qa_pmt_prims.h | 4 +++- 4 files changed, 7 insertions(+), 4 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/Makefile.am b/gruel/src/lib/Makefile.am index 773f3aefd..10ec7a44d 100644 --- a/gruel/src/lib/Makefile.am +++ b/gruel/src/lib/Makefile.am @@ -24,7 +24,7 @@ include $(top_srcdir)/Makefile.common SUBDIRS = pmt msg AM_CPPFLAGS = $(DEFINES) $(GRUEL_INCLUDES) $(BOOST_CPPFLAGS) \ - $(CPPUNIT_INCLUDES) $(WITH_INCLUDES) + $(CPPUNIT_INCLUDES) $(WITH_INCLUDES) -Dgruel_EXPORTS TESTS = test_gruel diff --git a/gruel/src/lib/pmt/pmt_int.h b/gruel/src/lib/pmt/pmt_int.h index ea28e37b4..3a5cd382b 100644 --- a/gruel/src/lib/pmt/pmt_int.h +++ b/gruel/src/lib/pmt/pmt_int.h @@ -35,7 +35,7 @@ #define PMT_LOCAL_ALLOCATOR 0 // define to 0 or 1 namespace pmt { -class pmt_base : boost::noncopyable { +class GRUEL_API pmt_base : boost::noncopyable { mutable boost::detail::atomic_count count_; protected: diff --git a/gruel/src/lib/pmt/qa_pmt.h b/gruel/src/lib/pmt/qa_pmt.h index 43a6dbf67..424c1065b 100644 --- a/gruel/src/lib/pmt/qa_pmt.h +++ b/gruel/src/lib/pmt/qa_pmt.h @@ -23,11 +23,12 @@ #ifndef INCLUDED_QA_PMT_H #define INCLUDED_QA_PMT_H +#include #include //! collect all the tests for pmt -class qa_pmt { +class __GR_ATTR_EXPORT qa_pmt { public: //! return suite of tests for all of pmt static CppUnit::TestSuite *suite (); diff --git a/gruel/src/lib/pmt/qa_pmt_prims.h b/gruel/src/lib/pmt/qa_pmt_prims.h index efc5c6050..cc1409ee6 100644 --- a/gruel/src/lib/pmt/qa_pmt_prims.h +++ b/gruel/src/lib/pmt/qa_pmt_prims.h @@ -22,10 +22,12 @@ #ifndef INCLUDED_QA_PMT_PRIMS_H #define INCLUDED_QA_PMT_PRIMS_H +#include +#include //reason: suppress warnings #include #include -class qa_pmt_prims : public CppUnit::TestCase { +class __GR_ATTR_EXPORT qa_pmt_prims : public CppUnit::TestCase { CPPUNIT_TEST_SUITE(qa_pmt_prims); CPPUNIT_TEST(test_symbols); -- cgit From ed950948ea424f3670be1f5ffc96be922ab5e3c9 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Wed, 20 Jul 2011 17:56:41 -0700 Subject: gruel: support for windows API set realtime scheduling --- gruel/src/lib/realtime.cc | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/realtime.cc b/gruel/src/lib/realtime.cc index 7397cf3d3..96351f812 100644 --- a/gruel/src/lib/realtime.cc +++ b/gruel/src/lib/realtime.cc @@ -132,6 +132,38 @@ namespace gruel { } // namespace gruel +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) + +#include + +namespace gruel { + + rt_status_t enable_realtime_scheduling(rt_sched_param p){ + + //set the priority class on the process + int pri_class = (true)? REALTIME_PRIORITY_CLASS : NORMAL_PRIORITY_CLASS; + if (SetPriorityClass(GetCurrentProcess(), pri_class) == 0) + return RT_OTHER_ERROR; + + //scale the priority value to the constants + int priorities[] = { + THREAD_PRIORITY_IDLE, THREAD_PRIORITY_LOWEST, THREAD_PRIORITY_BELOW_NORMAL, THREAD_PRIORITY_NORMAL, + THREAD_PRIORITY_ABOVE_NORMAL, THREAD_PRIORITY_HIGHEST, THREAD_PRIORITY_TIME_CRITICAL + }; + const double priority = double(p.priority)/(rt_priority_max() - rt_priority_min()); + size_t pri_index = size_t((priority+1.0)*6/2.0); // -1 -> 0, +1 -> 6 + pri_index %= sizeof(priorities)/sizeof(*priorities); //range check + + //set the thread priority on the thread + if (SetThreadPriority(GetCurrentThread(), priorities[pri_index]) == 0) + return RT_OTHER_ERROR; + + //printf("SetPriorityClass + SetThreadPriority\n"); + return RT_OK; + } + +} // namespace gruel + #else namespace gruel { -- cgit From accb9f2fe8fd8f6a1e114adac5b15304b0e0012d Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Wed, 20 Jul 2011 19:04:32 -0700 Subject: gr: squashed cmakelists.txt into one commit --- gruel/src/lib/CMakeLists.txt | 110 +++++++++++++++++++++++++++++++++++++++ gruel/src/lib/Makefile.am | 2 +- gruel/src/lib/msg/CMakeLists.txt | 28 ++++++++++ gruel/src/lib/pmt/CMakeLists.txt | 90 ++++++++++++++++++++++++++++++++ 4 files changed, 229 insertions(+), 1 deletion(-) create mode 100644 gruel/src/lib/CMakeLists.txt create mode 100644 gruel/src/lib/msg/CMakeLists.txt create mode 100644 gruel/src/lib/pmt/CMakeLists.txt (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/CMakeLists.txt b/gruel/src/lib/CMakeLists.txt new file mode 100644 index 000000000..d078e52f9 --- /dev/null +++ b/gruel/src/lib/CMakeLists.txt @@ -0,0 +1,110 @@ +# Copyright 2010-2011 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GNU Radio is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. + +######################################################################## +# Include subdirs rather to populate to the sources lists. +######################################################################## +INCLUDE(GrMiscUtils) +INCLUDE(CheckCXXSourceCompiles) + +GR_CHECK_HDR_N_DEF(signal.h HAVE_SIGNAL_H) +GR_CHECK_HDR_N_DEF(sched.h HAVE_SCHED_H) + +SET(CMAKE_REQUIRED_LIBRARIES -lpthread) +CHECK_CXX_SOURCE_COMPILES(" + #include + int main(){pthread_sigmask(0, 0, 0); return 0;} + " HAVE_PTHREAD_SIGMASK +) +GR_ADD_COND_DEF(HAVE_PTHREAD_SIGMASK) + +SET(CMAKE_REQUIRED_LIBRARIES -lpthread) +CHECK_CXX_SOURCE_COMPILES(" + #include + int main(){ + pthread_t pthread; + pthread_setschedparam(pthread, 0, 0); + return 0; + } " HAVE_PTHREAD_SETSCHEDPARAM +) +GR_ADD_COND_DEF(HAVE_PTHREAD_SETSCHEDPARAM) + +CHECK_CXX_SOURCE_COMPILES(" + #include + int main(){ + pid_t pid; + sched_setscheduler(pid, 0, 0); + return 0; + } " HAVE_SCHED_SETSCHEDULER +) +GR_ADD_COND_DEF(HAVE_SCHED_SETSCHEDULER) + +######################################################################## +# Include subdirs rather to populate to the sources lists. +######################################################################## +GR_INCLUDE_SUBDIRECTORY(msg) +GR_INCLUDE_SUBDIRECTORY(pmt) + +######################################################################## +# Setup the include and linker paths +######################################################################## +INCLUDE_DIRECTORIES(${GRUEL_INCLUDE_DIRS}) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) + +INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS}) +LINK_DIRECTORIES(${Boost_LIBRARY_DIRS}) + +######################################################################## +# Setup library +######################################################################## +LIST(APPEND gruel_sources + realtime.cc + sys_pri.cc + thread_body_wrapper.cc + thread_group.cc +) + +ADD_LIBRARY(gruel SHARED ${gruel_sources}) +TARGET_LINK_LIBRARIES(gruel ${Boost_LIBRARIES}) +SET_TARGET_PROPERTIES(gruel PROPERTIES DEFINE_SYMBOL "gruel_EXPORTS") +SET_TARGET_PROPERTIES(gruel PROPERTIES SOVERSION ${LIBVER}) + +INSTALL(TARGETS gruel + LIBRARY DESTINATION ${GR_LIBRARY_DIR} COMPONENT "gruel_runtime" # .so/.dylib file + ARCHIVE DESTINATION ${GR_LIBRARY_DIR} COMPONENT "gruel_devel" # .lib file + RUNTIME DESTINATION ${GR_RUNTIME_DIR} COMPONENT "gruel_runtime" # .dll file +) + +######################################################################## +# Setup tests +# Set the test environment so the build libs will be found under MSVC. +######################################################################## +IF(ENABLE_TESTING) + +INCLUDE_DIRECTORIES(${CPPUNIT_INCLUDE_DIRS}) +LINK_DIRECTORIES(${CPPUNIT_LIBRARY_DIRS}) + +INCLUDE(GrTest) +SET(GR_TEST_TARGET_DEPS gruel) +LIST(APPEND test_gruel_sources test_gruel.cc) +ADD_EXECUTABLE(test_gruel ${test_gruel_sources}) +TARGET_LINK_LIBRARIES(test_gruel gruel ${CPPUNIT_LIBRARIES}) +GR_ADD_TEST(gruel-test test_gruel) + +ENDIF(ENABLE_TESTING) diff --git a/gruel/src/lib/Makefile.am b/gruel/src/lib/Makefile.am index 10ec7a44d..773f3aefd 100644 --- a/gruel/src/lib/Makefile.am +++ b/gruel/src/lib/Makefile.am @@ -24,7 +24,7 @@ include $(top_srcdir)/Makefile.common SUBDIRS = pmt msg AM_CPPFLAGS = $(DEFINES) $(GRUEL_INCLUDES) $(BOOST_CPPFLAGS) \ - $(CPPUNIT_INCLUDES) $(WITH_INCLUDES) -Dgruel_EXPORTS + $(CPPUNIT_INCLUDES) $(WITH_INCLUDES) TESTS = test_gruel diff --git a/gruel/src/lib/msg/CMakeLists.txt b/gruel/src/lib/msg/CMakeLists.txt new file mode 100644 index 000000000..877cc2909 --- /dev/null +++ b/gruel/src/lib/msg/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright 2010 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GNU Radio is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. + +######################################################################## +# This file included, use CMake directory variables +######################################################################## + +LIST(APPEND gruel_sources + ${CMAKE_CURRENT_SOURCE_DIR}/msg_accepter.cc + ${CMAKE_CURRENT_SOURCE_DIR}/msg_accepter_msgq.cc + ${CMAKE_CURRENT_SOURCE_DIR}/msg_queue.cc +) diff --git a/gruel/src/lib/pmt/CMakeLists.txt b/gruel/src/lib/pmt/CMakeLists.txt new file mode 100644 index 000000000..797db475a --- /dev/null +++ b/gruel/src/lib/pmt/CMakeLists.txt @@ -0,0 +1,90 @@ +# Copyright 2010 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GNU Radio is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. + +######################################################################## +# This file included, use CMake directory variables +######################################################################## +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) + +######################################################################## +# Generate serial tags header file +######################################################################## +GET_FILENAME_COMPONENT(SCHEME_DIR + ${CMAKE_CURRENT_SOURCE_DIR}/../../scheme/gnuradio ABSOLUTE +) + +GET_FILENAME_COMPONENT(PMT_SERIAL_TAGS_H + ${CMAKE_CURRENT_BINARY_DIR}/../../include/gruel/pmt_serial_tags.h ABSOLUTE +) + +ADD_CUSTOM_COMMAND( + OUTPUT ${PMT_SERIAL_TAGS_H} + DEPENDS ${SCHEME_DIR}/gen-serial-tags.py + DEPENDS ${SCHEME_DIR}/pmt-serial-tags.scm + COMMAND ${PYTHON_EXECUTABLE} + ${SCHEME_DIR}/gen-serial-tags.py + ${SCHEME_DIR}/pmt-serial-tags.scm + ${PMT_SERIAL_TAGS_H} +) + +INSTALL( + FILES ${PMT_SERIAL_TAGS_H} + DESTINATION ${GR_INCLUDE_DIR}/gruel + COMPONENT "gruel_devel" +) + +INCLUDE(AddFileDependencies) +ADD_FILE_DEPENDENCIES( + ${CMAKE_CURRENT_SOURCE_DIR}/pmt_serialize.cc + ${PMT_SERIAL_TAGS_H} +) + +######################################################################## +# Generate other pmt stuff +######################################################################## +ADD_CUSTOM_COMMAND( + OUTPUT + ${CMAKE_CURRENT_BINARY_DIR}/pmt_unv_int.h + ${CMAKE_CURRENT_BINARY_DIR}/qa_pmt_unv.h + ${CMAKE_CURRENT_BINARY_DIR}/pmt_unv.cc + ${CMAKE_CURRENT_BINARY_DIR}/qa_pmt_unv.cc + DEPENDS + ${CMAKE_CURRENT_SOURCE_DIR}/generate_unv.py + ${CMAKE_CURRENT_SOURCE_DIR}/unv_template.h.t + ${CMAKE_CURRENT_SOURCE_DIR}/unv_template.cc.t + ${CMAKE_CURRENT_SOURCE_DIR}/unv_qa_template.cc.t + COMMAND ${PYTHON_EXECUTABLE} -B -c + \"import os,sys\;srcdir='${CMAKE_CURRENT_SOURCE_DIR}'\;sys.path.append(srcdir)\;os.environ['srcdir']=srcdir\;from generate_unv import main\;main()\" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} +) + +LIST(APPEND gruel_sources + ${CMAKE_CURRENT_BINARY_DIR}/pmt_unv.cc + ${CMAKE_CURRENT_SOURCE_DIR}/pmt.cc + ${CMAKE_CURRENT_SOURCE_DIR}/pmt_io.cc + ${CMAKE_CURRENT_SOURCE_DIR}/pmt_pool.cc + ${CMAKE_CURRENT_SOURCE_DIR}/pmt_serialize.cc +) + +LIST(APPEND test_gruel_sources + ${CMAKE_CURRENT_BINARY_DIR}/qa_pmt_unv.cc + ${CMAKE_CURRENT_SOURCE_DIR}/qa_pmt_prims.cc + ${CMAKE_CURRENT_SOURCE_DIR}/qa_pmt.cc +) -- cgit From 71c0f14a46f85027b95f2f5f6d3d219cc9e3783e Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Sat, 8 Oct 2011 17:11:12 -0700 Subject: gr: the CMakeLists.txt took a chill pill --- gruel/src/lib/CMakeLists.txt | 46 ++++++++++++++++++++-------------------- gruel/src/lib/msg/CMakeLists.txt | 2 +- gruel/src/lib/pmt/CMakeLists.txt | 20 ++++++++--------- 3 files changed, 34 insertions(+), 34 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/CMakeLists.txt b/gruel/src/lib/CMakeLists.txt index d078e52f9..b54e644bc 100644 --- a/gruel/src/lib/CMakeLists.txt +++ b/gruel/src/lib/CMakeLists.txt @@ -20,13 +20,13 @@ ######################################################################## # Include subdirs rather to populate to the sources lists. ######################################################################## -INCLUDE(GrMiscUtils) -INCLUDE(CheckCXXSourceCompiles) +include(GrMiscUtils) +include(CheckCXXSourceCompiles) GR_CHECK_HDR_N_DEF(signal.h HAVE_SIGNAL_H) GR_CHECK_HDR_N_DEF(sched.h HAVE_SCHED_H) -SET(CMAKE_REQUIRED_LIBRARIES -lpthread) +set(CMAKE_REQUIRED_LIBRARIES -lpthread) CHECK_CXX_SOURCE_COMPILES(" #include int main(){pthread_sigmask(0, 0, 0); return 0;} @@ -34,7 +34,7 @@ CHECK_CXX_SOURCE_COMPILES(" ) GR_ADD_COND_DEF(HAVE_PTHREAD_SIGMASK) -SET(CMAKE_REQUIRED_LIBRARIES -lpthread) +set(CMAKE_REQUIRED_LIBRARIES -lpthread) CHECK_CXX_SOURCE_COMPILES(" #include int main(){ @@ -64,28 +64,28 @@ GR_INCLUDE_SUBDIRECTORY(pmt) ######################################################################## # Setup the include and linker paths ######################################################################## -INCLUDE_DIRECTORIES(${GRUEL_INCLUDE_DIRS}) -INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) +include_directories(${GRUEL_INCLUDE_DIRS}) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) -INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS}) -LINK_DIRECTORIES(${Boost_LIBRARY_DIRS}) +include_directories(${Boost_INCLUDE_DIRS}) +link_directories(${Boost_LIBRARY_DIRS}) ######################################################################## # Setup library ######################################################################## -LIST(APPEND gruel_sources +list(APPEND gruel_sources realtime.cc sys_pri.cc thread_body_wrapper.cc thread_group.cc ) -ADD_LIBRARY(gruel SHARED ${gruel_sources}) -TARGET_LINK_LIBRARIES(gruel ${Boost_LIBRARIES}) -SET_TARGET_PROPERTIES(gruel PROPERTIES DEFINE_SYMBOL "gruel_EXPORTS") -SET_TARGET_PROPERTIES(gruel PROPERTIES SOVERSION ${LIBVER}) +add_library(gruel SHARED ${gruel_sources}) +target_link_libraries(gruel ${Boost_LIBRARIES}) +set_target_properties(gruel PROPERTIES DEFINE_SYMBOL "gruel_EXPORTS") +set_target_properties(gruel PROPERTIES SOVERSION ${LIBVER}) -INSTALL(TARGETS gruel +install(TARGETS gruel LIBRARY DESTINATION ${GR_LIBRARY_DIR} COMPONENT "gruel_runtime" # .so/.dylib file ARCHIVE DESTINATION ${GR_LIBRARY_DIR} COMPONENT "gruel_devel" # .lib file RUNTIME DESTINATION ${GR_RUNTIME_DIR} COMPONENT "gruel_runtime" # .dll file @@ -95,16 +95,16 @@ INSTALL(TARGETS gruel # Setup tests # Set the test environment so the build libs will be found under MSVC. ######################################################################## -IF(ENABLE_TESTING) +if(ENABLE_TESTING) -INCLUDE_DIRECTORIES(${CPPUNIT_INCLUDE_DIRS}) -LINK_DIRECTORIES(${CPPUNIT_LIBRARY_DIRS}) +include_directories(${CPPUNIT_INCLUDE_DIRS}) +link_directories(${CPPUNIT_LIBRARY_DIRS}) -INCLUDE(GrTest) -SET(GR_TEST_TARGET_DEPS gruel) -LIST(APPEND test_gruel_sources test_gruel.cc) -ADD_EXECUTABLE(test_gruel ${test_gruel_sources}) -TARGET_LINK_LIBRARIES(test_gruel gruel ${CPPUNIT_LIBRARIES}) +include(GrTest) +set(GR_TEST_TARGET_DEPS gruel) +list(APPEND test_gruel_sources test_gruel.cc) +add_executable(test_gruel ${test_gruel_sources}) +target_link_libraries(test_gruel gruel ${CPPUNIT_LIBRARIES}) GR_ADD_TEST(gruel-test test_gruel) -ENDIF(ENABLE_TESTING) +endif(ENABLE_TESTING) diff --git a/gruel/src/lib/msg/CMakeLists.txt b/gruel/src/lib/msg/CMakeLists.txt index 877cc2909..116d2c67f 100644 --- a/gruel/src/lib/msg/CMakeLists.txt +++ b/gruel/src/lib/msg/CMakeLists.txt @@ -21,7 +21,7 @@ # This file included, use CMake directory variables ######################################################################## -LIST(APPEND gruel_sources +list(APPEND gruel_sources ${CMAKE_CURRENT_SOURCE_DIR}/msg_accepter.cc ${CMAKE_CURRENT_SOURCE_DIR}/msg_accepter_msgq.cc ${CMAKE_CURRENT_SOURCE_DIR}/msg_queue.cc diff --git a/gruel/src/lib/pmt/CMakeLists.txt b/gruel/src/lib/pmt/CMakeLists.txt index 797db475a..a708fa7ad 100644 --- a/gruel/src/lib/pmt/CMakeLists.txt +++ b/gruel/src/lib/pmt/CMakeLists.txt @@ -20,21 +20,21 @@ ######################################################################## # This file included, use CMake directory variables ######################################################################## -INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) -INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +include_directories(${CMAKE_CURRENT_BINARY_DIR}) ######################################################################## # Generate serial tags header file ######################################################################## -GET_FILENAME_COMPONENT(SCHEME_DIR +get_filename_component(SCHEME_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../scheme/gnuradio ABSOLUTE ) -GET_FILENAME_COMPONENT(PMT_SERIAL_TAGS_H +get_filename_component(PMT_SERIAL_TAGS_H ${CMAKE_CURRENT_BINARY_DIR}/../../include/gruel/pmt_serial_tags.h ABSOLUTE ) -ADD_CUSTOM_COMMAND( +add_custom_command( OUTPUT ${PMT_SERIAL_TAGS_H} DEPENDS ${SCHEME_DIR}/gen-serial-tags.py DEPENDS ${SCHEME_DIR}/pmt-serial-tags.scm @@ -44,13 +44,13 @@ ADD_CUSTOM_COMMAND( ${PMT_SERIAL_TAGS_H} ) -INSTALL( +install( FILES ${PMT_SERIAL_TAGS_H} DESTINATION ${GR_INCLUDE_DIR}/gruel COMPONENT "gruel_devel" ) -INCLUDE(AddFileDependencies) +include(AddFileDependencies) ADD_FILE_DEPENDENCIES( ${CMAKE_CURRENT_SOURCE_DIR}/pmt_serialize.cc ${PMT_SERIAL_TAGS_H} @@ -59,7 +59,7 @@ ADD_FILE_DEPENDENCIES( ######################################################################## # Generate other pmt stuff ######################################################################## -ADD_CUSTOM_COMMAND( +add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pmt_unv_int.h ${CMAKE_CURRENT_BINARY_DIR}/qa_pmt_unv.h @@ -75,7 +75,7 @@ ADD_CUSTOM_COMMAND( WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) -LIST(APPEND gruel_sources +list(APPEND gruel_sources ${CMAKE_CURRENT_BINARY_DIR}/pmt_unv.cc ${CMAKE_CURRENT_SOURCE_DIR}/pmt.cc ${CMAKE_CURRENT_SOURCE_DIR}/pmt_io.cc @@ -83,7 +83,7 @@ LIST(APPEND gruel_sources ${CMAKE_CURRENT_SOURCE_DIR}/pmt_serialize.cc ) -LIST(APPEND test_gruel_sources +list(APPEND test_gruel_sources ${CMAKE_CURRENT_BINARY_DIR}/qa_pmt_unv.cc ${CMAKE_CURRENT_SOURCE_DIR}/qa_pmt_prims.cc ${CMAKE_CURRENT_SOURCE_DIR}/qa_pmt.cc -- cgit From faf7dea043728056bed5a7eb0529162eb7d9f932 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Sun, 23 Oct 2011 15:43:03 -0700 Subject: the libraries --- gruel/src/lib/CMakeLists.txt | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/CMakeLists.txt b/gruel/src/lib/CMakeLists.txt index b54e644bc..a6aa1d992 100644 --- a/gruel/src/lib/CMakeLists.txt +++ b/gruel/src/lib/CMakeLists.txt @@ -82,14 +82,7 @@ list(APPEND gruel_sources add_library(gruel SHARED ${gruel_sources}) target_link_libraries(gruel ${Boost_LIBRARIES}) -set_target_properties(gruel PROPERTIES DEFINE_SYMBOL "gruel_EXPORTS") -set_target_properties(gruel PROPERTIES SOVERSION ${LIBVER}) - -install(TARGETS gruel - LIBRARY DESTINATION ${GR_LIBRARY_DIR} COMPONENT "gruel_runtime" # .so/.dylib file - ARCHIVE DESTINATION ${GR_LIBRARY_DIR} COMPONENT "gruel_devel" # .lib file - RUNTIME DESTINATION ${GR_RUNTIME_DIR} COMPONENT "gruel_runtime" # .dll file -) +GR_LIBRARY_FOO(gruel RUNTIME_COMPONENT "gruel_runtime" DEVEL_COMPONENT "gruel_devel") ######################################################################## # Setup tests -- cgit From 00420d32081d8252bb37142b2be19a8a7c4dc4c4 Mon Sep 17 00:00:00 2001 From: Johnathan Corgan Date: Thu, 8 Dec 2011 13:48:48 -0800 Subject: Removed autotools, gr-waveform, some cleanup Nick Foster owes Nick Corgan a six-pack of beer! --- gruel/src/lib/.gitignore | 5 -- gruel/src/lib/Makefile.am | 68 --------------------------- gruel/src/lib/msg/.gitignore | 4 -- gruel/src/lib/msg/Makefile.am | 33 ------------- gruel/src/lib/pmt/.gitignore | 10 ---- gruel/src/lib/pmt/Makefile.am | 105 ------------------------------------------ 6 files changed, 225 deletions(-) delete mode 100644 gruel/src/lib/.gitignore delete mode 100644 gruel/src/lib/Makefile.am delete mode 100644 gruel/src/lib/msg/.gitignore delete mode 100644 gruel/src/lib/msg/Makefile.am delete mode 100644 gruel/src/lib/pmt/.gitignore delete mode 100644 gruel/src/lib/pmt/Makefile.am (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/.gitignore b/gruel/src/lib/.gitignore deleted file mode 100644 index 165e179d6..000000000 --- a/gruel/src/lib/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -/Makefile -/Makefile.in -/.libs -/.deps -test_gruel diff --git a/gruel/src/lib/Makefile.am b/gruel/src/lib/Makefile.am deleted file mode 100644 index 773f3aefd..000000000 --- a/gruel/src/lib/Makefile.am +++ /dev/null @@ -1,68 +0,0 @@ -# -# Copyright 2008,2009,2010,2011 Free Software Foundation, Inc. -# -# This file is part of GNU Radio -# -# GNU Radio is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3, or (at your option) -# any later version. -# -# GNU Radio is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Radio; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, -# Boston, MA 02110-1301, USA. -# - -include $(top_srcdir)/Makefile.common - -SUBDIRS = pmt msg - -AM_CPPFLAGS = $(DEFINES) $(GRUEL_INCLUDES) $(BOOST_CPPFLAGS) \ - $(CPPUNIT_INCLUDES) $(WITH_INCLUDES) - -TESTS = test_gruel - -noinst_PROGRAMS = test_gruel - - -lib_LTLIBRARIES = libgruel.la - -# magic flags -libgruel_la_LDFLAGS = $(NO_UNDEFINED) $(BOOST_LDFLAGS) $(LTVERSIONFLAGS) - -# ---------------------------------------------------------------- - -PMT_LIB = pmt/libpmt.la -MSG_LIB = msg/libmsg.la - -# These are the source files that go into the gruel shared library -libgruel_la_SOURCES = \ - realtime.cc \ - sys_pri.cc \ - thread_body_wrapper.cc \ - thread_group.cc - -libgruel_la_LIBADD = \ - $(BOOST_THREAD_LIB) \ - $(BOOST_SYSTEM_LIB) \ - $(BOOST_FILESYSTEM_LIB) \ - $(PMT_LIB) \ - $(MSG_LIB) \ - -lstdc++ - - -# ---------------------------------------------------------------- - -test_gruel_SOURCES = test_gruel.cc -test_gruel_LDADD = \ - $(BOOST_THREAD_LIB) \ - $(BOOST_SYSTEM_LIB) \ - $(BOOST_FILESYSTEM_LIB) \ - pmt/libpmt-qa.la libgruel.la - diff --git a/gruel/src/lib/msg/.gitignore b/gruel/src/lib/msg/.gitignore deleted file mode 100644 index c026fd667..000000000 --- a/gruel/src/lib/msg/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/Makefile -/Makefile.in -/.deps -/.libs diff --git a/gruel/src/lib/msg/Makefile.am b/gruel/src/lib/msg/Makefile.am deleted file mode 100644 index 9dbaf10f5..000000000 --- a/gruel/src/lib/msg/Makefile.am +++ /dev/null @@ -1,33 +0,0 @@ -# -# Copyright 2009,2010 Free Software Foundation, Inc. -# -# This file is part of GNU Radio -# -# GNU Radio is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3, or (at your option) -# any later version. -# -# GNU Radio is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Radio; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, -# Boston, MA 02110-1301, USA. -# - -include $(top_srcdir)/Makefile.common - -AM_CPPFLAGS = $(DEFINES) $(GRUEL_INCLUDES) \ - $(BOOST_CPPFLAGS) $(WITH_INCLUDES) - -noinst_LTLIBRARIES = libmsg.la - -libmsg_la_SOURCES = \ - msg_accepter.cc \ - msg_accepter_msgq.cc \ - msg_queue.cc - diff --git a/gruel/src/lib/pmt/.gitignore b/gruel/src/lib/pmt/.gitignore deleted file mode 100644 index 035c0316b..000000000 --- a/gruel/src/lib/pmt/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -/Makefile -/Makefile.in -/.libs -/.deps -/test_pmt -/qa_pmt_unv.cc -/qa_pmt_unv.h -/pmt_unv_int.h -/pmt_unv.cc -/stamp-sources-generate diff --git a/gruel/src/lib/pmt/Makefile.am b/gruel/src/lib/pmt/Makefile.am deleted file mode 100644 index 0c8e12dc3..000000000 --- a/gruel/src/lib/pmt/Makefile.am +++ /dev/null @@ -1,105 +0,0 @@ -# -# Copyright 2008,2009,2010,2011 Free Software Foundation, Inc. -# -# This file is part of GNU Radio -# -# GNU Radio is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3, or (at your option) -# any later version. -# -# GNU Radio is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Radio; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, -# Boston, MA 02110-1301, USA. -# - -include $(top_srcdir)/Makefile.common - -AM_CPPFLAGS = $(DEFINES) $(GRUEL_INCLUDES) $(BOOST_CPPFLAGS) \ - $(CPPUNIT_INCLUDES) $(WITH_INCLUDES) - -noinst_LTLIBRARIES = libpmt.la - -# ---------------------------------------------------------------- -# these scripts generate code - -code_generator = \ - generate_unv.py \ - unv_template.h.t \ - unv_template.cc.t \ - unv_qa_template.cc.t - -GENERATED_H = \ - pmt_unv_int.h \ - qa_pmt_unv.h - -GENERATED_CC = \ - pmt_unv.cc \ - qa_pmt_unv.cc - -python_built_sources = $(GENERATED_H) $(GENERATED_CC) - -PMT_SERIAL_TAGS_H = $(abs_top_builddir)/gruel/src/include/gruel/pmt_serial_tags.h -BUILT_SOURCES = $(python_built_sources) $(PMT_SERIAL_TAGS_H) - -EXTRA_DIST += $(code_generator) - -# ---------------------------------------------------------------- - -libpmt_la_SOURCES = \ - pmt.cc \ - pmt_io.cc \ - pmt_pool.cc \ - pmt_serialize.cc \ - pmt_unv.cc - -libpmt_la_LIBADD = \ - $(BOOST_THREAD_LIB) \ - -lstdc++ - -libpmt_la_LDFLAGS = \ - $(BOOST_LDFLAGS) - -noinst_HEADERS = \ - $(GENERATED_H) \ - pmt_int.h \ - qa_pmt.h \ - qa_pmt_prims.h - -# Build the qa code into its own library - -noinst_LTLIBRARIES += libpmt-qa.la - -libpmt_qa_la_SOURCES = \ - qa_pmt.cc \ - qa_pmt_prims.cc \ - qa_pmt_unv.cc - -# magic flags -libpmt_qa_la_LDFLAGS = $(NO_UNDEFINED) -avoid version - -libpmt_qa_la_LIBADD = \ - libpmt.la \ - $(CPPUNIT_LIBS) \ - -lstdc++ - - -# Do creation and inclusion of other Makefiles last - -# common way for generating sources from templates when using -# BUILT_SOURCES, using parallel build protection. -gen_sources = $(python_built_sources) -gen_sources_deps = $(core_generator) -par_gen_command = PYTHONPATH=$(top_srcdir)/gruel/src/lib/pmt srcdir=$(srcdir) $(PYTHON) $(srcdir)/generate_unv.py -include $(top_srcdir)/Makefile.par.gen - -# Rule to create the build header file using python -# Doesn't need parallel protections because there is a single target -$(PMT_SERIAL_TAGS_H): $(top_srcdir)/gruel/src/scheme/gnuradio/gen-serial-tags.py $(top_srcdir)/gruel/src/scheme/gnuradio/pmt-serial-tags.scm - $(PYTHON) $^ $@ -- cgit From 2bf64459036916258dcf3269cec47904fdeba8f6 Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Sun, 1 Apr 2012 16:13:42 -0400 Subject: Removes all references to guile and scheme, which are no longer needed. The remaining pmt_serial_tags.scm is parsed by Python already. Future modifications could change this format to not confuse the point. --- gruel/src/lib/pmt/CMakeLists.txt | 11 ++--- gruel/src/lib/pmt/gen-serial-tags.py | 53 +++++++++++++++++++++++++ gruel/src/lib/pmt/pmt-serial-tags.scm | 75 +++++++++++++++++++++++++++++++++++ 3 files changed, 132 insertions(+), 7 deletions(-) create mode 100644 gruel/src/lib/pmt/gen-serial-tags.py create mode 100644 gruel/src/lib/pmt/pmt-serial-tags.scm (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/CMakeLists.txt b/gruel/src/lib/pmt/CMakeLists.txt index a708fa7ad..a8e15cac6 100644 --- a/gruel/src/lib/pmt/CMakeLists.txt +++ b/gruel/src/lib/pmt/CMakeLists.txt @@ -26,9 +26,6 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR}) ######################################################################## # Generate serial tags header file ######################################################################## -get_filename_component(SCHEME_DIR - ${CMAKE_CURRENT_SOURCE_DIR}/../../scheme/gnuradio ABSOLUTE -) get_filename_component(PMT_SERIAL_TAGS_H ${CMAKE_CURRENT_BINARY_DIR}/../../include/gruel/pmt_serial_tags.h ABSOLUTE @@ -36,11 +33,11 @@ get_filename_component(PMT_SERIAL_TAGS_H add_custom_command( OUTPUT ${PMT_SERIAL_TAGS_H} - DEPENDS ${SCHEME_DIR}/gen-serial-tags.py - DEPENDS ${SCHEME_DIR}/pmt-serial-tags.scm + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/gen-serial-tags.py + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/pmt-serial-tags.scm COMMAND ${PYTHON_EXECUTABLE} - ${SCHEME_DIR}/gen-serial-tags.py - ${SCHEME_DIR}/pmt-serial-tags.scm + ${CMAKE_CURRENT_SOURCE_DIR}/gen-serial-tags.py + ${CMAKE_CURRENT_SOURCE_DIR}/pmt-serial-tags.scm ${PMT_SERIAL_TAGS_H} ) diff --git a/gruel/src/lib/pmt/gen-serial-tags.py b/gruel/src/lib/pmt/gen-serial-tags.py new file mode 100644 index 000000000..18e927beb --- /dev/null +++ b/gruel/src/lib/pmt/gen-serial-tags.py @@ -0,0 +1,53 @@ +""" +// +// Copyright 2011 Free Software Foundation, Inc. +// +// This file is part of GNU Radio +// +// GNU Radio is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// GNU Radio is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +// +// +// THIS FILE IS MACHINE GENERATED FROM %s. DO NOT EDIT BY HAND. +// See %s for additional commentary. +// + +#ifndef INCLUDED_PMT_SERIAL_TAGS_H +#define INCLUDED_PMT_SERIAL_TAGS_H + +enum pst_tags { +%s +}; +#endif /* INCLUDED_PMT_SERIAL_TAGS_H */ +""" + +import sys, os, re + +if __name__ == '__main__': + if len(sys.argv) != 3: + print "Usage %s "%__file__ + exit() + input_scm_file, output_hdr_file = sys.argv[1:] + enums = list() + for line in open(input_scm_file).readlines(): + match = re.match('^\s*\(define\s+([\w|-]+)\s+#x([0-9a-fA-F]+)\)', line) + if not match: continue + name, value = match.groups() + name = name.upper().replace('-', '_') + enums.append(' %s = 0x%s'%(name, value)) + open(output_hdr_file, 'w').write(__doc__%( + os.path.basename(__file__), + os.path.basename(input_scm_file), + ',\n'.join(enums), + )) diff --git a/gruel/src/lib/pmt/pmt-serial-tags.scm b/gruel/src/lib/pmt/pmt-serial-tags.scm new file mode 100644 index 000000000..646a751ea --- /dev/null +++ b/gruel/src/lib/pmt/pmt-serial-tags.scm @@ -0,0 +1,75 @@ +;;; -*-scheme-*- +;;; +;;; Copyright 2007 Free Software Foundation, Inc. +;;; +;;; This file is part of GNU Radio +;;; +;;; GNU Radio is free software; you can redistribute it and/or modify +;;; it under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3, or (define at your option) +;;; any later version. +;;; +;;; GNU Radio is distributed in the hope that it will be useful, +;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License along +;;; with this program; if not, write to the Free Software Foundation, Inc., +;;; 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +;;; + +;;; definitions of tag values used for marshalling pmt data + +(define pst-true #x00) +(define pst-false #x01) +(define pst-symbol #x02) ; untagged-int16 n; followed by n bytes of symbol name +(define pst-int32 #x03) +(define pst-double #x04) +(define pst-complex #x05) ; complex: real, imag +(define pst-null #x06) +(define pst-pair #x07) ; followed by two objects +(define pst-vector #x08) ; untagged-int32 n; followed by n objects +(define pst-dict #x09) ; untagged-int32 n; followed by n key/value tuples + +(define pst-uniform-vector #x0a) + +;; u8, s8, u16, s16, u32, s32, u64, s64, f32, f64, c32, c64 +;; +;; untagged-uint8 tag +;; untagged-uint8 uvi (define uniform vector info, see below) +;; untagged-int32 n-items +;; untagged-uint8 npad +;; npad bytes of zeros to align binary data +;; n-items binary numeric items +;; +;; uvi: +;; +-+-+-+-+-+-+-+-+ +;; |B| subtype | +;; +-+-+-+-+-+-+-+-+ +;; +;; B == 0, numeric data is little-endian. +;; B == 1, numeric data is big-endian. + + (define uvi-endian-mask #x80) + (define uvi-subtype-mask #x7f) + + (define uvi-little-endian #x00) + (define uvi-big-endian #x80) + + (define uvi-u8 #x00) + (define uvi-s8 #x01) + (define uvi-u16 #x02) + (define uvi-s16 #x03) + (define uvi-u32 #x04) + (define uvi-s32 #x05) + (define uvi-u64 #x06) + (define uvi-s64 #x07) + (define uvi-f32 #x08) + (define uvi-f64 #x09) + (define uvi-c32 #x0a) + (define uvi-c64 #x0b) + + +(define pst-comment #x3b) ; ascii ';' +(define pst-comment-end #x0a) ; ascii '\n' -- cgit From 6cf6dc9c76bbacbecdb808c451ede9031668b34c Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Tue, 3 Apr 2012 14:50:06 -0700 Subject: pmt: added advanded pmt_set_deleter (c++ only) --- gruel/src/lib/pmt/pmt.cc | 14 +++++++++++++- gruel/src/lib/pmt/pmt_int.h | 9 ++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/pmt.cc b/gruel/src/lib/pmt/pmt.cc index f9cf6b4bf..57b66b1a4 100644 --- a/gruel/src/lib/pmt/pmt.cc +++ b/gruel/src/lib/pmt/pmt.cc @@ -58,7 +58,7 @@ pmt_base::operator delete(void *p, size_t size) #endif void intrusive_ptr_add_ref(pmt_base* p) { ++(p->count_); } -void intrusive_ptr_release(pmt_base* p) { if (--(p->count_) == 0 ) delete p; } +void intrusive_ptr_release(pmt_base* p) { if (--(p->count_) == 0 ) p->deleter_(p); } pmt_base::~pmt_base() { @@ -1383,4 +1383,16 @@ pmt_dump_sizeof() printf("sizeof(pmt_uniform_vector) = %3zd\n", sizeof(pmt_uniform_vector)); } +/* + * ------------------------------------------------------------------------ + * advanced + * ------------------------------------------------------------------------ + */ + +void +pmt_set_deleter(pmt_t obj, boost::function &deleter) +{ + obj->deleter_ = (deleter)? deleter : &pmt_base::default_deleter; +} + } /* namespace pmt */ diff --git a/gruel/src/lib/pmt/pmt_int.h b/gruel/src/lib/pmt/pmt_int.h index 3a5cd382b..745dbc666 100644 --- a/gruel/src/lib/pmt/pmt_int.h +++ b/gruel/src/lib/pmt/pmt_int.h @@ -38,8 +38,15 @@ namespace pmt { class GRUEL_API pmt_base : boost::noncopyable { mutable boost::detail::atomic_count count_; +public: + static void default_deleter(pmt_base *p){ + delete p; + } + + boost::function deleter_; + protected: - pmt_base() : count_(0) {}; + pmt_base() : count_(0), deleter_(&pmt::pmt_base::default_deleter) {}; virtual ~pmt_base(); public: -- cgit From f919f9dcbb54a08e6e26d6c229ce92fb784fa1b2 Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Fri, 13 Apr 2012 18:36:53 -0400 Subject: Removed whitespace and added dtools/bin/remove-whitespace as a tool to do this in the future. The sed script was provided by Moritz Fischer. --- gruel/src/lib/CMakeLists.txt | 8 ++++---- gruel/src/lib/msg/CMakeLists.txt | 8 ++++---- gruel/src/lib/msg/msg_accepter.cc | 8 ++++---- gruel/src/lib/msg/msg_accepter_msgq.cc | 8 ++++---- gruel/src/lib/msg/msg_queue.cc | 14 +++++++------- gruel/src/lib/pmt/CMakeLists.txt | 8 ++++---- gruel/src/lib/pmt/generate_unv.py | 24 ++++++++++++------------ gruel/src/lib/pmt/pmt-serial-tags.scm | 8 ++++---- gruel/src/lib/pmt/pmt.cc | 30 +++++++++++++++--------------- gruel/src/lib/pmt/pmt_int.h | 10 +++++----- gruel/src/lib/pmt/pmt_io.cc | 14 +++++++------- gruel/src/lib/pmt/pmt_pool.cc | 8 ++++---- gruel/src/lib/pmt/pmt_serialize.cc | 22 +++++++++++----------- gruel/src/lib/pmt/qa_pmt.cc | 10 +++++----- gruel/src/lib/pmt/qa_pmt.h | 8 ++++---- gruel/src/lib/pmt/qa_pmt_prims.cc | 18 +++++++++--------- gruel/src/lib/pmt/qa_pmt_prims.h | 8 ++++---- gruel/src/lib/pmt/unv_template.cc.t | 2 +- gruel/src/lib/realtime.cc | 12 ++++++------ gruel/src/lib/sys_pri.cc | 8 ++++---- gruel/src/lib/test_gruel.cc | 12 ++++++------ gruel/src/lib/thread_body_wrapper.cc | 10 +++++----- gruel/src/lib/thread_group.cc | 2 +- 23 files changed, 130 insertions(+), 130 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/CMakeLists.txt b/gruel/src/lib/CMakeLists.txt index a6aa1d992..cd7b7abf4 100644 --- a/gruel/src/lib/CMakeLists.txt +++ b/gruel/src/lib/CMakeLists.txt @@ -1,17 +1,17 @@ # Copyright 2010-2011 Free Software Foundation, Inc. -# +# # This file is part of GNU Radio -# +# # GNU Radio is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. -# +# # GNU Radio is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -# +# # You should have received a copy of the GNU General Public License # along with GNU Radio; see the file COPYING. If not, write to # the Free Software Foundation, Inc., 51 Franklin Street, diff --git a/gruel/src/lib/msg/CMakeLists.txt b/gruel/src/lib/msg/CMakeLists.txt index 116d2c67f..74010af7e 100644 --- a/gruel/src/lib/msg/CMakeLists.txt +++ b/gruel/src/lib/msg/CMakeLists.txt @@ -1,17 +1,17 @@ # Copyright 2010 Free Software Foundation, Inc. -# +# # This file is part of GNU Radio -# +# # GNU Radio is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. -# +# # GNU Radio is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -# +# # You should have received a copy of the GNU General Public License # along with GNU Radio; see the file COPYING. If not, write to # the Free Software Foundation, Inc., 51 Franklin Street, diff --git a/gruel/src/lib/msg/msg_accepter.cc b/gruel/src/lib/msg/msg_accepter.cc index 64878f737..5acd98aa2 100644 --- a/gruel/src/lib/msg/msg_accepter.cc +++ b/gruel/src/lib/msg/msg_accepter.cc @@ -1,19 +1,19 @@ /* -*- c++ -*- */ /* * Copyright 2009 Free Software Foundation, Inc. - * + * * This file is part of GNU Radio - * + * * GNU Radio is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * GNU Radio is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with GNU Radio; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, diff --git a/gruel/src/lib/msg/msg_accepter_msgq.cc b/gruel/src/lib/msg/msg_accepter_msgq.cc index 64fe501d1..2ae3537b8 100644 --- a/gruel/src/lib/msg/msg_accepter_msgq.cc +++ b/gruel/src/lib/msg/msg_accepter_msgq.cc @@ -1,19 +1,19 @@ /* -*- c++ -*- */ /* * Copyright 2009 Free Software Foundation, Inc. - * + * * This file is part of GNU Radio - * + * * GNU Radio is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * GNU Radio is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. diff --git a/gruel/src/lib/msg/msg_queue.cc b/gruel/src/lib/msg/msg_queue.cc index 8d15f08c5..a0b120e40 100644 --- a/gruel/src/lib/msg/msg_queue.cc +++ b/gruel/src/lib/msg/msg_queue.cc @@ -1,19 +1,19 @@ /* -*- c++ -*- */ /* * Copyright 2009 Free Software Foundation, Inc. - * + * * This file is part of GNU Radio - * + * * GNU Radio is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * GNU Radio is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with GNU Radio; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -36,12 +36,12 @@ namespace gruel { { return msg_queue_sptr(new msg_queue(limit)); } - + msg_queue::msg_queue(unsigned int limit) : d_limit(limit) { } - + msg_queue::~msg_queue() { flush(); @@ -83,7 +83,7 @@ namespace gruel { if (empty_p()) return pmt_t(); - + pmt_t m(d_msgs.front()); d_msgs.pop_front(); diff --git a/gruel/src/lib/pmt/CMakeLists.txt b/gruel/src/lib/pmt/CMakeLists.txt index a8e15cac6..dc70f03d7 100644 --- a/gruel/src/lib/pmt/CMakeLists.txt +++ b/gruel/src/lib/pmt/CMakeLists.txt @@ -1,17 +1,17 @@ # Copyright 2010 Free Software Foundation, Inc. -# +# # This file is part of GNU Radio -# +# # GNU Radio is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. -# +# # GNU Radio is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -# +# # You should have received a copy of the GNU General Public License # along with GNU Radio; see the file COPYING. If not, write to # the Free Software Foundation, Inc., 51 Franklin Street, diff --git a/gruel/src/lib/pmt/generate_unv.py b/gruel/src/lib/pmt/generate_unv.py index 02aace250..42b57e245 100755 --- a/gruel/src/lib/pmt/generate_unv.py +++ b/gruel/src/lib/pmt/generate_unv.py @@ -1,24 +1,24 @@ #!/usr/bin/env python # # Copyright 2006,2009 Free Software Foundation, Inc. -# +# # This file is part of GNU Radio -# +# # GNU Radio is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. -# +# # GNU Radio is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -# +# # You should have received a copy of the GNU General Public License # along with GNU Radio; see the file COPYING. If not, write to # the Free Software Foundation, Inc., 51 Franklin Street, # Boston, MA 02110-1301, USA. -# +# """ Generate code for uniform numeric vectors @@ -46,19 +46,19 @@ header = """\ /* -*- c++ -*- */ /* * Copyright 2006,2009 Free Software Foundation, Inc. - * + * * This file is part of GNU Radio - * + * * GNU Radio is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * GNU Radio is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with GNU Radio; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -118,7 +118,7 @@ def do_substitution (d, input, out_file): key = match_obj.group (1) # print key return d[key] - + out = re.sub (r"@([a-zA-Z0-9_]+)@", repl, input) out_file.write (out) @@ -164,7 +164,7 @@ class qa_pmt_unv : public CppUnit::TestCase { CPPUNIT_TEST_SUITE_END(); private: -''') +''') for tag, typ in unv_types: output.write(' void test_%svector();\n' % (tag,)) output.write('};\n') @@ -178,7 +178,7 @@ def generate_qa_cc(): for tag, typ in unv_types: d = { 'TAG' : tag, 'TYPE' : typ } do_substitution(d, template, output) - + def main(): generate_h() diff --git a/gruel/src/lib/pmt/pmt-serial-tags.scm b/gruel/src/lib/pmt/pmt-serial-tags.scm index 646a751ea..ca25a43a8 100644 --- a/gruel/src/lib/pmt/pmt-serial-tags.scm +++ b/gruel/src/lib/pmt/pmt-serial-tags.scm @@ -1,19 +1,19 @@ ;;; -*-scheme-*- ;;; ;;; Copyright 2007 Free Software Foundation, Inc. -;;; +;;; ;;; This file is part of GNU Radio -;;; +;;; ;;; GNU Radio is free software; you can redistribute it and/or modify ;;; it under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 3, or (define at your option) ;;; any later version. -;;; +;;; ;;; GNU Radio is distributed in the hope that it will be useful, ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. -;;; +;;; ;;; You should have received a copy of the GNU General Public License along ;;; with this program; if not, write to the Free Software Foundation, Inc., ;;; 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. diff --git a/gruel/src/lib/pmt/pmt.cc b/gruel/src/lib/pmt/pmt.cc index 57b66b1a4..a7e0fd19f 100644 --- a/gruel/src/lib/pmt/pmt.cc +++ b/gruel/src/lib/pmt/pmt.cc @@ -1,19 +1,19 @@ /* -*- c++ -*- */ /* * Copyright 2006,2009,2010 Free Software Foundation, Inc. - * + * * This file is part of GNU Radio - * + * * GNU Radio is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * GNU Radio is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with GNU Radio; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -229,13 +229,13 @@ hash_string(const std::string &s) return h; } -bool +bool pmt_is_symbol(const pmt_t& obj) { return obj->is_symbol(); } -pmt_t +pmt_t pmt_string_to_symbol(const std::string &name) { unsigned hash = hash_string(name) % SYMBOL_HASH_TABLE_SIZE; @@ -350,7 +350,7 @@ pmt_to_uint64(pmt_t x) pmt_real::pmt_real(double value) : d_value(value) {} -bool +bool pmt_is_real(pmt_t x) { return x->is_real(); @@ -379,7 +379,7 @@ pmt_to_double(pmt_t x) pmt_complex::pmt_complex(std::complex value) : d_value(value) {} -bool +bool pmt_is_complex(pmt_t x) { return x->is_complex(); @@ -435,7 +435,7 @@ pmt_car(const pmt_t& pair) pmt_pair* p = dynamic_cast(pair.get()); if ( p ) return p->car(); - + throw pmt_wrong_type("pmt_car", pair); } @@ -445,7 +445,7 @@ pmt_cdr(const pmt_t& pair) pmt_pair* p = dynamic_cast(pair.get()); if ( p ) return p->cdr(); - + throw pmt_wrong_type("pmt_cdr", pair); } @@ -766,7 +766,7 @@ pmt_uniform_vector_writable_elements(pmt_t vector, size_t &len) * This is an a-list implementation. * * When we need better performance for large dictionaries, consider implementing - * persistent Red-Black trees as described in "Purely Functional Data Structures", + * persistent Red-Black trees as described in "Purely Functional Data Structures", * Chris Okasaki, 1998, section 3.3. */ @@ -802,7 +802,7 @@ pmt_dict_delete(const pmt_t &dict, const pmt_t &key) if (pmt_eqv(pmt_caar(dict), key)) return pmt_cdr(dict); - + return pmt_cons(pmt_car(dict), pmt_dict_delete(pmt_cdr(dict), key)); } @@ -887,7 +887,7 @@ pmt_any_set(pmt_t obj, const boost::any &any) // msg_accepter -- built from "any" //////////////////////////////////////////////////////////////////////////// -bool +bool pmt_is_msg_accepter(const pmt_t &obj) { if (!pmt_is_any(obj)) @@ -1222,7 +1222,7 @@ pmt_nthcdr(size_t n, pmt_t list) { if (!(pmt_is_pair(list) || pmt_is_null(list))) throw pmt_wrong_type("pmt_nthcdr", list); - + while (n > 0){ if (pmt_is_pair(list)){ list = pmt_cdr(list); @@ -1359,7 +1359,7 @@ pmt_cadddr(pmt_t pair) { return pmt_car(pmt_cdr(pmt_cdr(pmt_cdr(pair)))); } - + bool pmt_is_eof_object(pmt_t obj) { diff --git a/gruel/src/lib/pmt/pmt_int.h b/gruel/src/lib/pmt/pmt_int.h index 745dbc666..bd2b5fe5a 100644 --- a/gruel/src/lib/pmt/pmt_int.h +++ b/gruel/src/lib/pmt/pmt_int.h @@ -1,19 +1,19 @@ /* -*- c++ -*- */ /* * Copyright 2006,2009,2010 Free Software Foundation, Inc. - * + * * This file is part of GNU Radio - * + * * GNU Radio is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * GNU Radio is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with GNU Radio; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -101,7 +101,7 @@ class pmt_symbol : public pmt_base { std::string d_name; pmt_t d_next; - + public: pmt_symbol(const std::string &name); //~pmt_symbol(){} diff --git a/gruel/src/lib/pmt/pmt_io.cc b/gruel/src/lib/pmt/pmt_io.cc index 1214ff588..4bac4a0ec 100644 --- a/gruel/src/lib/pmt/pmt_io.cc +++ b/gruel/src/lib/pmt/pmt_io.cc @@ -1,19 +1,19 @@ /* -*- c++ -*- */ /* * Copyright 2006,2009 Free Software Foundation, Inc. - * + * * This file is part of GNU Radio - * + * * GNU Radio is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * GNU Radio is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. @@ -127,7 +127,7 @@ std::ostream& operator<<(std::ostream &os, pmt_t obj) return os; } -std::string +std::string pmt_write_string(pmt_t obj) { std::ostringstream s; @@ -150,7 +150,7 @@ pmt_serialize(pmt_t obj, std::ostream &sink) /*! * \brief Create obj from portable byte-serial representation */ -pmt_t +pmt_t pmt_deserialize(std::istream &source) { throw pmt_notimplemented("notimplemented: pmt_deserialize", PMT_NIL); @@ -159,7 +159,7 @@ pmt_deserialize(std::istream &source) } /* namespace pmt */ -void +void pmt::pmt_print(pmt_t v) { std::cout << pmt_write_string(v) << std::endl; diff --git a/gruel/src/lib/pmt/pmt_pool.cc b/gruel/src/lib/pmt/pmt_pool.cc index 731d28ca7..63a681abf 100644 --- a/gruel/src/lib/pmt/pmt_pool.cc +++ b/gruel/src/lib/pmt/pmt_pool.cc @@ -1,19 +1,19 @@ /* -*- c++ -*- */ /* * Copyright 2007,2009 Free Software Foundation, Inc. - * + * * This file is part of GNU Radio - * + * * GNU Radio is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * GNU Radio is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. diff --git a/gruel/src/lib/pmt/pmt_serialize.cc b/gruel/src/lib/pmt/pmt_serialize.cc index 184a31e6b..de9644c3c 100644 --- a/gruel/src/lib/pmt/pmt_serialize.cc +++ b/gruel/src/lib/pmt/pmt_serialize.cc @@ -1,19 +1,19 @@ /* -*- c++ -*- */ /* * Copyright 2007,2009 Free Software Foundation, Inc. - * + * * This file is part of GNU Radio - * + * * GNU Radio is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * GNU Radio is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. @@ -216,7 +216,7 @@ deserialize_untagged_f64(double *ip, std::streambuf &sb) *ip = iu.id; return t != std::streambuf::traits_type::eof(); } - + /* * Write portable byte-serial representation of \p obj to \p sb @@ -227,7 +227,7 @@ bool pmt_serialize(pmt_t obj, std::streambuf &sb) { bool ok = true; - + tail_recursion: if (pmt_is_bool(obj)){ @@ -236,7 +236,7 @@ pmt_serialize(pmt_t obj, std::streambuf &sb) else return serialize_untagged_u8(PST_FALSE, sb); } - + if (pmt_is_null(obj)) return serialize_untagged_u8(PST_NULL, sb); @@ -294,10 +294,10 @@ pmt_serialize(pmt_t obj, std::streambuf &sb) if (pmt_is_uniform_vector(obj)) throw pmt_notimplemented("pmt_serialize (uniform-vector)", obj); - + if (pmt_is_dict(obj)) throw pmt_notimplemented("pmt_serialize (dict)", obj); - + throw pmt_notimplemented("pmt_serialize (?)", obj); } @@ -325,7 +325,7 @@ pmt_deserialize(std::streambuf &sb) switch (tag){ case PST_TRUE: return PMT_T; - + case PST_FALSE: return PMT_F; @@ -369,7 +369,7 @@ pmt_deserialize(std::streambuf &sb) case PST_COMMENT: throw pmt_notimplemented("pmt_deserialize: tag value = ", pmt_from_long(tag)); - + default: throw pmt_exception("pmt_deserialize: malformed input stream, tag value = ", pmt_from_long(tag)); diff --git a/gruel/src/lib/pmt/qa_pmt.cc b/gruel/src/lib/pmt/qa_pmt.cc index 250befafa..27c617e74 100644 --- a/gruel/src/lib/pmt/qa_pmt.cc +++ b/gruel/src/lib/pmt/qa_pmt.cc @@ -1,18 +1,18 @@ /* * Copyright 2006 Free Software Foundation, Inc. - * + * * This file is part of GNU Radio - * + * * GNU Radio is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * GNU Radio is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with GNU Radio; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -35,6 +35,6 @@ qa_pmt::suite () s->addTest (qa_pmt_prims::suite ()); s->addTest (qa_pmt_unv::suite ()); - + return s; } diff --git a/gruel/src/lib/pmt/qa_pmt.h b/gruel/src/lib/pmt/qa_pmt.h index 424c1065b..3de5872c7 100644 --- a/gruel/src/lib/pmt/qa_pmt.h +++ b/gruel/src/lib/pmt/qa_pmt.h @@ -1,19 +1,19 @@ /* -*- c++ -*- */ /* * Copyright 2006 Free Software Foundation, Inc. - * + * * This file is part of GNU Radio - * + * * GNU Radio is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * GNU Radio is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with GNU Radio; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, diff --git a/gruel/src/lib/pmt/qa_pmt_prims.cc b/gruel/src/lib/pmt/qa_pmt_prims.cc index 7dec30d56..6212b8ea4 100644 --- a/gruel/src/lib/pmt/qa_pmt_prims.cc +++ b/gruel/src/lib/pmt/qa_pmt_prims.cc @@ -1,19 +1,19 @@ /* -*- c++ -*- */ /* * Copyright 2006,2009,2010 Free Software Foundation, Inc. - * + * * This file is part of GNU Radio - * + * * GNU Radio is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * GNU Radio is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with GNU Radio; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -173,7 +173,7 @@ qa_pmt_prims::test_pairs() CPPUNIT_ASSERT_EQUAL(s3, pmt_car(c1)); CPPUNIT_ASSERT_EQUAL((size_t)1, pmt_length(c3)); CPPUNIT_ASSERT_EQUAL((size_t)2, pmt_length(c2)); - + CPPUNIT_ASSERT_THROW(pmt_cdr(PMT_NIL), pmt_wrong_type); CPPUNIT_ASSERT_THROW(pmt_car(PMT_NIL), pmt_wrong_type); CPPUNIT_ASSERT_THROW(pmt_set_car(s1, PMT_NIL), pmt_wrong_type); @@ -282,7 +282,7 @@ qa_pmt_prims::test_tuples() //std::cout << v << std::endl; //std::cout << t2 << std::endl; - + t = pmt_make_tuple(s[0], s[1], s[2]); pmt_t list0 = pmt_list3(s[0], s[1], s[2]); CPPUNIT_ASSERT_EQUAL(size_t(3), pmt_length(list0)); @@ -346,11 +346,11 @@ qa_pmt_prims::test_misc() pmt_t p0 = pmt_cons(k0, v0); pmt_t p1 = pmt_cons(k1, v1); pmt_t p2 = pmt_cons(k2, v2); - + pmt_t alist = pmt_cons(p0, pmt_cons(p1, pmt_cons(p2, PMT_NIL))); CPPUNIT_ASSERT(pmt_eq(p1, pmt_assv(k1, alist))); CPPUNIT_ASSERT(pmt_eq(PMT_F, pmt_assv(k3, alist))); - + pmt_t keys = pmt_cons(k0, pmt_cons(k1, pmt_cons(k2, PMT_NIL))); pmt_t vals = pmt_cons(v0, pmt_cons(v1, pmt_cons(v2, PMT_NIL))); CPPUNIT_ASSERT(pmt_equal(keys, pmt_map(pmt_car, alist))); @@ -372,7 +372,7 @@ qa_pmt_prims::test_dict() pmt_t v2 = mp("v2"); pmt_t v3 = mp("v3"); pmt_t not_found = pmt_cons(PMT_NIL, PMT_NIL); - + CPPUNIT_ASSERT(!pmt_dict_has_key(dict, k0)); dict = pmt_dict_add(dict, k0, v0); CPPUNIT_ASSERT(pmt_dict_has_key(dict, k0)); diff --git a/gruel/src/lib/pmt/qa_pmt_prims.h b/gruel/src/lib/pmt/qa_pmt_prims.h index cc1409ee6..a407509b2 100644 --- a/gruel/src/lib/pmt/qa_pmt_prims.h +++ b/gruel/src/lib/pmt/qa_pmt_prims.h @@ -1,19 +1,19 @@ /* -*- c++ -*- */ /* * Copyright 2006 Free Software Foundation, Inc. - * + * * This file is part of GNU Radio - * + * * GNU Radio is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * GNU Radio is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with GNU Radio; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, diff --git a/gruel/src/lib/pmt/unv_template.cc.t b/gruel/src/lib/pmt/unv_template.cc.t index 148965c09..566168c3d 100644 --- a/gruel/src/lib/pmt/unv_template.cc.t +++ b/gruel/src/lib/pmt/unv_template.cc.t @@ -33,7 +33,7 @@ pmt_@TAG@vector::ref(size_t k) const return d_v[k]; } -void +void pmt_@TAG@vector::set(size_t k, @TYPE@ x) { if (k >= length()) diff --git a/gruel/src/lib/realtime.cc b/gruel/src/lib/realtime.cc index 96351f812..e01c6c53d 100644 --- a/gruel/src/lib/realtime.cc +++ b/gruel/src/lib/realtime.cc @@ -1,19 +1,19 @@ /* -*- c++ -*- */ /* * Copyright 2006,2007,2008 Free Software Foundation, Inc. - * + * * This file is part of GNU Radio - * + * * GNU Radio is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * GNU Radio is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with GNU Radio; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -90,7 +90,7 @@ namespace gruel { return RT_OTHER_ERROR; } } - + //printf("SCHED_FIFO enabled with priority = %d\n", pri); return RT_OK; } @@ -125,7 +125,7 @@ namespace gruel { return RT_OTHER_ERROR; } } - + //printf("SCHED_FIFO enabled with priority = %d\n", pri); return RT_OK; } diff --git a/gruel/src/lib/sys_pri.cc b/gruel/src/lib/sys_pri.cc index dc0164d70..c8a505341 100644 --- a/gruel/src/lib/sys_pri.cc +++ b/gruel/src/lib/sys_pri.cc @@ -1,19 +1,19 @@ /* -*- c++ -*- */ /* * Copyright 2008 Free Software Foundation, Inc. - * + * * This file is part of GNU Radio - * + * * GNU Radio is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * GNU Radio is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. diff --git a/gruel/src/lib/test_gruel.cc b/gruel/src/lib/test_gruel.cc index 7ef3520e6..f32e3f341 100644 --- a/gruel/src/lib/test_gruel.cc +++ b/gruel/src/lib/test_gruel.cc @@ -1,19 +1,19 @@ /* -*- c++ -*- */ /* * Copyright 2006,2009,2010,2011 Free Software Foundation, Inc. - * + * * This file is part of GNU Radio - * + * * GNU Radio is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * GNU Radio is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with GNU Radio; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -32,7 +32,7 @@ #include namespace fs = boost::filesystem; -int +int main(int argc, char **argv) { fs::path path = fs::current_path() / ".unittests"; @@ -45,7 +45,7 @@ main(int argc, char **argv) runner.addTest(qa_pmt::suite ()); runner.setOutputter(xmlout); - + bool was_successful = runner.run("", false); return was_successful ? 0 : 1; diff --git a/gruel/src/lib/thread_body_wrapper.cc b/gruel/src/lib/thread_body_wrapper.cc index 86c4edb5b..019eaa342 100644 --- a/gruel/src/lib/thread_body_wrapper.cc +++ b/gruel/src/lib/thread_body_wrapper.cc @@ -1,19 +1,19 @@ /* -*- c++ -*- */ /* * Copyright 2008 Free Software Foundation, Inc. - * + * * This file is part of GNU Radio - * + * * GNU Radio is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * GNU Radio is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. @@ -37,7 +37,7 @@ namespace gruel { sigset_t new_set; int r; - sigemptyset(&new_set); + sigemptyset(&new_set); sigaddset(&new_set, SIGHUP); // block these... sigaddset(&new_set, SIGINT); sigaddset(&new_set, SIGPIPE); diff --git a/gruel/src/lib/thread_group.cc b/gruel/src/lib/thread_group.cc index fa78567ec..9e8ded4df 100644 --- a/gruel/src/lib/thread_group.cc +++ b/gruel/src/lib/thread_group.cc @@ -4,7 +4,7 @@ * Copyright (C) 2007 Anthony Williams * Copyright 2008 Free Software Foundation, Inc. * - * Distributed under the Boost Software License, Version 1.0. (See accompanying + * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ -- cgit From eba5deff498acba7fbc91c2bd00a2389d3fc0194 Mon Sep 17 00:00:00 2001 From: Johnathan Corgan Date: Sun, 15 Apr 2012 09:06:29 -0700 Subject: pmt: fix segfault in deleter --- gruel/src/lib/pmt/pmt.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/pmt.cc b/gruel/src/lib/pmt/pmt.cc index 57b66b1a4..c100611be 100644 --- a/gruel/src/lib/pmt/pmt.cc +++ b/gruel/src/lib/pmt/pmt.cc @@ -58,7 +58,13 @@ pmt_base::operator delete(void *p, size_t size) #endif void intrusive_ptr_add_ref(pmt_base* p) { ++(p->count_); } -void intrusive_ptr_release(pmt_base* p) { if (--(p->count_) == 0 ) p->deleter_(p); } +void intrusive_ptr_release(pmt_base* p) { + if (--(p->count_) == 0 ){ + //make a copy of deleter before we delete its container, p + boost::function deleter = p->deleter_; + deleter(p); + } +} pmt_base::~pmt_base() { -- cgit From e53e231e50b66f9ab9a1ab5a3c7da894736be000 Mon Sep 17 00:00:00 2001 From: Johnathan Corgan Date: Mon, 16 Apr 2012 16:20:29 -0700 Subject: Revert "Merge branch 'test/fix-pmt-deleter' into maint" This reverts commit 04e2ebb979942cada74f10ea022342716c6851bf, reversing changes made to 25d687550a0322ffaf270f25faf2b4a78a97142c. --- gruel/src/lib/pmt/pmt.cc | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/pmt.cc b/gruel/src/lib/pmt/pmt.cc index c100611be..57b66b1a4 100644 --- a/gruel/src/lib/pmt/pmt.cc +++ b/gruel/src/lib/pmt/pmt.cc @@ -58,13 +58,7 @@ pmt_base::operator delete(void *p, size_t size) #endif void intrusive_ptr_add_ref(pmt_base* p) { ++(p->count_); } -void intrusive_ptr_release(pmt_base* p) { - if (--(p->count_) == 0 ){ - //make a copy of deleter before we delete its container, p - boost::function deleter = p->deleter_; - deleter(p); - } -} +void intrusive_ptr_release(pmt_base* p) { if (--(p->count_) == 0 ) p->deleter_(p); } pmt_base::~pmt_base() { -- cgit From 54f27eed4991daa41ccba37789a250abdab020a9 Mon Sep 17 00:00:00 2001 From: Johnathan Corgan Date: Mon, 16 Apr 2012 16:21:58 -0700 Subject: Revert "Merge remote branch 'jblum-github/pmt_set_deleter'" This reverts commit f88b8cf5508d3ba446cb94f800c56d34279cf91e, reversing changes made to a87ac60f15c2593ececb02ba16ab842c20e760d2. --- gruel/src/lib/pmt/pmt.cc | 14 +------------- gruel/src/lib/pmt/pmt_int.h | 9 +-------- 2 files changed, 2 insertions(+), 21 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/pmt.cc b/gruel/src/lib/pmt/pmt.cc index 57b66b1a4..f9cf6b4bf 100644 --- a/gruel/src/lib/pmt/pmt.cc +++ b/gruel/src/lib/pmt/pmt.cc @@ -58,7 +58,7 @@ pmt_base::operator delete(void *p, size_t size) #endif void intrusive_ptr_add_ref(pmt_base* p) { ++(p->count_); } -void intrusive_ptr_release(pmt_base* p) { if (--(p->count_) == 0 ) p->deleter_(p); } +void intrusive_ptr_release(pmt_base* p) { if (--(p->count_) == 0 ) delete p; } pmt_base::~pmt_base() { @@ -1383,16 +1383,4 @@ pmt_dump_sizeof() printf("sizeof(pmt_uniform_vector) = %3zd\n", sizeof(pmt_uniform_vector)); } -/* - * ------------------------------------------------------------------------ - * advanced - * ------------------------------------------------------------------------ - */ - -void -pmt_set_deleter(pmt_t obj, boost::function &deleter) -{ - obj->deleter_ = (deleter)? deleter : &pmt_base::default_deleter; -} - } /* namespace pmt */ diff --git a/gruel/src/lib/pmt/pmt_int.h b/gruel/src/lib/pmt/pmt_int.h index 745dbc666..3a5cd382b 100644 --- a/gruel/src/lib/pmt/pmt_int.h +++ b/gruel/src/lib/pmt/pmt_int.h @@ -38,15 +38,8 @@ namespace pmt { class GRUEL_API pmt_base : boost::noncopyable { mutable boost::detail::atomic_count count_; -public: - static void default_deleter(pmt_base *p){ - delete p; - } - - boost::function deleter_; - protected: - pmt_base() : count_(0), deleter_(&pmt::pmt_base::default_deleter) {}; + pmt_base() : count_(0) {}; virtual ~pmt_base(); public: -- cgit From 4c589268b7145d782194d99c4eade83bc04eaae5 Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Mon, 23 Apr 2012 19:09:22 -0400 Subject: Various fixes for using Python 2.5. --- gruel/src/lib/pmt/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/CMakeLists.txt b/gruel/src/lib/pmt/CMakeLists.txt index dc70f03d7..72bd27a04 100644 --- a/gruel/src/lib/pmt/CMakeLists.txt +++ b/gruel/src/lib/pmt/CMakeLists.txt @@ -67,7 +67,7 @@ add_custom_command( ${CMAKE_CURRENT_SOURCE_DIR}/unv_template.h.t ${CMAKE_CURRENT_SOURCE_DIR}/unv_template.cc.t ${CMAKE_CURRENT_SOURCE_DIR}/unv_qa_template.cc.t - COMMAND ${PYTHON_EXECUTABLE} -B -c + COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B} -c \"import os,sys\;srcdir='${CMAKE_CURRENT_SOURCE_DIR}'\;sys.path.append(srcdir)\;os.environ['srcdir']=srcdir\;from generate_unv import main\;main()\" WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) -- cgit From 9bab2daba836ad6c121b5237af287efb7dc5968e Mon Sep 17 00:00:00 2001 From: Tim Oshea Date: Mon, 30 Apr 2012 15:57:41 -0700 Subject: gruel: fix linker assumption made explicit on Ubuntu 12.04 --- gruel/src/lib/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/CMakeLists.txt b/gruel/src/lib/CMakeLists.txt index cd7b7abf4..2a96163ce 100644 --- a/gruel/src/lib/CMakeLists.txt +++ b/gruel/src/lib/CMakeLists.txt @@ -81,7 +81,7 @@ list(APPEND gruel_sources ) add_library(gruel SHARED ${gruel_sources}) -target_link_libraries(gruel ${Boost_LIBRARIES}) +target_link_libraries(gruel ${Boost_LIBRARIES} -lpthread) GR_LIBRARY_FOO(gruel RUNTIME_COMPONENT "gruel_runtime" DEVEL_COMPONENT "gruel_devel") ######################################################################## -- cgit From 29ed15d3acaf8c778ea6aff41a636892e362f7a3 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Wed, 2 May 2012 22:00:45 -0700 Subject: gruel: conditional linking for pthread --- gruel/src/lib/CMakeLists.txt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/CMakeLists.txt b/gruel/src/lib/CMakeLists.txt index 2a96163ce..e7713536c 100644 --- a/gruel/src/lib/CMakeLists.txt +++ b/gruel/src/lib/CMakeLists.txt @@ -80,8 +80,14 @@ list(APPEND gruel_sources thread_group.cc ) +list(APPEND gruel_libs ${Boost_LIBRARIES}) + +if(HAVE_PTHREAD_SETSCHEDPARAM) + list(APPEND gruel_libs pthread) +endif() + add_library(gruel SHARED ${gruel_sources}) -target_link_libraries(gruel ${Boost_LIBRARIES} -lpthread) +target_link_libraries(gruel ${gruel_libs}) GR_LIBRARY_FOO(gruel RUNTIME_COMPONENT "gruel_runtime" DEVEL_COMPONENT "gruel_devel") ######################################################################## -- cgit From e7ea4f2f5f21bc745fd3b3a92b1cee176c00c551 Mon Sep 17 00:00:00 2001 From: Tim O'Shea Date: Wed, 13 Jun 2012 16:26:52 -0400 Subject: New Features: added support for pmt_serialize and pmt_deserialize for uint64_t type pmts added gr_add_const_bb typed block to gr_add_const_XX gengen --- gruel/src/lib/pmt/pmt-serial-tags.scm | 1 + gruel/src/lib/pmt/pmt_serialize.cc | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/pmt-serial-tags.scm b/gruel/src/lib/pmt/pmt-serial-tags.scm index ca25a43a8..a78d87681 100644 --- a/gruel/src/lib/pmt/pmt-serial-tags.scm +++ b/gruel/src/lib/pmt/pmt-serial-tags.scm @@ -33,6 +33,7 @@ (define pst-dict #x09) ; untagged-int32 n; followed by n key/value tuples (define pst-uniform-vector #x0a) +(define pst-uint64 #x0b) ;; u8, s8, u16, s16, u32, s32, u64, s64, f32, f64, c32, c64 ;; diff --git a/gruel/src/lib/pmt/pmt_serialize.cc b/gruel/src/lib/pmt/pmt_serialize.cc index de9644c3c..05140bb42 100644 --- a/gruel/src/lib/pmt/pmt_serialize.cc +++ b/gruel/src/lib/pmt/pmt_serialize.cc @@ -79,7 +79,6 @@ serialize_untagged_f64(double i, std::streambuf &sb) } -#if 0 // always writes big-endian static bool serialize_untagged_u64(uint64_t i, std::streambuf &sb) @@ -93,7 +92,6 @@ serialize_untagged_u64(uint64_t i, std::streambuf &sb) sb.sputc((i >> 8) & 0xff); return sb.sputc((i >> 0) & 0xff) != std::streambuf::traits_type::eof(); } -#endif // ---------------------------------------------------------------- // input primitives @@ -152,7 +150,6 @@ deserialize_untagged_u32(uint32_t *ip, std::streambuf &sb) return t != std::streambuf::traits_type::eof(); } -#if 0 // always reads big-endian static bool deserialize_untagged_u64(uint64_t *ip, std::streambuf &sb) @@ -181,7 +178,6 @@ deserialize_untagged_u64(uint64_t *ip, std::streambuf &sb) *ip = i; return t != std::streambuf::traits_type::eof(); } -#endif static bool deserialize_untagged_f64(double *ip, std::streambuf &sb) @@ -260,7 +256,13 @@ pmt_serialize(pmt_t obj, std::streambuf &sb) } if (pmt_is_number(obj)){ - + + if (pmt_is_uint64(obj)){ + uint64_t i = pmt_to_uint64(obj); + ok = serialize_untagged_u8(PST_UINT64, sb); + ok &= serialize_untagged_u64(i, sb); + return ok; + } else if (pmt_is_integer(obj)){ long i = pmt_to_long(obj); if (sizeof(long) > 4){ @@ -315,7 +317,7 @@ pmt_deserialize(std::streambuf &sb) //uint8_t u8; uint16_t u16; uint32_t u32; - //uint32_t u64; + uint64_t u64; double f64; static char tmpbuf[1024]; @@ -347,6 +349,11 @@ pmt_deserialize(std::streambuf &sb) goto error; return pmt_from_long((int32_t) u32); + case PST_UINT64: + if(!deserialize_untagged_u64(&u64, sb)) + goto error; + return pmt_from_uint64(u64); + case PST_PAIR: return parse_pair(sb); -- cgit From e42a6889a2966d8e9fd4e6b2b1bb3dd28c9794c9 Mon Sep 17 00:00:00 2001 From: Tim O'Shea Date: Wed, 20 Jun 2012 11:58:40 -0400 Subject: 1. handle pmt serialize and deserialize for tuples 2. fix offset checking in pmt_annotator_raw --- gruel/src/lib/pmt/pmt-serial-tags.scm | 1 + gruel/src/lib/pmt/pmt_serialize.cc | 41 +++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/pmt-serial-tags.scm b/gruel/src/lib/pmt/pmt-serial-tags.scm index a78d87681..4f06bf75f 100644 --- a/gruel/src/lib/pmt/pmt-serial-tags.scm +++ b/gruel/src/lib/pmt/pmt-serial-tags.scm @@ -34,6 +34,7 @@ (define pst-uniform-vector #x0a) (define pst-uint64 #x0b) +(define pst-tuple #x0c) ;; u8, s8, u16, s16, u32, s32, u64, s64, f32, f64, c32, c64 ;; diff --git a/gruel/src/lib/pmt/pmt_serialize.cc b/gruel/src/lib/pmt/pmt_serialize.cc index 05140bb42..8c9dd12b3 100644 --- a/gruel/src/lib/pmt/pmt_serialize.cc +++ b/gruel/src/lib/pmt/pmt_serialize.cc @@ -24,6 +24,7 @@ #endif #include #include +#include #include "pmt_int.h" #include "gruel/pmt_serial_tags.h" @@ -213,6 +214,28 @@ deserialize_untagged_f64(double *ip, std::streambuf &sb) return t != std::streambuf::traits_type::eof(); } +static bool +deserialize_tuple(pmt_t *tuple, std::streambuf &sb) +{ + std::cout << "deserialize_tuple\n"; + uint32_t nitems; + bool ok = deserialize_untagged_u32(&nitems, sb); + pmt_t list(PMT_NIL); + std::cout << "nitems: " << nitems << "\n"; + for(uint32_t i=0; i #include -#include #include "pmt_int.h" #include "gruel/pmt_serial_tags.h" @@ -217,13 +216,10 @@ deserialize_untagged_f64(double *ip, std::streambuf &sb) static bool deserialize_tuple(pmt_t *tuple, std::streambuf &sb) { - std::cout << "deserialize_tuple\n"; uint32_t nitems; bool ok = deserialize_untagged_u32(&nitems, sb); pmt_t list(PMT_NIL); - std::cout << "nitems: " << nitems << "\n"; for(uint32_t i=0; i &data) +{ + + return pmt_t(new pmt_@TAG@vector(k, &data[0])); +} + @TYPE@ pmt_@TAG@vector_ref(pmt_t vector, size_t k) { -- cgit From 8e8ed231cd2469e1a39c5ae6af23ac9b29264af7 Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Fri, 14 Dec 2012 16:00:27 -0500 Subject: gruel: Enabling serialize/deserialize for PMT vectors. --- gruel/src/lib/pmt/pmt_serialize.cc | 344 ++++++++++++++++++++++++++++++++++++- 1 file changed, 338 insertions(+), 6 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/pmt_serialize.cc b/gruel/src/lib/pmt/pmt_serialize.cc index a19809a66..1ee7ca1fe 100644 --- a/gruel/src/lib/pmt/pmt_serialize.cc +++ b/gruel/src/lib/pmt/pmt_serialize.cc @@ -309,11 +309,192 @@ pmt_serialize(pmt_t obj, std::streambuf &sb) } - if (pmt_is_vector(obj)) - throw pmt_notimplemented("pmt_serialize (vector)", obj); + if (pmt_is_vector(obj)) { + size_t vec_len = pmt::pmt_length(obj); + ok = serialize_untagged_u8(PST_VECTOR, sb); + ok &= serialize_untagged_u32(vec_len, sb); + for(size_t i=0; i c = pmt_c32vector_ref(obj, i); + ok &= serialize_untagged_f64(c.real(), sb); + ok &= serialize_untagged_f64(c.imag(), sb); + } + return ok; + } + + if(pmt_is_c64vector(obj)) { + ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb); + ok &= serialize_untagged_u8(UVI_C64, sb); + ok &= serialize_untagged_u32(vec_len, sb); + ok &= serialize_untagged_u8(npad, sb); + for(size_t i=0; i c = pmt_c64vector_ref(obj, i); + ok &= serialize_untagged_f64(c.real(), sb); + ok &= serialize_untagged_f64(c.imag(), sb); + } + return ok; + } + } if (pmt_is_dict(obj)) throw pmt_notimplemented("pmt_serialize (dict)", obj); @@ -342,7 +523,7 @@ pmt_t pmt_deserialize(std::streambuf &sb) { uint8_t tag; - //uint8_t u8; + uint8_t u8; uint16_t u16; uint32_t u32; uint64_t u64; @@ -408,8 +589,159 @@ pmt_deserialize(std::streambuf &sb) } case PST_VECTOR: - case PST_DICT: + { + uint32_t nitems; + if(!deserialize_untagged_u32(&nitems, sb)) + goto error; + pmt_t vec = pmt_make_vector(nitems, PMT_NIL); + for(uint32_t i=0; i(f64)); + } + return vec; + } + case(UVI_F64): + { + pmt_t vec = pmt_make_f64vector(nitems, 0); + for(uint32_t i=0; i c; + deserialize_untagged_f64(&f64, sb); + c.real(static_cast(f64)); + deserialize_untagged_f64(&f64, sb); + c.imag(static_cast(f64)); + pmt_c32vector_set(vec, i, c); + } + return vec; + } + + case(UVI_C64): + { + pmt_t vec = pmt_make_c64vector(nitems, 0); + for(uint32_t i=0; i c; + deserialize_untagged_f64(&f64, sb); + c.real(f64); + deserialize_untagged_f64(&f64, sb); + c.imag(f64); + pmt_c64vector_set(vec, i, c); + } + return vec; + } + + default: + throw pmt_exception("pmt_deserialize: malformed input stream, tag value = ", + pmt_from_long(tag)); + } + } + + case PST_DICT: case PST_COMMENT: throw pmt_notimplemented("pmt_deserialize: tag value = ", pmt_from_long(tag)); -- cgit From b15b38df132ae662c1b9e3ebe5ea5ba4f7180afa Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Mon, 17 Dec 2012 16:09:34 -0500 Subject: gruel: changing PMT (de)serialize of complex to make more portable (apparently; for OSX). --- gruel/src/lib/pmt/pmt_serialize.cc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/pmt_serialize.cc b/gruel/src/lib/pmt/pmt_serialize.cc index 1ee7ca1fe..24be6b772 100644 --- a/gruel/src/lib/pmt/pmt_serialize.cc +++ b/gruel/src/lib/pmt/pmt_serialize.cc @@ -711,12 +711,12 @@ pmt_deserialize(std::streambuf &sb) { pmt_t vec = pmt_make_c32vector(nitems, 0); for(uint32_t i=0; i c; + float re, im; deserialize_untagged_f64(&f64, sb); - c.real(static_cast(f64)); + re = static_cast(f64); deserialize_untagged_f64(&f64, sb); - c.imag(static_cast(f64)); - pmt_c32vector_set(vec, i, c); + im = static_cast(f64); + pmt_c32vector_set(vec, i, std::complex(re, im)); } return vec; } @@ -725,12 +725,12 @@ pmt_deserialize(std::streambuf &sb) { pmt_t vec = pmt_make_c64vector(nitems, 0); for(uint32_t i=0; i c; + double re, im; deserialize_untagged_f64(&f64, sb); - c.real(f64); + re = f64; deserialize_untagged_f64(&f64, sb); - c.imag(f64); - pmt_c64vector_set(vec, i, c); + im = f64; + pmt_c64vector_set(vec, i, std::complex(re, im)); } return vec; } -- cgit From eff53a185e1c25fc54768f480e1be1a02bba699e Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Wed, 19 Dec 2012 18:03:49 -0500 Subject: gruel: pmt_Xvector_elements can be used in Python to return a Python tuple. --- gruel/src/lib/pmt/unv_template.cc.t | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/unv_template.cc.t b/gruel/src/lib/pmt/unv_template.cc.t index f74397421..1ed505e29 100644 --- a/gruel/src/lib/pmt/unv_template.cc.t +++ b/gruel/src/lib/pmt/unv_template.cc.t @@ -118,6 +118,18 @@ pmt_@TAG@vector_elements(pmt_t vector, size_t &len) return _@TAG@vector(vector)->elements(len); } +const std::vector< @TYPE@ > +pmt_@TAG@vector_elements(pmt_t vector) +{ + if (!vector->is_@TAG@vector()) + throw pmt_wrong_type("pmt_@TAG@vector_elements", vector); + size_t len; + const @TYPE@ *array = _@TAG@vector(vector)->elements(len); + const std::vector< @TYPE@ > vec(array, array+len); + return vec; +} + + @TYPE@ * pmt_@TAG@vector_writable_elements(pmt_t vector, size_t &len) { -- cgit From b60396ab638534aff05fa5b0c8b8c0b334b4e58e Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Thu, 20 Dec 2012 11:54:22 -0500 Subject: gruel: adding a 'pmt_from_complex' call (more clear than pmt_make_rectangular). --- gruel/src/lib/pmt/pmt.cc | 10 ++++++++++ gruel/src/lib/pmt/qa_pmt_prims.cc | 12 ++++++++++++ 2 files changed, 22 insertions(+) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/pmt/pmt.cc b/gruel/src/lib/pmt/pmt.cc index e5baca98a..1d1e9ba7c 100644 --- a/gruel/src/lib/pmt/pmt.cc +++ b/gruel/src/lib/pmt/pmt.cc @@ -387,10 +387,20 @@ pmt_is_complex(pmt_t x) pmt_t pmt_make_rectangular(double re, double im) +{ + return pmt_from_complex(re, im); +} + +pmt_t pmt_from_complex(double re, double im) { return pmt_t(new pmt_complex(std::complex(re, im))); } +pmt_t pmt_from_complex(const std::complex &z) +{ + return pmt_t(new pmt_complex(z)); +} + std::complex pmt_to_complex(pmt_t x) { diff --git a/gruel/src/lib/pmt/qa_pmt_prims.cc b/gruel/src/lib/pmt/qa_pmt_prims.cc index 1bf5fcfb1..3ae4d70b6 100644 --- a/gruel/src/lib/pmt/qa_pmt_prims.cc +++ b/gruel/src/lib/pmt/qa_pmt_prims.cc @@ -134,12 +134,24 @@ qa_pmt_prims::test_complexes() { pmt_t p1 = pmt_make_rectangular(2, -3); pmt_t m1 = pmt_make_rectangular(-3, 2); + pmt_t p2 = pmt_from_complex(2, -3); + pmt_t m2 = pmt_from_complex(-3, 2); + pmt_t p3 = pmt_from_complex(std::complex(2, -3)); + pmt_t m3 = pmt_from_complex(std::complex(-3, 2)); CPPUNIT_ASSERT(!pmt_is_complex(PMT_T)); CPPUNIT_ASSERT(pmt_is_complex(p1)); CPPUNIT_ASSERT(pmt_is_complex(m1)); + CPPUNIT_ASSERT(pmt_is_complex(p2)); + CPPUNIT_ASSERT(pmt_is_complex(m2)); + CPPUNIT_ASSERT(pmt_is_complex(p3)); + CPPUNIT_ASSERT(pmt_is_complex(m3)); CPPUNIT_ASSERT_THROW(pmt_to_complex(PMT_T), pmt_wrong_type); CPPUNIT_ASSERT_EQUAL(std::complex(2, -3), pmt_to_complex(p1)); CPPUNIT_ASSERT_EQUAL(std::complex(-3, 2), pmt_to_complex(m1)); + CPPUNIT_ASSERT_EQUAL(std::complex(2, -3), pmt_to_complex(p2)); + CPPUNIT_ASSERT_EQUAL(std::complex(-3, 2), pmt_to_complex(m2)); + CPPUNIT_ASSERT_EQUAL(std::complex(2, -3), pmt_to_complex(p3)); + CPPUNIT_ASSERT_EQUAL(std::complex(-3, 2), pmt_to_complex(m3)); CPPUNIT_ASSERT_EQUAL(std::complex(1.0, 0), pmt_to_complex(pmt_from_long(1))); CPPUNIT_ASSERT_EQUAL(std::complex(1.0, 0), pmt_to_complex(pmt_from_double(1.0))); } -- cgit From e788c523d4f8de3efd64a64f148ac1bf25ea032d Mon Sep 17 00:00:00 2001 From: Michael L Dickens Date: Tue, 1 Jan 2013 21:42:23 -0500 Subject: Tweak INCLUDE dirs such that INCLUDE_DIRECTORIES and LINK_DIRECTORIES are ordered as: internal build and source for this component, other components (internal build and source, or already installed), non-project non-system dependencies (e.g., Qt, Boost, Python), system dependencies (e.g., CoreAudio). --- gruel/src/lib/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/CMakeLists.txt b/gruel/src/lib/CMakeLists.txt index e7713536c..e33b80d64 100644 --- a/gruel/src/lib/CMakeLists.txt +++ b/gruel/src/lib/CMakeLists.txt @@ -64,8 +64,8 @@ GR_INCLUDE_SUBDIRECTORY(pmt) ######################################################################## # Setup the include and linker paths ######################################################################## -include_directories(${GRUEL_INCLUDE_DIRS}) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +include_directories(${GRUEL_INCLUDE_DIRS}) include_directories(${Boost_INCLUDE_DIRS}) link_directories(${Boost_LIBRARY_DIRS}) -- cgit From 7bc415bd2875132ce321c5913950d23e7c9ad8b1 Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Wed, 19 Dec 2012 13:37:39 -0500 Subject: gruel: adding wrapper layer for gruel threads to enable setting thread affinity. Working in Linux; programmed for Windows (but untested); nops for OSX. --- gruel/src/lib/CMakeLists.txt | 1 + gruel/src/lib/thread.cc | 223 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 224 insertions(+) create mode 100644 gruel/src/lib/thread.cc (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/CMakeLists.txt b/gruel/src/lib/CMakeLists.txt index e33b80d64..717d56660 100644 --- a/gruel/src/lib/CMakeLists.txt +++ b/gruel/src/lib/CMakeLists.txt @@ -76,6 +76,7 @@ link_directories(${Boost_LIBRARY_DIRS}) list(APPEND gruel_sources realtime.cc sys_pri.cc + thread.cc thread_body_wrapper.cc thread_group.cc ) diff --git a/gruel/src/lib/thread.cc b/gruel/src/lib/thread.cc new file mode 100644 index 000000000..46ba1745a --- /dev/null +++ b/gruel/src/lib/thread.cc @@ -0,0 +1,223 @@ +/* -*- c++ -*- */ +/* + * Copyright 2012 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) + +#include + +namespace gruel { + + gr_thread_t + get_current_thread_id() + { + return GetCurrentThread(); + } + + void + thread_bind_to_processor(unsigned int n) + { + std::vector mask(1, n); + thread_bind_to_processor(get_current_thread_id(), mask); + } + + void + thread_bind_to_processor(const std::vector &mask) + { + thread_bind_to_processor(get_current_thread_id(), mask); + } + + void + thread_bind_to_processor(gr_thread_t thread, unsigned int n) + { + std::vector mask(1, n); + thread_bind_to_processor(thread, mask); + } + + void + thread_bind_to_processor(gr_thread_t thread, const std::vector &mask) + { + //DWORD_PTR mask = (1 << n); + DWORD_PTR mask = 0; + + std::vector _mask = mask; + std::vector::iterator itr; + for(itr = _mask.begin(); itr != _mask.end(); itr++) + mask |= (1 << (*itr)); + + DWORD_PTR ret = SetThreadAffinityMask(thread, mask); + if(ret == 0) { + std::stringstream s; + s << "thread_bind_to_processor failed with error: " << GetLastError() << std::endl; + throw std::runtime_error(s.str()); + } + } + + void + thread_unbind() + { + thread_bind_unbind(get_current_thread_id()); + } + + void + thread_unbind(gr_thread_t thread) + { + DWORD_PTR mask = sizeof(DWORD_PTR) - 1; + DWORD_PTR ret = SetThreadAffinityMask(thread, mask); + if(ret == 0) { + std::stringstream s; + s << "thread_unbind failed with error: " << GetLastError() << std::endl; + throw std::runtime_error(s.str()); + } + } +} /* namespace gruel */ + +#elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) + +namespace gruel { + + gr_thread_t + get_current_thread_id() + { + // Not implemented on OSX + } + + void + thread_bind_to_processor(unsigned int n) + { + // Not implemented on OSX + } + + void + thread_bind_to_processor(gr_thread_t thread, unsigned int n) + { + // Not implemented on OSX + } + + void + thread_bind_to_processor(gr_thread_t thread, const std::vector &mask) + { + // Not implemented on OSX + } + + void + thread_bind_to_processor(gr_thread_t thread, const std::vector &mask) + + void + thread_unbind() + { + // Not implemented on OSX + } + + void + thread_unbind(gr_thread_t thread) + { + // Not implemented on OSX + } +} /* namespace gruel */ + +#else + +#include +#include +#include + +namespace gruel { + + gr_thread_t + get_current_thread_id() + { + return pthread_self(); + } + + void + thread_bind_to_processor(unsigned int n) + { + std::vector mask(1, n); + thread_bind_to_processor(get_current_thread_id(), mask); + } + + void + thread_bind_to_processor(const std::vector &mask) + { + thread_bind_to_processor(get_current_thread_id(), mask); + } + + void + thread_bind_to_processor(gr_thread_t thread, unsigned int n) + { + std::vector mask(1, n); + thread_bind_to_processor(thread, mask); + } + + void + thread_bind_to_processor(gr_thread_t thread, const std::vector &mask) + { + cpu_set_t set; + size_t len = sizeof(cpu_set_t); + std::vector _mask = mask; + std::vector::iterator itr; + + CPU_ZERO(&set); + for(itr = _mask.begin(); itr != _mask.end(); itr++) + CPU_SET(*itr, &set); + + int ret = pthread_setaffinity_np(thread, len, &set); + if(ret != 0) { + std::stringstream s; + s << "thread_bind_to_processor failed with error: " << ret << std::endl; + throw std::runtime_error(s.str()); + } + } + + void + thread_unbind() + { + thread_unbind(get_current_thread_id()); + } + + void + thread_unbind(gr_thread_t thread) + { + cpu_set_t set; + size_t len = sizeof(cpu_set_t); + + CPU_ZERO(&set); + long ncpus = sysconf(_SC_NPROCESSORS_ONLN); + for(long n = 0; n < ncpus; n++) { + CPU_SET(n, &set); + } + + int ret = pthread_setaffinity_np(thread, len, &set); + if(ret != 0) { + std::stringstream s; + s << "thread_unbind failed with error: " << ret << std::endl; + throw std::runtime_error(s.str()); + } + } +} /* namespace gruel */ + +#endif -- cgit From 01eab0c7e283db9c1cfff0a26296a49128062cca Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Wed, 19 Dec 2012 13:38:24 -0500 Subject: core: working thread affinity concept into gr_blocks. Example in gnuradio-core/src/examples/mp-sched/affinity_set.py Documentation describing API in docs/doxygen/other/thread_affinity.dox --- gruel/src/lib/thread.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/thread.cc b/gruel/src/lib/thread.cc index 46ba1745a..ab022c0bd 100644 --- a/gruel/src/lib/thread.cc +++ b/gruel/src/lib/thread.cc @@ -118,13 +118,16 @@ namespace gruel { } void - thread_bind_to_processor(gr_thread_t thread, const std::vector &mask) + thread_bind_to_processor(const std::vector &mask) { // Not implemented on OSX } void thread_bind_to_processor(gr_thread_t thread, const std::vector &mask) + { + // Not implemented on OSX + } void thread_unbind() -- cgit From 0c46b36ed5c52f0003f0cd45195bdee1193a2a33 Mon Sep 17 00:00:00 2001 From: Nicholas Corgan Date: Wed, 6 Feb 2013 12:36:13 -0800 Subject: gruel: renamed mask to dword_mask --- gruel/src/lib/thread.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/thread.cc b/gruel/src/lib/thread.cc index ab022c0bd..8ebe822fb 100644 --- a/gruel/src/lib/thread.cc +++ b/gruel/src/lib/thread.cc @@ -61,14 +61,14 @@ namespace gruel { thread_bind_to_processor(gr_thread_t thread, const std::vector &mask) { //DWORD_PTR mask = (1 << n); - DWORD_PTR mask = 0; + DWORD_PTR dword_mask = 0; std::vector _mask = mask; std::vector::iterator itr; for(itr = _mask.begin(); itr != _mask.end(); itr++) - mask |= (1 << (*itr)); + dword_mask |= (1 << (*itr)); - DWORD_PTR ret = SetThreadAffinityMask(thread, mask); + DWORD_PTR ret = SetThreadAffinityMask(thread, dword_mask); if(ret == 0) { std::stringstream s; s << "thread_bind_to_processor failed with error: " << GetLastError() << std::endl; @@ -79,14 +79,14 @@ namespace gruel { void thread_unbind() { - thread_bind_unbind(get_current_thread_id()); + thread_unbind(get_current_thread_id()); } void thread_unbind(gr_thread_t thread) { - DWORD_PTR mask = sizeof(DWORD_PTR) - 1; - DWORD_PTR ret = SetThreadAffinityMask(thread, mask); + DWORD_PTR dword_mask = sizeof(DWORD_PTR) - 1; + DWORD_PTR ret = SetThreadAffinityMask(thread, dword_mask); if(ret == 0) { std::stringstream s; s << "thread_unbind failed with error: " << GetLastError() << std::endl; -- cgit From 78cd4026c0a9b902162e94905b60a9dd44a07bb7 Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Fri, 29 Mar 2013 13:12:36 -0400 Subject: core: addressing issue #529. Using vector instead of vector for affinity mask vector. This is wrong as the mask should be unsigned, but necessary for SWIG to work cleanly on both 32-bit and 64-bit platforms. --- gruel/src/lib/thread.cc | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) (limited to 'gruel/src/lib') diff --git a/gruel/src/lib/thread.cc b/gruel/src/lib/thread.cc index 8ebe822fb..a5116b687 100644 --- a/gruel/src/lib/thread.cc +++ b/gruel/src/lib/thread.cc @@ -38,33 +38,33 @@ namespace gruel { } void - thread_bind_to_processor(unsigned int n) + thread_bind_to_processor(int n) { - std::vector mask(1, n); + std::vector mask(1, n); thread_bind_to_processor(get_current_thread_id(), mask); } void - thread_bind_to_processor(const std::vector &mask) + thread_bind_to_processor(const std::vector &mask) { thread_bind_to_processor(get_current_thread_id(), mask); } void - thread_bind_to_processor(gr_thread_t thread, unsigned int n) + thread_bind_to_processor(gr_thread_t thread, int n) { - std::vector mask(1, n); + std::vector mask(1, n); thread_bind_to_processor(thread, mask); } void - thread_bind_to_processor(gr_thread_t thread, const std::vector &mask) + thread_bind_to_processor(gr_thread_t thread, const std::vector &mask) { //DWORD_PTR mask = (1 << n); DWORD_PTR dword_mask = 0; - std::vector _mask = mask; - std::vector::iterator itr; + std::vector _mask = mask; + std::vector::iterator itr; for(itr = _mask.begin(); itr != _mask.end(); itr++) dword_mask |= (1 << (*itr)); @@ -106,25 +106,25 @@ namespace gruel { } void - thread_bind_to_processor(unsigned int n) + thread_bind_to_processor(int n) { // Not implemented on OSX } void - thread_bind_to_processor(gr_thread_t thread, unsigned int n) + thread_bind_to_processor(gr_thread_t thread, int n) { // Not implemented on OSX } void - thread_bind_to_processor(const std::vector &mask) + thread_bind_to_processor(const std::vector &mask) { // Not implemented on OSX } void - thread_bind_to_processor(gr_thread_t thread, const std::vector &mask) + thread_bind_to_processor(gr_thread_t thread, const std::vector &mask) { // Not implemented on OSX } @@ -157,32 +157,32 @@ namespace gruel { } void - thread_bind_to_processor(unsigned int n) + thread_bind_to_processor(int n) { - std::vector mask(1, n); + std::vector mask(1, n); thread_bind_to_processor(get_current_thread_id(), mask); } void - thread_bind_to_processor(const std::vector &mask) + thread_bind_to_processor(const std::vector &mask) { thread_bind_to_processor(get_current_thread_id(), mask); } void - thread_bind_to_processor(gr_thread_t thread, unsigned int n) + thread_bind_to_processor(gr_thread_t thread, int n) { - std::vector mask(1, n); + std::vector mask(1, n); thread_bind_to_processor(thread, mask); } void - thread_bind_to_processor(gr_thread_t thread, const std::vector &mask) + thread_bind_to_processor(gr_thread_t thread, const std::vector &mask) { cpu_set_t set; size_t len = sizeof(cpu_set_t); - std::vector _mask = mask; - std::vector::iterator itr; + std::vector _mask = mask; + std::vector::iterator itr; CPU_ZERO(&set); for(itr = _mask.begin(); itr != _mask.end(); itr++) -- cgit