diff options
author | Marcus Müller <mmueller@gnuradio.org> | 2019-08-07 21:45:12 +0200 |
---|---|---|
committer | Marcus Müller <marcus@hostalia.de> | 2019-08-09 23:04:28 +0200 |
commit | f7bbf2c1d8d780294f3e016aff239ca35eb6516e (patch) | |
tree | e09ab6112e02b2215b2d59ac24d3d6ea2edac745 /gnuradio-runtime | |
parent | 78431dc6941e3acc67c858277dfe4a0ed583643c (diff) |
Tree: clang-format without the include sorting
Diffstat (limited to 'gnuradio-runtime')
181 files changed, 17593 insertions, 18376 deletions
diff --git a/gnuradio-runtime/apps/gnuradio-config-info.cc b/gnuradio-runtime/apps/gnuradio-config-info.cc index 813dda138c..b4ba29124e 100644 --- a/gnuradio-runtime/apps/gnuradio-config-info.cc +++ b/gnuradio-runtime/apps/gnuradio-config-info.cc @@ -34,74 +34,70 @@ namespace po = boost::program_options; using boost::format; -int -main(int argc, char **argv) +int main(int argc, char** argv) { - po::options_description desc((format("Program options: %1% [options]") % argv[0]).str()); - po::variables_map vm; - - desc.add_options() - ("help,h", "print help message") - ("prefix", "print GNU Radio installation prefix") - ("sysconfdir", "print GNU Radio system configuration directory") - ("prefsdir", "print GNU Radio preferences directory") - ("userprefsdir", "print GNU Radio user preferences directory") - ("prefs", "print GNU Radio preferences") - ("builddate", "print GNU Radio build date (RFC2822 format)") - ("enabled-components", "print GNU Radio build time enabled components") - ("cc", "print GNU Radio C compiler version") - ("cxx", "print GNU Radio C++ compiler version") - ("cflags", "print GNU Radio CFLAGS") - ("version,v", "print GNU Radio version") - ; - - try { - po::store(po::parse_command_line(argc, argv, desc), vm); - po::notify(vm); - } - catch (po::error& error){ - std::cerr << "Error: " << error.what() << std::endl << std::endl; - std::cerr << desc << std::endl; - return 1; - } - - if(vm.size() == 0 || vm.count("help")) { - std::cout << desc << std::endl; - return 1; - } - - if(vm.count("prefix")) - std::cout << gr::prefix() << std::endl; - - if(vm.count("sysconfdir")) - std::cout << gr::sysconfdir() << std::endl; - - if(vm.count("prefsdir")) - std::cout << gr::prefsdir() << std::endl; - - if(vm.count("userprefsdir")) - std::cout << gr::userconf_path() << std::endl; - - if(vm.count("prefs")) - std::cout << gr::prefs::singleton()->to_string() << std::endl; - - if(vm.count("builddate")) - std::cout << gr::build_date() << std::endl; - - if(vm.count("enabled-components")) - std::cout << gr::build_time_enabled_components() << std::endl; - - if(vm.count("version")) - std::cout << gr::version() << std::endl; - - if(vm.count("cc")) - std::cout << gr::c_compiler() << std::endl; - - if(vm.count("cxx")) - std::cout << gr::cxx_compiler() << std::endl; - - if(vm.count("cflags")) - std::cout << gr::compiler_flags() << std::endl; - - return 0; + po::options_description desc( + (format("Program options: %1% [options]") % argv[0]).str()); + po::variables_map vm; + + desc.add_options()("help,h", "print help message")( + "prefix", "print GNU Radio installation prefix")( + "sysconfdir", "print GNU Radio system configuration directory")( + "prefsdir", "print GNU Radio preferences directory")( + "userprefsdir", "print GNU Radio user preferences directory")( + "prefs", "print GNU Radio preferences")( + "builddate", "print GNU Radio build date (RFC2822 format)")( + "enabled-components", "print GNU Radio build time enabled components")( + "cc", "print GNU Radio C compiler version")( + "cxx", "print GNU Radio C++ compiler version")( + "cflags", "print GNU Radio CFLAGS")("version,v", "print GNU Radio version"); + + try { + po::store(po::parse_command_line(argc, argv, desc), vm); + po::notify(vm); + } catch (po::error& error) { + std::cerr << "Error: " << error.what() << std::endl << std::endl; + std::cerr << desc << std::endl; + return 1; + } + + if (vm.size() == 0 || vm.count("help")) { + std::cout << desc << std::endl; + return 1; + } + + if (vm.count("prefix")) + std::cout << gr::prefix() << std::endl; + + if (vm.count("sysconfdir")) + std::cout << gr::sysconfdir() << std::endl; + + if (vm.count("prefsdir")) + std::cout << gr::prefsdir() << std::endl; + + if (vm.count("userprefsdir")) + std::cout << gr::userconf_path() << std::endl; + + if (vm.count("prefs")) + std::cout << gr::prefs::singleton()->to_string() << std::endl; + + if (vm.count("builddate")) + std::cout << gr::build_date() << std::endl; + + if (vm.count("enabled-components")) + std::cout << gr::build_time_enabled_components() << std::endl; + + if (vm.count("version")) + std::cout << gr::version() << std::endl; + + if (vm.count("cc")) + std::cout << gr::c_compiler() << std::endl; + + if (vm.count("cxx")) + std::cout << gr::cxx_compiler() << std::endl; + + if (vm.count("cflags")) + std::cout << gr::compiler_flags() << std::endl; + + return 0; } diff --git a/gnuradio-runtime/include/gnuradio/api.h b/gnuradio-runtime/include/gnuradio/api.h index 1c68b8c8b8..5fd3d66378 100644 --- a/gnuradio-runtime/include/gnuradio/api.h +++ b/gnuradio-runtime/include/gnuradio/api.h @@ -25,9 +25,9 @@ #include <gnuradio/attributes.h> #ifdef gnuradio_runtime_EXPORTS -# define GR_RUNTIME_API __GR_ATTR_EXPORT +#define GR_RUNTIME_API __GR_ATTR_EXPORT #else -# define GR_RUNTIME_API __GR_ATTR_IMPORT +#define GR_RUNTIME_API __GR_ATTR_IMPORT #endif #endif /* INCLUDED_GR_RUNTIME_RUNTIME_API_H */ diff --git a/gnuradio-runtime/include/gnuradio/attributes.h b/gnuradio-runtime/include/gnuradio/attributes.h index 250683f248..e5b2f98f03 100644 --- a/gnuradio-runtime/include/gnuradio/attributes.h +++ b/gnuradio-runtime/include/gnuradio/attributes.h @@ -26,65 +26,69 @@ // Cross-platform attribute macros //////////////////////////////////////////////////////////////////////// #if defined __GNUC__ -# define __GR_ATTR_ALIGNED(x) __attribute__((aligned(x))) -# define __GR_ATTR_UNUSED __attribute__((unused)) -# define __GR_ATTR_INLINE __attribute__((always_inline)) -# define __GR_ATTR_DEPRECATED __attribute__((deprecated)) -# if __GNUC__ >= 4 -# define __GR_ATTR_EXPORT __attribute__((visibility("default"))) -# define __GR_ATTR_IMPORT __attribute__((visibility("default"))) -# else -# define __GR_ATTR_EXPORT -# define __GR_ATTR_IMPORT -# endif +#define __GR_ATTR_ALIGNED(x) __attribute__((aligned(x))) +#define __GR_ATTR_UNUSED __attribute__((unused)) +#define __GR_ATTR_INLINE __attribute__((always_inline)) +#define __GR_ATTR_DEPRECATED __attribute__((deprecated)) +#if __GNUC__ >= 4 +#define __GR_ATTR_EXPORT __attribute__((visibility("default"))) +#define __GR_ATTR_IMPORT __attribute__((visibility("default"))) +#else +#define __GR_ATTR_EXPORT +#define __GR_ATTR_IMPORT +#endif #elif defined __clang__ -# define __GR_ATTR_ALIGNED(x) __attribute__((aligned(x))) -# define __GR_ATTR_UNUSED __attribute__((unused)) -# define __GR_ATTR_INLINE __attribute__((always_inline)) -# define __GR_ATTR_DEPRECATED __attribute__((deprecated)) -# define __GR_ATTR_EXPORT __attribute__((visibility("default"))) -# define __GR_ATTR_IMPORT __attribute__((visibility("default"))) +#define __GR_ATTR_ALIGNED(x) __attribute__((aligned(x))) +#define __GR_ATTR_UNUSED __attribute__((unused)) +#define __GR_ATTR_INLINE __attribute__((always_inline)) +#define __GR_ATTR_DEPRECATED __attribute__((deprecated)) +#define __GR_ATTR_EXPORT __attribute__((visibility("default"))) +#define __GR_ATTR_IMPORT __attribute__((visibility("default"))) #elif _MSC_VER -# define __GR_ATTR_ALIGNED(x) __declspec(align(x)) -# define __GR_ATTR_UNUSED -# define __GR_ATTR_INLINE __forceinline -# define __GR_ATTR_DEPRECATED __declspec(deprecated) -# define __GR_ATTR_EXPORT __declspec(dllexport) -# define __GR_ATTR_IMPORT __declspec(dllimport) +#define __GR_ATTR_ALIGNED(x) __declspec(align(x)) +#define __GR_ATTR_UNUSED +#define __GR_ATTR_INLINE __forceinline +#define __GR_ATTR_DEPRECATED __declspec(deprecated) +#define __GR_ATTR_EXPORT __declspec(dllexport) +#define __GR_ATTR_IMPORT __declspec(dllimport) #else -# define __GR_ATTR_ALIGNED(x) -# define __GR_ATTR_UNUSED -# define __GR_ATTR_INLINE -# define __GR_ATTR_DEPRECATED -# define __GR_ATTR_EXPORT -# define __GR_ATTR_IMPORT +#define __GR_ATTR_ALIGNED(x) +#define __GR_ATTR_UNUSED +#define __GR_ATTR_INLINE +#define __GR_ATTR_DEPRECATED +#define __GR_ATTR_EXPORT +#define __GR_ATTR_IMPORT #endif //////////////////////////////////////////////////////////////////////// // define inline when building C //////////////////////////////////////////////////////////////////////// #if defined(_MSC_VER) && !defined(__cplusplus) && !defined(inline) -# define inline __inline +#define inline __inline #endif //////////////////////////////////////////////////////////////////////// // suppress warnings //////////////////////////////////////////////////////////////////////// #ifdef _MSC_VER -# pragma warning(disable: 4251) // class 'A<T>' needs to have dll-interface to be used by clients of class 'B' -# pragma warning(disable: 4275) // non dll-interface class ... used as base for dll-interface class ... -# pragma warning(disable: 4244) // conversion from 'double' to 'float', possible loss of data -# pragma warning(disable: 4305) // 'initializing' : truncation from 'double' to 'float' -# pragma warning(disable: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow) +#pragma warning(disable : 4251) // class 'A<T>' needs to have dll-interface to be used by + // clients of class 'B' +#pragma warning(disable : 4275) // non dll-interface class ... used as base for + // dll-interface class ... +#pragma warning( \ + disable : 4244) // conversion from 'double' to 'float', possible loss of data +#pragma warning(disable : 4305) // 'initializing' : truncation from 'double' to 'float' +#pragma warning(disable : 4290) // C++ exception specification ignored except to indicate + // a function is not __declspec(nothrow) #endif //////////////////////////////////////////////////////////////////////// // implement cross-compiler VLA macros //////////////////////////////////////////////////////////////////////// #ifdef _MSC_VER -# define __GR_VLA(TYPE, buf, size) TYPE * buf = (TYPE *) alloca(sizeof(TYPE) * (size)) +#define __GR_VLA(TYPE, buf, size) TYPE* buf = (TYPE*)alloca(sizeof(TYPE) * (size)) #else -# define __GR_VLA(TYPE, buf, size) TYPE buf[size] +#define __GR_VLA(TYPE, buf, size) TYPE buf[size] #endif #endif /* INCLUDED_GNURADIO_ATTRIBUTES_H */ diff --git a/gnuradio-runtime/include/gnuradio/basic_block.h b/gnuradio-runtime/include/gnuradio/basic_block.h index 1b36999f5a..450086c4b9 100644 --- a/gnuradio-runtime/include/gnuradio/basic_block.h +++ b/gnuradio-runtime/include/gnuradio/basic_block.h @@ -44,49 +44,51 @@ namespace gr { - /*! - * \brief The abstract base class for all signal processing blocks. - * \ingroup internal - * - * Basic blocks are the bare abstraction of an entity that has a - * name, a set of inputs and outputs, and a message queue. These - * are never instantiated directly; rather, this is the abstract - * parent class of both gr_hier_block, which is a recursive - * container, and block, which implements actual signal - * processing functions. - */ - class GR_RUNTIME_API basic_block : public msg_accepter, - public boost::enable_shared_from_this<basic_block> - { +/*! + * \brief The abstract base class for all signal processing blocks. + * \ingroup internal + * + * Basic blocks are the bare abstraction of an entity that has a + * name, a set of inputs and outputs, and a message queue. These + * are never instantiated directly; rather, this is the abstract + * parent class of both gr_hier_block, which is a recursive + * container, and block, which implements actual signal + * processing functions. + */ +class GR_RUNTIME_API basic_block : public msg_accepter, + public boost::enable_shared_from_this<basic_block> +{ typedef boost::function<void(pmt::pmt_t)> msg_handler_t; - private: - typedef std::map<pmt::pmt_t , msg_handler_t, pmt::comparator> d_msg_handlers_t; +private: + typedef std::map<pmt::pmt_t, msg_handler_t, pmt::comparator> d_msg_handlers_t; d_msg_handlers_t d_msg_handlers; typedef std::deque<pmt::pmt_t> msg_queue_t; typedef std::map<pmt::pmt_t, msg_queue_t, pmt::comparator> msg_queue_map_t; - typedef std::map<pmt::pmt_t, msg_queue_t, pmt::comparator>::iterator msg_queue_map_itr; - std::map<pmt::pmt_t, boost::shared_ptr<boost::condition_variable>, pmt::comparator> msg_queue_ready; + typedef std::map<pmt::pmt_t, msg_queue_t, pmt::comparator>::iterator + msg_queue_map_itr; + std::map<pmt::pmt_t, boost::shared_ptr<boost::condition_variable>, pmt::comparator> + msg_queue_ready; - gr::thread::mutex mutex; //< protects all vars + gr::thread::mutex mutex; //< protects all vars - protected: +protected: friend class flowgraph; friend class flat_flowgraph; // TODO: will be redundant friend class tpb_thread_body; enum vcolor { WHITE, GREY, BLACK }; - std::string d_name; + std::string d_name; gr::io_signature::sptr d_input_signature; gr::io_signature::sptr d_output_signature; - long d_unique_id; - long d_symbolic_id; - std::string d_symbol_name; - std::string d_symbol_alias; - vcolor d_color; - bool d_rpc_set; + long d_unique_id; + long d_symbolic_id; + std::string d_symbol_name; + std::string d_symbol_alias; + vcolor d_color; + bool d_rpc_set; msg_queue_map_t msg_queue; std::vector<boost::any> d_rpc_vars; // container for all RPC variables @@ -94,18 +96,17 @@ namespace gr { basic_block(void) {} // allows pure virtual interface sub-classes //! Protected constructor prevents instantiation by non-derived classes - basic_block(const std::string &name, + basic_block(const std::string& name, gr::io_signature::sptr input_signature, gr::io_signature::sptr output_signature); //! may only be called during constructor - void set_input_signature(gr::io_signature::sptr iosig) { - d_input_signature = iosig; - } + void set_input_signature(gr::io_signature::sptr iosig) { d_input_signature = iosig; } //! may only be called during constructor - void set_output_signature(gr::io_signature::sptr iosig) { - d_output_signature = iosig; + void set_output_signature(gr::io_signature::sptr iosig) + { + d_output_signature = iosig; } /*! @@ -117,8 +118,9 @@ namespace gr { /*! * \brief Tests if there is a handler attached to port \p which_port */ - virtual bool has_msg_handler(pmt::pmt_t which_port) { - return (d_msg_handlers.find(which_port) != d_msg_handlers.end()); + virtual bool has_msg_handler(pmt::pmt_t which_port) + { + return (d_msg_handlers.find(which_port) != d_msg_handlers.end()); } /* @@ -129,16 +131,16 @@ namespace gr { */ virtual void dispatch_msg(pmt::pmt_t which_port, pmt::pmt_t msg) { - // AA Update this - if(has_msg_handler(which_port)) { // Is there a handler? - d_msg_handlers[which_port](msg); // Yes, invoke it. - } + // AA Update this + if (has_msg_handler(which_port)) { // Is there a handler? + d_msg_handlers[which_port](msg); // Yes, invoke it. + } } // Message passing interface pmt::pmt_t d_message_subscribers; - public: +public: pmt::pmt_t message_subscribers(pmt::pmt_t port); virtual ~basic_block(); long unique_id() const { return d_unique_id; } @@ -153,9 +155,12 @@ namespace gr { * and never changes during the life of the block. */ std::string symbol_name() const { return d_symbol_name; } - std::string identifier() const { return this->name() + "(" + std::to_string(this->unique_id()) + ")"; } + std::string identifier() const + { + return this->name() + "(" + std::to_string(this->unique_id()) + ")"; + } - gr::io_signature::sptr input_signature() const { return d_input_signature; } + gr::io_signature::sptr input_signature() const { return d_input_signature; } gr::io_signature::sptr output_signature() const { return d_output_signature; } basic_block_sptr to_basic_block(); // Needed for Python type coercion @@ -167,7 +172,7 @@ namespace gr { /*! * Returns the block's alias as a string. */ - std::string alias() const { return alias_set()?d_symbol_alias:symbol_name(); } + std::string alias() const { return alias_set() ? d_symbol_alias : symbol_name(); } /*! * Returns the block's alias as PMT. @@ -188,9 +193,21 @@ namespace gr { void message_port_sub(pmt::pmt_t port_id, pmt::pmt_t target); void message_port_unsub(pmt::pmt_t port_id, pmt::pmt_t target); - virtual bool message_port_is_hier(pmt::pmt_t port_id) { (void) port_id; return false; } - virtual bool message_port_is_hier_in(pmt::pmt_t port_id) { (void) port_id; return false; } - virtual bool message_port_is_hier_out(pmt::pmt_t port_id) { (void) port_id; return false; } + virtual bool message_port_is_hier(pmt::pmt_t port_id) + { + (void)port_id; + return false; + } + virtual bool message_port_is_hier_in(pmt::pmt_t port_id) + { + (void)port_id; + return false; + } + virtual bool message_port_is_hier_out(pmt::pmt_t port_id) + { + (void)port_id; + return false; + } /*! * \brief Get input message port names. @@ -214,66 +231,72 @@ namespace gr { void _post(pmt::pmt_t which_port, pmt::pmt_t msg); //! is the queue empty? - bool empty_p(pmt::pmt_t which_port) { - if(msg_queue.find(which_port) == msg_queue.end()) - throw std::runtime_error("port does not exist!"); - return msg_queue[which_port].empty(); + bool empty_p(pmt::pmt_t which_port) + { + if (msg_queue.find(which_port) == msg_queue.end()) + throw std::runtime_error("port does not exist!"); + return msg_queue[which_port].empty(); } - bool empty_p() { - bool rv = true; - BOOST_FOREACH(msg_queue_map_t::value_type &i, msg_queue) { - rv &= msg_queue[i.first].empty(); - } - return rv; + bool empty_p() + { + bool rv = true; + BOOST_FOREACH (msg_queue_map_t::value_type& i, msg_queue) { + rv &= msg_queue[i.first].empty(); + } + return rv; } //! are all msg ports with handlers empty? - bool empty_handled_p(pmt::pmt_t which_port){ + bool empty_handled_p(pmt::pmt_t which_port) + { return (empty_p(which_port) || !has_msg_handler(which_port)); } - bool empty_handled_p() { - bool rv = true; - BOOST_FOREACH(msg_queue_map_t::value_type &i, msg_queue) { - rv &= empty_handled_p(i.first); - } - return rv; + bool empty_handled_p() + { + bool rv = true; + BOOST_FOREACH (msg_queue_map_t::value_type& i, msg_queue) { + rv &= empty_handled_p(i.first); + } + return rv; } //! How many messages in the queue? - size_t nmsgs(pmt::pmt_t which_port) { - if(msg_queue.find(which_port) == msg_queue.end()) - throw std::runtime_error("port does not exist!"); - return msg_queue[which_port].size(); + size_t nmsgs(pmt::pmt_t which_port) + { + if (msg_queue.find(which_port) == msg_queue.end()) + throw std::runtime_error("port does not exist!"); + return msg_queue[which_port].size(); } //| Acquires and release the mutex - void insert_tail( pmt::pmt_t which_port, pmt::pmt_t msg); + void insert_tail(pmt::pmt_t which_port, pmt::pmt_t msg); /*! * \returns returns pmt at head of queue or pmt::pmt_t() if empty. */ - pmt::pmt_t delete_head_nowait( pmt::pmt_t which_port); + pmt::pmt_t delete_head_nowait(pmt::pmt_t which_port); - msg_queue_t::iterator get_iterator(pmt::pmt_t which_port) { - return msg_queue[which_port].begin(); + msg_queue_t::iterator get_iterator(pmt::pmt_t which_port) + { + return msg_queue[which_port].begin(); } - void erase_msg(pmt::pmt_t which_port, msg_queue_t::iterator it) { - msg_queue[which_port].erase(it); + void erase_msg(pmt::pmt_t which_port, msg_queue_t::iterator it) + { + msg_queue[which_port].erase(it); } - virtual bool has_msg_port(pmt::pmt_t which_port) { - if(msg_queue.find(which_port) != msg_queue.end()) { - return true; - } - if(pmt::dict_has_key(d_message_subscribers, which_port)) { - return true; - } - return false; + virtual bool has_msg_port(pmt::pmt_t which_port) + { + if (msg_queue.find(which_port) != msg_queue.end()) { + return true; + } + if (pmt::dict_has_key(d_message_subscribers, which_port)) { + return true; + } + return false; } - const msg_queue_map_t& get_msg_map(void) const { - return msg_queue; - } + const msg_queue_map_t& get_msg_map(void) const { return msg_queue; } #ifdef GR_CTRLPORT /*! @@ -288,10 +311,7 @@ namespace gr { * * \param s an rpcbasic_sptr of the new RPC variable register to store. */ - void add_rpc_variable(rpcbasic_sptr s) - { - d_rpc_vars.push_back(s); - } + void add_rpc_variable(rpcbasic_sptr s) { d_rpc_vars.push_back(s); } #endif /* GR_CTRLPORT */ /*! @@ -302,7 +322,7 @@ namespace gr { * are created, which then get wrapped as shared pointers * (rpcbasic_sptr(...)) and stored using add_rpc_variable. */ - virtual void setup_rpc() {}; + virtual void setup_rpc(){}; /*! * \brief Ask if this block has been registered to the RPC. @@ -330,10 +350,11 @@ namespace gr { * This check is in addition to the constraints specified by the * input and output gr::io_signatures. */ - virtual bool check_topology(int ninputs, int noutputs) { - (void)ninputs; - (void)noutputs; - return true; + virtual bool check_topology(int ninputs, int noutputs) + { + (void)ninputs; + (void)noutputs; + return true; } /*! @@ -363,14 +384,17 @@ namespace gr { * If the block inherits from hier_block2, the runtime system * will ensure that no reentrant calls are made to msg_handler. */ - template <typename T> void set_msg_handler(pmt::pmt_t which_port, T msg_handler) { - if(msg_queue.find(which_port) == msg_queue.end()) { - throw std::runtime_error("attempt to set_msg_handler() on bad input message port!"); - } - d_msg_handlers[which_port] = msg_handler_t(msg_handler); + template <typename T> + void set_msg_handler(pmt::pmt_t which_port, T msg_handler) + { + if (msg_queue.find(which_port) == msg_queue.end()) { + throw std::runtime_error( + "attempt to set_msg_handler() on bad input message port!"); + } + d_msg_handlers[which_port] = msg_handler_t(msg_handler); } - virtual void set_processor_affinity(const std::vector<int> &mask) = 0; + virtual void set_processor_affinity(const std::vector<int>& mask) = 0; virtual void unset_processor_affinity() = 0; @@ -379,23 +403,23 @@ namespace gr { virtual void set_log_level(std::string level) = 0; virtual std::string log_level() = 0; - }; +}; - inline bool operator<(basic_block_sptr lhs, basic_block_sptr rhs) - { +inline bool operator<(basic_block_sptr lhs, basic_block_sptr rhs) +{ return lhs->unique_id() < rhs->unique_id(); - } +} - typedef std::vector<basic_block_sptr> basic_block_vector_t; - typedef std::vector<basic_block_sptr>::iterator basic_block_viter_t; +typedef std::vector<basic_block_sptr> basic_block_vector_t; +typedef std::vector<basic_block_sptr>::iterator basic_block_viter_t; - GR_RUNTIME_API long basic_block_ncurrently_allocated(); +GR_RUNTIME_API long basic_block_ncurrently_allocated(); - inline std::ostream &operator << (std::ostream &os, basic_block_sptr basic_block) - { +inline std::ostream& operator<<(std::ostream& os, basic_block_sptr basic_block) +{ os << basic_block->identifier(); return os; - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/block.h b/gnuradio-runtime/include/gnuradio/block.h index dd7febdbc2..51c9e0ac8b 100644 --- a/gnuradio-runtime/include/gnuradio/block.h +++ b/gnuradio-runtime/include/gnuradio/block.h @@ -36,56 +36,56 @@ namespace gr { - /*! - * \brief The abstract base class for all 'terminal' processing blocks. - * \ingroup base_blk - * - * A signal processing flow is constructed by creating a tree of - * hierarchical blocks, which at any level may also contain terminal - * nodes that actually implement signal processing functions. This - * is the base class for all such leaf nodes. - * - * Blocks have a set of input streams and output streams. The - * input_signature and output_signature define the number of input - * streams and output streams respectively, and the type of the data - * items in each stream. - * - * Blocks report the number of items consumed on each input in - * general_work(), using consume() or consume_each(). - * - * If the same number of items is produced on each output, the block - * returns that number from general_work(). Otherwise, the block - * calls produce() for each output, then returns - * WORK_CALLED_PRODUCE. The input and output rates are not required - * to be related. - * - * User derived blocks override two methods, forecast and - * general_work, to implement their signal processing - * behavior. forecast is called by the system scheduler to determine - * how many items are required on each input stream in order to - * produce a given number of output items. - * - * general_work is called to perform the signal processing in the - * block. It reads the input items and writes the output items. - */ - class GR_RUNTIME_API block : public basic_block - { - public: - +/*! + * \brief The abstract base class for all 'terminal' processing blocks. + * \ingroup base_blk + * + * A signal processing flow is constructed by creating a tree of + * hierarchical blocks, which at any level may also contain terminal + * nodes that actually implement signal processing functions. This + * is the base class for all such leaf nodes. + * + * Blocks have a set of input streams and output streams. The + * input_signature and output_signature define the number of input + * streams and output streams respectively, and the type of the data + * items in each stream. + * + * Blocks report the number of items consumed on each input in + * general_work(), using consume() or consume_each(). + * + * If the same number of items is produced on each output, the block + * returns that number from general_work(). Otherwise, the block + * calls produce() for each output, then returns + * WORK_CALLED_PRODUCE. The input and output rates are not required + * to be related. + * + * User derived blocks override two methods, forecast and + * general_work, to implement their signal processing + * behavior. forecast is called by the system scheduler to determine + * how many items are required on each input stream in order to + * produce a given number of output items. + * + * general_work is called to perform the signal processing in the + * block. It reads the input items and writes the output items. + */ +class GR_RUNTIME_API block : public basic_block +{ +public: //! Magic return values from general_work - enum { - WORK_CALLED_PRODUCE = -2, - WORK_DONE = -1 - }; + enum { WORK_CALLED_PRODUCE = -2, WORK_DONE = -1 }; /*! * \brief enum to represent different tag propagation policies. */ enum tag_propagation_policy_t { - TPP_DONT = 0, /*!< Scheduler doesn't propagate tags from in- to output. The block itself is free to insert tags as it wants. */ - TPP_ALL_TO_ALL = 1, /*!< Propagate tags from all in- to all outputs. The scheduler takes care of that. */ - TPP_ONE_TO_ONE = 2, /*!< Propagate tags from n. input to n. output. Requires same number of in- and outputs */ - TPP_CUSTOM = 3 /*!< Like TPP_DONT, but signals the block it should implement application-specific forwarding behaviour. */ + TPP_DONT = 0, /*!< Scheduler doesn't propagate tags from in- to output. The block + itself is free to insert tags as it wants. */ + TPP_ALL_TO_ALL = 1, /*!< Propagate tags from all in- to all outputs. The scheduler + takes care of that. */ + TPP_ONE_TO_ONE = 2, /*!< Propagate tags from n. input to n. output. Requires same + number of in- and outputs */ + TPP_CUSTOM = 3 /*!< Like TPP_DONT, but signals the block it should implement + application-specific forwarding behaviour. */ }; virtual ~block(); @@ -100,7 +100,7 @@ namespace gr { * initialized with zeroes. */ unsigned history() const; - void set_history(unsigned history); + void set_history(unsigned history); /*! * Declares the block's delay in samples. Since the delay of @@ -160,16 +160,17 @@ namespace gr { * number of data items required on each input stream. The * estimate doesn't have to be exact, but should be close. */ - virtual void forecast(int noutput_items, - gr_vector_int &ninput_items_required); + virtual void forecast(int noutput_items, gr_vector_int& ninput_items_required); /*! * \brief compute output items from input items * * \param noutput_items number of output items to write on each output stream * \param ninput_items number of input items available on each input stream - * \param input_items vector of pointers to the input items, one entry per input stream - * \param output_items vector of pointers to the output items, one entry per output stream + * \param input_items vector of pointers to the input items, one entry per input + * stream + * \param output_items vector of pointers to the output items, one entry per output + * stream * * \returns number of items actually written to each output stream * or WORK_CALLED_PRODUCE or WORK_DONE. It is OK to return a @@ -185,9 +186,9 @@ namespace gr { * many items were consumed on each input stream. */ virtual int general_work(int noutput_items, - gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items); + gr_vector_int& ninput_items, + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items); /*! * \brief Called to enable drivers, etc for i/o devices. @@ -215,7 +216,7 @@ namespace gr { * output multiple is 1. */ void set_output_multiple(int multiple); - int output_multiple() const { return d_output_multiple; } + int output_multiple() const { return d_output_multiple; } bool output_multiple_set() const { return d_output_multiple_set; } /*! @@ -236,10 +237,10 @@ namespace gr { * aligned calls can be performed again. */ void set_alignment(int multiple); - int alignment() const { return d_output_multiple; } + int alignment() const { return d_output_multiple; } void set_unaligned(int na); - int unaligned() const { return d_unaligned; } + int unaligned() const { return d_unaligned; } void set_is_unaligned(bool u); bool is_unaligned() const { return d_is_unaligned; } @@ -316,21 +317,25 @@ namespace gr { * \brief return the numerator, or interpolation rate, of the * approximate output rate / input rate */ - uint64_t relative_rate_i() const { - return (uint64_t) d_mp_relative_rate.get_num().get_ui(); } + uint64_t relative_rate_i() const + { + return (uint64_t)d_mp_relative_rate.get_num().get_ui(); + } /*! * \brief return the denominator, or decimation rate, of the * approximate output rate / input rate */ - uint64_t relative_rate_d() const { - return (uint64_t) d_mp_relative_rate.get_den().get_ui(); } + uint64_t relative_rate_d() const + { + return (uint64_t)d_mp_relative_rate.get_den().get_ui(); + } /*! * \brief return a reference to the multiple precision rational * represntation of the approximate output rate / input rate */ - mpq_class &mp_relative_rate() { return d_mp_relative_rate; } + mpq_class& mp_relative_rate() { return d_mp_relative_rate; } /* * The following two methods provide special case info to the @@ -347,9 +352,9 @@ namespace gr { virtual int fixed_rate_ninput_to_noutput(int ninput); /*! - * \brief Given noutput samples, return number of input samples required to produce noutput. - * N.B. this is only defined if fixed_rate returns true. - * Generally speaking, you don't need to override this. + * \brief Given noutput samples, return number of input samples required to produce + * noutput. N.B. this is only defined if fixed_rate returns true. Generally speaking, + * you don't need to override this. */ virtual int fixed_rate_noutput_to_ninput(int noutput); @@ -670,7 +675,7 @@ namespace gr { * * \param mask a vector of ints of the core numbers available to this block. */ - void set_processor_affinity(const std::vector<int> &mask); + void set_processor_affinity(const std::vector<int>& mask); /*! * \brief Remove processor affinity to a specific core. @@ -701,8 +706,8 @@ namespace gr { // ---------------------------------------------------------------------------- - /*! - * \brief the system message handler + /*! + * \brief the system message handler */ void system_handler(pmt::pmt_t msg); @@ -730,35 +735,36 @@ namespace gr { */ std::string log_level(); - /*! + /*! * \brief returns true when execution has completed due to a message connection - */ + */ bool finished(); - private: - int d_output_multiple; - bool d_output_multiple_set; - int d_unaligned; - bool d_is_unaligned; - double d_relative_rate; // approx output_rate / input_rate - mpq_class d_mp_relative_rate; - block_detail_sptr d_detail; // implementation details - unsigned d_history; - unsigned d_attr_delay; // the block's sample delay - bool d_fixed_rate; - bool d_max_noutput_items_set; // if d_max_noutput_items is valid - int d_max_noutput_items; // value of max_noutput_items for this block - int d_min_noutput_items; - tag_propagation_policy_t d_tag_propagation_policy; // policy for moving tags downstream - std::vector<int> d_affinity; // thread affinity proc. mask - int d_priority; // thread priority level - bool d_pc_rpc_set; - bool d_update_rate; // should sched update rel rate? +private: + int d_output_multiple; + bool d_output_multiple_set; + int d_unaligned; + bool d_is_unaligned; + double d_relative_rate; // approx output_rate / input_rate + mpq_class d_mp_relative_rate; + block_detail_sptr d_detail; // implementation details + unsigned d_history; + unsigned d_attr_delay; // the block's sample delay + bool d_fixed_rate; + bool d_max_noutput_items_set; // if d_max_noutput_items is valid + int d_max_noutput_items; // value of max_noutput_items for this block + int d_min_noutput_items; + tag_propagation_policy_t + d_tag_propagation_policy; // policy for moving tags downstream + std::vector<int> d_affinity; // thread affinity proc. mask + int d_priority; // thread priority level + bool d_pc_rpc_set; + bool d_update_rate; // should sched update rel rate? bool d_finished; // true if msg ports think we are finished - protected: +protected: block(void) {} // allows pure virtual interface sub-classes - block(const std::string &name, + block(const std::string& name, gr::io_signature::sptr input_signature, gr::io_signature::sptr output_signature); @@ -776,16 +782,16 @@ namespace gr { */ inline void add_item_tag(unsigned int which_output, uint64_t abs_offset, - const pmt::pmt_t &key, - const pmt::pmt_t &value, - const pmt::pmt_t &srcid=pmt::PMT_F) + const pmt::pmt_t& key, + const pmt::pmt_t& value, + const pmt::pmt_t& srcid = pmt::PMT_F) { - tag_t tag; - tag.offset = abs_offset; - tag.key = key; - tag.value = value; - tag.srcid = srcid; - this->add_item_tag(which_output, tag); + tag_t tag; + tag.offset = abs_offset; + tag.key = key; + tag.value = value; + tag.srcid = srcid; + this->add_item_tag(which_output, tag); } /*! @@ -794,7 +800,7 @@ namespace gr { * \param which_output an integer of which output stream to attach the tag * \param tag the tag object to add */ - void add_item_tag(unsigned int which_output, const tag_t &tag); + void add_item_tag(unsigned int which_output, const tag_t& tag); /*! * \brief DEPRECATED. Will be removed in 3.8. @@ -810,16 +816,16 @@ namespace gr { */ inline void remove_item_tag(unsigned int which_input, uint64_t abs_offset, - const pmt::pmt_t &key, - const pmt::pmt_t &value, - const pmt::pmt_t &srcid=pmt::PMT_F) + const pmt::pmt_t& key, + const pmt::pmt_t& value, + const pmt::pmt_t& srcid = pmt::PMT_F) { - tag_t tag; - tag.offset = abs_offset; - tag.key = key; - tag.value = value; - tag.srcid = srcid; - this->remove_item_tag(which_input, tag); + tag_t tag; + tag.offset = abs_offset; + tag.key = key; + tag.value = value; + tag.srcid = srcid; + this->remove_item_tag(which_input, tag); } /*! @@ -828,7 +834,7 @@ namespace gr { * \param which_input an integer of which input stream to remove the tag from * \param tag the tag object to remove */ - void remove_item_tag(unsigned int which_input, const tag_t &tag); + void remove_item_tag(unsigned int which_input, const tag_t& tag); /*! * \brief Given a [start,end), returns a vector of all tags in the range. @@ -843,7 +849,7 @@ namespace gr { * \param abs_start a uint64 count of the start of the range of interest * \param abs_end a uint64 count of the end of the range of interest */ - void get_tags_in_range(std::vector<tag_t> &v, + void get_tags_in_range(std::vector<tag_t>& v, unsigned int which_input, uint64_t abs_start, uint64_t abs_end); @@ -863,11 +869,11 @@ namespace gr { * \param abs_end a uint64 count of the end of the range of interest * \param key a PMT symbol key to filter only tags of this key */ - void get_tags_in_range(std::vector<tag_t> &v, + void get_tags_in_range(std::vector<tag_t>& v, unsigned int which_input, uint64_t abs_start, uint64_t abs_end, - const pmt::pmt_t &key); + const pmt::pmt_t& key); /*! * \brief Gets all tags within the relative window of the current call to work. @@ -890,7 +896,7 @@ namespace gr { * \param rel_start a uint64 count of the start of the range of interest * \param rel_end a uint64 count of the end of the range of interest */ - void get_tags_in_window(std::vector<tag_t> &v, + void get_tags_in_window(std::vector<tag_t>& v, unsigned int which_input, uint64_t rel_start, uint64_t rel_end); @@ -907,11 +913,11 @@ namespace gr { * \param rel_end a uint64 count of the end of the range of interest * \param key a PMT symbol key to filter only tags of this key */ - void get_tags_in_window(std::vector<tag_t> &v, + void get_tags_in_window(std::vector<tag_t>& v, unsigned int which_input, uint64_t rel_start, uint64_t rel_end, - const pmt::pmt_t &key); + const pmt::pmt_t& key); void enable_update_rate(bool en); @@ -941,32 +947,30 @@ namespace gr { */ const pmt::pmt_t d_system_port; - public: +public: block_detail_sptr detail() const { return d_detail; } void set_detail(block_detail_sptr detail) { d_detail = detail; } - /*! \brief Tell msg neighbors we are finished - */ - void notify_msg_neighbors(); - - /*! \brief Make sure we don't think we are finished - */ - void clear_finished(){ d_finished = false; } + /*! \brief Tell msg neighbors we are finished + */ + void notify_msg_neighbors(); - std::string identifier() const; + /*! \brief Make sure we don't think we are finished + */ + void clear_finished() { d_finished = false; } - }; + std::string identifier() const; +}; - typedef std::vector<block_sptr> block_vector_t; - typedef std::vector<block_sptr>::iterator block_viter_t; +typedef std::vector<block_sptr> block_vector_t; +typedef std::vector<block_sptr>::iterator block_viter_t; - inline block_sptr cast_to_block_sptr(basic_block_sptr p) - { +inline block_sptr cast_to_block_sptr(basic_block_sptr p) +{ return boost::dynamic_pointer_cast<block, basic_block>(p); - } +} - GR_RUNTIME_API std::ostream& - operator << (std::ostream& os, const block *m); +GR_RUNTIME_API std::ostream& operator<<(std::ostream& os, const block* m); } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/block_detail.h b/gnuradio-runtime/include/gnuradio/block_detail.h index 8a9f4ab881..8f27fa2de9 100644 --- a/gnuradio-runtime/include/gnuradio/block_detail.h +++ b/gnuradio-runtime/include/gnuradio/block_detail.h @@ -32,18 +32,18 @@ namespace gr { - /*! - * \brief Implementation details to support the signal processing abstraction - * \ingroup internal - * - * This class contains implementation detail that should be "out of - * sight" of almost all users of GNU Radio. This decoupling also - * means that we can make changes to the guts without having to - * recompile everything. - */ - class GR_RUNTIME_API block_detail - { - public: +/*! + * \brief Implementation details to support the signal processing abstraction + * \ingroup internal + * + * This class contains implementation detail that should be "out of + * sight" of almost all users of GNU Radio. This decoupling also + * means that we can make changes to the guts without having to + * recompile everything. + */ +class GR_RUNTIME_API block_detail +{ +public: ~block_detail(); int ninputs() const { return d_ninputs; } @@ -57,17 +57,17 @@ namespace gr { void set_input(unsigned int which, buffer_reader_sptr reader); buffer_reader_sptr input(unsigned int which) { - if(which >= d_ninputs) - throw std::invalid_argument("block_detail::input"); - return d_input[which]; + if (which >= d_ninputs) + throw std::invalid_argument("block_detail::input"); + return d_input[which]; } void set_output(unsigned int which, buffer_sptr buffer); buffer_sptr output(unsigned int which) { - if(which >= d_noutputs) - throw std::invalid_argument("block_detail::output"); - return d_output[which]; + if (which >= d_noutputs) + throw std::invalid_argument("block_detail::output"); + return d_output[which]; } /*! @@ -116,19 +116,20 @@ namespace gr { * \param which_output an integer of which output stream to attach the tag * \param tag the tag object to add */ - void add_item_tag(unsigned int which_output, const tag_t &tag); + void add_item_tag(unsigned int which_output, const tag_t& tag); /*! * \brief Removes a tag from the given input stream. * * Calls gr::buffer::remove_item_tag(). - * The tag in question will then no longer appear on subsequent calls of get_tags_in_range(). + * The tag in question will then no longer appear on subsequent calls of + * get_tags_in_range(). * * \param which_input an integer of which input stream to remove the tag from * \param tag the tag object to add * \param id The unique block ID (use gr::block::unique_id()) */ - void remove_item_tag(unsigned int which_input, const tag_t &tag, long id); + void remove_item_tag(unsigned int which_input, const tag_t& tag, long id); /*! * \brief Given a [start,end), returns a vector of all tags in the range. @@ -145,11 +146,11 @@ namespace gr { * \param abs_end a uint64 count of the end of the range of interest * \param id Block ID */ - void get_tags_in_range(std::vector<tag_t> &v, + void get_tags_in_range(std::vector<tag_t>& v, unsigned int which_input, uint64_t abs_start, uint64_t abs_end, - long id); + long id); /*! * \brief Given a [start,end), returns a vector of all tags in the @@ -170,12 +171,12 @@ namespace gr { * \param key a PMT symbol to select only tags of this key * \param id Block ID */ - void get_tags_in_range(std::vector<tag_t> &v, + void get_tags_in_range(std::vector<tag_t>& v, unsigned int which_input, uint64_t abs_start, uint64_t abs_end, - const pmt::pmt_t &key, - long id); + const pmt::pmt_t& key, + long id); /*! * \brief Set core affinity of block to the cores in the vector @@ -184,7 +185,7 @@ namespace gr { * \param mask a vector of ints of the core numbers available to * this block. */ - void set_processor_affinity(const std::vector<int> &mask); + void set_processor_affinity(const std::vector<int>& mask); /*! * \brief Unset core affinity. @@ -203,8 +204,8 @@ namespace gr { */ int set_thread_priority(int priority); - bool threaded; // set if thread is currently running. - gr::thread::gr_thread_t thread; // portable thread handle + bool threaded; // set if thread is currently running. + gr::thread::gr_thread_t thread; // portable thread handle void start_perf_counters(); void stop_perf_counters(int noutput_items, int nproduced); @@ -238,20 +239,20 @@ namespace gr { float pc_work_time_total(); - tpb_detail d_tpb; // used by thread-per-block scheduler + tpb_detail d_tpb; // used by thread-per-block scheduler int d_produce_or; int consumed() const; // ---------------------------------------------------------------------------- - private: - unsigned int d_ninputs; - unsigned int d_noutputs; +private: + unsigned int d_ninputs; + unsigned int d_noutputs; std::vector<buffer_reader_sptr> d_input; - std::vector<buffer_sptr> d_output; - bool d_done; - int d_consumed; + std::vector<buffer_sptr> d_output; + bool d_done; + int d_consumed; // Performance counters float d_ins_noutput_items; @@ -281,15 +282,14 @@ namespace gr { friend struct tpb_detail; - friend GR_RUNTIME_API block_detail_sptr - make_block_detail(unsigned int ninputs, unsigned int noutputs); - }; + friend GR_RUNTIME_API block_detail_sptr make_block_detail(unsigned int ninputs, + unsigned int noutputs); +}; - GR_RUNTIME_API block_detail_sptr - make_block_detail(unsigned int ninputs, unsigned int noutputs); +GR_RUNTIME_API block_detail_sptr make_block_detail(unsigned int ninputs, + unsigned int noutputs); - GR_RUNTIME_API long - block_detail_ncurrently_allocated(); +GR_RUNTIME_API long block_detail_ncurrently_allocated(); } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/block_gateway.h b/gnuradio-runtime/include/gnuradio/block_gateway.h index 28589f8f9f..960d141b14 100644 --- a/gnuradio-runtime/include/gnuradio/block_gateway.h +++ b/gnuradio-runtime/include/gnuradio/block_gateway.h @@ -29,55 +29,54 @@ namespace gr { - /*! - * The work type enum tells the gateway what kind of block to - * implement. The choices are familiar gnuradio block overloads - * (sync, decim, interp). - */ - enum block_gw_work_type { +/*! + * The work type enum tells the gateway what kind of block to + * implement. The choices are familiar gnuradio block overloads + * (sync, decim, interp). + */ +enum block_gw_work_type { GR_BLOCK_GW_WORK_GENERAL, GR_BLOCK_GW_WORK_SYNC, GR_BLOCK_GW_WORK_DECIM, GR_BLOCK_GW_WORK_INTERP, - }; - - //! Magic return values from general_work, \ref gr::block::WORK_CALLED_PRODUCE - enum block_gw_work_return_type{ - WORK_CALLED_PRODUCE = -2, - WORK_DONE = -1 - }; - enum tag_propagation_policy_t { +}; + +//! Magic return values from general_work, \ref gr::block::WORK_CALLED_PRODUCE +enum block_gw_work_return_type { WORK_CALLED_PRODUCE = -2, WORK_DONE = -1 }; +enum tag_propagation_policy_t { TPP_DONT = 0, TPP_ALL_TO_ALL = 1, TPP_ONE_TO_ONE = 2, TPP_CUSTOM = 3 - }; +}; - /*! - * Shared message structure between python and gateway. - * Each action type represents a scheduler-called function. - */ - struct block_gw_message_type { +/*! + * Shared message structure between python and gateway. + * Each action type represents a scheduler-called function. + */ +struct block_gw_message_type { enum action_type { - ACTION_GENERAL_WORK, //dispatch work - ACTION_WORK, //dispatch work - ACTION_FORECAST, //dispatch forecast - ACTION_START, //dispatch start - ACTION_STOP, //dispatch stop + ACTION_GENERAL_WORK, // dispatch work + ACTION_WORK, // dispatch work + ACTION_FORECAST, // dispatch forecast + ACTION_START, // dispatch start + ACTION_STOP, // dispatch stop }; action_type action; int general_work_args_noutput_items; std::vector<int> general_work_args_ninput_items; - std::vector<void *> general_work_args_input_items; //TODO this should be const void*, but swig can't int cast it right - std::vector<void *> general_work_args_output_items; + std::vector<void*> general_work_args_input_items; // TODO this should be const void*, + // but swig can't int cast it right + std::vector<void*> general_work_args_output_items; int general_work_args_return_value; int work_args_ninput_items; int work_args_noutput_items; - std::vector<void *> work_args_input_items; //TODO this should be const void*, but swig can't int cast it right - std::vector<void *> work_args_output_items; + std::vector<void*> work_args_input_items; // TODO this should be const void*, but swig + // can't int cast it right + std::vector<void*> work_args_output_items; int work_args_return_value; int forecast_args_noutput_items; @@ -86,18 +85,18 @@ namespace gr { bool start_args_return_value; bool stop_args_return_value; - }; - - /*! - * The gateway block which performs all the magic. - * - * The gateway provides access to all the gr::block routines. - * The methods prefixed with gr::block__ are renamed - * to class methods without the prefix in python. - */ - class GR_RUNTIME_API block_gateway : virtual public gr::block - { - public: +}; + +/*! + * The gateway block which performs all the magic. + * + * The gateway provides access to all the gr::block routines. + * The methods prefixed with gr::block__ are renamed + * to class methods without the prefix in python. + */ +class GR_RUNTIME_API block_gateway : virtual public gr::block +{ +public: // gr::block_gateway::sptr typedef boost::shared_ptr<block_gateway> sptr; @@ -111,224 +110,220 @@ namespace gr { * \param factor the decimation or interpolation factor * \return a new gateway block */ - static sptr make(gr::feval_ll *handler, - const std::string &name, + static sptr make(gr::feval_ll* handler, + const std::string& name, gr::io_signature::sptr in_sig, gr::io_signature::sptr out_sig, const block_gw_work_type work_type, const unsigned factor); //! Provide access to the shared message object - virtual block_gw_message_type &block_message(void) = 0; + virtual block_gw_message_type& block_message(void) = 0; - long block__unique_id(void) const { - return gr::block::unique_id(); - } + long block__unique_id(void) const { return gr::block::unique_id(); } - std::string block__name(void) const { - return gr::block::name(); - } + std::string block__name(void) const { return gr::block::name(); } - unsigned block__history(void) const { - return gr::block::history(); - } + unsigned block__history(void) const { return gr::block::history(); } - void block__set_history(unsigned history) { - return gr::block::set_history(history); - } + void block__set_history(unsigned history) { return gr::block::set_history(history); } - void block__set_fixed_rate(bool fixed_rate) { - return gr::block::set_fixed_rate(fixed_rate); + void block__set_fixed_rate(bool fixed_rate) + { + return gr::block::set_fixed_rate(fixed_rate); } - bool block__fixed_rate(void) const { - return gr::block::fixed_rate(); - } + bool block__fixed_rate(void) const { return gr::block::fixed_rate(); } - void block__set_output_multiple(int multiple) { - return gr::block::set_output_multiple(multiple); + void block__set_output_multiple(int multiple) + { + return gr::block::set_output_multiple(multiple); } - void block__set_min_output_buffer(int port, long size) { - return gr::block::set_min_output_buffer(port, size); + void block__set_min_output_buffer(int port, long size) + { + return gr::block::set_min_output_buffer(port, size); } - void block__set_min_output_buffer(long size) { - return gr::block::set_min_output_buffer(size); + void block__set_min_output_buffer(long size) + { + return gr::block::set_min_output_buffer(size); } - int block__output_multiple(void) const { - return gr::block::output_multiple(); - } + int block__output_multiple(void) const { return gr::block::output_multiple(); } - void block__consume(int which_input, int how_many_items) { - return gr::block::consume(which_input, how_many_items); + void block__consume(int which_input, int how_many_items) + { + return gr::block::consume(which_input, how_many_items); } - void block__consume_each(int how_many_items) { - return gr::block::consume_each(how_many_items); + void block__consume_each(int how_many_items) + { + return gr::block::consume_each(how_many_items); } - void block__produce(int which_output, int how_many_items) { - return gr::block::produce(which_output, how_many_items); + void block__produce(int which_output, int how_many_items) + { + return gr::block::produce(which_output, how_many_items); } - void block__set_relative_rate(double relative_rate) { - return gr::block::set_relative_rate(relative_rate); + void block__set_relative_rate(double relative_rate) + { + return gr::block::set_relative_rate(relative_rate); } - void block__set_inverse_relative_rate(double inverse_relative_rate) { - return gr::block::set_inverse_relative_rate(inverse_relative_rate); + void block__set_inverse_relative_rate(double inverse_relative_rate) + { + return gr::block::set_inverse_relative_rate(inverse_relative_rate); } - void block__set_relative_rate(uint64_t interpolation, uint64_t decimation) { - return gr::block::set_relative_rate(interpolation, decimation); + void block__set_relative_rate(uint64_t interpolation, uint64_t decimation) + { + return gr::block::set_relative_rate(interpolation, decimation); } - double block__relative_rate(void) const { - return gr::block::relative_rate(); - } + double block__relative_rate(void) const { return gr::block::relative_rate(); } - uint64_t block__relative_rate_i(void) const { - return gr::block::relative_rate_i(); - } + uint64_t block__relative_rate_i(void) const { return gr::block::relative_rate_i(); } - uint64_t block__relative_rate_d(void) const { - return gr::block::relative_rate_d(); - } + uint64_t block__relative_rate_d(void) const { return gr::block::relative_rate_d(); } - uint64_t block__nitems_read(unsigned int which_input) { - return gr::block::nitems_read(which_input); + uint64_t block__nitems_read(unsigned int which_input) + { + return gr::block::nitems_read(which_input); } - uint64_t block__nitems_written(unsigned int which_output) { - return gr::block::nitems_written(which_output); + uint64_t block__nitems_written(unsigned int which_output) + { + return gr::block::nitems_written(which_output); } - block::tag_propagation_policy_t block__tag_propagation_policy(void) { - return gr::block::tag_propagation_policy(); + block::tag_propagation_policy_t block__tag_propagation_policy(void) + { + return gr::block::tag_propagation_policy(); } - void block__set_tag_propagation_policy(block::tag_propagation_policy_t p) { - return gr::block::set_tag_propagation_policy(p); + void block__set_tag_propagation_policy(block::tag_propagation_policy_t p) + { + return gr::block::set_tag_propagation_policy(p); } - void block__add_item_tag(unsigned int which_output, - const tag_t &tag) + void block__add_item_tag(unsigned int which_output, const tag_t& tag) { - return gr::block::add_item_tag(which_output, tag); + return gr::block::add_item_tag(which_output, tag); } void block__add_item_tag(unsigned int which_output, uint64_t abs_offset, - const pmt::pmt_t &key, - const pmt::pmt_t &value, - const pmt::pmt_t &srcid=pmt::PMT_F) + const pmt::pmt_t& key, + const pmt::pmt_t& value, + const pmt::pmt_t& srcid = pmt::PMT_F) { - return gr::block::add_item_tag(which_output, abs_offset, - key, value, srcid); + return gr::block::add_item_tag(which_output, abs_offset, key, value, srcid); } std::vector<tag_t> block__get_tags_in_range(unsigned int which_input, uint64_t abs_start, uint64_t abs_end) { - std::vector<gr::tag_t> tags; - gr::block::get_tags_in_range(tags, which_input, abs_start, abs_end); - return tags; + std::vector<gr::tag_t> tags; + gr::block::get_tags_in_range(tags, which_input, abs_start, abs_end); + return tags; } std::vector<tag_t> block__get_tags_in_range(unsigned int which_input, uint64_t abs_start, uint64_t abs_end, - const pmt::pmt_t &key) + const pmt::pmt_t& key) { - std::vector<gr::tag_t> tags; - gr::block::get_tags_in_range(tags, which_input, abs_start, abs_end, key); - return tags; + std::vector<gr::tag_t> tags; + gr::block::get_tags_in_range(tags, which_input, abs_start, abs_end, key); + return tags; } std::vector<tag_t> block__get_tags_in_window(unsigned int which_input, uint64_t rel_start, uint64_t rel_end) { - std::vector<gr::tag_t> tags; - gr::block::get_tags_in_window(tags, which_input, rel_start, rel_end); - return tags; + std::vector<gr::tag_t> tags; + gr::block::get_tags_in_window(tags, which_input, rel_start, rel_end); + return tags; } std::vector<tag_t> block__get_tags_in_window(unsigned int which_input, uint64_t rel_start, uint64_t rel_end, - const pmt::pmt_t &key) + const pmt::pmt_t& key) { - std::vector<gr::tag_t> tags; - gr::block::get_tags_in_window(tags, which_input, rel_start, rel_end, key); - return tags; + std::vector<gr::tag_t> tags; + gr::block::get_tags_in_window(tags, which_input, rel_start, rel_end, key); + return tags; } /* Message passing interface */ - void block__message_port_register_in(pmt::pmt_t port_id) { - gr::basic_block::message_port_register_in(port_id); + void block__message_port_register_in(pmt::pmt_t port_id) + { + gr::basic_block::message_port_register_in(port_id); } - void block__message_port_register_out(pmt::pmt_t port_id) { - gr::basic_block::message_port_register_out(port_id); + void block__message_port_register_out(pmt::pmt_t port_id) + { + gr::basic_block::message_port_register_out(port_id); } - void block__message_port_pub(pmt::pmt_t port_id, pmt::pmt_t msg) { - gr::basic_block::message_port_pub(port_id, msg); + void block__message_port_pub(pmt::pmt_t port_id, pmt::pmt_t msg) + { + gr::basic_block::message_port_pub(port_id, msg); } - void block__message_port_sub(pmt::pmt_t port_id, pmt::pmt_t target) { - gr::basic_block::message_port_sub(port_id, target); + void block__message_port_sub(pmt::pmt_t port_id, pmt::pmt_t target) + { + gr::basic_block::message_port_sub(port_id, target); } - void block__message_port_unsub(pmt::pmt_t port_id, pmt::pmt_t target) { - gr::basic_block::message_port_unsub(port_id, target); + void block__message_port_unsub(pmt::pmt_t port_id, pmt::pmt_t target) + { + gr::basic_block::message_port_unsub(port_id, target); } - pmt::pmt_t block__message_subscribers(pmt::pmt_t which_port) { - return gr::basic_block::message_subscribers(which_port); + pmt::pmt_t block__message_subscribers(pmt::pmt_t which_port) + { + return gr::basic_block::message_subscribers(which_port); } - pmt::pmt_t block__message_ports_in() { - return gr::basic_block::message_ports_in(); - } + pmt::pmt_t block__message_ports_in() { return gr::basic_block::message_ports_in(); } - pmt::pmt_t block__message_ports_out() { - return gr::basic_block::message_ports_out(); - } + pmt::pmt_t block__message_ports_out() { return gr::basic_block::message_ports_out(); } - void set_msg_handler_feval(pmt::pmt_t which_port, gr::feval_p *msg_handler) + void set_msg_handler_feval(pmt::pmt_t which_port, gr::feval_p* msg_handler) { - if(msg_queue.find(which_port) == msg_queue.end()) { - throw std::runtime_error("attempt to set_msg_handler_feval() on bad input message port!"); - } - d_msg_handlers_feval[which_port] = msg_handler; + if (msg_queue.find(which_port) == msg_queue.end()) { + throw std::runtime_error( + "attempt to set_msg_handler_feval() on bad input message port!"); + } + d_msg_handlers_feval[which_port] = msg_handler; } - protected: - typedef std::map<pmt::pmt_t, feval_p *, pmt::comparator> msg_handlers_feval_t; +protected: + typedef std::map<pmt::pmt_t, feval_p*, pmt::comparator> msg_handlers_feval_t; msg_handlers_feval_t d_msg_handlers_feval; bool has_msg_handler(pmt::pmt_t which_port) { - return (d_msg_handlers_feval.find(which_port) != d_msg_handlers_feval.end()); + return (d_msg_handlers_feval.find(which_port) != d_msg_handlers_feval.end()); } void dispatch_msg(pmt::pmt_t which_port, pmt::pmt_t msg) { - // Is there a handler? - if(d_msg_handlers_feval.find(which_port) != d_msg_handlers_feval.end()) { - d_msg_handlers_feval[which_port]->calleval(msg); // Yes, invoke it. - } - else { - // Pass to generic dispatcher if not found - gr::basic_block::dispatch_msg(which_port, msg); - } - } - }; + // Is there a handler? + if (d_msg_handlers_feval.find(which_port) != d_msg_handlers_feval.end()) { + d_msg_handlers_feval[which_port]->calleval(msg); // Yes, invoke it. + } else { + // Pass to generic dispatcher if not found + gr::basic_block::dispatch_msg(which_port, msg); + } + } +}; } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/block_registry.h b/gnuradio-runtime/include/gnuradio/block_registry.h index 86e5528dd1..2f12a01bb4 100644 --- a/gnuradio-runtime/include/gnuradio/block_registry.h +++ b/gnuradio-runtime/include/gnuradio/block_registry.h @@ -30,13 +30,13 @@ namespace gr { #ifndef GR_BASIC_BLOCK_H - class basic_block; - class block; +class basic_block; +class block; #endif - class GR_RUNTIME_API block_registry - { - public: +class GR_RUNTIME_API block_registry +{ +public: block_registry(); long block_register(basic_block* block); @@ -52,16 +52,16 @@ namespace gr { void unregister_primitive(std::string blk); void notify_blk(std::string blk); - private: - //typedef std::map< long, basic_block_sptr > blocksubmap_t; - typedef std::map< long, basic_block* > blocksubmap_t; - typedef std::map< std::string, blocksubmap_t > blockmap_t; +private: + // typedef std::map< long, basic_block_sptr > blocksubmap_t; + typedef std::map<long, basic_block*> blocksubmap_t; + typedef std::map<std::string, blocksubmap_t> blockmap_t; blockmap_t d_map; pmt::pmt_t d_ref_map; - std::map< std::string, block*> primitive_map; + std::map<std::string, block*> primitive_map; gr::thread::mutex d_mutex; - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/buffer.h b/gnuradio-runtime/include/gnuradio/buffer.h index 914661b318..d51fb92629 100644 --- a/gnuradio-runtime/include/gnuradio/buffer.h +++ b/gnuradio-runtime/include/gnuradio/buffer.h @@ -32,29 +32,30 @@ namespace gr { - class vmcircbuf; - - /*! - * \brief Allocate a buffer that holds at least \p nitems of size \p sizeof_item. - * - * The total size of the buffer will be rounded up to a system - * dependent boundary. This is typically the system page size, but - * under MS windows is 64KB. - * - * \param nitems is the minimum number of items the buffer will hold. - * \param sizeof_item is the size of an item in bytes. - * \param link is the block that writes to this buffer. - */ - GR_RUNTIME_API buffer_sptr make_buffer(int nitems, size_t sizeof_item, - block_sptr link=block_sptr()); - - /*! - * \brief Single writer, multiple reader fifo. - * \ingroup internal - */ - class GR_RUNTIME_API buffer - { - public: +class vmcircbuf; + +/*! + * \brief Allocate a buffer that holds at least \p nitems of size \p sizeof_item. + * + * The total size of the buffer will be rounded up to a system + * dependent boundary. This is typically the system page size, but + * under MS windows is 64KB. + * + * \param nitems is the minimum number of items the buffer will hold. + * \param sizeof_item is the size of an item in bytes. + * \param link is the block that writes to this buffer. + */ +GR_RUNTIME_API buffer_sptr make_buffer(int nitems, + size_t sizeof_item, + block_sptr link = block_sptr()); + +/*! + * \brief Single writer, multiple reader fifo. + * \ingroup internal + */ +class GR_RUNTIME_API buffer +{ +public: virtual ~buffer(); /*! @@ -78,7 +79,7 @@ namespace gr { * The return value points at space that can hold at least * space_available() items. */ - void *write_pointer(); + void* write_pointer(); /*! * \brief tell buffer that we wrote \p nitems into it @@ -96,7 +97,7 @@ namespace gr { size_t nreaders() const { return d_readers.size(); } buffer_reader* reader(size_t index) { return d_readers[index]; } - gr::thread::mutex *mutex() { return &d_mutex; } + gr::thread::mutex* mutex() { return &d_mutex; } uint64_t nitems_written() { return d_abs_write_offset; } @@ -109,7 +110,7 @@ namespace gr { * * \param tag the new tag */ - void add_item_tag(const tag_t &tag); + void add_item_tag(const tag_t& tag); /*! * \brief Removes an existing tag from the buffer. @@ -123,7 +124,7 @@ namespace gr { * \param tag the tag that needs to be removed * \param id the unique ID of the block calling this function */ - void remove_item_tag(const tag_t &tag, long id); + void remove_item_tag(const tag_t& tag, long id); /*! * \brief Removes all tags before \p max_time from buffer @@ -132,63 +133,76 @@ namespace gr { */ void prune_tags(uint64_t max_time); - std::multimap<uint64_t,tag_t>::iterator get_tags_begin() { return d_item_tags.begin(); } - std::multimap<uint64_t,tag_t>::iterator get_tags_end() { return d_item_tags.end(); } - std::multimap<uint64_t,tag_t>::iterator get_tags_lower_bound(uint64_t x) { return d_item_tags.lower_bound(x); } - std::multimap<uint64_t,tag_t>::iterator get_tags_upper_bound(uint64_t x) { return d_item_tags.upper_bound(x); } + std::multimap<uint64_t, tag_t>::iterator get_tags_begin() + { + return d_item_tags.begin(); + } + std::multimap<uint64_t, tag_t>::iterator get_tags_end() { return d_item_tags.end(); } + std::multimap<uint64_t, tag_t>::iterator get_tags_lower_bound(uint64_t x) + { + return d_item_tags.lower_bound(x); + } + std::multimap<uint64_t, tag_t>::iterator get_tags_upper_bound(uint64_t x) + { + return d_item_tags.upper_bound(x); + } // ------------------------------------------------------------------------- - private: +private: friend class buffer_reader; - friend GR_RUNTIME_API buffer_sptr make_buffer(int nitems, size_t sizeof_item, block_sptr link); - friend GR_RUNTIME_API buffer_reader_sptr buffer_add_reader - (buffer_sptr buf, int nzero_preload, block_sptr link, int delay); - - protected: - char *d_base; // base address of buffer - unsigned int d_bufsize; // in items + friend GR_RUNTIME_API buffer_sptr make_buffer(int nitems, + size_t sizeof_item, + block_sptr link); + friend GR_RUNTIME_API buffer_reader_sptr buffer_add_reader(buffer_sptr buf, + int nzero_preload, + block_sptr link, + int delay); + +protected: + char* d_base; // base address of buffer + unsigned int d_bufsize; // in items // Keep track of maximum sample delay of any reader; Only prune tags past this. unsigned d_max_reader_delay; - private: - gr::vmcircbuf *d_vmcircbuf; - size_t d_sizeof_item; // in bytes - std::vector<buffer_reader *> d_readers; - boost::weak_ptr<block> d_link; // block that writes to this buffer +private: + gr::vmcircbuf* d_vmcircbuf; + size_t d_sizeof_item; // in bytes + std::vector<buffer_reader*> d_readers; + boost::weak_ptr<block> d_link; // block that writes to this buffer // // The mutex protects d_write_index, d_abs_write_offset, d_done, d_item_tags // and the d_read_index's and d_abs_read_offset's in the buffer readers. // - gr::thread::mutex d_mutex; - unsigned int d_write_index; // in items [0,d_bufsize) - uint64_t d_abs_write_offset; // num items written since the start - bool d_done; - std::multimap<uint64_t,tag_t> d_item_tags; - uint64_t d_last_min_items_read; + gr::thread::mutex d_mutex; + unsigned int d_write_index; // in items [0,d_bufsize) + uint64_t d_abs_write_offset; // num items written since the start + bool d_done; + std::multimap<uint64_t, tag_t> d_item_tags; + uint64_t d_last_min_items_read; unsigned index_add(unsigned a, unsigned b) { - unsigned s = a + b; + unsigned s = a + b; - if(s >= d_bufsize) - s -= d_bufsize; + if (s >= d_bufsize) + s -= d_bufsize; - assert(s < d_bufsize); - return s; + assert(s < d_bufsize); + return s; } unsigned index_sub(unsigned a, unsigned b) { - int s = a - b; + int s = a - b; - if(s < 0) - s += d_bufsize; + if (s < 0) + s += d_bufsize; - assert((unsigned) s < d_bufsize); - return s; + assert((unsigned)s < d_bufsize); + return s; } virtual bool allocate_buffer(int nitems, size_t sizeof_item); @@ -211,32 +225,34 @@ namespace gr { /*! * \brief disassociate \p reader from this buffer */ - void drop_reader(buffer_reader *reader); - }; - - /*! - * \brief Create a new gr::buffer_reader and attach it to buffer \p buf - * \param buf is the buffer the \p gr::buffer_reader reads from. - * \param nzero_preload -- number of zero items to "preload" into buffer. - * \param link is the block that reads from the buffer using this gr::buffer_reader. - * \param delay Optional setting to declare the buffer's sample delay. - */ - GR_RUNTIME_API buffer_reader_sptr - buffer_add_reader(buffer_sptr buf, int nzero_preload, block_sptr link=block_sptr(), int delay=0); - - //! returns # of buffers currently allocated - GR_RUNTIME_API long buffer_ncurrently_allocated(); - - - // --------------------------------------------------------------------------- - - /*! - * \brief How we keep track of the readers of a gr::buffer. - * \ingroup internal - */ - class GR_RUNTIME_API buffer_reader - { - public: + void drop_reader(buffer_reader* reader); +}; + +/*! + * \brief Create a new gr::buffer_reader and attach it to buffer \p buf + * \param buf is the buffer the \p gr::buffer_reader reads from. + * \param nzero_preload -- number of zero items to "preload" into buffer. + * \param link is the block that reads from the buffer using this gr::buffer_reader. + * \param delay Optional setting to declare the buffer's sample delay. + */ +GR_RUNTIME_API buffer_reader_sptr buffer_add_reader(buffer_sptr buf, + int nzero_preload, + block_sptr link = block_sptr(), + int delay = 0); + +//! returns # of buffers currently allocated +GR_RUNTIME_API long buffer_ncurrently_allocated(); + + +// --------------------------------------------------------------------------- + +/*! + * \brief How we keep track of the readers of a gr::buffer. + * \ingroup internal + */ +class GR_RUNTIME_API buffer_reader +{ +public: ~buffer_reader(); /*! @@ -276,7 +292,7 @@ namespace gr { * * The return value points to items_available() number of items */ - const void *read_pointer(); + const void* read_pointer(); /* * \brief tell buffer we read \p items from it @@ -286,7 +302,7 @@ namespace gr { void set_done(bool done) { d_buffer->set_done(done); } bool done() const { return d_buffer->done(); } - gr::thread::mutex *mutex() { return d_buffer->mutex(); } + gr::thread::mutex* mutex() { return d_buffer->mutex(); } uint64_t nitems_read() { return d_abs_read_offset; } @@ -311,33 +327,35 @@ namespace gr { * \param v a vector reference to return tags into * \param abs_start a uint64 count of the start of the range of interest * \param abs_end a uint64 count of the end of the range of interest - * \param id the unique ID of the block to make sure already deleted tags are not returned + * \param id the unique ID of the block to make sure already deleted tags + * are not returned */ - void get_tags_in_range(std::vector<tag_t> &v, + void get_tags_in_range(std::vector<tag_t>& v, uint64_t abs_start, uint64_t abs_end, - long id); + long id); // ------------------------------------------------------------------------- - private: +private: friend class buffer; - friend GR_RUNTIME_API buffer_reader_sptr - buffer_add_reader(buffer_sptr buf, int nzero_preload, block_sptr link, int delay); + friend GR_RUNTIME_API buffer_reader_sptr buffer_add_reader(buffer_sptr buf, + int nzero_preload, + block_sptr link, + int delay); - buffer_sptr d_buffer; - unsigned int d_read_index; // in items [0,d->buffer.d_bufsize) - uint64_t d_abs_read_offset; // num items seen since the start - boost::weak_ptr<block> d_link; // block that reads via this buffer reader - unsigned d_attr_delay; // sample delay attribute for tag propagation + buffer_sptr d_buffer; + unsigned int d_read_index; // in items [0,d->buffer.d_bufsize) + uint64_t d_abs_read_offset; // num items seen since the start + boost::weak_ptr<block> d_link; // block that reads via this buffer reader + unsigned d_attr_delay; // sample delay attribute for tag propagation //! constructor is private. Use gr::buffer::add_reader to create instances - buffer_reader(buffer_sptr buffer, unsigned int read_index, - block_sptr link); - }; + buffer_reader(buffer_sptr buffer, unsigned int read_index, block_sptr link); +}; - //! returns # of buffer_readers currently allocated - GR_RUNTIME_API long buffer_reader_ncurrently_allocated (); +//! returns # of buffer_readers currently allocated +GR_RUNTIME_API long buffer_reader_ncurrently_allocated(); } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/constants.h b/gnuradio-runtime/include/gnuradio/constants.h index 95aa80b62c..a0c31159ef 100644 --- a/gnuradio-runtime/include/gnuradio/constants.h +++ b/gnuradio-runtime/include/gnuradio/constants.h @@ -28,65 +28,65 @@ namespace gr { - /*! - * \brief return SYSCONFDIR. Typically ${CMAKE_INSTALL_PREFIX}/etc or /etc - */ - GR_RUNTIME_API const std::string prefix(); - - /*! - * \brief return SYSCONFDIR. Typically ${CMAKE_INSTALL_PREFIX}/etc or /etc - */ - GR_RUNTIME_API const std::string sysconfdir(); - - /*! - * \brief return preferences file directory. Typically ${SYSCONFDIR}/etc/conf.d - */ - GR_RUNTIME_API const std::string prefsdir(); - - /*! - * \brief return date/time of build, as set when 'cmake' is run - */ - GR_RUNTIME_API const std::string build_date(); - - /*! - * \brief return version string defined by cmake (GrVersion.cmake) - */ - GR_RUNTIME_API const std::string version(); - - /*! - * \brief return just the major version defined by cmake - */ - GR_RUNTIME_API const std::string major_version(); - - /*! - * \brief return just the api version defined by cmake - */ - GR_RUNTIME_API const std::string api_version(); - - /*! - * \brief returnjust the minor version defined by cmake - */ - GR_RUNTIME_API const std::string minor_version(); - - /*! - * \brief return C compiler used to build this version of GNU Radio - */ - GR_RUNTIME_API const std::string c_compiler(); - - /*! - * \brief return C++ compiler used to build this version of GNU Radio - */ - GR_RUNTIME_API const std::string cxx_compiler(); - - /*! - * \brief return C and C++ compiler flags used to build this version of GNU Radio - */ - GR_RUNTIME_API const std::string compiler_flags(); - - /*! - * \brief return build-time enabled components - */ - GR_RUNTIME_API const std::string build_time_enabled_components(); +/*! + * \brief return SYSCONFDIR. Typically ${CMAKE_INSTALL_PREFIX}/etc or /etc + */ +GR_RUNTIME_API const std::string prefix(); + +/*! + * \brief return SYSCONFDIR. Typically ${CMAKE_INSTALL_PREFIX}/etc or /etc + */ +GR_RUNTIME_API const std::string sysconfdir(); + +/*! + * \brief return preferences file directory. Typically ${SYSCONFDIR}/etc/conf.d + */ +GR_RUNTIME_API const std::string prefsdir(); + +/*! + * \brief return date/time of build, as set when 'cmake' is run + */ +GR_RUNTIME_API const std::string build_date(); + +/*! + * \brief return version string defined by cmake (GrVersion.cmake) + */ +GR_RUNTIME_API const std::string version(); + +/*! + * \brief return just the major version defined by cmake + */ +GR_RUNTIME_API const std::string major_version(); + +/*! + * \brief return just the api version defined by cmake + */ +GR_RUNTIME_API const std::string api_version(); + +/*! + * \brief returnjust the minor version defined by cmake + */ +GR_RUNTIME_API const std::string minor_version(); + +/*! + * \brief return C compiler used to build this version of GNU Radio + */ +GR_RUNTIME_API const std::string c_compiler(); + +/*! + * \brief return C++ compiler used to build this version of GNU Radio + */ +GR_RUNTIME_API const std::string cxx_compiler(); + +/*! + * \brief return C and C++ compiler flags used to build this version of GNU Radio + */ +GR_RUNTIME_API const std::string compiler_flags(); + +/*! + * \brief return build-time enabled components + */ +GR_RUNTIME_API const std::string build_time_enabled_components(); } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/endianness.h b/gnuradio-runtime/include/gnuradio/endianness.h index 43c21a1c15..614e4c1255 100644 --- a/gnuradio-runtime/include/gnuradio/endianness.h +++ b/gnuradio-runtime/include/gnuradio/endianness.h @@ -25,7 +25,7 @@ namespace gr { - typedef enum {GR_MSB_FIRST, GR_LSB_FIRST} endianness_t; +typedef enum { GR_MSB_FIRST, GR_LSB_FIRST } endianness_t; } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/expj.h b/gnuradio-runtime/include/gnuradio/expj.h index 7556e17011..60486eb011 100644 --- a/gnuradio-runtime/include/gnuradio/expj.h +++ b/gnuradio-runtime/include/gnuradio/expj.h @@ -26,12 +26,11 @@ #include <gnuradio/sincos.h> #include <gnuradio/types.h> -static inline gr_complex -gr_expj(float phase) +static inline gr_complex gr_expj(float phase) { - float t_imag, t_real; - gr::sincosf(phase, &t_imag, &t_real); - return gr_complex(t_real, t_imag); + float t_imag, t_real; + gr::sincosf(phase, &t_imag, &t_real); + return gr_complex(t_real, t_imag); } diff --git a/gnuradio-runtime/include/gnuradio/feval.h b/gnuradio-runtime/include/gnuradio/feval.h index 40e3ad9a55..d366501277 100644 --- a/gnuradio-runtime/include/gnuradio/feval.h +++ b/gnuradio-runtime/include/gnuradio/feval.h @@ -29,158 +29,158 @@ namespace gr { - /*! - * \brief base class for evaluating a function: double -> double - * \ingroup misc - * - * This class is designed to be subclassed in Python or C++ and is - * callable from both places. It uses SWIG's "director" feature to - * implement the magic. - * - * It's slow. Don't use it in a performance critical path. - * - * Override eval to define the behavior. - * Use calleval to invoke eval (this kludge is required to allow a - * python specific "shim" to be inserted. - */ - class GR_RUNTIME_API feval_dd - { - protected: +/*! + * \brief base class for evaluating a function: double -> double + * \ingroup misc + * + * This class is designed to be subclassed in Python or C++ and is + * callable from both places. It uses SWIG's "director" feature to + * implement the magic. + * + * It's slow. Don't use it in a performance critical path. + * + * Override eval to define the behavior. + * Use calleval to invoke eval (this kludge is required to allow a + * python specific "shim" to be inserted. + */ +class GR_RUNTIME_API feval_dd +{ +protected: /*! * \brief override this to define the function */ virtual double eval(double x); - public: +public: feval_dd() {} virtual ~feval_dd(); - virtual double calleval(double x); // invoke "eval" - }; - - /*! - * \brief base class for evaluating a function: complex -> complex - * \ingroup misc - * - * This class is designed to be subclassed in Python or C++ and is - * callable from both places. It uses SWIG's "director" feature to - * implement the magic. - * - * It's slow. Don't use it in a performance critical path. - * - * Override eval to define the behavior. - * Use calleval to invoke eval (this kludge is required to allow a - * python specific "shim" to be inserted. - */ - class GR_RUNTIME_API feval_cc - { - protected: + virtual double calleval(double x); // invoke "eval" +}; + +/*! + * \brief base class for evaluating a function: complex -> complex + * \ingroup misc + * + * This class is designed to be subclassed in Python or C++ and is + * callable from both places. It uses SWIG's "director" feature to + * implement the magic. + * + * It's slow. Don't use it in a performance critical path. + * + * Override eval to define the behavior. + * Use calleval to invoke eval (this kludge is required to allow a + * python specific "shim" to be inserted. + */ +class GR_RUNTIME_API feval_cc +{ +protected: /*! * \brief override this to define the function */ virtual gr_complex eval(gr_complex x); - public: +public: feval_cc() {} virtual ~feval_cc(); - virtual gr_complex calleval(gr_complex x); // invoke "eval" - }; - - /*! - * \brief base class for evaluating a function: long -> long - * \ingroup misc - * - * This class is designed to be subclassed in Python or C++ and is - * callable from both places. It uses SWIG's "director" feature to - * implement the magic. - * - * It's slow. Don't use it in a performance critical path. - * - * Override eval to define the behavior. - * Use calleval to invoke eval (this kludge is required to allow a - * python specific "shim" to be inserted. - */ - class GR_RUNTIME_API feval_ll - { - protected: + virtual gr_complex calleval(gr_complex x); // invoke "eval" +}; + +/*! + * \brief base class for evaluating a function: long -> long + * \ingroup misc + * + * This class is designed to be subclassed in Python or C++ and is + * callable from both places. It uses SWIG's "director" feature to + * implement the magic. + * + * It's slow. Don't use it in a performance critical path. + * + * Override eval to define the behavior. + * Use calleval to invoke eval (this kludge is required to allow a + * python specific "shim" to be inserted. + */ +class GR_RUNTIME_API feval_ll +{ +protected: /*! * \brief override this to define the function */ virtual long eval(long x); - public: +public: feval_ll() {} virtual ~feval_ll(); - virtual long calleval(long x); // invoke "eval" - }; - - /*! - * \brief base class for evaluating a function: void -> void - * \ingroup misc - * - * This class is designed to be subclassed in Python or C++ and is - * callable from both places. It uses SWIG's "director" feature to - * implement the magic. - * - * It's slow. Don't use it in a performance critical path. - * - * Override eval to define the behavior. - * Use calleval to invoke eval (this kludge is required to allow a - * python specific "shim" to be inserted. - */ - class GR_RUNTIME_API feval - { - protected: + virtual long calleval(long x); // invoke "eval" +}; + +/*! + * \brief base class for evaluating a function: void -> void + * \ingroup misc + * + * This class is designed to be subclassed in Python or C++ and is + * callable from both places. It uses SWIG's "director" feature to + * implement the magic. + * + * It's slow. Don't use it in a performance critical path. + * + * Override eval to define the behavior. + * Use calleval to invoke eval (this kludge is required to allow a + * python specific "shim" to be inserted. + */ +class GR_RUNTIME_API feval +{ +protected: /*! * \brief override this to define the function */ virtual void eval(); - public: +public: feval() {} virtual ~feval(); - virtual void calleval(); // invoke "eval" - }; - - /*! - * \brief base class for evaluating a function: pmt -> void - * \ingroup misc - * - * This class is designed to be subclassed in Python or C++ and is - * callable from both places. It uses SWIG's "director" feature to - * implement the magic. - * - * It's slow. Don't use it in a performance critical path. - * - * Override eval to define the behavior. - * Use calleval to invoke eval (this kludge is required to allow a - * python specific "shim" to be inserted. - */ - class GR_RUNTIME_API feval_p - { - protected: + virtual void calleval(); // invoke "eval" +}; + +/*! + * \brief base class for evaluating a function: pmt -> void + * \ingroup misc + * + * This class is designed to be subclassed in Python or C++ and is + * callable from both places. It uses SWIG's "director" feature to + * implement the magic. + * + * It's slow. Don't use it in a performance critical path. + * + * Override eval to define the behavior. + * Use calleval to invoke eval (this kludge is required to allow a + * python specific "shim" to be inserted. + */ +class GR_RUNTIME_API feval_p +{ +protected: /*! * \brief override this to define the function */ virtual void eval(pmt::pmt_t x); - public: +public: feval_p() {} virtual ~feval_p(); - virtual void calleval(pmt::pmt_t x); // invoke "eval" - }; + virtual void calleval(pmt::pmt_t x); // invoke "eval" +}; - /*! - * \brief trivial examples / test cases showing C++ calling Python code - */ - GR_RUNTIME_API double feval_dd_example(feval_dd *f, double x); - GR_RUNTIME_API gr_complex feval_cc_example(feval_cc *f, gr_complex x); - GR_RUNTIME_API long feval_ll_example(feval_ll *f, long x); - GR_RUNTIME_API void feval_example(feval *f); +/*! + * \brief trivial examples / test cases showing C++ calling Python code + */ +GR_RUNTIME_API double feval_dd_example(feval_dd* f, double x); +GR_RUNTIME_API gr_complex feval_cc_example(feval_cc* f, gr_complex x); +GR_RUNTIME_API long feval_ll_example(feval_ll* f, long x); +GR_RUNTIME_API void feval_example(feval* f); } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/flowgraph.h b/gnuradio-runtime/include/gnuradio/flowgraph.h index c7e5cb9a5c..7bef328afe 100644 --- a/gnuradio-runtime/include/gnuradio/flowgraph.h +++ b/gnuradio-runtime/include/gnuradio/flowgraph.h @@ -30,128 +30,138 @@ namespace gr { - /*! - * \brief Class representing a specific input or output graph endpoint - * \ingroup internal - */ - class GR_RUNTIME_API endpoint - { - private: +/*! + * \brief Class representing a specific input or output graph endpoint + * \ingroup internal + */ +class GR_RUNTIME_API endpoint +{ +private: basic_block_sptr d_basic_block; int d_port; - public: - endpoint() : d_basic_block(), d_port(0) { } - endpoint(basic_block_sptr block, int port) { d_basic_block = block; d_port = port; } +public: + endpoint() : d_basic_block(), d_port(0) {} + endpoint(basic_block_sptr block, int port) + { + d_basic_block = block; + d_port = port; + } basic_block_sptr block() const { return d_basic_block; } int port() const { return d_port; } - std::string identifier() const { - return d_basic_block->alias() + ":" + std::to_string(d_port); + std::string identifier() const + { + return d_basic_block->alias() + ":" + std::to_string(d_port); }; bool operator==(const endpoint& other) const; - }; +}; - inline bool endpoint::operator==(const endpoint &other) const - { - return (d_basic_block == other.d_basic_block && - d_port == other.d_port); - } +inline bool endpoint::operator==(const endpoint& other) const +{ + return (d_basic_block == other.d_basic_block && d_port == other.d_port); +} - class GR_RUNTIME_API msg_endpoint - { - private: +class GR_RUNTIME_API msg_endpoint +{ +private: basic_block_sptr d_basic_block; pmt::pmt_t d_port; bool d_is_hier; - public: - msg_endpoint() : d_basic_block(), d_port(pmt::PMT_NIL) { } - msg_endpoint(basic_block_sptr block, pmt::pmt_t port, bool is_hier=false) { - d_basic_block = block; d_port = port; d_is_hier = is_hier; +public: + msg_endpoint() : d_basic_block(), d_port(pmt::PMT_NIL) {} + msg_endpoint(basic_block_sptr block, pmt::pmt_t port, bool is_hier = false) + { + d_basic_block = block; + d_port = port; + d_is_hier = is_hier; } basic_block_sptr block() const { return d_basic_block; } pmt::pmt_t port() const { return d_port; } bool is_hier() const { return d_is_hier; } void set_hier(bool h) { d_is_hier = h; } - std::string identifier() const { - return d_basic_block->alias() + ":" + pmt::symbol_to_string(d_port); + std::string identifier() const + { + return d_basic_block->alias() + ":" + pmt::symbol_to_string(d_port); } - bool operator==(const msg_endpoint &other) const; - }; - - inline bool - msg_endpoint::operator==(const msg_endpoint &other) const - { - return (d_basic_block == other.d_basic_block && - pmt::equal(d_port, other.d_port)); - } - - // Hold vectors of gr::endpoint objects - typedef std::vector<endpoint> endpoint_vector_t; - typedef std::vector<endpoint>::iterator endpoint_viter_t; - - /*! - *\brief Class representing a connection between to graph endpoints - */ - class GR_RUNTIME_API edge - { - public: - edge() : d_src(), d_dst() { }; - edge(const endpoint &src, const endpoint &dst) - : d_src(src), d_dst(dst) { } + bool operator==(const msg_endpoint& other) const; +}; + +inline bool msg_endpoint::operator==(const msg_endpoint& other) const +{ + return (d_basic_block == other.d_basic_block && pmt::equal(d_port, other.d_port)); +} + +// Hold vectors of gr::endpoint objects +typedef std::vector<endpoint> endpoint_vector_t; +typedef std::vector<endpoint>::iterator endpoint_viter_t; + +/*! + *\brief Class representing a connection between to graph endpoints + */ +class GR_RUNTIME_API edge +{ +public: + edge() : d_src(), d_dst(){}; + edge(const endpoint& src, const endpoint& dst) : d_src(src), d_dst(dst) {} ~edge(); - const endpoint &src() const { return d_src; } - const endpoint &dst() const { return d_dst; } - std::string identifier() const { return d_src.identifier() + "->" + d_dst.identifier(); } + const endpoint& src() const { return d_src; } + const endpoint& dst() const { return d_dst; } + std::string identifier() const + { + return d_src.identifier() + "->" + d_dst.identifier(); + } - private: +private: endpoint d_src; endpoint d_dst; - }; - - // Hold vectors of gr::edge objects - typedef std::vector<edge> edge_vector_t; - typedef std::vector<edge>::iterator edge_viter_t; - - - /*! - *\brief Class representing a msg connection between to graph msg endpoints - */ - class GR_RUNTIME_API msg_edge - { - public: - msg_edge() : d_src(), d_dst() { }; - msg_edge(const msg_endpoint &src, const msg_endpoint &dst) - : d_src(src), d_dst(dst) { } +}; + +// Hold vectors of gr::edge objects +typedef std::vector<edge> edge_vector_t; +typedef std::vector<edge>::iterator edge_viter_t; + + +/*! + *\brief Class representing a msg connection between to graph msg endpoints + */ +class GR_RUNTIME_API msg_edge +{ +public: + msg_edge() : d_src(), d_dst(){}; + msg_edge(const msg_endpoint& src, const msg_endpoint& dst) : d_src(src), d_dst(dst) {} ~msg_edge() {} - const msg_endpoint &src() const { return d_src; } - const msg_endpoint &dst() const { return d_dst; } - std::string identifier() const { return d_src.identifier() + "->" + d_dst.identifier(); } + const msg_endpoint& src() const { return d_src; } + const msg_endpoint& dst() const { return d_dst; } + std::string identifier() const + { + return d_src.identifier() + "->" + d_dst.identifier(); + } - private: +private: msg_endpoint d_src; msg_endpoint d_dst; - }; - - // Hold vectors of gr::msg_edge objects - typedef std::vector<msg_edge> msg_edge_vector_t; - typedef std::vector<msg_edge>::iterator msg_edge_viter_t; - - // Create a shared pointer to a heap allocated flowgraph - // (types defined in runtime_types.h) - GR_RUNTIME_API flowgraph_sptr make_flowgraph(); - - /*! - * \brief Class representing a directed, acyclic graph of basic blocks - * \ingroup internal - */ - class GR_RUNTIME_API flowgraph - { - public: +}; + +// Hold vectors of gr::msg_edge objects +typedef std::vector<msg_edge> msg_edge_vector_t; +typedef std::vector<msg_edge>::iterator msg_edge_viter_t; + +// Create a shared pointer to a heap allocated flowgraph +// (types defined in runtime_types.h) +GR_RUNTIME_API flowgraph_sptr make_flowgraph(); + +/*! + * \brief Class representing a directed, acyclic graph of basic blocks + * \ingroup internal + */ +class GR_RUNTIME_API flowgraph +{ +public: friend GR_RUNTIME_API flowgraph_sptr make_flowgraph(); /*! @@ -166,24 +176,28 @@ namespace gr { * destination is unused so far, then adds the edge to the internal list of * edges. */ - void connect(const endpoint &src, const endpoint &dst); + void connect(const endpoint& src, const endpoint& dst); /*! * \brief Disconnect two endpoints */ - void disconnect(const endpoint &src, const endpoint &dst); + void disconnect(const endpoint& src, const endpoint& dst); /*! * \brief convenience wrapper; used to connect two endpoints */ - void connect(basic_block_sptr src_block, int src_port, - basic_block_sptr dst_block, int dst_port); + void connect(basic_block_sptr src_block, + int src_port, + basic_block_sptr dst_block, + int dst_port); /*! * \brief convenience wrapper; used to disconnect two endpoints */ - void disconnect(basic_block_sptr src_block, int src_port, - basic_block_sptr dst_block, int dst_port); + void disconnect(basic_block_sptr src_block, + int src_port, + basic_block_sptr dst_block, + int dst_port); /*! * \brief Connect two message endpoints @@ -191,12 +205,12 @@ namespace gr { * Checks the validity of both endpoints, then adds the edge to the * internal list of edges. */ - void connect(const msg_endpoint &src, const msg_endpoint &dst); + void connect(const msg_endpoint& src, const msg_endpoint& dst); /*! * \brief Disconnect two message endpoints */ - void disconnect(const msg_endpoint &src, const msg_endpoint &dst); + void disconnect(const msg_endpoint& src, const msg_endpoint& dst); /*! * \brief Validate flow graph @@ -214,17 +228,18 @@ namespace gr { /*! * \brief Get vector of edges */ - const edge_vector_t &edges() const { return d_edges; } + const edge_vector_t& edges() const { return d_edges; } /*! * \brief Get vector of message edges */ - const msg_edge_vector_t &msg_edges() const { return d_msg_edges; } + const msg_edge_vector_t& msg_edges() const { return d_msg_edges; } /*! * \brief calculates all used blocks in a flow graph * \details - * Iterates over all message edges and stream edges, noting both endpoints in a vector. + * Iterates over all message edges and stream edges, noting both endpoints in a + * vector. * * \return a unique vector of used blocks */ @@ -237,7 +252,7 @@ namespace gr { * * \return toplogically sorted vector of blocks. All the sources come first. */ - basic_block_vector_t topological_sort(basic_block_vector_t &blocks); + basic_block_vector_t topological_sort(basic_block_vector_t& blocks); /*! * \brief Calculate vector of disjoint graph partions @@ -245,7 +260,7 @@ namespace gr { */ std::vector<basic_block_vector_t> partition(); - protected: +protected: basic_block_vector_t d_blocks; edge_vector_t d_edges; msg_edge_vector_t d_msg_edges; @@ -257,69 +272,70 @@ namespace gr { bool has_block_p(basic_block_sptr block); edge calc_upstream_edge(basic_block_sptr block, int port); - private: +private: void check_valid_port(gr::io_signature::sptr sig, int port); - void check_valid_port(const msg_endpoint &e); - void check_dst_not_used(const endpoint &dst); - void check_type_match(const endpoint &src, const endpoint &dst); - edge_vector_t calc_connections(basic_block_sptr block, bool check_inputs); // false=use outputs - void check_contiguity(basic_block_sptr block, const std::vector<int> &used_ports, bool check_inputs); + void check_valid_port(const msg_endpoint& e); + void check_dst_not_used(const endpoint& dst); + void check_type_match(const endpoint& src, const endpoint& dst); + edge_vector_t calc_connections(basic_block_sptr block, + bool check_inputs); // false=use outputs + void check_contiguity(basic_block_sptr block, + const std::vector<int>& used_ports, + bool check_inputs); basic_block_vector_t calc_downstream_blocks(basic_block_sptr block); - basic_block_vector_t calc_reachable_blocks(basic_block_sptr block, basic_block_vector_t &blocks); - void reachable_dfs_visit(basic_block_sptr block, basic_block_vector_t &blocks); - basic_block_vector_t calc_adjacent_blocks(basic_block_sptr block, basic_block_vector_t &blocks); - basic_block_vector_t sort_sources_first(basic_block_vector_t &blocks); + basic_block_vector_t calc_reachable_blocks(basic_block_sptr block, + basic_block_vector_t& blocks); + void reachable_dfs_visit(basic_block_sptr block, basic_block_vector_t& blocks); + basic_block_vector_t calc_adjacent_blocks(basic_block_sptr block, + basic_block_vector_t& blocks); + basic_block_vector_t sort_sources_first(basic_block_vector_t& blocks); bool source_p(basic_block_sptr block); - void topological_dfs_visit(basic_block_sptr block, basic_block_vector_t &output); - }; - - // Convenience functions - inline - void flowgraph::connect(basic_block_sptr src_block, int src_port, - basic_block_sptr dst_block, int dst_port) - { - connect(endpoint(src_block, src_port), - endpoint(dst_block, dst_port)); - } - - inline - void flowgraph::disconnect(basic_block_sptr src_block, int src_port, - basic_block_sptr dst_block, int dst_port) - { - disconnect(endpoint(src_block, src_port), - endpoint(dst_block, dst_port)); - } - - inline std::ostream& - operator <<(std::ostream &os, const endpoint endp) - { + void topological_dfs_visit(basic_block_sptr block, basic_block_vector_t& output); +}; + +// Convenience functions +inline void flowgraph::connect(basic_block_sptr src_block, + int src_port, + basic_block_sptr dst_block, + int dst_port) +{ + connect(endpoint(src_block, src_port), endpoint(dst_block, dst_port)); +} + +inline void flowgraph::disconnect(basic_block_sptr src_block, + int src_port, + basic_block_sptr dst_block, + int dst_port) +{ + disconnect(endpoint(src_block, src_port), endpoint(dst_block, dst_port)); +} + +inline std::ostream& operator<<(std::ostream& os, const endpoint endp) +{ os << endp.identifier(); return os; - } +} - inline std::ostream& - operator <<(std::ostream &os, const edge edge) - { +inline std::ostream& operator<<(std::ostream& os, const edge edge) +{ os << edge.identifier(); return os; - } +} - inline std::ostream& - operator <<(std::ostream &os, const msg_endpoint endp) - { +inline std::ostream& operator<<(std::ostream& os, const msg_endpoint endp) +{ os << endp.identifier(); return os; - } +} - inline std::ostream& - operator <<(std::ostream &os, const msg_edge edge) - { +inline std::ostream& operator<<(std::ostream& os, const msg_edge edge) +{ os << edge.identifier(); return os; - } +} - std::string dot_graph_fg (flowgraph_sptr fg); +std::string dot_graph_fg(flowgraph_sptr fg); } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/fxpt.h b/gnuradio-runtime/include/gnuradio/fxpt.h index 61c7400d01..9ebcd87acd 100644 --- a/gnuradio-runtime/include/gnuradio/fxpt.h +++ b/gnuradio-runtime/include/gnuradio/fxpt.h @@ -29,18 +29,18 @@ namespace gr { - /*! - * \brief fixed point sine and cosine and friends. - * \ingroup misc - * - * fixed pt radians - * --------- -------- - * -2**31 -pi - * 0 0 - * 2**31-1 pi - epsilon - */ - class GR_RUNTIME_API fxpt - { +/*! + * \brief fixed point sine and cosine and friends. + * \ingroup misc + * + * fixed pt radians + * --------- -------- + * -2**31 -pi + * 0 0 + * 2**31-1 pi - epsilon + */ +class GR_RUNTIME_API fxpt +{ static const int WORDBITS = 32; static const int NBITS = 10; static const float s_sine_table[1 << NBITS][2]; @@ -48,62 +48,54 @@ namespace gr { static const float TAU; static const float TWO_TO_THE_31; - public: - static int32_t - float_to_fixed(float x) +public: + static int32_t float_to_fixed(float x) { - // Fold x into -PI to PI. - int d = (int)std::floor(x/TAU+0.5); - x -= d*TAU; - // And convert to an integer. - return (int32_t) ((float) x * TWO_TO_THE_31 / PI); + // Fold x into -PI to PI. + int d = (int)std::floor(x / TAU + 0.5); + x -= d * TAU; + // And convert to an integer. + return (int32_t)((float)x * TWO_TO_THE_31 / PI); } - static float - fixed_to_float (int32_t x) - { - return x * (PI / TWO_TO_THE_31); - } + static float fixed_to_float(int32_t x) { return x * (PI / TWO_TO_THE_31); } /*! * \brief Given a fixed point angle x, return float sine (x) */ - static float - sin(int32_t x) + static float sin(int32_t x) { - uint32_t ux = x; - int index = ux >> (WORDBITS - NBITS); - return s_sine_table[index][0] * (ux >> 1) + s_sine_table[index][1]; + uint32_t ux = x; + int index = ux >> (WORDBITS - NBITS); + return s_sine_table[index][0] * (ux >> 1) + s_sine_table[index][1]; } /* * \brief Given a fixed point angle x, return float cosine (x) */ - static float - cos (int32_t x) + static float cos(int32_t x) { - uint32_t ux = x + 0x40000000; - int index = ux >> (WORDBITS - NBITS); - return s_sine_table[index][0] * (ux >> 1) + s_sine_table[index][1]; + uint32_t ux = x + 0x40000000; + int index = ux >> (WORDBITS - NBITS); + return s_sine_table[index][0] * (ux >> 1) + s_sine_table[index][1]; } /* * \brief Given a fixedpoint angle x, return float cos(x) and sin (x) */ - static void sincos(int32_t x, float *s, float *c) + static void sincos(int32_t x, float* s, float* c) { - uint32_t ux = x; - int sin_index = ux >> (WORDBITS - NBITS); - *s = s_sine_table[sin_index][0] * (ux >> 1) + s_sine_table[sin_index][1]; + uint32_t ux = x; + int sin_index = ux >> (WORDBITS - NBITS); + *s = s_sine_table[sin_index][0] * (ux >> 1) + s_sine_table[sin_index][1]; - ux = x + 0x40000000; - int cos_index = ux >> (WORDBITS - NBITS); - *c = s_sine_table[cos_index][0] * (ux >> 1) + s_sine_table[cos_index][1]; + ux = x + 0x40000000; + int cos_index = ux >> (WORDBITS - NBITS); + *c = s_sine_table[cos_index][0] * (ux >> 1) + s_sine_table[cos_index][1]; - return; + return; } - - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/fxpt_nco.h b/gnuradio-runtime/include/gnuradio/fxpt_nco.h index b3eafadecf..7ad519cb94 100644 --- a/gnuradio-runtime/include/gnuradio/fxpt_nco.h +++ b/gnuradio-runtime/include/gnuradio/fxpt_nco.h @@ -30,148 +30,143 @@ namespace gr { - /*! - * \brief Numerically Controlled Oscillator (NCO) - * \ingroup misc - */ - class /*GR_RUNTIME_API*/ fxpt_nco - { +/*! + * \brief Numerically Controlled Oscillator (NCO) + * \ingroup misc + */ +class /*GR_RUNTIME_API*/ fxpt_nco +{ uint32_t d_phase; int32_t d_phase_inc; - public: +public: fxpt_nco() : d_phase(0), d_phase_inc(0) {} ~fxpt_nco() {} // radians - void set_phase(float angle) { - d_phase = gr::fxpt::float_to_fixed(angle); - } + void set_phase(float angle) { d_phase = gr::fxpt::float_to_fixed(angle); } - void adjust_phase(float delta_phase) { - d_phase += gr::fxpt::float_to_fixed(delta_phase); + void adjust_phase(float delta_phase) + { + d_phase += gr::fxpt::float_to_fixed(delta_phase); } // angle_rate is in radians / step - void set_freq(float angle_rate){ - d_phase_inc = gr::fxpt::float_to_fixed(angle_rate); + void set_freq(float angle_rate) + { + d_phase_inc = gr::fxpt::float_to_fixed(angle_rate); } // angle_rate is a delta in radians / step void adjust_freq(float delta_angle_rate) { - d_phase_inc += gr::fxpt::float_to_fixed(delta_angle_rate); + d_phase_inc += gr::fxpt::float_to_fixed(delta_angle_rate); } // increment current phase angle - void step() - { - d_phase += d_phase_inc; - } + void step() { d_phase += d_phase_inc; } - void step(int n) - { - d_phase += d_phase_inc * n; - } + void step(int n) { d_phase += d_phase_inc * n; } // units are radians / step float get_phase() const { return gr::fxpt::fixed_to_float(d_phase); } float get_freq() const { return gr::fxpt::fixed_to_float(d_phase_inc); } // compute sin and cos for current phase angle - void sincos(float *sinx, float *cosx) const + void sincos(float* sinx, float* cosx) const { - *sinx = gr::fxpt::sin(d_phase); - *cosx = gr::fxpt::cos(d_phase); + *sinx = gr::fxpt::sin(d_phase); + *cosx = gr::fxpt::cos(d_phase); } // compute cos and sin for a block of phase angles - void sincos(gr_complex *output, int noutput_items, double ampl=1.0) + void sincos(gr_complex* output, int noutput_items, double ampl = 1.0) { - for(int i = 0; i < noutput_items; i++) { - output[i] = gr_complex(gr::fxpt::cos(d_phase) * ampl, gr::fxpt::sin(d_phase) * ampl); - step(); - } + for (int i = 0; i < noutput_items; i++) { + output[i] = + gr_complex(gr::fxpt::cos(d_phase) * ampl, gr::fxpt::sin(d_phase) * ampl); + step(); + } } // compute sin for a block of phase angles - void sin(float *output, int noutput_items, double ampl=1.0) + void sin(float* output, int noutput_items, double ampl = 1.0) { - for(int i = 0; i < noutput_items; i++) { - output[i] = (float)(gr::fxpt::sin(d_phase) * ampl); - step(); - } + for (int i = 0; i < noutput_items; i++) { + output[i] = (float)(gr::fxpt::sin(d_phase) * ampl); + step(); + } } // compute cos for a block of phase angles - void cos(float *output, int noutput_items, double ampl=1.0) + void cos(float* output, int noutput_items, double ampl = 1.0) { - for(int i = 0; i < noutput_items; i++) { - output[i] = (float)(gr::fxpt::cos(d_phase) * ampl); - step (); - } + for (int i = 0; i < noutput_items; i++) { + output[i] = (float)(gr::fxpt::cos(d_phase) * ampl); + step(); + } } - + // compute sin for a block of phase angles - void sin(std::int8_t *output, int noutput_items, double ampl=1.0) + void sin(std::int8_t* output, int noutput_items, double ampl = 1.0) { - for(int i = 0; i < noutput_items; i++) { - output[i] = (std::int8_t)(gr::fxpt::sin(d_phase) * ampl); - step(); - } + for (int i = 0; i < noutput_items; i++) { + output[i] = (std::int8_t)(gr::fxpt::sin(d_phase) * ampl); + step(); + } } // compute cos for a block of phase angles - void cos(std::int8_t *output, int noutput_items, double ampl=1.0) + void cos(std::int8_t* output, int noutput_items, double ampl = 1.0) { - for(int i = 0; i < noutput_items; i++) { - output[i] = (std::int8_t)(gr::fxpt::cos(d_phase) * ampl); - step(); - } + for (int i = 0; i < noutput_items; i++) { + output[i] = (std::int8_t)(gr::fxpt::cos(d_phase) * ampl); + step(); + } } // compute sin for a block of phase angles - void sin(short *output, int noutput_items, double ampl=1.0) + void sin(short* output, int noutput_items, double ampl = 1.0) { - for(int i = 0; i < noutput_items; i++) { - output[i] = (short)(gr::fxpt::sin(d_phase) * ampl); - step(); - } + for (int i = 0; i < noutput_items; i++) { + output[i] = (short)(gr::fxpt::sin(d_phase) * ampl); + step(); + } } // compute cos for a block of phase angles - void cos(short *output, int noutput_items, double ampl=1.0) + void cos(short* output, int noutput_items, double ampl = 1.0) { - for(int i = 0; i < noutput_items; i++) { - output[i] = (short)(gr::fxpt::cos(d_phase) * ampl); - step(); - } + for (int i = 0; i < noutput_items; i++) { + output[i] = (short)(gr::fxpt::cos(d_phase) * ampl); + step(); + } } // compute sin for a block of phase angles - void sin(int *output, int noutput_items, double ampl=1.0) + void sin(int* output, int noutput_items, double ampl = 1.0) { - for(int i = 0; i < noutput_items; i++) { - output[i] = (int)(gr::fxpt::sin(d_phase) * ampl); - step(); - } + for (int i = 0; i < noutput_items; i++) { + output[i] = (int)(gr::fxpt::sin(d_phase) * ampl); + step(); + } } // compute cos for a block of phase angles - void cos(int *output, int noutput_items, double ampl=1.0) + void cos(int* output, int noutput_items, double ampl = 1.0) { - for(int i = 0; i < noutput_items; i++) { - output[i] = (int)(gr::fxpt::cos(d_phase) * ampl); - step(); - } + for (int i = 0; i < noutput_items; i++) { + output[i] = (int)(gr::fxpt::cos(d_phase) * ampl); + step(); + } } // compute cos or sin for current phase angle float cos() const { return gr::fxpt::cos(d_phase); } float sin() const { return gr::fxpt::sin(d_phase); } - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/fxpt_vco.h b/gnuradio-runtime/include/gnuradio/fxpt_vco.h index a6bde65f1f..28ab74654d 100644 --- a/gnuradio-runtime/include/gnuradio/fxpt_vco.h +++ b/gnuradio-runtime/include/gnuradio/fxpt_vco.h @@ -29,62 +29,61 @@ namespace gr { - /*! - * \brief Voltage Controlled Oscillator (VCO) - * \ingroup misc - */ - class /*GR_RUNTIME_API*/ fxpt_vco { +/*! + * \brief Voltage Controlled Oscillator (VCO) + * \ingroup misc + */ +class /*GR_RUNTIME_API*/ fxpt_vco +{ int32_t d_phase; - public: - fxpt_vco () : d_phase(0) {} +public: + fxpt_vco() : d_phase(0) {} ~fxpt_vco() {} // radians - void set_phase(float angle) { - d_phase = fxpt::float_to_fixed(angle); - } + void set_phase(float angle) { d_phase = fxpt::float_to_fixed(angle); } - void adjust_phase(float delta_phase) { - d_phase += fxpt::float_to_fixed(delta_phase); - } + void adjust_phase(float delta_phase) { d_phase += fxpt::float_to_fixed(delta_phase); } - float get_phase() const { - return fxpt::fixed_to_float(d_phase); - } + float get_phase() const { return fxpt::fixed_to_float(d_phase); } // compute sin and cos for current phase angle - void sincos(float *sinx, float *cosx) const + void sincos(float* sinx, float* cosx) const { - *sinx = fxpt::sin(d_phase); - *cosx = fxpt::cos(d_phase); + *sinx = fxpt::sin(d_phase); + *cosx = fxpt::cos(d_phase); } // compute complex sine a block at a time - void sincos(gr_complex *output, const float *input, int noutput_items, - float k, float ampl = 1.0) + void sincos(gr_complex* output, + const float* input, + int noutput_items, + float k, + float ampl = 1.0) { - for(int i = 0; i < noutput_items; i++) { - output[i] = gr_complex((float)(fxpt::cos(d_phase) * ampl), - (float)(fxpt::sin(d_phase) * ampl)); - adjust_phase(input[i] * k); - } + for (int i = 0; i < noutput_items; i++) { + output[i] = gr_complex((float)(fxpt::cos(d_phase) * ampl), + (float)(fxpt::sin(d_phase) * ampl)); + adjust_phase(input[i] * k); + } } // compute a block at a time - void cos(float *output, const float *input, int noutput_items, float k, float ampl = 1.0) + void + cos(float* output, const float* input, int noutput_items, float k, float ampl = 1.0) { - for(int i = 0; i < noutput_items; i++) { - output[i] = (float)(fxpt::cos(d_phase) * ampl); - adjust_phase(input[i] * k); - } + for (int i = 0; i < noutput_items; i++) { + output[i] = (float)(fxpt::cos(d_phase) * ampl); + adjust_phase(input[i] * k); + } } // compute cos or sin for current phase angle float cos() const { return fxpt::cos(d_phase); } float sin() const { return fxpt::sin(d_phase); } - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/gr_complex.h b/gnuradio-runtime/include/gnuradio/gr_complex.h index 807f208b41..694729306e 100644 --- a/gnuradio-runtime/include/gnuradio/gr_complex.h +++ b/gnuradio-runtime/include/gnuradio/gr_complex.h @@ -24,16 +24,43 @@ #define INCLUDED_GR_COMPLEX_H #include <complex> -typedef std::complex<float> gr_complex; -typedef std::complex<double> gr_complexd; +typedef std::complex<float> gr_complex; +typedef std::complex<double> gr_complexd; -inline bool is_complex (gr_complex x) { (void) x; return true;} -inline bool is_complex (gr_complexd x) { (void) x; return true;} -inline bool is_complex (float x) { (void) x; return false;} -inline bool is_complex (double x) { (void) x; return false;} -inline bool is_complex (int x) { (void) x; return false;} -inline bool is_complex (char x) { (void) x; return false;} -inline bool is_complex (short x) { (void) x; return false;} +inline bool is_complex(gr_complex x) +{ + (void)x; + return true; +} +inline bool is_complex(gr_complexd x) +{ + (void)x; + return true; +} +inline bool is_complex(float x) +{ + (void)x; + return false; +} +inline bool is_complex(double x) +{ + (void)x; + return false; +} +inline bool is_complex(int x) +{ + (void)x; + return false; +} +inline bool is_complex(char x) +{ + (void)x; + return false; +} +inline bool is_complex(short x) +{ + (void)x; + return false; +} #endif /* INCLUDED_GR_COMPLEX_H */ - diff --git a/gnuradio-runtime/include/gnuradio/hier_block2.h b/gnuradio-runtime/include/gnuradio/hier_block2.h index b7c6be2441..78c5f3c183 100644 --- a/gnuradio-runtime/include/gnuradio/hier_block2.h +++ b/gnuradio-runtime/include/gnuradio/hier_block2.h @@ -28,43 +28,42 @@ namespace gr { - /*! - * \brief public constructor for hier_block2 - */ - GR_RUNTIME_API hier_block2_sptr - make_hier_block2(const std::string &name, - gr::io_signature::sptr input_signature, - gr::io_signature::sptr output_signature); - - class hier_block2_detail; - - /*! - * \brief Hierarchical container class for gr::block's and gr::hier_block2's - * \ingroup container_blk - * \ingroup base_blk - */ - class GR_RUNTIME_API hier_block2 : public basic_block - { - private: +/*! + * \brief public constructor for hier_block2 + */ +GR_RUNTIME_API hier_block2_sptr make_hier_block2(const std::string& name, + gr::io_signature::sptr input_signature, + gr::io_signature::sptr output_signature); + +class hier_block2_detail; + +/*! + * \brief Hierarchical container class for gr::block's and gr::hier_block2's + * \ingroup container_blk + * \ingroup base_blk + */ +class GR_RUNTIME_API hier_block2 : public basic_block +{ +private: friend class hier_block2_detail; friend GR_RUNTIME_API hier_block2_sptr - make_hier_block2(const std::string &name, - gr::io_signature::sptr input_signature, - gr::io_signature::sptr output_signature); + make_hier_block2(const std::string& name, + gr::io_signature::sptr input_signature, + gr::io_signature::sptr output_signature); /*! * \brief Private implementation details of gr::hier_block2 */ - hier_block2_detail *d_detail; + hier_block2_detail* d_detail; - protected: +protected: hier_block2(void) {} // allows pure virtual interface sub-classes - hier_block2(const std::string &name, + hier_block2(const std::string& name, gr::io_signature::sptr input_signature, gr::io_signature::sptr output_signature); - public: +public: virtual ~hier_block2(); /*! @@ -102,8 +101,7 @@ namespace gr { * gr-blocks or hierarchical blocks to the internal flowgraph, and * wires the specified output port to the specified input port. */ - void connect(basic_block_sptr src, int src_port, - basic_block_sptr dst, int dst_port); + void connect(basic_block_sptr src, int src_port, basic_block_sptr dst, int dst_port); /*! * \brief Add gr-blocks or hierarchical blocks to internal graph @@ -113,14 +111,22 @@ namespace gr { * gr-blocks or hierarchical blocks to the internal message port * subscription */ - void msg_connect(basic_block_sptr src, pmt::pmt_t srcport, - basic_block_sptr dst, pmt::pmt_t dstport); - void msg_connect(basic_block_sptr src, std::string srcport, - basic_block_sptr dst, std::string dstport); - void msg_disconnect(basic_block_sptr src, pmt::pmt_t srcport, - basic_block_sptr dst, pmt::pmt_t dstport); - void msg_disconnect(basic_block_sptr src, std::string srcport, - basic_block_sptr dst, std::string dstport); + void msg_connect(basic_block_sptr src, + pmt::pmt_t srcport, + basic_block_sptr dst, + pmt::pmt_t dstport); + void msg_connect(basic_block_sptr src, + std::string srcport, + basic_block_sptr dst, + std::string dstport); + void msg_disconnect(basic_block_sptr src, + pmt::pmt_t srcport, + basic_block_sptr dst, + pmt::pmt_t dstport); + void msg_disconnect(basic_block_sptr src, + std::string srcport, + basic_block_sptr dst, + std::string dstport); /*! * \brief Remove a gr-block or hierarchical block from the @@ -138,8 +144,8 @@ namespace gr { * This disconnects the specified input port from the specified * output port of a pair of gr-blocks or hierarchical blocks. */ - void disconnect(basic_block_sptr src, int src_port, - basic_block_sptr dst, int dst_port); + void + disconnect(basic_block_sptr src, int src_port, basic_block_sptr dst, int dst_port); /*! * \brief Disconnect all connections in the internal flowgraph. @@ -174,7 +180,7 @@ namespace gr { /*! * \brief Returns max buffer size (itemcount) on output port \p i. */ - int max_output_buffer(size_t port=0); + int max_output_buffer(size_t port = 0); /*! * \brief Sets max buffer size (itemcount) on all output ports. @@ -189,7 +195,7 @@ namespace gr { /*! * \brief Returns min buffer size (itemcount) on output port \p i. */ - int min_output_buffer(size_t port=0); + int min_output_buffer(size_t port = 0); /*! * \brief Sets min buffer size (itemcount) on all output ports. @@ -208,39 +214,49 @@ namespace gr { hier_block2_sptr to_hier_block2(); // Needed for Python type coercion - bool has_msg_port(pmt::pmt_t which_port) { - return message_port_is_hier(which_port) || basic_block::has_msg_port(which_port); + bool has_msg_port(pmt::pmt_t which_port) + { + return message_port_is_hier(which_port) || basic_block::has_msg_port(which_port); } - bool message_port_is_hier(pmt::pmt_t port_id) { - return message_port_is_hier_in(port_id) || message_port_is_hier_out(port_id); + bool message_port_is_hier(pmt::pmt_t port_id) + { + return message_port_is_hier_in(port_id) || message_port_is_hier_out(port_id); } - bool message_port_is_hier_in(pmt::pmt_t port_id) { - return pmt::list_has(hier_message_ports_in, port_id); + bool message_port_is_hier_in(pmt::pmt_t port_id) + { + return pmt::list_has(hier_message_ports_in, port_id); } - bool message_port_is_hier_out(pmt::pmt_t port_id) { - return pmt::list_has(hier_message_ports_out, port_id); + bool message_port_is_hier_out(pmt::pmt_t port_id) + { + return pmt::list_has(hier_message_ports_out, port_id); } pmt::pmt_t hier_message_ports_in; pmt::pmt_t hier_message_ports_out; - void message_port_register_hier_in(pmt::pmt_t port_id) { - if(pmt::list_has(hier_message_ports_in, port_id)) - throw std::invalid_argument("hier msg in port by this name already registered"); - if(msg_queue.find(port_id) != msg_queue.end()) - throw std::invalid_argument("block already has a primitive input port by this name"); - hier_message_ports_in = pmt::list_add(hier_message_ports_in, port_id); + void message_port_register_hier_in(pmt::pmt_t port_id) + { + if (pmt::list_has(hier_message_ports_in, port_id)) + throw std::invalid_argument( + "hier msg in port by this name already registered"); + if (msg_queue.find(port_id) != msg_queue.end()) + throw std::invalid_argument( + "block already has a primitive input port by this name"); + hier_message_ports_in = pmt::list_add(hier_message_ports_in, port_id); } - void message_port_register_hier_out(pmt::pmt_t port_id) { - if(pmt::list_has(hier_message_ports_out, port_id)) - throw std::invalid_argument("hier msg out port by this name already registered"); - if(pmt::dict_has_key(d_message_subscribers, port_id)) - throw std::invalid_argument("block already has a primitive output port by this name"); - hier_message_ports_out = pmt::list_add(hier_message_ports_out, port_id); + void message_port_register_hier_out(pmt::pmt_t port_id) + { + if (pmt::list_has(hier_message_ports_out, port_id)) + throw std::invalid_argument( + "hier msg out port by this name already registered"); + if (pmt::dict_has_key(d_message_subscribers, port_id)) + throw std::invalid_argument( + "block already has a primitive output port by this name"); + hier_message_ports_out = pmt::list_add(hier_message_ports_out, port_id); } /*! @@ -248,7 +264,7 @@ namespace gr { * * \param mask a vector of ints of the core numbers available to this block. */ - void set_processor_affinity(const std::vector<int> &mask); + void set_processor_affinity(const std::vector<int>& mask); /*! * \brief Remove processor affinity for all blocks in hier_block2. @@ -267,23 +283,23 @@ namespace gr { std::vector<int> processor_affinity(); /*! - * \brief Set the logger's output level. - * - * Sets the level of the logger for all connected blocks. This takes - * a string that is translated to the standard levels and can be - * (case insensitive): - * - * \li off , notset - * \li debug - * \li info - * \li notice - * \li warn - * \li error - * \li crit - * \li alert - * \li fatal - * \li emerg - */ + * \brief Set the logger's output level. + * + * Sets the level of the logger for all connected blocks. This takes + * a string that is translated to the standard levels and can be + * (case insensitive): + * + * \li off , notset + * \li debug + * \li info + * \li notice + * \li warn + * \li error + * \li crit + * \li alert + * \li fatal + * \li emerg + */ void set_log_level(std::string level); /*! @@ -306,16 +322,17 @@ namespace gr { * should be set or just the block ports connected to the hier ports. */ bool all_max_output_buffer_p(void); - }; +}; - /*! - * \brief Return hierarchical block's flow graph represented in dot language - */ - GR_RUNTIME_API std::string dot_graph(hier_block2_sptr hierblock2); +/*! + * \brief Return hierarchical block's flow graph represented in dot language + */ +GR_RUNTIME_API std::string dot_graph(hier_block2_sptr hierblock2); - inline hier_block2_sptr cast_to_hier_block2_sptr(basic_block_sptr block) { +inline hier_block2_sptr cast_to_hier_block2_sptr(basic_block_sptr block) +{ return boost::dynamic_pointer_cast<hier_block2, basic_block>(block); - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/high_res_timer.h b/gnuradio-runtime/include/gnuradio/high_res_timer.h index 5f6a285a11..f12b3e09bf 100644 --- a/gnuradio-runtime/include/gnuradio/high_res_timer.h +++ b/gnuradio-runtime/include/gnuradio/high_res_timer.h @@ -28,129 +28,143 @@ // Use architecture defines to determine the implementation //////////////////////////////////////////////////////////////////////// #if defined(linux) || defined(__linux) || defined(__linux__) - #define GNURADIO_HRT_USE_CLOCK_GETTIME - #include <ctime> +#define GNURADIO_HRT_USE_CLOCK_GETTIME +#include <ctime> #elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) - #define GNURADIO_HRT_USE_QUERY_PERFORMANCE_COUNTER +#define GNURADIO_HRT_USE_QUERY_PERFORMANCE_COUNTER #elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) - #define GNURADIO_HRT_USE_MACH_ABSOLUTE_TIME +#define GNURADIO_HRT_USE_MACH_ABSOLUTE_TIME #elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) - #define GNURADIO_HRT_USE_CLOCK_GETTIME - #include <ctime> +#define GNURADIO_HRT_USE_CLOCK_GETTIME +#include <ctime> #else - #define GNURADIO_HRT_USE_MICROSEC_CLOCK +#define GNURADIO_HRT_USE_MICROSEC_CLOCK #endif //////////////////////////////////////////////////////////////////////// namespace gr { - //! Typedef for the timer tick count - typedef signed long long high_res_timer_type; +//! Typedef for the timer tick count +typedef signed long long high_res_timer_type; - //! Get the current time in ticks - high_res_timer_type high_res_timer_now(void); +//! Get the current time in ticks +high_res_timer_type high_res_timer_now(void); - //! Get the current time in ticks - for performance monitoring - high_res_timer_type high_res_timer_now_perfmon(void); +//! Get the current time in ticks - for performance monitoring +high_res_timer_type high_res_timer_now_perfmon(void); - //! Get the number of ticks per second - high_res_timer_type high_res_timer_tps(void); +//! Get the number of ticks per second +high_res_timer_type high_res_timer_tps(void); - //! Get the tick count at the epoch - high_res_timer_type high_res_timer_epoch(void); +//! Get the tick count at the epoch +high_res_timer_type high_res_timer_epoch(void); #ifdef GNURADIO_HRT_USE_CLOCK_GETTIME - //! storage for high res timer type - GR_RUNTIME_API extern clockid_t high_res_timer_source; +//! storage for high res timer type +GR_RUNTIME_API extern clockid_t high_res_timer_source; #endif } /* namespace gr */ //////////////////////////////////////////////////////////////////////// #ifdef GNURADIO_HRT_USE_CLOCK_GETTIME - inline gr::high_res_timer_type gr::high_res_timer_now(void){ - timespec ts; - clock_gettime(CLOCK_MONOTONIC, &ts); - return ts.tv_sec*high_res_timer_tps() + ts.tv_nsec; - } - - inline gr::high_res_timer_type gr::high_res_timer_now_perfmon(void){ - timespec ts; - clock_gettime(high_res_timer_source, &ts); - return ts.tv_sec*high_res_timer_tps() + ts.tv_nsec; - } - - inline gr::high_res_timer_type gr::high_res_timer_tps(void){ - return 1000000000UL; - } +inline gr::high_res_timer_type gr::high_res_timer_now(void) +{ + timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return ts.tv_sec * high_res_timer_tps() + ts.tv_nsec; +} + +inline gr::high_res_timer_type gr::high_res_timer_now_perfmon(void) +{ + timespec ts; + clock_gettime(high_res_timer_source, &ts); + return ts.tv_sec * high_res_timer_tps() + ts.tv_nsec; +} + +inline gr::high_res_timer_type gr::high_res_timer_tps(void) { return 1000000000UL; } #endif /* GNURADIO_HRT_USE_CLOCK_GETTIME */ //////////////////////////////////////////////////////////////////////// #ifdef GNURADIO_HRT_USE_MACH_ABSOLUTE_TIME - #include <mach/mach_time.h> +#include <mach/mach_time.h> - inline gr::high_res_timer_type gr::high_res_timer_now(void){ - return mach_absolute_time(); - } +inline gr::high_res_timer_type gr::high_res_timer_now(void) +{ + return mach_absolute_time(); +} - inline gr::high_res_timer_type gr::high_res_timer_now_perfmon(void){ - return gr::high_res_timer_now(); - } +inline gr::high_res_timer_type gr::high_res_timer_now_perfmon(void) +{ + return gr::high_res_timer_now(); +} - inline gr::high_res_timer_type gr::high_res_timer_tps(void){ - mach_timebase_info_data_t info; - mach_timebase_info(&info); - return gr::high_res_timer_type(info.numer*1000000000UL)/info.denom; - } +inline gr::high_res_timer_type gr::high_res_timer_tps(void) +{ + mach_timebase_info_data_t info; + mach_timebase_info(&info); + return gr::high_res_timer_type(info.numer * 1000000000UL) / info.denom; +} #endif //////////////////////////////////////////////////////////////////////// #ifdef GNURADIO_HRT_USE_QUERY_PERFORMANCE_COUNTER - #include <windows.h> - - inline gr::high_res_timer_type gr::high_res_timer_now(void){ - LARGE_INTEGER counts; - QueryPerformanceCounter(&counts); - return counts.QuadPart; - } - - inline gr::high_res_timer_type gr::high_res_timer_now_perfmon(void){ - return gr::high_res_timer_now(); - } - - inline gr::high_res_timer_type gr::high_res_timer_tps(void){ - LARGE_INTEGER freq; - QueryPerformanceFrequency(&freq); - return freq.QuadPart; - } +#include <windows.h> + +inline gr::high_res_timer_type gr::high_res_timer_now(void) +{ + LARGE_INTEGER counts; + QueryPerformanceCounter(&counts); + return counts.QuadPart; +} + +inline gr::high_res_timer_type gr::high_res_timer_now_perfmon(void) +{ + return gr::high_res_timer_now(); +} + +inline gr::high_res_timer_type gr::high_res_timer_tps(void) +{ + LARGE_INTEGER freq; + QueryPerformanceFrequency(&freq); + return freq.QuadPart; +} #endif //////////////////////////////////////////////////////////////////////// #ifdef GNURADIO_HRT_USE_MICROSEC_CLOCK - #include <boost/date_time/posix_time/posix_time.hpp> +#include <boost/date_time/posix_time/posix_time.hpp> - inline gr::high_res_timer_type gr::high_res_timer_now(void){ - static const boost::posix_time::ptime epoch(boost::posix_time::from_time_t(0)); - return (boost::posix_time::microsec_clock::universal_time() - epoch).ticks(); - } +inline gr::high_res_timer_type gr::high_res_timer_now(void) +{ + static const boost::posix_time::ptime epoch(boost::posix_time::from_time_t(0)); + return (boost::posix_time::microsec_clock::universal_time() - epoch).ticks(); +} - inline gr::high_res_timer_type gr::high_res_timer_now_perfmon(void){ - return gr::high_res_timer_now(); - } +inline gr::high_res_timer_type gr::high_res_timer_now_perfmon(void) +{ + return gr::high_res_timer_now(); +} - inline gr::high_res_timer_type gr::high_res_timer_tps(void){ - return boost::posix_time::time_duration::ticks_per_second(); - } +inline gr::high_res_timer_type gr::high_res_timer_tps(void) +{ + return boost::posix_time::time_duration::ticks_per_second(); +} #endif //////////////////////////////////////////////////////////////////////// #include <boost/date_time/posix_time/posix_time.hpp> -inline gr::high_res_timer_type gr::high_res_timer_epoch(void){ - static const double hrt_ticks_per_utc_ticks = gr::high_res_timer_tps()/double(boost::posix_time::time_duration::ticks_per_second()); - boost::posix_time::time_duration utc = boost::posix_time::microsec_clock::universal_time() - boost::posix_time::from_time_t(0); - return gr::high_res_timer_now() - utc.ticks()*hrt_ticks_per_utc_ticks; +inline gr::high_res_timer_type gr::high_res_timer_epoch(void) +{ + static const double hrt_ticks_per_utc_ticks = + gr::high_res_timer_tps() / + double(boost::posix_time::time_duration::ticks_per_second()); + boost::posix_time::time_duration utc = + boost::posix_time::microsec_clock::universal_time() - + boost::posix_time::from_time_t(0); + return gr::high_res_timer_now() - utc.ticks() * hrt_ticks_per_utc_ticks; } #endif /* INCLUDED_GNURADIO_HIGH_RES_TIMER_H */ diff --git a/gnuradio-runtime/include/gnuradio/io_signature.h b/gnuradio-runtime/include/gnuradio/io_signature.h index 973f93cd98..dfdd89794e 100644 --- a/gnuradio-runtime/include/gnuradio/io_signature.h +++ b/gnuradio-runtime/include/gnuradio/io_signature.h @@ -28,20 +28,21 @@ namespace gr { - /*! - * \brief i/o signature for input and output ports. - * \brief misc - */ - class GR_RUNTIME_API io_signature - { - int d_min_streams; - int d_max_streams; - std::vector<int> d_sizeof_stream_item; +/*! + * \brief i/o signature for input and output ports. + * \brief misc + */ +class GR_RUNTIME_API io_signature +{ + int d_min_streams; + int d_max_streams; + std::vector<int> d_sizeof_stream_item; - io_signature(int min_streams, int max_streams, - const std::vector<int> &sizeof_stream_items); + io_signature(int min_streams, + int max_streams, + const std::vector<int>& sizeof_stream_items); - public: +public: typedef boost::shared_ptr<io_signature> sptr; static const int IO_INFINITE = -1; @@ -53,21 +54,22 @@ namespace gr { * * \ingroup internal * \param min_streams specify minimum number of streams (>= 0) - * \param max_streams specify maximum number of streams (>= min_streams or -1 -> infinite) - * \param sizeof_stream_item specify the size of the items in each stream + * \param max_streams specify maximum number of streams (>= min_streams or -1 -> + * infinite) \param sizeof_stream_item specify the size of the items in each stream */ - static sptr make(int min_streams, int max_streams, - int sizeof_stream_item); + static sptr make(int min_streams, int max_streams, int sizeof_stream_item); /*! * \brief Create an i/o signature * * \param min_streams specify minimum number of streams (>= 0) - * \param max_streams specify maximum number of streams (>= min_streams or -1 -> infinite) - * \param sizeof_stream_item1 specify the size of the items in the first stream - * \param sizeof_stream_item2 specify the size of the items in the second and subsequent streams + * \param max_streams specify maximum number of streams (>= min_streams or -1 -> + * infinite) \param sizeof_stream_item1 specify the size of the items in the first + * stream \param sizeof_stream_item2 specify the size of the items in the second and + * subsequent streams */ - static sptr make2(int min_streams, int max_streams, + static sptr make2(int min_streams, + int max_streams, int sizeof_stream_item1, int sizeof_stream_item2); @@ -75,12 +77,14 @@ namespace gr { * \brief Create an i/o signature * * \param min_streams specify minimum number of streams (>= 0) - * \param max_streams specify maximum number of streams (>= min_streams or -1 -> infinite) - * \param sizeof_stream_item1 specify the size of the items in the first stream - * \param sizeof_stream_item2 specify the size of the items in the second stream - * \param sizeof_stream_item3 specify the size of the items in the third and subsequent streams + * \param max_streams specify maximum number of streams (>= min_streams or -1 -> + * infinite) \param sizeof_stream_item1 specify the size of the items in the first + * stream \param sizeof_stream_item2 specify the size of the items in the second + * stream \param sizeof_stream_item3 specify the size of the items in the third and + * subsequent streams */ - static sptr make3(int min_streams, int max_streams, + static sptr make3(int min_streams, + int max_streams, int sizeof_stream_item1, int sizeof_stream_item2, int sizeof_stream_item3); @@ -89,22 +93,22 @@ namespace gr { * \brief Create an i/o signature * * \param min_streams specify minimum number of streams (>= 0) - * \param max_streams specify maximum number of streams (>= min_streams or -1 -> infinite) - * \param sizeof_stream_items specify the size of the items in the streams + * \param max_streams specify maximum number of streams (>= min_streams or -1 -> + * infinite) \param sizeof_stream_items specify the size of the items in the streams * * If there are more streams than there are entries in * sizeof_stream_items, the value of the last entry in * sizeof_stream_items is used for the missing values. * sizeof_stream_items must contain at least 1 entry. */ - static sptr makev(int min_streams, int max_streams, - const std::vector<int> &sizeof_stream_items); + static sptr + makev(int min_streams, int max_streams, const std::vector<int>& sizeof_stream_items); int min_streams() const { return d_min_streams; } int max_streams() const { return d_max_streams; } int sizeof_stream_item(int index) const; std::vector<int> sizeof_stream_items() const; - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/logger.h b/gnuradio-runtime/include/gnuradio/logger.h index 7bb3521e3c..5c62ac2d78 100644 --- a/gnuradio-runtime/include/gnuradio/logger.h +++ b/gnuradio-runtime/include/gnuradio/logger.h @@ -24,10 +24,10 @@ #define INCLUDED_GR_LOGGER_H /*! -* \ingroup logging -* \brief GNU Radio logging wrapper for log4cpp library (C++ port of log4j) -* -*/ + * \ingroup logging + * \brief GNU Radio logging wrapper for log4cpp library (C++ port of log4j) + * + */ #ifdef _MSC_VER typedef int mode_t; @@ -52,231 +52,299 @@ typedef int mode_t; namespace gr { - /*! - * \brief GR_LOG macros - * \ingroup logging - * - * These macros wrap the standard LOG4CPP_LEVEL macros. The availablie macros - * are: - * LOG_DEBUG - * LOG_INFO - * LOG_WARN - * LOG_TRACE - * LOG_ERROR - * LOG_ALERT - * LOG_CRIT - * LOG_FATAL - * LOG_EMERG - */ - typedef log4cpp::Category* logger_ptr; +/*! + * \brief GR_LOG macros + * \ingroup logging + * + * These macros wrap the standard LOG4CPP_LEVEL macros. The availablie macros + * are: + * LOG_DEBUG + * LOG_INFO + * LOG_WARN + * LOG_TRACE + * LOG_ERROR + * LOG_ALERT + * LOG_CRIT + * LOG_FATAL + * LOG_EMERG + */ +typedef log4cpp::Category* logger_ptr; } /* namespace gr */ - /* Macros for Programmatic Configuration */ -#define GR_LOG_DECLARE_LOGPTR(logger) \ - gr::logger_ptr logger +/* Macros for Programmatic Configuration */ +#define GR_LOG_DECLARE_LOGPTR(logger) gr::logger_ptr logger -#define GR_LOG_ASSIGN_LOGPTR(logger,name) \ - logger = gr::logger_get_logger(name) +#define GR_LOG_ASSIGN_LOGPTR(logger, name) logger = gr::logger_get_logger(name) -#define GR_CONFIG_LOGGER(config) \ - gr::logger_config::load_config(config) +#define GR_CONFIG_LOGGER(config) gr::logger_config::load_config(config) -#define GR_CONFIG_AND_WATCH_LOGGER(config,period) \ - gr::logger_config::load_config(config,period) +#define GR_CONFIG_AND_WATCH_LOGGER(config, period) \ + gr::logger_config::load_config(config, period) -#define GR_LOG_GETLOGGER(logger, name) \ - gr::logger_ptr logger = gr::logger_get_logger(name) +#define GR_LOG_GETLOGGER(logger, name) gr::logger_ptr logger = gr::logger_get_logger(name) -#define GR_SET_LEVEL(name, level) { \ - gr::logger_ptr logger = gr::logger_get_logger(name); \ - gr::logger_set_level(logger,level);} +#define GR_SET_LEVEL(name, level) \ + { \ + gr::logger_ptr logger = gr::logger_get_logger(name); \ + gr::logger_set_level(logger, level); \ + } -#define GR_LOG_SET_LEVEL(logger, level) \ - gr::logger_set_level(logger, level) +#define GR_LOG_SET_LEVEL(logger, level) gr::logger_set_level(logger, level) -#define GR_GET_LEVEL(name, level) { \ - gr::logger_ptr logger = gr::logger_get_logger(name); \ - gr::logger_get_level(logger,level);} +#define GR_GET_LEVEL(name, level) \ + { \ + gr::logger_ptr logger = gr::logger_get_logger(name); \ + gr::logger_get_level(logger, level); \ + } -#define GR_LOG_GET_LEVEL(logger, level) \ - gr::logger_get_level(logger,level) +#define GR_LOG_GET_LEVEL(logger, level) gr::logger_get_level(logger, level) -#define GR_ADD_CONSOLE_APPENDER(name, target, pattern) { \ - gr::logger_ptr logger = gr::logger_get_logger(name); \ - gr::logger_add_console_appender(logger,target,pattern);} +#define GR_ADD_CONSOLE_APPENDER(name, target, pattern) \ + { \ + gr::logger_ptr logger = gr::logger_get_logger(name); \ + gr::logger_add_console_appender(logger, target, pattern); \ + } -#define GR_LOG_ADD_CONSOLE_APPENDER(logger, target, pattern) { \ - gr::logger_add_console_appender(logger,target,pattern);} +#define GR_LOG_ADD_CONSOLE_APPENDER(logger, target, pattern) \ + { \ + gr::logger_add_console_appender(logger, target, pattern); \ + } -#define GR_SET_CONSOLE_APPENDER(name, target, pattern) { \ - gr::logger_ptr logger = gr::logger_get_logger(name); \ - gr::logger_set_console_appender(logger,target,pattern);} +#define GR_SET_CONSOLE_APPENDER(name, target, pattern) \ + { \ + gr::logger_ptr logger = gr::logger_get_logger(name); \ + gr::logger_set_console_appender(logger, target, pattern); \ + } -#define GR_LOG_SET_CONSOLE_APPENDER(logger, target, pattern) { \ - gr::logger_set_console_appender(logger,target,pattern);} +#define GR_LOG_SET_CONSOLE_APPENDER(logger, target, pattern) \ + { \ + gr::logger_set_console_appender(logger, target, pattern); \ + } -#define GR_ADD_FILE_APPENDER(name, filename, append, pattern) { \ - gr::logger_ptr logger = gr::logger_get_logger(name); \ - gr::logger_add_file_appender(logger,filename,append,pattern);} +#define GR_ADD_FILE_APPENDER(name, filename, append, pattern) \ + { \ + gr::logger_ptr logger = gr::logger_get_logger(name); \ + gr::logger_add_file_appender(logger, filename, append, pattern); \ + } -#define GR_LOG_ADD_FILE_APPENDER(logger, filename, append, pattern) { \ - gr::logger_add_file_appender(logger,filename,append,pattern);} +#define GR_LOG_ADD_FILE_APPENDER(logger, filename, append, pattern) \ + { \ + gr::logger_add_file_appender(logger, filename, append, pattern); \ + } -#define GR_SET_FILE_APPENDER(name, filename, append, pattern) { \ - gr::logger_ptr logger = gr::logger_get_logger(name); \ - gr::logger_set_file_appender(logger,filename,append,pattern);} +#define GR_SET_FILE_APPENDER(name, filename, append, pattern) \ + { \ + gr::logger_ptr logger = gr::logger_get_logger(name); \ + gr::logger_set_file_appender(logger, filename, append, pattern); \ + } -#define GR_LOG_SET_FILE_APPENDER(logger, filename, append, pattern) { \ - gr::logger_set_file_appender(logger,filename,append,pattern);} +#define GR_LOG_SET_FILE_APPENDER(logger, filename, append, pattern) \ + { \ + gr::logger_set_file_appender(logger, filename, append, pattern); \ + } -#define GR_ADD_ROLLINGFILE_APPENDER(name, filename, filesize, bkup_index, append, mode, pattern) { \ - gr::logger_ptr logger = gr::logger_get_logger(name); \ - gr::logger_add_rollingfile_appender(logger,filename,filesize,bkup_index,append,mode,pattern);} +#define GR_ADD_ROLLINGFILE_APPENDER( \ + name, filename, filesize, bkup_index, append, mode, pattern) \ + { \ + gr::logger_ptr logger = gr::logger_get_logger(name); \ + gr::logger_add_rollingfile_appender( \ + logger, filename, filesize, bkup_index, append, mode, pattern); \ + } -#define GR_LOG_ADD_ROLLINGFILE_APPENDER(logger, filename, filesize, bkup_index, append, mode, pattern) { \ - gr::logger_add_rollingfile_appender(logger,filename,filesize,bkup_index,append,mode,pattern);} +#define GR_LOG_ADD_ROLLINGFILE_APPENDER( \ + logger, filename, filesize, bkup_index, append, mode, pattern) \ + { \ + gr::logger_add_rollingfile_appender( \ + logger, filename, filesize, bkup_index, append, mode, pattern); \ + } -#define GR_GET_LOGGER_NAMES(names) { \ - names = gr::logger_get_logger_names();} +#define GR_GET_LOGGER_NAMES(names) \ + { \ + names = gr::logger_get_logger_names(); \ + } -#define GR_RESET_CONFIGURATION() \ - gr::logger_config::reset_config(); +#define GR_RESET_CONFIGURATION() gr::logger_config::reset_config(); - /* Logger name referenced macros */ -#define GR_DEBUG(name, msg) { \ - gr::logger_ptr logger = gr::logger_get_logger(name); \ - *logger<< log4cpp::Priority::DEBUG << msg << log4cpp::eol;} +/* Logger name referenced macros */ +#define GR_DEBUG(name, msg) \ + { \ + gr::logger_ptr logger = gr::logger_get_logger(name); \ + *logger << log4cpp::Priority::DEBUG << msg << log4cpp::eol; \ + } -#define GR_INFO(name, msg) { \ - gr::logger_ptr logger = gr::logger_get_logger(name); \ - *logger<< log4cpp::Priority::INFO << msg << log4cpp::eol;} +#define GR_INFO(name, msg) \ + { \ + gr::logger_ptr logger = gr::logger_get_logger(name); \ + *logger << log4cpp::Priority::INFO << msg << log4cpp::eol; \ + } -#define GR_NOTICE(name, msg) { \ - gr::logger_ptr logger = gr::logger_get_logger(name); \ - *logger << log4cpp::Priority::NOTICE << msg;} +#define GR_NOTICE(name, msg) \ + { \ + gr::logger_ptr logger = gr::logger_get_logger(name); \ + *logger << log4cpp::Priority::NOTICE << msg; \ + } -#define GR_WARN(name, msg) { \ - gr::logger_ptr logger = gr::logger_get_logger(name); \ - *logger<< log4cpp::Priority::WARN << msg << log4cpp::eol;} +#define GR_WARN(name, msg) \ + { \ + gr::logger_ptr logger = gr::logger_get_logger(name); \ + *logger << log4cpp::Priority::WARN << msg << log4cpp::eol; \ + } -#define GR_ERROR(name, msg) { \ - gr::logger_ptr logger = gr::logger_get_logger(name); \ - *logger<< log4cpp::Priority::ERROR << msg << log4cpp::eol;} +#define GR_ERROR(name, msg) \ + { \ + gr::logger_ptr logger = gr::logger_get_logger(name); \ + *logger << log4cpp::Priority::ERROR << msg << log4cpp::eol; \ + } -#define GR_CRIT(name, msg) { \ - gr::logger_ptr logger = gr::logger_get_logger(name); \ - *logger<< log4cpp::Priority::CRIT << msg << log4cpp::eol;} +#define GR_CRIT(name, msg) \ + { \ + gr::logger_ptr logger = gr::logger_get_logger(name); \ + *logger << log4cpp::Priority::CRIT << msg << log4cpp::eol; \ + } -#define GR_ALERT(name, msg) { \ - gr::logger_ptr logger = gr::logger_get_logger(name); \ - *logger<< log4cpp::Priority::ALERT << msg << log4cpp::eol;} +#define GR_ALERT(name, msg) \ + { \ + gr::logger_ptr logger = gr::logger_get_logger(name); \ + *logger << log4cpp::Priority::ALERT << msg << log4cpp::eol; \ + } -#define GR_FATAL(name, msg) { \ - gr::logger_ptr logger = gr::logger_get_logger(name); \ - *logger<< log4cpp::Priority::FATAL << msg << log4cpp::eol;} +#define GR_FATAL(name, msg) \ + { \ + gr::logger_ptr logger = gr::logger_get_logger(name); \ + *logger << log4cpp::Priority::FATAL << msg << log4cpp::eol; \ + } -#define GR_EMERG(name, msg) { \ - gr::logger_ptr logger = gr::logger_get_logger(name); \ - *logger<< log4cpp::Priority::EMERG << msg << log4cpp::eol;} +#define GR_EMERG(name, msg) \ + { \ + gr::logger_ptr logger = gr::logger_get_logger(name); \ + *logger << log4cpp::Priority::EMERG << msg << log4cpp::eol; \ + } -#define GR_ERRORIF(name, cond, msg) { \ - if((cond)) { \ - gr::logger_ptr logger = gr::logger_get_logger(name); \ - *logger<< log4cpp::Priority::ERROR << msg << log4cpp::eol;} \ - } +#define GR_ERRORIF(name, cond, msg) \ + { \ + if ((cond)) { \ + gr::logger_ptr logger = gr::logger_get_logger(name); \ + *logger << log4cpp::Priority::ERROR << msg << log4cpp::eol; \ + } \ + } -#define GR_ASSERT(name, cond, msg) { \ - if(!(cond)) { \ - gr::logger_ptr logger = gr::logger_get_logger(name); \ - *logger<< log4cpp::Priority::EMERG << msg << log4cpp::eol;} \ - assert(0); \ - } +#define GR_ASSERT(name, cond, msg) \ + { \ + if (!(cond)) { \ + gr::logger_ptr logger = gr::logger_get_logger(name); \ + *logger << log4cpp::Priority::EMERG << msg << log4cpp::eol; \ + } \ + assert(0); \ + } - /* LoggerPtr Referenced Macros */ -#define GR_LOG_DEBUG(logger, msg) { \ - *logger << log4cpp::Priority::DEBUG << msg << log4cpp::eol;} +/* LoggerPtr Referenced Macros */ +#define GR_LOG_DEBUG(logger, msg) \ + { \ + *logger << log4cpp::Priority::DEBUG << msg << log4cpp::eol; \ + } -#define GR_LOG_INFO(logger, msg) { \ - *logger << log4cpp::Priority::INFO << msg << log4cpp::eol;} +#define GR_LOG_INFO(logger, msg) \ + { \ + *logger << log4cpp::Priority::INFO << msg << log4cpp::eol; \ + } -#define GR_LOG_NOTICE(logger, msg) { \ - *logger << log4cpp::Priority::NOTICE << msg << log4cpp::eol;} +#define GR_LOG_NOTICE(logger, msg) \ + { \ + *logger << log4cpp::Priority::NOTICE << msg << log4cpp::eol; \ + } -#define GR_LOG_WARN(logger, msg) { \ - *logger << log4cpp::Priority::WARN << msg << log4cpp::eol;} +#define GR_LOG_WARN(logger, msg) \ + { \ + *logger << log4cpp::Priority::WARN << msg << log4cpp::eol; \ + } -#define GR_LOG_ERROR(logger, msg) { \ - *logger << log4cpp::Priority::ERROR << msg << log4cpp::eol;} +#define GR_LOG_ERROR(logger, msg) \ + { \ + *logger << log4cpp::Priority::ERROR << msg << log4cpp::eol; \ + } -#define GR_LOG_CRIT(logger, msg) { \ - *logger << log4cpp::Priority::CRIT << msg << log4cpp::eol;} +#define GR_LOG_CRIT(logger, msg) \ + { \ + *logger << log4cpp::Priority::CRIT << msg << log4cpp::eol; \ + } -#define GR_LOG_ALERT(logger, msg) { \ - *logger << log4cpp::Priority::ALERT << msg << log4cpp::eol;} +#define GR_LOG_ALERT(logger, msg) \ + { \ + *logger << log4cpp::Priority::ALERT << msg << log4cpp::eol; \ + } -#define GR_LOG_FATAL(logger, msg) { \ - *logger << log4cpp::Priority::FATAL << msg << log4cpp::eol;} +#define GR_LOG_FATAL(logger, msg) \ + { \ + *logger << log4cpp::Priority::FATAL << msg << log4cpp::eol; \ + } -#define GR_LOG_EMERG(logger, msg) { \ - *logger << log4cpp::Priority::EMERG << msg << log4cpp::eol;} +#define GR_LOG_EMERG(logger, msg) \ + { \ + *logger << log4cpp::Priority::EMERG << msg << log4cpp::eol; \ + } -#define GR_LOG_ERRORIF(logger,cond, msg) { \ - if((cond)) { \ - *logger<< log4cpp::Priority::ERROR << msg << log4cpp::eol;} \ - } +#define GR_LOG_ERRORIF(logger, cond, msg) \ + { \ + if ((cond)) { \ + *logger << log4cpp::Priority::ERROR << msg << log4cpp::eol; \ + } \ + } -#define GR_LOG_ASSERT(logger, cond, msg) { \ - if(!(cond)) { \ - *logger<< log4cpp::Priority::EMERG << msg << log4cpp::eol; \ - assert(0);} \ - } +#define GR_LOG_ASSERT(logger, cond, msg) \ + { \ + if (!(cond)) { \ + *logger << log4cpp::Priority::EMERG << msg << log4cpp::eol; \ + assert(0); \ + } \ + } namespace gr { - /*! - * \brief Class to control configuration of logger. - * This is a singleton that can launch a thread to watch a config file for changes - * \ingroup logging - */ - class GR_RUNTIME_API logger_config - { - private: +/*! + * \brief Class to control configuration of logger. + * This is a singleton that can launch a thread to watch a config file for changes + * \ingroup logging + */ +class GR_RUNTIME_API logger_config +{ +private: /*! \brief filename of logger config file */ std::string filename; - /*! \brief Period (seconds) over which watcher thread checks config file for changes */ + /*! \brief Period (seconds) over which watcher thread checks config file for changes + */ unsigned int watch_period; /*! \brief Pointer to watch thread for config file changes */ - boost::thread *watch_thread; + boost::thread* watch_thread; /*! \brief Watcher thread method * /param filename Name of configuration file * /param watch_period Seconds between checks for changes in config file */ - static void watch_file(std::string filename,unsigned int watch_period); + static void watch_file(std::string filename, unsigned int watch_period); static bool logger_configured; - logger_config()/*: - rpc_get_filename("logger_config", "filename", &logger_config::get_filename4rpc, - pmt::mp(""), pmt::mp(""), pmt::mp(""), - "", "filename", RPC_PRIVLVL_MIN, - DISPTIME | DISPOPTSTRIP), - rpc_get_watchperiod("logger_config", "watch_period", &logger_config::get_watchperiod4rpc, - pmt::mp(0), pmt::mp(32768), pmt::mp(0), - "", "watch_period", RPC_PRIVLVL_MIN, - DISPTIME | DISPOPTSTRIP), - rpc_get_config("logger_config", "config", &logger_config::get_config4rpc, - pmt::mp(""), pmt::mp(""), pmt::mp(""), - "", "filename", RPC_PRIVLVL_MIN, - DISPTIME | DISPOPTSTRIP), - rpc_set_config("logger_config","config", &logger_config::set_config4rpc, - pmt::mp(""), pmt::mp(""), pmt::mp(""), - "", "filename", RPC_PRIVLVL_MIN, - DISPTIME | DISPOPTSTRIP) - */ + logger_config() /*: + rpc_get_filename("logger_config", "filename", &logger_config::get_filename4rpc, + pmt::mp(""), pmt::mp(""), pmt::mp(""), + "", "filename", RPC_PRIVLVL_MIN, + DISPTIME | DISPOPTSTRIP), + rpc_get_watchperiod("logger_config", "watch_period", + &logger_config::get_watchperiod4rpc, pmt::mp(0), pmt::mp(32768), pmt::mp(0), + "", "watch_period", RPC_PRIVLVL_MIN, + DISPTIME | DISPOPTSTRIP), + rpc_get_config("logger_config", "config", &logger_config::get_config4rpc, + pmt::mp(""), pmt::mp(""), pmt::mp(""), + "", "filename", RPC_PRIVLVL_MIN, + DISPTIME | DISPOPTSTRIP), + rpc_set_config("logger_config","config", &logger_config::set_config4rpc, + pmt::mp(""), pmt::mp(""), pmt::mp(""), + "", "filename", RPC_PRIVLVL_MIN, + DISPTIME | DISPOPTSTRIP) + */ { - } //!< Constructor + } //!< Constructor /* rpcbasic_register_get<logger_config,std::string> rpc_get_filename; @@ -285,31 +353,23 @@ namespace gr { rpcbasic_register_set<logger_config,std::string> rpc_set_config; */ - logger_config(logger_config const&); //!<Copy constructor - void operator=(logger_config const&); //!<Assignment Operator + logger_config(logger_config const&); //!< Copy constructor + void operator=(logger_config const&); //!< Assignment Operator - std::string get_filename4rpc() { - return filename; - } - int get_watchperiod4rpc(){return watch_period;}; + std::string get_filename4rpc() { return filename; } + int get_watchperiod4rpc() { return watch_period; }; - std::string get_config4rpc() { - return filename; - } + std::string get_config4rpc() { return filename; } - void set_config4rpc(std::string set) { - printf("Set string was:%s\n", set.c_str()); - } + void set_config4rpc(std::string set) { printf("Set string was:%s\n", set.c_str()); } /*! \brief destructor stops watch thread before exits */ - ~logger_config() { - stop_watch(); - } + ~logger_config() { stop_watch(); } /*! \brief Instance getter for singleton. Only used by class. */ static logger_config& get_instance(void); - public: +public: /*! \brief Getter for config filename */ static std::string get_filename(); /*! \brief Getter for watch period */ @@ -318,331 +378,339 @@ namespace gr { * /param filename Name of configuration file * /param watch_period Seconds between checks for changes in config file */ - static void load_config(std::string filename,unsigned int watch_period=0); + static void load_config(std::string filename, unsigned int watch_period = 0); /*! \brief Method to stop watcher thread */ static void stop_watch(); /*! \brief method to reset logger configuration */ static void reset_config(void); - }; - - /*! - * \brief Retrieve a pointer to a logger by name - * - * Retrieves a logger pointer - * \p name. - * - * \param name Name of the logger for which a pointer is requested - */ - GR_RUNTIME_API logger_ptr logger_get_logger(std::string name); - - /*! - * \brief Load logger's configuration file. - * - * Initialize the GNU Radio logger by loading the configuration file - * \p config_filename. - * - * \param config_filename The configuration file. Set to "" for the - * basic logger that outputs to the console. - */ - GR_RUNTIME_API bool logger_load_config(const std::string &config_filename=""); - - /*! - * \brief Reset logger's configuration file. - * - * Remove all appenders from loggers - */ - GR_RUNTIME_API void logger_reset_config(void); - - /*! - * \brief Set the logger's output level. - * - * Sets the level of the logger. This takes a string that is - * translated to the standard levels and can be (case insensitive): - * - * \li off , notset - * \li debug - * \li info - * \li notice - * \li warn - * \li error - * \li crit - * \li alert - * \li fatal - * \li emerg - * - * \param logger the logger to set the level of. - * \param level string to set the level to. - */ - GR_RUNTIME_API void logger_set_level(logger_ptr logger, - const std::string &level); - - /*! - * \brief Set the logger's output level. - * - * Sets the level of the logger. This takes the actual Log4cpp::Priority - * data type, which can be: - * - * \li log4cpp::Priority::NOTSET - * \li log4cpp::Priority::DEBUG - * \li log4cpp::Priority::INFO - * \li log4cpp::Priority::NOTICE - * \li log4cpp::Priority::WARN - * \li log4cpp::Priority::ERROR - * \li log4cpp::Priority::CRIT - * \li log4cpp::Priority::ALERT - * \li log4cpp::Priority::FATAL - * \li log4cpp::Priority::EMERG - * - * \param logger the logger to set the level of. - * \param level new logger level of type Log4cpp::Priority - */ - GR_RUNTIME_API void logger_set_level(logger_ptr logger, - log4cpp::Priority::Value level); - - /*! - * \brief Get the logger's output level. - * - * Gets the level of the logger. This returns a string that - * corresponds to the standard levels and can be (case insensitive): - * - * \li notset - * \li debug - * \li info - * \li notice - * \li warn - * \li error - * \li crit - * \li alert - * \li fatal - * \li emerg - * - * \param logger the logger to get the level of. - * \param level string to get the level into. - */ - GR_RUNTIME_API void logger_get_level(logger_ptr logger, std::string &level); - - /*! - * \brief Get the logger's output level. - * - * Gets the level of the logger. This returns the actual Log4cpp::Level - * data type, which can be: - * - * \li log4cpp::Priority::NOTSET - * \li log4cpp::Priority::DEBUG - * \li log4cpp::Priority::INFO - * \li log4cpp::Priority::NOTICE - * \li log4cpp::Priority::WARN - * \li log4cpp::Priority::ERROR - * \li log4cpp::Priority::CRIT - * \li log4cpp::Priority::ALERT - * \li log4cpp::Priority::FATAL - * \li log4cpp::Priority::EMERG - * - * \param logger the logger to get the level of. - * \param level of the logger. - */ - GR_RUNTIME_API void logger_get_level(logger_ptr logger, - log4cpp::Priority::Value &level); - - /*! - * \brief Add console appender to a given logger - * - * Add console appender to a given logger - * - * \param logger Logger to which appender will be added - * \param appender Name of appender to add to logger - */ - GR_RUNTIME_API void logger_add_appender(logger_ptr logger, - std::string appender); - - /*! - * \brief Sets a console appender to a given logger. Deletes any - * existing appenders and adds a new one. To add an additional - * appender, use logger_add_appender. - * - * \param logger Logger to which appender will be added - * \param appender Name of appender to add to logger - */ - GR_RUNTIME_API void logger_set_appender(logger_ptr logger, - std::string appender); - - /*! - * \brief Add console appender to a given logger - * - * Add console appender to a given logger - * - * \param logger Logger to which appender will be added - * \param target Std target to write 'cout' or 'cerr' (default is cout) - * \param pattern Formatting pattern for log messages - */ - GR_RUNTIME_API void logger_add_console_appender(logger_ptr logger, - std::string target, - std::string pattern); - - /*! - * \brief Sets a new console appender to a given logger after - * removing all others. Use logger_add_console_appender to add - * another. - * - * \param logger Logger to which appender will be added - * \param target Std target to write 'cout' or 'cerr' (default is cout) - * \param pattern Formatting pattern for log messages - */ - GR_RUNTIME_API void logger_set_console_appender(logger_ptr logger, - std::string target, - std::string pattern); - - /*! - * \brief Add file appender to a given logger - * - * Add file appender to a given logger - * - * \param logger Logger to which appender will be added - * \param filename File to which log will be written - * \param append Overwrite or append to log file - * \param pattern Formatting pattern for log messages - */ - GR_RUNTIME_API void logger_add_file_appender(logger_ptr logger, - std::string filename, - bool append, std::string pattern); - - /*! - * \brief Set a file appender to a given logger. To add another file - * appender, use logger_add_file_appender. - * - * \param logger Logger to which appender will be added - * \param filename File to which log will be written - * \param append Overwrite or append to log file - * \param pattern Formatting pattern for log messages - */ - GR_RUNTIME_API void logger_set_file_appender(logger_ptr logger, - std::string filename, - bool append, std::string pattern); - - /*! - * \brief Add rolling file appender to a given logger - * - * Add rolling file appender to a given logger - * - * \param logger Logger to which appender will be added - * \param filename File to which log will be written - * \param filesize Sizez of files to write - * \param bkup_index Number of files to write - * \param append Overwrite or append to log file - * \param mode Permissions to set on log file - * \param pattern Formatting pattern for log messages - */ - GR_RUNTIME_API void logger_add_rollingfile_appender(logger_ptr logger, std::string filename, - size_t filesize, int bkup_index, bool append, - mode_t mode,std::string pattern); - - /*! - * \brief Add rolling file appender to a given logger - * - * Add rolling file appender to a given logger - * - * \return vector of string names of loggers - */ - GR_RUNTIME_API std::vector<std::string> logger_get_logger_names(void); +}; + +/*! + * \brief Retrieve a pointer to a logger by name + * + * Retrieves a logger pointer + * \p name. + * + * \param name Name of the logger for which a pointer is requested + */ +GR_RUNTIME_API logger_ptr logger_get_logger(std::string name); + +/*! + * \brief Load logger's configuration file. + * + * Initialize the GNU Radio logger by loading the configuration file + * \p config_filename. + * + * \param config_filename The configuration file. Set to "" for the + * basic logger that outputs to the console. + */ +GR_RUNTIME_API bool logger_load_config(const std::string& config_filename = ""); + +/*! + * \brief Reset logger's configuration file. + * + * Remove all appenders from loggers + */ +GR_RUNTIME_API void logger_reset_config(void); + +/*! + * \brief Set the logger's output level. + * + * Sets the level of the logger. This takes a string that is + * translated to the standard levels and can be (case insensitive): + * + * \li off , notset + * \li debug + * \li info + * \li notice + * \li warn + * \li error + * \li crit + * \li alert + * \li fatal + * \li emerg + * + * \param logger the logger to set the level of. + * \param level string to set the level to. + */ +GR_RUNTIME_API void logger_set_level(logger_ptr logger, const std::string& level); + +/*! + * \brief Set the logger's output level. + * + * Sets the level of the logger. This takes the actual Log4cpp::Priority + * data type, which can be: + * + * \li log4cpp::Priority::NOTSET + * \li log4cpp::Priority::DEBUG + * \li log4cpp::Priority::INFO + * \li log4cpp::Priority::NOTICE + * \li log4cpp::Priority::WARN + * \li log4cpp::Priority::ERROR + * \li log4cpp::Priority::CRIT + * \li log4cpp::Priority::ALERT + * \li log4cpp::Priority::FATAL + * \li log4cpp::Priority::EMERG + * + * \param logger the logger to set the level of. + * \param level new logger level of type Log4cpp::Priority + */ +GR_RUNTIME_API void logger_set_level(logger_ptr logger, log4cpp::Priority::Value level); + +/*! + * \brief Get the logger's output level. + * + * Gets the level of the logger. This returns a string that + * corresponds to the standard levels and can be (case insensitive): + * + * \li notset + * \li debug + * \li info + * \li notice + * \li warn + * \li error + * \li crit + * \li alert + * \li fatal + * \li emerg + * + * \param logger the logger to get the level of. + * \param level string to get the level into. + */ +GR_RUNTIME_API void logger_get_level(logger_ptr logger, std::string& level); + +/*! + * \brief Get the logger's output level. + * + * Gets the level of the logger. This returns the actual Log4cpp::Level + * data type, which can be: + * + * \li log4cpp::Priority::NOTSET + * \li log4cpp::Priority::DEBUG + * \li log4cpp::Priority::INFO + * \li log4cpp::Priority::NOTICE + * \li log4cpp::Priority::WARN + * \li log4cpp::Priority::ERROR + * \li log4cpp::Priority::CRIT + * \li log4cpp::Priority::ALERT + * \li log4cpp::Priority::FATAL + * \li log4cpp::Priority::EMERG + * + * \param logger the logger to get the level of. + * \param level of the logger. + */ +GR_RUNTIME_API void logger_get_level(logger_ptr logger, log4cpp::Priority::Value& level); + +/*! + * \brief Add console appender to a given logger + * + * Add console appender to a given logger + * + * \param logger Logger to which appender will be added + * \param appender Name of appender to add to logger + */ +GR_RUNTIME_API void logger_add_appender(logger_ptr logger, std::string appender); + +/*! + * \brief Sets a console appender to a given logger. Deletes any + * existing appenders and adds a new one. To add an additional + * appender, use logger_add_appender. + * + * \param logger Logger to which appender will be added + * \param appender Name of appender to add to logger + */ +GR_RUNTIME_API void logger_set_appender(logger_ptr logger, std::string appender); + +/*! + * \brief Add console appender to a given logger + * + * Add console appender to a given logger + * + * \param logger Logger to which appender will be added + * \param target Std target to write 'cout' or 'cerr' (default is cout) + * \param pattern Formatting pattern for log messages + */ +GR_RUNTIME_API void +logger_add_console_appender(logger_ptr logger, std::string target, std::string pattern); + +/*! + * \brief Sets a new console appender to a given logger after + * removing all others. Use logger_add_console_appender to add + * another. + * + * \param logger Logger to which appender will be added + * \param target Std target to write 'cout' or 'cerr' (default is cout) + * \param pattern Formatting pattern for log messages + */ +GR_RUNTIME_API void +logger_set_console_appender(logger_ptr logger, std::string target, std::string pattern); + +/*! + * \brief Add file appender to a given logger + * + * Add file appender to a given logger + * + * \param logger Logger to which appender will be added + * \param filename File to which log will be written + * \param append Overwrite or append to log file + * \param pattern Formatting pattern for log messages + */ +GR_RUNTIME_API void logger_add_file_appender(logger_ptr logger, + std::string filename, + bool append, + std::string pattern); + +/*! + * \brief Set a file appender to a given logger. To add another file + * appender, use logger_add_file_appender. + * + * \param logger Logger to which appender will be added + * \param filename File to which log will be written + * \param append Overwrite or append to log file + * \param pattern Formatting pattern for log messages + */ +GR_RUNTIME_API void logger_set_file_appender(logger_ptr logger, + std::string filename, + bool append, + std::string pattern); + +/*! + * \brief Add rolling file appender to a given logger + * + * Add rolling file appender to a given logger + * + * \param logger Logger to which appender will be added + * \param filename File to which log will be written + * \param filesize Sizez of files to write + * \param bkup_index Number of files to write + * \param append Overwrite or append to log file + * \param mode Permissions to set on log file + * \param pattern Formatting pattern for log messages + */ +GR_RUNTIME_API void logger_add_rollingfile_appender(logger_ptr logger, + std::string filename, + size_t filesize, + int bkup_index, + bool append, + mode_t mode, + std::string pattern); + +/*! + * \brief Add rolling file appender to a given logger + * + * Add rolling file appender to a given logger + * + * \return vector of string names of loggers + */ +GR_RUNTIME_API std::vector<std::string> logger_get_logger_names(void); } /* namespace gr */ - // If Logger disable do nothing +// If Logger disable do nothing namespace gr { - /********************* Start Classes and Methods for Python ******************/ - /*! - * \brief Logger class for referencing loggers in python. Not - * needed in C++ (use macros) Wraps and manipulates loggers for - * python as python has no macros - * \ingroup logging - * - */ - class GR_RUNTIME_API logger - { - private: +/********************* Start Classes and Methods for Python ******************/ +/*! + * \brief Logger class for referencing loggers in python. Not + * needed in C++ (use macros) Wraps and manipulates loggers for + * python as python has no macros + * \ingroup logging + * + */ +class GR_RUNTIME_API logger +{ +private: /*! \brief logger pointer to logger associated wiith this wrapper class */ GR_LOG_DECLARE_LOGPTR(d_logger); - public: + +public: /*! * \brief constructor Provide name of logger to associate with this class * \param logger_name Name of logger associated with class */ - logger(std::string logger_name) { - GR_LOG_ASSIGN_LOGPTR(d_logger,logger_name); - }; + logger(std::string logger_name) { GR_LOG_ASSIGN_LOGPTR(d_logger, logger_name); }; /*! \brief Destructor */ - ~logger(){;} + ~logger() { ; } // Wrappers for logging macros /*! \brief inline function, wrapper to set the logger level */ - void set_level(std::string level){GR_LOG_SET_LEVEL(d_logger,level);} + void set_level(std::string level) { GR_LOG_SET_LEVEL(d_logger, level); } /*! \brief inline function, wrapper to get the logger level */ - void get_level(std::string &level){GR_LOG_GET_LEVEL(d_logger,level);} + void get_level(std::string& level) { GR_LOG_GET_LEVEL(d_logger, level); } /*! \brief inline function, wrapper for LOG4CPP_DEBUG for DEBUG message */ - void debug(std::string msg){GR_LOG_DEBUG(d_logger,msg);}; + void debug(std::string msg) { GR_LOG_DEBUG(d_logger, msg); }; /*! \brief inline function, wrapper for LOG4CPP_INFO for INFO message */ - void info(std::string msg){GR_LOG_INFO(d_logger,msg);} + void info(std::string msg) { GR_LOG_INFO(d_logger, msg); } /*! \brief inline function, wrapper for NOTICE message */ - void notice(std::string msg){GR_LOG_NOTICE(d_logger,msg);} + void notice(std::string msg) { GR_LOG_NOTICE(d_logger, msg); } /*! \brief inline function, wrapper for LOG4CPP_WARN for WARN message */ - void warn(std::string msg){GR_LOG_WARN(d_logger,msg);} + void warn(std::string msg) { GR_LOG_WARN(d_logger, msg); } /*! \brief inline function, wrapper for LOG4CPP_ERROR for ERROR message */ - void error(std::string msg){GR_LOG_ERROR(d_logger,msg);} + void error(std::string msg) { GR_LOG_ERROR(d_logger, msg); } /*! \brief inline function, wrapper for NOTICE message */ - void crit(std::string msg){GR_LOG_CRIT(d_logger,msg);} + void crit(std::string msg) { GR_LOG_CRIT(d_logger, msg); } /*! \brief inline function, wrapper for ALERT message */ - void alert(std::string msg){GR_LOG_ALERT(d_logger,msg);} + void alert(std::string msg) { GR_LOG_ALERT(d_logger, msg); } /*! \brief inline function, wrapper for FATAL message */ - void fatal(std::string msg){GR_LOG_FATAL(d_logger,msg);} + void fatal(std::string msg) { GR_LOG_FATAL(d_logger, msg); } /*! \brief inline function, wrapper for EMERG message */ - void emerg(std::string msg){GR_LOG_EMERG(d_logger,msg);} + void emerg(std::string msg) { GR_LOG_EMERG(d_logger, msg); } - /*! \brief inline function, wrapper for LOG4CPP_ASSERT for conditional ERROR message */ - void errorIF(bool cond,std::string msg){GR_LOG_ERRORIF(d_logger,cond,msg);} + /*! \brief inline function, wrapper for LOG4CPP_ASSERT for conditional ERROR message + */ + void errorIF(bool cond, std::string msg) { GR_LOG_ERRORIF(d_logger, cond, msg); } - /*! \brief inline function, wrapper for LOG4CPP_ASSERT for conditional ERROR message */ - void log_assert(bool cond,std::string msg){GR_LOG_ASSERT(d_logger,cond,msg);} + /*! \brief inline function, wrapper for LOG4CPP_ASSERT for conditional ERROR message + */ + void log_assert(bool cond, std::string msg) { GR_LOG_ASSERT(d_logger, cond, msg); } /*! \brief inline function, Method to add console appender to logger */ - void add_console_appender(std::string target,std::string pattern) { - GR_LOG_ADD_CONSOLE_APPENDER(d_logger, target, pattern); + void add_console_appender(std::string target, std::string pattern) + { + GR_LOG_ADD_CONSOLE_APPENDER(d_logger, target, pattern); } /*! \brief inline function, Method to set a console appender to logger */ - void set_console_appender(std::string target,std::string pattern) { - GR_LOG_SET_CONSOLE_APPENDER(d_logger, target, pattern); + void set_console_appender(std::string target, std::string pattern) + { + GR_LOG_SET_CONSOLE_APPENDER(d_logger, target, pattern); } /*! \brief inline function, Method to add file appender to logger */ - void add_file_appender(std::string filename, bool append, std::string pattern) { - GR_LOG_ADD_FILE_APPENDER(d_logger, filename, append, pattern); + void add_file_appender(std::string filename, bool append, std::string pattern) + { + GR_LOG_ADD_FILE_APPENDER(d_logger, filename, append, pattern); } /*! \brief inline function, Method to set a file appender to logger */ - void set_file_appender(std::string filename, bool append, std::string pattern) { - GR_LOG_SET_FILE_APPENDER(d_logger, filename, append, pattern); + void set_file_appender(std::string filename, bool append, std::string pattern) + { + GR_LOG_SET_FILE_APPENDER(d_logger, filename, append, pattern); } /*! \brief inline function, Method to add rolling file appender to logger */ - void add_rollingfile_appender(std::string filename, size_t filesize, - int bkup_index, bool append, mode_t mode, - std::string pattern) { - GR_LOG_ADD_ROLLINGFILE_APPENDER(d_logger,filename,filesize, - bkup_index,append,mode,pattern); + void add_rollingfile_appender(std::string filename, + size_t filesize, + int bkup_index, + bool append, + mode_t mode, + std::string pattern) + { + GR_LOG_ADD_ROLLINGFILE_APPENDER( + d_logger, filename, filesize, bkup_index, append, mode, pattern); } - }; +}; } /* namespace gr */ @@ -672,18 +740,19 @@ GR_RUNTIME_API void gr_logger_reset_config(void); namespace gr { - /*! - * Function to use the GR prefs files to get and setup the two - * default loggers defined there. The loggers are unique to the - * class in which they are called, and we pass it the \p name to - * identify where the log message originates from. For a GNU Radio - * block, we use 'alias()' for this value, and this is set up for us - * automatically in gr::block. - */ - GR_RUNTIME_API bool configure_default_loggers(gr::logger_ptr &l, gr::logger_ptr &d, - const std::string name); - - GR_RUNTIME_API bool update_logger_alias(const std::string &name, const std::string &alias); +/*! + * Function to use the GR prefs files to get and setup the two + * default loggers defined there. The loggers are unique to the + * class in which they are called, and we pass it the \p name to + * identify where the log message originates from. For a GNU Radio + * block, we use 'alias()' for this value, and this is set up for us + * automatically in gr::block. + */ +GR_RUNTIME_API bool +configure_default_loggers(gr::logger_ptr& l, gr::logger_ptr& d, const std::string name); + +GR_RUNTIME_API bool update_logger_alias(const std::string& name, + const std::string& alias); } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/math.h b/gnuradio-runtime/include/gnuradio/math.h index ce37f6ca84..5f0f54cb2d 100644 --- a/gnuradio-runtime/include/gnuradio/math.h +++ b/gnuradio-runtime/include/gnuradio/math.h @@ -40,203 +40,169 @@ * compile. GR_M_PI actually works with C++ but is defined here for the sake * of consistency. */ -#define GR_M_LOG2E 1.4426950408889634074 /* log_2 e */ -#define GR_M_PI 3.14159265358979323846 /* pi */ -#define GR_M_PI_4 0.78539816339744830961566084582 /* pi/4 */ -#define GR_M_TWOPI (2*GR_M_PI) /* 2*pi */ -#define GR_M_SQRT2 1.41421356237309504880 /* sqrt(2) */ +#define GR_M_LOG2E 1.4426950408889634074 /* log_2 e */ +#define GR_M_PI 3.14159265358979323846 /* pi */ +#define GR_M_PI_4 0.78539816339744830961566084582 /* pi/4 */ +#define GR_M_TWOPI (2 * GR_M_PI) /* 2*pi */ +#define GR_M_SQRT2 1.41421356237309504880 /* sqrt(2) */ namespace gr { - static inline bool - is_power_of_2(long x) - { - return x != 0 && (x & (x-1)) == 0; - } - - /*! - * \brief Fast arc tangent using table lookup and linear interpolation - * \ingroup misc - * - * \param y component of input vector - * \param x component of input vector - * \returns float angle angle of vector (x, y) in radians - * - * This function calculates the angle of the vector (x,y) based on a - * table lookup and linear interpolation. The table uses a 256 point - * table covering -45 to +45 degrees and uses symmetry to determine - * the final angle value in the range of -180 to 180 degrees. Note - * that this function uses the small angle approximation for values - * close to zero. This routine calculates the arc tangent with an - * average error of +/- 0.045 degrees. - */ - GR_RUNTIME_API float fast_atan2f(float y, float x); - - static inline float - fast_atan2f(gr_complex z) - { - return fast_atan2f(z.imag(), z.real()); - } - - /* This bounds x by +/- clip without a branch */ - static inline float - branchless_clip(float x, float clip) - { - float x1 = fabsf(x+clip); - float x2 = fabsf(x-clip); +static inline bool is_power_of_2(long x) { return x != 0 && (x & (x - 1)) == 0; } + +/*! + * \brief Fast arc tangent using table lookup and linear interpolation + * \ingroup misc + * + * \param y component of input vector + * \param x component of input vector + * \returns float angle angle of vector (x, y) in radians + * + * This function calculates the angle of the vector (x,y) based on a + * table lookup and linear interpolation. The table uses a 256 point + * table covering -45 to +45 degrees and uses symmetry to determine + * the final angle value in the range of -180 to 180 degrees. Note + * that this function uses the small angle approximation for values + * close to zero. This routine calculates the arc tangent with an + * average error of +/- 0.045 degrees. + */ +GR_RUNTIME_API float fast_atan2f(float y, float x); + +static inline float fast_atan2f(gr_complex z) { return fast_atan2f(z.imag(), z.real()); } + +/* This bounds x by +/- clip without a branch */ +static inline float branchless_clip(float x, float clip) +{ + float x1 = fabsf(x + clip); + float x2 = fabsf(x - clip); x1 -= x2; - return 0.5*x1; - } + return 0.5 * x1; +} - static inline float - clip(float x, float clip) - { +static inline float clip(float x, float clip) +{ float y = x; - if(x > clip) - y = clip; - else if(x < -clip) - y = -clip; + if (x > clip) + y = clip; + else if (x < -clip) + y = -clip; return y; - } - - // Slicer Functions - static inline unsigned int - binary_slicer(float x) - { - if(x >= 0) - return 1; - else - return 0; - } +} - static inline unsigned int - quad_45deg_slicer(float r, float i) - { - unsigned int ret = 0; - if((r >= 0) && (i >= 0)) - ret = 0; - else if((r < 0) && (i >= 0)) - ret = 1; - else if((r < 0) && (i < 0)) - ret = 2; +// Slicer Functions +static inline unsigned int binary_slicer(float x) +{ + if (x >= 0) + return 1; else - ret = 3; - return ret; - } + return 0; +} - static inline unsigned int - quad_0deg_slicer(float r, float i) - { +static inline unsigned int quad_45deg_slicer(float r, float i) +{ unsigned int ret = 0; - if(fabsf(r) > fabsf(i)) { - if(r > 0) + if ((r >= 0) && (i >= 0)) ret = 0; - else - ret = 2; - } - else { - if(i > 0) + else if ((r < 0) && (i >= 0)) ret = 1; - else + else if ((r < 0) && (i < 0)) + ret = 2; + else ret = 3; + return ret; +} + +static inline unsigned int quad_0deg_slicer(float r, float i) +{ + unsigned int ret = 0; + if (fabsf(r) > fabsf(i)) { + if (r > 0) + ret = 0; + else + ret = 2; + } else { + if (i > 0) + ret = 1; + else + ret = 3; } return ret; - } +} - static inline unsigned int - quad_45deg_slicer(gr_complex x) - { +static inline unsigned int quad_45deg_slicer(gr_complex x) +{ return quad_45deg_slicer(x.real(), x.imag()); - } +} - static inline unsigned int - quad_0deg_slicer(gr_complex x) - { +static inline unsigned int quad_0deg_slicer(gr_complex x) +{ return quad_0deg_slicer(x.real(), x.imag()); - } - - // Branchless Slicer Functions - static inline unsigned int - branchless_binary_slicer(float x) - { - return (x >= 0); - } - - static inline unsigned int - branchless_quad_0deg_slicer(float r, float i) - { +} + +// Branchless Slicer Functions +static inline unsigned int branchless_binary_slicer(float x) { return (x >= 0); } + +static inline unsigned int branchless_quad_0deg_slicer(float r, float i) +{ unsigned int ret = 0; - ret = (fabsf(r) > fabsf(i)) * (((r < 0) << 0x1)); // either 0 (00) or 2 (10) + ret = (fabsf(r) > fabsf(i)) * (((r < 0) << 0x1)); // either 0 (00) or 2 (10) ret |= (fabsf(i) > fabsf(r)) * (((i < 0) << 0x1) | 0x1); // either 1 (01) or 3 (11) return ret; - } +} - static inline unsigned int - branchless_quad_0deg_slicer(gr_complex x) - { +static inline unsigned int branchless_quad_0deg_slicer(gr_complex x) +{ return branchless_quad_0deg_slicer(x.real(), x.imag()); - } +} - static inline unsigned int - branchless_quad_45deg_slicer(float r, float i) - { +static inline unsigned int branchless_quad_45deg_slicer(float r, float i) +{ char ret = (r <= 0); ret |= ((i <= 0) << 1); return (ret ^ ((ret & 0x2) >> 0x1)); - } +} - static inline unsigned int - branchless_quad_45deg_slicer(gr_complex x) - { +static inline unsigned int branchless_quad_45deg_slicer(gr_complex x) +{ return branchless_quad_45deg_slicer(x.real(), x.imag()); - } - - /*! - * \param x any value - * \param pow2 must be a power of 2 - * \returns \p x rounded down to a multiple of \p pow2. - */ - static inline size_t - p2_round_down(size_t x, size_t pow2) - { - return x & -pow2; - } - - /*! - * \param x any value - * \param pow2 must be a power of 2 - * \returns \p x rounded up to a multiple of \p pow2. - */ - static inline size_t - p2_round_up(size_t x, size_t pow2) - { +} + +/*! + * \param x any value + * \param pow2 must be a power of 2 + * \returns \p x rounded down to a multiple of \p pow2. + */ +static inline size_t p2_round_down(size_t x, size_t pow2) { return x & -pow2; } + +/*! + * \param x any value + * \param pow2 must be a power of 2 + * \returns \p x rounded up to a multiple of \p pow2. + */ +static inline size_t p2_round_up(size_t x, size_t pow2) +{ return p2_round_down(x + pow2 - 1, pow2); - } - - /*! - * \param x any value - * \param pow2 must be a power of 2 - * \returns \p x modulo \p pow2. - */ - static inline size_t - p2_modulo(size_t x, size_t pow2) - { - return x & (pow2 - 1); - } - - /*! - * \param x any value - * \param pow2 must be a power of 2 - * \returns \p pow2 - (\p x modulo \p pow2). - */ - static inline size_t - p2_modulo_neg(size_t x, size_t pow2) - { +} + +/*! + * \param x any value + * \param pow2 must be a power of 2 + * \returns \p x modulo \p pow2. + */ +static inline size_t p2_modulo(size_t x, size_t pow2) { return x & (pow2 - 1); } + +/*! + * \param x any value + * \param pow2 must be a power of 2 + * \returns \p pow2 - (\p x modulo \p pow2). + */ +static inline size_t p2_modulo_neg(size_t x, size_t pow2) +{ return pow2 - p2_modulo(x, pow2); - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/message.h b/gnuradio-runtime/include/gnuradio/message.h index 0fda2d9c8c..605f90e430 100644 --- a/gnuradio-runtime/include/gnuradio/message.h +++ b/gnuradio-runtime/include/gnuradio/message.h @@ -29,62 +29,64 @@ namespace gr { - /*! - * \brief Message class. - * - * \ingroup misc - * The ideas and method names for adjustable message length were - * lifted from the click modular router "Packet" class. - */ - class GR_RUNTIME_API message - { - public: +/*! + * \brief Message class. + * + * \ingroup misc + * The ideas and method names for adjustable message length were + * lifted from the click modular router "Packet" class. + */ +class GR_RUNTIME_API message +{ +public: typedef boost::shared_ptr<message> sptr; - private: - sptr d_next; // link field for msg queue - long d_type; // type of the message - double d_arg1; // optional arg1 - double d_arg2; // optional arg2 +private: + sptr d_next; // link field for msg queue + long d_type; // type of the message + double d_arg1; // optional arg1 + double d_arg2; // optional arg2 - unsigned char *d_buf_start; // start of allocated buffer - unsigned char *d_msg_start; // where the msg starts - unsigned char *d_msg_end; // one beyond end of msg - unsigned char *d_buf_end; // one beyond end of allocated buffer + unsigned char* d_buf_start; // start of allocated buffer + unsigned char* d_msg_start; // where the msg starts + unsigned char* d_msg_end; // one beyond end of msg + unsigned char* d_buf_end; // one beyond end of allocated buffer message(long type, double arg1, double arg2, size_t length); friend class msg_queue; - unsigned char *buf_data() const { return d_buf_start; } + unsigned char* buf_data() const { return d_buf_start; } size_t buf_len() const { return d_buf_end - d_buf_start; } - public: +public: /*! * \brief public constructor for message */ static sptr make(long type = 0, double arg1 = 0, double arg2 = 0, size_t length = 0); - static sptr make_from_string(const std::string s, long type = 0, - double arg1 = 0, double arg2 = 0); + static sptr make_from_string(const std::string s, + long type = 0, + double arg1 = 0, + double arg2 = 0); ~message(); - long type() const { return d_type; } + long type() const { return d_type; } double arg1() const { return d_arg1; } double arg2() const { return d_arg2; } - void set_type(long type) { d_type = type; } + void set_type(long type) { d_type = type; } void set_arg1(double arg1) { d_arg1 = arg1; } void set_arg2(double arg2) { d_arg2 = arg2; } - unsigned char *msg() const { return d_msg_start; } + unsigned char* msg() const { return d_msg_start; } size_t length() const { return d_msg_end - d_msg_start; } std::string to_string() const; - }; +}; - GR_RUNTIME_API long message_ncurrently_allocated(); +GR_RUNTIME_API long message_ncurrently_allocated(); } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/messages/msg_accepter.h b/gnuradio-runtime/include/gnuradio/messages/msg_accepter.h index cd87b21dec..7a23428eaa 100644 --- a/gnuradio-runtime/include/gnuradio/messages/msg_accepter.h +++ b/gnuradio-runtime/include/gnuradio/messages/msg_accepter.h @@ -27,30 +27,30 @@ #include <boost/shared_ptr.hpp> namespace gr { - namespace messages { +namespace messages { + +/*! + * \brief Virtual base class that accepts messages + */ +class GR_RUNTIME_API msg_accepter +{ +public: + msg_accepter(){}; + virtual ~msg_accepter(); /*! - * \brief Virtual base class that accepts messages + * \brief send \p msg to \p msg_accepter on port \p which_port + * + * Sending a message is an asynchronous operation. The \p post + * call will not wait for the message either to arrive at the + * destination or to be received. */ - class GR_RUNTIME_API msg_accepter - { - public: - msg_accepter() {}; - virtual ~msg_accepter(); - - /*! - * \brief send \p msg to \p msg_accepter on port \p which_port - * - * Sending a message is an asynchronous operation. The \p post - * call will not wait for the message either to arrive at the - * destination or to be received. - */ - virtual void post(pmt::pmt_t which_port, pmt::pmt_t msg) = 0; - }; - - typedef boost::shared_ptr<msg_accepter> msg_accepter_sptr; - - } /* namespace messages */ + virtual void post(pmt::pmt_t which_port, pmt::pmt_t msg) = 0; +}; + +typedef boost::shared_ptr<msg_accepter> msg_accepter_sptr; + +} /* namespace messages */ } /* namespace gr */ #endif /* INCLUDED_MSG_ACCEPTER_H */ diff --git a/gnuradio-runtime/include/gnuradio/messages/msg_accepter_msgq.h b/gnuradio-runtime/include/gnuradio/messages/msg_accepter_msgq.h index ba699b8ee6..605196387f 100644 --- a/gnuradio-runtime/include/gnuradio/messages/msg_accepter_msgq.h +++ b/gnuradio-runtime/include/gnuradio/messages/msg_accepter_msgq.h @@ -27,27 +27,27 @@ #include <gnuradio/messages/msg_queue.h> namespace gr { - namespace messages { +namespace messages { - /*! - * \brief Concrete class that accepts messages and inserts them - * into a message queue. - */ - class GR_RUNTIME_API msg_accepter_msgq : public msg_accepter - { - protected: - msg_queue_sptr d_msg_queue; +/*! + * \brief Concrete class that accepts messages and inserts them + * into a message queue. + */ +class GR_RUNTIME_API msg_accepter_msgq : public msg_accepter +{ +protected: + msg_queue_sptr d_msg_queue; - public: - msg_accepter_msgq(msg_queue_sptr msgq); - ~msg_accepter_msgq(); +public: + msg_accepter_msgq(msg_queue_sptr msgq); + ~msg_accepter_msgq(); - virtual void post(pmt::pmt_t msg); + virtual void post(pmt::pmt_t msg); - msg_queue_sptr msg_queue() const { return d_msg_queue; } - }; + msg_queue_sptr msg_queue() const { return d_msg_queue; } +}; - } /* namespace messages */ +} /* namespace messages */ } /* namespace gr */ #endif /* INCLUDED_MSG_ACCEPTER_MSGQ_H */ diff --git a/gnuradio-runtime/include/gnuradio/messages/msg_passing.h b/gnuradio-runtime/include/gnuradio/messages/msg_passing.h index 42b300a574..c8df3db7bd 100644 --- a/gnuradio-runtime/include/gnuradio/messages/msg_passing.h +++ b/gnuradio-runtime/include/gnuradio/messages/msg_passing.h @@ -31,93 +31,89 @@ #include <gnuradio/messages/msg_accepter.h> namespace gr { - namespace messages { +namespace messages { - /*! - * \brief send message to msg_accepter - * - * \param accepter is the target of the send. - * \param which_port A pmt symbol describing the port by name. - * \param msg is the message to send. It's usually a pmt tuple. - * - * Sending a message is an asynchronous operation. The \p send - * call will not wait for the message either to arrive at the - * destination or to be received. - * - * \returns msg - */ - static inline pmt::pmt_t - send(msg_accepter_sptr accepter, const pmt::pmt_t &which_port, - const pmt::pmt_t &msg) - { - accepter->post(which_port, msg); - return msg; - } +/*! + * \brief send message to msg_accepter + * + * \param accepter is the target of the send. + * \param which_port A pmt symbol describing the port by name. + * \param msg is the message to send. It's usually a pmt tuple. + * + * Sending a message is an asynchronous operation. The \p send + * call will not wait for the message either to arrive at the + * destination or to be received. + * + * \returns msg + */ +static inline pmt::pmt_t +send(msg_accepter_sptr accepter, const pmt::pmt_t& which_port, const pmt::pmt_t& msg) +{ + accepter->post(which_port, msg); + return msg; +} - /*! - * \brief send message to msg_accepter - * - * \param accepter is the target of the send. - * \param which_port A pmt symbol describing the port by name. - * \param msg is the message to send. It's usually a pmt tuple. - * - * Sending a message is an asynchronous operation. The \p send - * call will not wait for the message either to arrive at the - * destination or to be received. - * - * \returns msg - */ - static inline pmt::pmt_t - send(msg_accepter *accepter, const pmt::pmt_t &which_port, - const pmt::pmt_t &msg) - { - accepter->post(which_port, msg); - return msg; - } +/*! + * \brief send message to msg_accepter + * + * \param accepter is the target of the send. + * \param which_port A pmt symbol describing the port by name. + * \param msg is the message to send. It's usually a pmt tuple. + * + * Sending a message is an asynchronous operation. The \p send + * call will not wait for the message either to arrive at the + * destination or to be received. + * + * \returns msg + */ +static inline pmt::pmt_t +send(msg_accepter* accepter, const pmt::pmt_t& which_port, const pmt::pmt_t& msg) +{ + accepter->post(which_port, msg); + return msg; +} - /*! - * \brief send message to msg_accepter - * - * \param accepter is the target of the send. - * \param which_port A pmt symbol describing the port by name. - * \param msg is the message to send. It's usually a pmt tuple. - * - * Sending a message is an asynchronous operation. The \p send - * call will not wait for the message either to arrive at the - * destination or to be received. - * - * \returns msg - */ - static inline pmt::pmt_t - send(msg_accepter &accepter, const pmt::pmt_t &which_port, - const pmt::pmt_t &msg) - { - accepter.post(which_port, msg); - return msg; - } +/*! + * \brief send message to msg_accepter + * + * \param accepter is the target of the send. + * \param which_port A pmt symbol describing the port by name. + * \param msg is the message to send. It's usually a pmt tuple. + * + * Sending a message is an asynchronous operation. The \p send + * call will not wait for the message either to arrive at the + * destination or to be received. + * + * \returns msg + */ +static inline pmt::pmt_t +send(msg_accepter& accepter, const pmt::pmt_t& which_port, const pmt::pmt_t& msg) +{ + accepter.post(which_port, msg); + return msg; +} - /*! - * \brief send message to msg_accepter - * - * \param accepter is the target of the send. - * aprecond: pmt::is_msg_accepter(accepter) - * \param which_port A pmt symbol describing the port by name. - * \param msg is the message to send. It's usually a pmt tuple. - * - * Sending a message is an asynchronous operation. The \p send - * call will not wait for the message either to arrive at the - * destination or to be received. - * - * \returns msg - */ - static inline pmt::pmt_t - send(pmt::pmt_t accepter, const pmt::pmt_t &which_port, - const pmt::pmt_t &msg) - { - return send(pmt::msg_accepter_ref(accepter), which_port, msg); - } +/*! + * \brief send message to msg_accepter + * + * \param accepter is the target of the send. + * aprecond: pmt::is_msg_accepter(accepter) + * \param which_port A pmt symbol describing the port by name. + * \param msg is the message to send. It's usually a pmt tuple. + * + * Sending a message is an asynchronous operation. The \p send + * call will not wait for the message either to arrive at the + * destination or to be received. + * + * \returns msg + */ +static inline pmt::pmt_t +send(pmt::pmt_t accepter, const pmt::pmt_t& which_port, const pmt::pmt_t& msg) +{ + return send(pmt::msg_accepter_ref(accepter), which_port, msg); +} - } /* namespace messages */ +} /* namespace messages */ } /* namespace gr */ #endif /* INCLUDED_MSG_PASSING_H */ diff --git a/gnuradio-runtime/include/gnuradio/messages/msg_producer.h b/gnuradio-runtime/include/gnuradio/messages/msg_producer.h index 046db9b204..4522992699 100644 --- a/gnuradio-runtime/include/gnuradio/messages/msg_producer.h +++ b/gnuradio-runtime/include/gnuradio/messages/msg_producer.h @@ -27,26 +27,26 @@ #include <boost/shared_ptr.hpp> namespace gr { - namespace messages { +namespace messages { + +/*! + * \brief Virtual base class that produces messages + */ +class GR_RUNTIME_API msg_producer +{ +public: + msg_producer() {} + virtual ~msg_producer(); /*! - * \brief Virtual base class that produces messages + * \brief send \p msg to \p msg_producer */ - class GR_RUNTIME_API msg_producer - { - public: - msg_producer() {} - virtual ~msg_producer(); - - /*! - * \brief send \p msg to \p msg_producer - */ - virtual pmt::pmt_t retrieve() = 0; - }; + virtual pmt::pmt_t retrieve() = 0; +}; - typedef boost::shared_ptr<msg_producer> msg_producer_sptr; +typedef boost::shared_ptr<msg_producer> msg_producer_sptr; - } /* namespace messages */ +} /* namespace messages */ } /* namespace gr */ #endif /* INCLUDED_MSG_PRODUCER_H */ diff --git a/gnuradio-runtime/include/gnuradio/messages/msg_queue.h b/gnuradio-runtime/include/gnuradio/messages/msg_queue.h index dfe1ca97be..237b4eca34 100644 --- a/gnuradio-runtime/include/gnuradio/messages/msg_queue.h +++ b/gnuradio-runtime/include/gnuradio/messages/msg_queue.h @@ -29,67 +29,67 @@ #include <deque> namespace gr { - namespace messages { +namespace messages { - class msg_queue; - typedef boost::shared_ptr<msg_queue> msg_queue_sptr; +class msg_queue; +typedef boost::shared_ptr<msg_queue> msg_queue_sptr; - msg_queue_sptr make_msg_queue(unsigned int limit=0); +msg_queue_sptr make_msg_queue(unsigned int limit = 0); + +/*! + * \brief thread-safe message queue + */ +class GR_RUNTIME_API msg_queue +{ +private: + gr::thread::mutex d_mutex; + gr::thread::condition_variable d_not_empty; + gr::thread::condition_variable d_not_full; + unsigned int d_limit; // max # of messages in queue. 0 -> unbounded + + std::deque<pmt::pmt_t> d_msgs; + +public: + msg_queue(unsigned int limit); + ~msg_queue(); + + /*! + * \brief Insert message at tail of queue. + * \param msg message + * + * Block if queue if full. + */ + void insert_tail(pmt::pmt_t msg); + + /*! + * \brief Delete message from head of queue and return it. + * Block if no message is available. + */ + pmt::pmt_t delete_head(); /*! - * \brief thread-safe message queue + * \brief If there's a message in the q, delete it and return it. + * If no message is available, return pmt::pmt_t(). */ - class GR_RUNTIME_API msg_queue - { - private: - gr::thread::mutex d_mutex; - gr::thread::condition_variable d_not_empty; - gr::thread::condition_variable d_not_full; - unsigned int d_limit; // max # of messages in queue. 0 -> unbounded - - std::deque<pmt::pmt_t> d_msgs; - - public: - msg_queue(unsigned int limit); - ~msg_queue(); - - /*! - * \brief Insert message at tail of queue. - * \param msg message - * - * Block if queue if full. - */ - void insert_tail(pmt::pmt_t msg); - - /*! - * \brief Delete message from head of queue and return it. - * Block if no message is available. - */ - pmt::pmt_t delete_head(); - - /*! - * \brief If there's a message in the q, delete it and return it. - * If no message is available, return pmt::pmt_t(). - */ - pmt::pmt_t delete_head_nowait(); - - //! Delete all messages from the queue - void flush(); - - //! is the queue empty? - bool empty_p() const { return d_msgs.empty(); } - - //! is the queue full? - bool full_p() const { return d_limit != 0 && count() >= d_limit; } - - //! return number of messages in queue - unsigned int count() const { return d_msgs.size(); } - - //! return limit on number of message in queue. 0 -> unbounded - unsigned int limit() const { return d_limit; } - }; - - } /* namespace messages */ + pmt::pmt_t delete_head_nowait(); + + //! Delete all messages from the queue + void flush(); + + //! is the queue empty? + bool empty_p() const { return d_msgs.empty(); } + + //! is the queue full? + bool full_p() const { return d_limit != 0 && count() >= d_limit; } + + //! return number of messages in queue + unsigned int count() const { return d_msgs.size(); } + + //! return limit on number of message in queue. 0 -> unbounded + unsigned int limit() const { return d_limit; } +}; + +} /* namespace messages */ } /* namespace gr */ #endif /* INCLUDED_MSG_QUEUE_H */ diff --git a/gnuradio-runtime/include/gnuradio/misc.h b/gnuradio-runtime/include/gnuradio/misc.h index 290e39b490..786f17caa0 100644 --- a/gnuradio-runtime/include/gnuradio/misc.h +++ b/gnuradio-runtime/include/gnuradio/misc.h @@ -26,14 +26,13 @@ #include <gnuradio/api.h> #include <gnuradio/types.h> -GR_RUNTIME_API unsigned int -gr_rounduppow2(unsigned int n); +GR_RUNTIME_API unsigned int gr_rounduppow2(unsigned int n); // FIXME should be template -GR_RUNTIME_API void gr_zero_vector(std::vector<float> &v); -GR_RUNTIME_API void gr_zero_vector(std::vector<double> &v); -GR_RUNTIME_API void gr_zero_vector(std::vector<int> &v); -GR_RUNTIME_API void gr_zero_vector(std::vector<gr_complex> &v); +GR_RUNTIME_API void gr_zero_vector(std::vector<float>& v); +GR_RUNTIME_API void gr_zero_vector(std::vector<double>& v); +GR_RUNTIME_API void gr_zero_vector(std::vector<int>& v); +GR_RUNTIME_API void gr_zero_vector(std::vector<gr_complex>& v); #endif /* INCLUDED_GR_MISC_H */ diff --git a/gnuradio-runtime/include/gnuradio/msg_accepter.h b/gnuradio-runtime/include/gnuradio/msg_accepter.h index 1f60a9e555..70ea5b7661 100644 --- a/gnuradio-runtime/include/gnuradio/msg_accepter.h +++ b/gnuradio-runtime/include/gnuradio/msg_accepter.h @@ -28,18 +28,18 @@ namespace gr { - /*! - * \brief Accepts messages and inserts them into a message queue, - * then notifies subclass gr::basic_block there is a message pending. - */ - class GR_RUNTIME_API msg_accepter : public gr::messages::msg_accepter - { - public: +/*! + * \brief Accepts messages and inserts them into a message queue, + * then notifies subclass gr::basic_block there is a message pending. + */ +class GR_RUNTIME_API msg_accepter : public gr::messages::msg_accepter +{ +public: msg_accepter(); ~msg_accepter(); void post(pmt::pmt_t which_port, pmt::pmt_t msg); - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/msg_handler.h b/gnuradio-runtime/include/gnuradio/msg_handler.h index b37f215616..cb4c60029d 100644 --- a/gnuradio-runtime/include/gnuradio/msg_handler.h +++ b/gnuradio-runtime/include/gnuradio/msg_handler.h @@ -28,21 +28,21 @@ namespace gr { - class msg_handler; - typedef boost::shared_ptr<msg_handler> msg_handler_sptr; - - /*! - * \brief abstract class of message handlers - * \ingroup base - */ - class GR_RUNTIME_API msg_handler - { - public: +class msg_handler; +typedef boost::shared_ptr<msg_handler> msg_handler_sptr; + +/*! + * \brief abstract class of message handlers + * \ingroup base + */ +class GR_RUNTIME_API msg_handler +{ +public: virtual ~msg_handler(); //! handle \p msg virtual void handle(message::sptr msg) = 0; - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/msg_queue.h b/gnuradio-runtime/include/gnuradio/msg_queue.h index 3326cf9a7f..b3486e3e55 100644 --- a/gnuradio-runtime/include/gnuradio/msg_queue.h +++ b/gnuradio-runtime/include/gnuradio/msg_queue.h @@ -29,30 +29,30 @@ namespace gr { - /*! - * \brief thread-safe message queue - * \ingroup misc - */ - class GR_RUNTIME_API msg_queue : public msg_handler - { +/*! + * \brief thread-safe message queue + * \ingroup misc + */ +class GR_RUNTIME_API msg_queue : public msg_handler +{ gr::thread::mutex d_mutex; gr::thread::condition_variable d_not_empty; gr::thread::condition_variable d_not_full; message::sptr d_head; message::sptr d_tail; - unsigned int d_count; // # of messages in queue. - unsigned int d_limit; // max # of messages in queue. 0 -> unbounded + unsigned int d_count; // # of messages in queue. + unsigned int d_limit; // max # of messages in queue. 0 -> unbounded - public: +public: typedef boost::shared_ptr<msg_queue> sptr; - static sptr make(unsigned int limit=0); + static sptr make(unsigned int limit = 0); msg_queue(unsigned int limit); ~msg_queue(); //! Generic msg_handler method: insert the message. - void handle(message::sptr msg) { insert_tail (msg); } + void handle(message::sptr msg) { insert_tail(msg); } /*! * \brief Insert message at tail of queue. @@ -88,7 +88,7 @@ namespace gr { //! return limit on number of message in queue. 0 -> unbounded unsigned int limit() const { return d_limit; } - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/nco.h b/gnuradio-runtime/include/gnuradio/nco.h index e2256c3b70..658bfd7524 100644 --- a/gnuradio-runtime/include/gnuradio/nco.h +++ b/gnuradio-runtime/include/gnuradio/nco.h @@ -32,64 +32,52 @@ namespace gr { - /*! - * \brief base class template for Numerically Controlled Oscillator (NCO) - * \ingroup misc - */ - template<class o_type, class i_type> - class nco - { - public: +/*! + * \brief base class template for Numerically Controlled Oscillator (NCO) + * \ingroup misc + */ +template <class o_type, class i_type> +class nco +{ +public: nco() : phase(0), phase_inc(0) {} virtual ~nco() {} // radians - void set_phase(double angle) - { - phase = angle; - } + void set_phase(double angle) { phase = angle; } - void adjust_phase(double delta_phase) - { - phase += delta_phase; - } + void adjust_phase(double delta_phase) { phase += delta_phase; } // angle_rate is in radians / step - void set_freq(double angle_rate) - { - phase_inc = angle_rate; - } + void set_freq(double angle_rate) { phase_inc = angle_rate; } // angle_rate is a delta in radians / step - void adjust_freq(double delta_angle_rate) - { - phase_inc += delta_angle_rate; - } + void adjust_freq(double delta_angle_rate) { phase_inc += delta_angle_rate; } // increment current phase angle void step() { - phase += phase_inc; - if(fabs(phase) > GR_M_PI) { - while(phase > GR_M_PI) - phase -= 2*GR_M_PI; - - while(phase < -GR_M_PI) - phase += 2*GR_M_PI; - } + phase += phase_inc; + if (fabs(phase) > GR_M_PI) { + while (phase > GR_M_PI) + phase -= 2 * GR_M_PI; + + while (phase < -GR_M_PI) + phase += 2 * GR_M_PI; + } } void step(int n) { - phase += phase_inc * n; - if(fabs(phase) > GR_M_PI){ - while(phase > GR_M_PI) - phase -= 2*GR_M_PI; - - while(phase < -GR_M_PI) - phase += 2*GR_M_PI; - } + phase += phase_inc * n; + if (fabs(phase) > GR_M_PI) { + while (phase > GR_M_PI) + phase -= 2 * GR_M_PI; + + while (phase < -GR_M_PI) + phase += 2 * GR_M_PI; + } } // units are radians / step @@ -97,104 +85,96 @@ namespace gr { double get_freq() const { return phase_inc; } // compute sin and cos for current phase angle - void sincos(float *sinx, float *cosx) const; + void sincos(float* sinx, float* cosx) const; // compute cos or sin for current phase angle float cos() const { return std::cos(phase); } float sin() const { return std::sin(phase); } // compute a block at a time - void sin(float *output, int noutput_items, double ampl = 1.0); - void cos(float *output, int noutput_items, double ampl = 1.0); - void sincos(gr_complex *output, int noutput_items, double ampl = 1.0); - void sin(short *output, int noutput_items, double ampl = 1.0); - void cos(short *output, int noutput_items, double ampl = 1.0); - void sin(int *output, int noutput_items, double ampl = 1.0); - void cos(int *output, int noutput_items, double ampl = 1.0); - - protected: + void sin(float* output, int noutput_items, double ampl = 1.0); + void cos(float* output, int noutput_items, double ampl = 1.0); + void sincos(gr_complex* output, int noutput_items, double ampl = 1.0); + void sin(short* output, int noutput_items, double ampl = 1.0); + void cos(short* output, int noutput_items, double ampl = 1.0); + void sin(int* output, int noutput_items, double ampl = 1.0); + void cos(int* output, int noutput_items, double ampl = 1.0); + +protected: double phase; double phase_inc; - }; +}; - template<class o_type, class i_type> - void - nco<o_type,i_type>::sincos(float *sinx, float *cosx) const - { +template <class o_type, class i_type> +void nco<o_type, i_type>::sincos(float* sinx, float* cosx) const +{ gr::sincosf(phase, sinx, cosx); - } - - template<class o_type, class i_type> - void - nco<o_type,i_type>::sin(float *output, int noutput_items, double ampl) - { - for(int i = 0; i < noutput_items; i++) { - output[i] = (float)(sin () * ampl); - step(); +} + +template <class o_type, class i_type> +void nco<o_type, i_type>::sin(float* output, int noutput_items, double ampl) +{ + for (int i = 0; i < noutput_items; i++) { + output[i] = (float)(sin() * ampl); + step(); } - } - - template<class o_type, class i_type> - void - nco<o_type,i_type>::cos(float *output, int noutput_items, double ampl) - { - for(int i = 0; i < noutput_items; i++) { - output[i] = (float)(cos() * ampl); - step(); +} + +template <class o_type, class i_type> +void nco<o_type, i_type>::cos(float* output, int noutput_items, double ampl) +{ + for (int i = 0; i < noutput_items; i++) { + output[i] = (float)(cos() * ampl); + step(); } - } - - template<class o_type, class i_type> - void - nco<o_type,i_type>::sin(short *output, int noutput_items, double ampl) - { - for(int i = 0; i < noutput_items; i++) { - output[i] = (short)(sin() * ampl); - step(); +} + +template <class o_type, class i_type> +void nco<o_type, i_type>::sin(short* output, int noutput_items, double ampl) +{ + for (int i = 0; i < noutput_items; i++) { + output[i] = (short)(sin() * ampl); + step(); } - } - - template<class o_type, class i_type> - void - nco<o_type,i_type>::cos(short *output, int noutput_items, double ampl) - { - for(int i = 0; i < noutput_items; i++) { - output[i] = (short)(cos() * ampl); - step(); +} + +template <class o_type, class i_type> +void nco<o_type, i_type>::cos(short* output, int noutput_items, double ampl) +{ + for (int i = 0; i < noutput_items; i++) { + output[i] = (short)(cos() * ampl); + step(); } - } - - template<class o_type, class i_type> - void - nco<o_type,i_type>::sin(int *output, int noutput_items, double ampl) - { - for(int i = 0; i < noutput_items; i++) { - output[i] = (int)(sin() * ampl); - step(); +} + +template <class o_type, class i_type> +void nco<o_type, i_type>::sin(int* output, int noutput_items, double ampl) +{ + for (int i = 0; i < noutput_items; i++) { + output[i] = (int)(sin() * ampl); + step(); } - } - - template<class o_type, class i_type> - void - nco<o_type,i_type>::cos(int *output, int noutput_items, double ampl) - { - for(int i = 0; i < noutput_items; i++) { - output[i] = (int)(cos() * ampl); - step(); +} + +template <class o_type, class i_type> +void nco<o_type, i_type>::cos(int* output, int noutput_items, double ampl) +{ + for (int i = 0; i < noutput_items; i++) { + output[i] = (int)(cos() * ampl); + step(); } - } - - template<class o_type, class i_type> - void - nco<o_type,i_type>::sincos(gr_complex *output, int noutput_items, double ampl) - { - for(int i = 0; i < noutput_items; i++) { - float cosx, sinx; - nco::sincos(&sinx, &cosx); - output[i] = gr_complex(cosx * ampl, sinx * ampl); - step(); +} + +template <class o_type, class i_type> +void nco<o_type, i_type>::sincos(gr_complex* output, int noutput_items, double ampl) +{ + for (int i = 0; i < noutput_items; i++) { + float cosx, sinx; + nco::sincos(&sinx, &cosx); + output[i] = gr_complex(cosx * ampl, sinx * ampl); + step(); } - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/prefs.h b/gnuradio-runtime/include/gnuradio/prefs.h index ccb4db1e20..a8f66af785 100644 --- a/gnuradio-runtime/include/gnuradio/prefs.h +++ b/gnuradio-runtime/include/gnuradio/prefs.h @@ -30,22 +30,23 @@ namespace gr { - typedef std::map< std::string, std::map<std::string, std::string> > config_map_t; - typedef std::map< std::string, std::map<std::string, std::string> >::iterator config_map_itr; - typedef std::map<std::string, std::string> config_map_elem_t; - typedef std::map<std::string, std::string>::iterator config_map_elem_itr; - - /*! - * \brief Base class for representing user preferences a la windows INI files. - * \ingroup misc - * - * The real implementation is in Python, and is accessible from C++ - * via the magic of SWIG directors. - */ - class GR_RUNTIME_API prefs - { - public: - static prefs *singleton(); +typedef std::map<std::string, std::map<std::string, std::string>> config_map_t; +typedef std::map<std::string, std::map<std::string, std::string>>::iterator + config_map_itr; +typedef std::map<std::string, std::string> config_map_elem_t; +typedef std::map<std::string, std::string>::iterator config_map_elem_itr; + +/*! + * \brief Base class for representing user preferences a la windows INI files. + * \ingroup misc + * + * The real implementation is in Python, and is accessible from C++ + * via the magic of SWIG directors. + */ +class GR_RUNTIME_API prefs +{ +public: + static prefs* singleton(); /*! * \brief Creates an object to read preference files. @@ -76,7 +77,7 @@ namespace gr { * key1 = value1 * \endcode */ - void add_config_file(const std::string &configfile); + void add_config_file(const std::string& configfile); /*! * \brief Returns the configuration options as a string. @@ -94,84 +95,77 @@ namespace gr { /*! * \brief Does \p section exist? */ - virtual bool has_section(const std::string §ion); + virtual bool has_section(const std::string& section); /*! * \brief Does \p option exist? */ - virtual bool has_option(const std::string §ion, - const std::string &option); + virtual bool has_option(const std::string& section, const std::string& option); /*! * \brief If option exists return associated value; else * default_val. */ - virtual const std::string get_string(const std::string §ion, - const std::string &option, - const std::string &default_val); + virtual const std::string get_string(const std::string& section, + const std::string& option, + const std::string& default_val); /*! * \brief Set or add a string \p option to \p section with value * \p val. */ - virtual void set_string(const std::string §ion, - const std::string &option, - const std::string &val); + virtual void set_string(const std::string& section, + const std::string& option, + const std::string& val); /*! * \brief If option exists and value can be converted to bool, * return it; else default_val. */ - virtual bool get_bool(const std::string §ion, - const std::string &option, - bool default_val); + virtual bool + get_bool(const std::string& section, const std::string& option, bool default_val); /*! * \brief Set or add a bool \p option to \p section with value \p val. */ - virtual void set_bool(const std::string §ion, - const std::string &option, - bool val); + virtual void + set_bool(const std::string& section, const std::string& option, bool val); /*! * \brief If option exists and value can be converted to long, * return it; else default_val. */ - virtual long get_long(const std::string §ion, - const std::string &option, - long default_val); + virtual long + get_long(const std::string& section, const std::string& option, long default_val); /*! * \brief Set or add a long \p option to \p section with value \p val. */ - virtual void set_long(const std::string §ion, - const std::string &option, - long val); + virtual void + set_long(const std::string& section, const std::string& option, long val); /*! * \brief If option exists and value can be converted to double, * return it; else default_val. */ - virtual double get_double(const std::string §ion, - const std::string &option, - double default_val); + virtual double + get_double(const std::string& section, const std::string& option, double default_val); /*! * \brief Set or add a double \p option to \p section with value \p val. */ - virtual void set_double(const std::string §ion, - const std::string &option, - double val); + virtual void + set_double(const std::string& section, const std::string& option, double val); - protected: +protected: virtual std::vector<std::string> _sys_prefs_filenames(); - virtual void _read_files(const std::vector<std::string> &filenames); - virtual char * option_to_env(std::string section, std::string option); + virtual void _read_files(const std::vector<std::string>& filenames); + virtual char* option_to_env(std::string section, std::string option); - private: +private: gr::thread::mutex d_mutex; config_map_t d_config_map; - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/py_feval.h b/gnuradio-runtime/include/gnuradio/py_feval.h index 89491af0b4..ab7a0dd856 100644 --- a/gnuradio-runtime/include/gnuradio/py_feval.h +++ b/gnuradio-runtime/include/gnuradio/py_feval.h @@ -27,69 +27,71 @@ #include <pmt/pmt.h> #include <gnuradio/feval.h> -class ensure_py_gil_state { - PyGILState_STATE d_gstate; +class ensure_py_gil_state +{ + PyGILState_STATE d_gstate; + public: - ensure_py_gil_state() { d_gstate = PyGILState_Ensure(); } - ~ensure_py_gil_state() { PyGILState_Release(d_gstate); } + ensure_py_gil_state() { d_gstate = PyGILState_Ensure(); } + ~ensure_py_gil_state() { PyGILState_Release(d_gstate); } }; namespace gr { - class GR_RUNTIME_API py_feval_dd : public feval_dd - { - public: +class GR_RUNTIME_API py_feval_dd : public feval_dd +{ +public: double calleval(double x) { - ensure_py_gil_state _lock; - return eval(x); + ensure_py_gil_state _lock; + return eval(x); } - virtual ~py_feval_dd() {}; - }; + virtual ~py_feval_dd(){}; +}; - class GR_RUNTIME_API py_feval_cc : public feval_cc - { - public: +class GR_RUNTIME_API py_feval_cc : public feval_cc +{ +public: gr_complex calleval(gr_complex x) { - ensure_py_gil_state _lock; - return eval(x); + ensure_py_gil_state _lock; + return eval(x); } - virtual ~py_feval_cc() {}; - }; + virtual ~py_feval_cc(){}; +}; - class GR_RUNTIME_API py_feval_ll : public feval_ll - { - public: +class GR_RUNTIME_API py_feval_ll : public feval_ll +{ +public: long calleval(long x) { - ensure_py_gil_state _lock; - return eval(x); + ensure_py_gil_state _lock; + return eval(x); } - virtual ~py_feval_ll() {}; - }; + virtual ~py_feval_ll(){}; +}; - class GR_RUNTIME_API py_feval : public feval - { - public: +class GR_RUNTIME_API py_feval : public feval +{ +public: void calleval() { - ensure_py_gil_state _lock; - eval(); + ensure_py_gil_state _lock; + eval(); } - virtual ~py_feval() {}; - }; + virtual ~py_feval(){}; +}; - class GR_RUNTIME_API py_feval_p : public feval_p - { - public: +class GR_RUNTIME_API py_feval_p : public feval_p +{ +public: void calleval(pmt::pmt_t x) { - ensure_py_gil_state _lock; - eval(x); + ensure_py_gil_state _lock; + eval(x); } - virtual ~py_feval_p() {}; - }; + virtual ~py_feval_p(){}; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/pycallback_object.h b/gnuradio-runtime/include/gnuradio/pycallback_object.h index 0b2db0d79f..87f5e41691 100644 --- a/gnuradio-runtime/include/gnuradio/pycallback_object.h +++ b/gnuradio-runtime/include/gnuradio/pycallback_object.h @@ -25,175 +25,183 @@ #include <pythread.h> #include <boost/format.hpp> -enum pyport_t { - PYPORT_STRING, - PYPORT_FLOAT -}; +enum pyport_t { PYPORT_STRING, PYPORT_FLOAT }; int pycallback_object_count = 500; // a simple to-PMT converter template class-function -template <class myType> class pmt_assist +template <class myType> +class pmt_assist { public: - static pmt::pmt_t make(myType _val) - { - return pmt::mp(_val); - } + static pmt::pmt_t make(myType _val) { return pmt::mp(_val); } }; /* template specializations for vectors that can't use pmt::mp() */ -template<> -pmt::pmt_t pmt_assist<std::vector<float> >::make(std::vector<float> _val) +template <> +pmt::pmt_t pmt_assist<std::vector<float>>::make(std::vector<float> _val) { - return pmt::init_f32vector(_val.size(), _val); + return pmt::init_f32vector(_val.size(), _val); } -template<> -pmt::pmt_t pmt_assist<std::vector<gr_complex> >::make(std::vector<gr_complex> _val) +template <> +pmt::pmt_t pmt_assist<std::vector<gr_complex>>::make(std::vector<gr_complex> _val) { - return pmt::init_c32vector(_val.size(), _val); + return pmt::init_c32vector(_val.size(), _val); } -template <class myType> class pycallback_object +template <class myType> +class pycallback_object { public: - pycallback_object(std::string name, std::string functionbase, - std::string units, std::string desc, - myType min, myType max, myType deflt, - DisplayType dtype) : - d_callback(NULL), - d_functionbase(functionbase), d_units(units), d_desc(desc), - d_min(min), d_max(max), d_deflt(deflt), d_dtype(dtype), - d_name(name), d_id(pycallback_object_count++) - { - d_callback = NULL; - setup_rpc(); - } - - void add_rpc_variable(rpcbasic_sptr s) - { - d_rpc_vars.push_back(s); - } - - myType get() { - myType rVal = d_deflt; - if(d_callback == NULL) { - printf("WARNING: pycallback_object get() called without py callback set!\n"); - return rVal; + pycallback_object(std::string name, + std::string functionbase, + std::string units, + std::string desc, + myType min, + myType max, + myType deflt, + DisplayType dtype) + : d_callback(NULL), + d_functionbase(functionbase), + d_units(units), + d_desc(desc), + d_min(min), + d_max(max), + d_deflt(deflt), + d_dtype(dtype), + d_name(name), + d_id(pycallback_object_count++) + { + d_callback = NULL; + setup_rpc(); } - else { - // obtain PyGIL - PyGILState_STATE state = PyGILState_Ensure(); - - PyObject *func; - //PyObject *arglist; - PyObject *result; - - func = (PyObject *) d_callback; // Get Python function - //arglist = Py_BuildValue(""); // Build argument list - result = PyEval_CallObject(func,NULL); // Call Python - //result = PyEval_CallObject(func,arglist); // Call Python - //Py_DECREF(arglist); // Trash arglist - if(result) { // If no errors, return double - rVal = pyCast(result); - } - Py_XDECREF(result); - - // release PyGIL - PyGILState_Release(state); - return rVal; + + void add_rpc_variable(rpcbasic_sptr s) { d_rpc_vars.push_back(s); } + + myType get() + { + myType rVal = d_deflt; + if (d_callback == NULL) { + printf("WARNING: pycallback_object get() called without py callback set!\n"); + return rVal; + } else { + // obtain PyGIL + PyGILState_STATE state = PyGILState_Ensure(); + + PyObject* func; + // PyObject *arglist; + PyObject* result; + + func = (PyObject*)d_callback; // Get Python function + // arglist = Py_BuildValue(""); // Build argument list + result = PyEval_CallObject(func, NULL); // Call Python + // result = PyEval_CallObject(func,arglist); // Call Python + // Py_DECREF(arglist); // Trash arglist + if (result) { // If no errors, return double + rVal = pyCast(result); + } + Py_XDECREF(result); + + // release PyGIL + PyGILState_Release(state); + return rVal; + } } - } - void set_callback(PyObject *cb) - { - d_callback = cb; - } + void set_callback(PyObject* cb) { d_callback = cb; } - void setup_rpc() - { + void setup_rpc() + { #ifdef GR_CTRLPORT - add_rpc_variable( - rpcbasic_sptr(new rpcbasic_register_get<pycallback_object, myType>( - (boost::format("%s%d") % d_name % d_id).str() , d_functionbase.c_str(), - this, &pycallback_object::get, pmt_assist<myType>::make(d_min), - pmt_assist<myType>::make(d_max), pmt_assist<myType>::make(d_deflt), - d_units.c_str(), d_desc.c_str(), RPC_PRIVLVL_MIN, d_dtype))); + add_rpc_variable( + rpcbasic_sptr(new rpcbasic_register_get<pycallback_object, myType>( + (boost::format("%s%d") % d_name % d_id).str(), + d_functionbase.c_str(), + this, + &pycallback_object::get, + pmt_assist<myType>::make(d_min), + pmt_assist<myType>::make(d_max), + pmt_assist<myType>::make(d_deflt), + d_units.c_str(), + d_desc.c_str(), + RPC_PRIVLVL_MIN, + d_dtype))); #endif /* GR_CTRLPORT */ - } + } private: - PyObject* d_callback; - std::string d_functionbase, d_units, d_desc; - myType d_min, d_max, d_deflt; - DisplayType d_dtype; - - /* This is a fall-through converter in case someone tries to call pyCast on an - * object type for which there isn't a template specialization (located below - * this class) function. This function should never get called, and it is - * unknown if changing the return type from myType to 'void' will break - * something. */ - myType pyCast(PyObject* obj) { - printf("TYPE NOT IMPLEMENTED!\n"); - assert(0); - // the following is to make compilers happy only. - myType dummy; - return(dummy); - }; - - std::vector<boost::any> d_rpc_vars; // container for all RPC variables - std::string d_name; - int d_id; + PyObject* d_callback; + std::string d_functionbase, d_units, d_desc; + myType d_min, d_max, d_deflt; + DisplayType d_dtype; + + /* This is a fall-through converter in case someone tries to call pyCast on an + * object type for which there isn't a template specialization (located below + * this class) function. This function should never get called, and it is + * unknown if changing the return type from myType to 'void' will break + * something. */ + myType pyCast(PyObject* obj) + { + printf("TYPE NOT IMPLEMENTED!\n"); + assert(0); + // the following is to make compilers happy only. + myType dummy; + return (dummy); + }; + + std::vector<boost::any> d_rpc_vars; // container for all RPC variables + std::string d_name; + int d_id; }; // template specialization conversion functions // get data out of the PyObject and into the real world -template<> +template <> std::string pycallback_object<std::string>::pyCast(PyObject* obj) { - return std::string(PyString_AsString(obj)); + return std::string(PyString_AsString(obj)); } -template<> +template <> double pycallback_object<double>::pyCast(PyObject* obj) { - return PyFloat_AsDouble(obj); + return PyFloat_AsDouble(obj); } -template<> +template <> float pycallback_object<float>::pyCast(PyObject* obj) { - return (float)PyFloat_AsDouble(obj); + return (float)PyFloat_AsDouble(obj); } -template<> +template <> int pycallback_object<int>::pyCast(PyObject* obj) { - return PyInt_AsLong(obj); + return PyInt_AsLong(obj); } -template<> -std::vector<float> pycallback_object<std::vector<float> >::pyCast(PyObject* obj) +template <> +std::vector<float> pycallback_object<std::vector<float>>::pyCast(PyObject* obj) { - int size = PyObject_Size(obj); - std::vector<float> rval(size); - for(int i=0; i<size; i++) { - rval[i] = (float)PyFloat_AsDouble(PyList_GetItem(obj, i)); - } - return rval; + int size = PyObject_Size(obj); + std::vector<float> rval(size); + for (int i = 0; i < size; i++) { + rval[i] = (float)PyFloat_AsDouble(PyList_GetItem(obj, i)); + } + return rval; } -template<> -std::vector<gr_complex> pycallback_object<std::vector<gr_complex> >::pyCast(PyObject* obj) +template <> +std::vector<gr_complex> pycallback_object<std::vector<gr_complex>>::pyCast(PyObject* obj) { - int size = PyObject_Size(obj); - std::vector<gr_complex> rval(size); - for(int i=0; i<size; i++){ rval[i] = \ - gr_complex((float)PyComplex_RealAsDouble(PyList_GetItem(obj, i)), - (float)PyComplex_ImagAsDouble(PyList_GetItem(obj, i))); - } - return rval; + int size = PyObject_Size(obj); + std::vector<gr_complex> rval(size); + for (int i = 0; i < size; i++) { + rval[i] = gr_complex((float)PyComplex_RealAsDouble(PyList_GetItem(obj, i)), + (float)PyComplex_ImagAsDouble(PyList_GetItem(obj, i))); + } + return rval; } // TODO: add more template specializations as needed! diff --git a/gnuradio-runtime/include/gnuradio/random.h b/gnuradio-runtime/include/gnuradio/random.h index 9aadadff29..95931baf7a 100644 --- a/gnuradio-runtime/include/gnuradio/random.h +++ b/gnuradio-runtime/include/gnuradio/random.h @@ -32,29 +32,32 @@ namespace gr { - /*! - * \brief pseudo random number generator - * \ingroup math_blk - */ - class GR_RUNTIME_API random - { - protected: +/*! + * \brief pseudo random number generator + * \ingroup math_blk + */ +class GR_RUNTIME_API random +{ +protected: long d_seed; bool d_gauss_stored; float d_gauss_value; - boost::mt19937 *d_rng; // mersenne twister as random number generator - boost::uniform_real<float> *d_uniform; // choose uniform distribution, default is [0,1) - boost::uniform_int<> *d_integer_dis; - boost::variate_generator<boost::mt19937&, boost::uniform_real<float> > *d_generator; - boost::variate_generator<boost::mt19937&, boost::uniform_int<> > *d_integer_generator; + boost::mt19937* d_rng; // mersenne twister as random number generator + boost::uniform_real<float>* + d_uniform; // choose uniform distribution, default is [0,1) + boost::uniform_int<>* d_integer_dis; + boost::variate_generator<boost::mt19937&, boost::uniform_real<float>>* d_generator; + boost::variate_generator<boost::mt19937&, boost::uniform_int<>>* d_integer_generator; - public: - random(unsigned int seed=0, int min_integer = 0, int max_integer = 2); +public: + random(unsigned int seed = 0, int min_integer = 0, int max_integer = 2); ~random(); /*! - * \brief Change the seed for the initialized number generator. seed = 0 initializes the random number generator with the system time. Note that a fast initialization of various instances can result in the same seed. + * \brief Change the seed for the initialized number generator. seed = 0 initializes + * the random number generator with the system time. Note that a fast initialization + * of various instances can result in the same seed. */ void reseed(unsigned int seed); @@ -76,7 +79,8 @@ namespace gr { float ran1(); /*! - * \brief Normally distributed random numbers (Gaussian distribution with zero mean and variance 1) + * \brief Normally distributed random numbers (Gaussian distribution with zero mean + * and variance 1) */ float gasdev(); @@ -86,7 +90,8 @@ namespace gr { float laplacian(); /*! - * \brief Rayleigh distributed random numbers (zero mean and variance 1 for the underlying Gaussian distributions) + * \brief Rayleigh distributed random numbers (zero mean and variance 1 for the + * underlying Gaussian distributions) */ float rayleigh(); @@ -96,12 +101,13 @@ namespace gr { float impulse(float factor); /*! - * \brief Normally distributed random numbers with zero mean and variance 1 on real and imaginary part. This results in a Rayleigh distribution for the amplitude and an uniform distribution for the phase. + * \brief Normally distributed random numbers with zero mean and variance 1 on real + * and imaginary part. This results in a Rayleigh distribution for the amplitude and + * an uniform distribution for the phase. */ gr_complex rayleigh_complex(); - }; +}; } /* namespace gr */ #endif /* INCLUDED_GR_RANDOM_H */ - diff --git a/gnuradio-runtime/include/gnuradio/realtime.h b/gnuradio-runtime/include/gnuradio/realtime.h index bd912e2983..158b6295bb 100644 --- a/gnuradio-runtime/include/gnuradio/realtime.h +++ b/gnuradio-runtime/include/gnuradio/realtime.h @@ -28,11 +28,11 @@ namespace gr { - /*! - * \brief If possible, enable high-priority "real time" scheduling. - * \ingroup misc - */ - GR_RUNTIME_API rt_status_t enable_realtime_scheduling(); +/*! + * \brief If possible, enable high-priority "real time" scheduling. + * \ingroup misc + */ +GR_RUNTIME_API rt_status_t enable_realtime_scheduling(); } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/realtime_impl.h b/gnuradio-runtime/include/gnuradio/realtime_impl.h index 7d8fbc85c2..8f1b6a4cb6 100644 --- a/gnuradio-runtime/include/gnuradio/realtime_impl.h +++ b/gnuradio-runtime/include/gnuradio/realtime_impl.h @@ -31,64 +31,58 @@ */ namespace gr { - typedef enum { - RT_OK = 0, - RT_NOT_IMPLEMENTED, - RT_NO_PRIVS, - RT_OTHER_ERROR - } rt_status_t; +typedef enum { RT_OK = 0, RT_NOT_IMPLEMENTED, RT_NO_PRIVS, RT_OTHER_ERROR } rt_status_t; - enum rt_sched_policy { - RT_SCHED_RR = 0, // round robin - RT_SCHED_FIFO = 1, // first in first out - }; +enum rt_sched_policy { + RT_SCHED_RR = 0, // round robin + RT_SCHED_FIFO = 1, // first in first out +}; - namespace impl { - /* - * Define the range for our virtual priorities (don't change - * these) - * - * Processes (or threads) with numerically higher priority values - * are scheduled before processes with numerically lower priority - * values. Thus, the value returned by rt_priority_max() will be - * greater than the value returned by rt_priority_min(). - */ - static inline int rt_priority_min() { return 0; } - static inline int rt_priority_max() { return 15; } - static inline int rt_priority_default() { return 1; } +namespace impl { +/* + * Define the range for our virtual priorities (don't change + * these) + * + * Processes (or threads) with numerically higher priority values + * are scheduled before processes with numerically lower priority + * values. Thus, the value returned by rt_priority_max() will be + * greater than the value returned by rt_priority_min(). + */ +static inline int rt_priority_min() { return 0; } +static inline int rt_priority_max() { return 15; } +static inline int rt_priority_default() { return 1; } - struct GR_RUNTIME_API rt_sched_param { - int priority; - rt_sched_policy policy; +struct GR_RUNTIME_API rt_sched_param { + int priority; + rt_sched_policy policy; - rt_sched_param() - : priority(rt_priority_default()), policy(RT_SCHED_RR){} + rt_sched_param() : priority(rt_priority_default()), policy(RT_SCHED_RR) {} - rt_sched_param(int priority_, rt_sched_policy policy_ = RT_SCHED_RR) - { - if(priority_ < rt_priority_min() || priority_ > rt_priority_max()) - throw std::invalid_argument("rt_sched_param: priority out of range"); + rt_sched_param(int priority_, rt_sched_policy policy_ = RT_SCHED_RR) + { + if (priority_ < rt_priority_min() || priority_ > rt_priority_max()) + throw std::invalid_argument("rt_sched_param: priority out of range"); priority = priority_; policy = policy_; - } - }; + } +}; - /*! - * \brief If possible, enable "realtime" scheduling. - * \ingroup misc - * - * In general, this means that the code will be scheduled before - * any non-realtime (normal) processes. Note that if your code - * contains an non-blocking infinite loop and you enable realtime - * scheduling, it's possible to hang the system. - */ +/*! + * \brief If possible, enable "realtime" scheduling. + * \ingroup misc + * + * In general, this means that the code will be scheduled before + * any non-realtime (normal) processes. Note that if your code + * contains an non-blocking infinite loop and you enable realtime + * scheduling, it's possible to hang the system. + */ - // NOTE: If you change this, you need to change the code in - // gnuradio-runtime/swig/realtime.i, see note there. - GR_RUNTIME_API rt_status_t enable_realtime_scheduling(rt_sched_param = rt_sched_param()); +// NOTE: If you change this, you need to change the code in +// gnuradio-runtime/swig/realtime.i, see note there. +GR_RUNTIME_API rt_status_t enable_realtime_scheduling(rt_sched_param = rt_sched_param()); - } /* namespace impl */ +} /* namespace impl */ } /* namespace gr */ #endif /* INCLUDED_GNURADIO_REALTIME_H */ diff --git a/gnuradio-runtime/include/gnuradio/rpcbufferedget.h b/gnuradio-runtime/include/gnuradio/rpcbufferedget.h index ad05551d1a..8be38f9a61 100644 --- a/gnuradio-runtime/include/gnuradio/rpcbufferedget.h +++ b/gnuradio-runtime/include/gnuradio/rpcbufferedget.h @@ -26,39 +26,46 @@ #include <boost/thread/condition_variable.hpp> #include <boost/thread/mutex.hpp> -template<typename TdataType> -class rpcbufferedget { +template <typename TdataType> +class rpcbufferedget +{ public: - rpcbufferedget(const unsigned int init_buffer_size = 4096) : - d_data_needed(false), d_data_ready(), d_buffer_lock(), d_buffer(init_buffer_size) {;} + rpcbufferedget(const unsigned int init_buffer_size = 4096) + : d_data_needed(false), + d_data_ready(), + d_buffer_lock(), + d_buffer(init_buffer_size) + { + ; + } - ~rpcbufferedget() { - d_data_ready.notify_all(); - } + ~rpcbufferedget() { d_data_ready.notify_all(); } - void offer_data(const TdataType& data) { - if (!d_data_needed) - return; + void offer_data(const TdataType& data) { - boost::mutex::scoped_lock lock(d_buffer_lock); - d_buffer = data; - d_data_needed = false; + if (!d_data_needed) + return; + { + boost::mutex::scoped_lock lock(d_buffer_lock); + d_buffer = data; + d_data_needed = false; + } + d_data_ready.notify_one(); } - d_data_ready.notify_one(); - } - TdataType get() { - boost::mutex::scoped_lock lock(d_buffer_lock); - d_data_needed = true; - d_data_ready.wait(lock); - return d_buffer; - } + TdataType get() + { + boost::mutex::scoped_lock lock(d_buffer_lock); + d_data_needed = true; + d_data_ready.wait(lock); + return d_buffer; + } private: - bool d_data_needed; - boost::condition_variable d_data_ready; - boost::mutex d_buffer_lock; - TdataType d_buffer; + bool d_data_needed; + boost::condition_variable d_data_ready; + boost::mutex d_buffer_lock; + TdataType d_buffer; }; #endif diff --git a/gnuradio-runtime/include/gnuradio/rpccallbackregister_base.h b/gnuradio-runtime/include/gnuradio/rpccallbackregister_base.h index 14e8772449..f12c489f05 100644 --- a/gnuradio-runtime/include/gnuradio/rpccallbackregister_base.h +++ b/gnuradio-runtime/include/gnuradio/rpccallbackregister_base.h @@ -31,85 +31,111 @@ typedef uint32_t DisplayType; //! DisplayType Plotting types const uint32_t DISPNULL = 0x0000; const uint32_t DISPTIME = 0x0001; -const uint32_t DISPXY = 0x0002; -const uint32_t DISPPSD = 0x0004; +const uint32_t DISPXY = 0x0002; +const uint32_t DISPPSD = 0x0004; const uint32_t DISPSPEC = 0x0008; const uint32_t DISPRAST = 0x0010; //! DisplayType Options -const uint32_t DISPOPTCPLX = 0x0100; -const uint32_t DISPOPTLOG = 0x0200; -const uint32_t DISPOPTSTEM = 0x0400; -const uint32_t DISPOPTSTRIP = 0x0800; +const uint32_t DISPOPTCPLX = 0x0100; +const uint32_t DISPOPTLOG = 0x0200; +const uint32_t DISPOPTSTEM = 0x0400; +const uint32_t DISPOPTSTRIP = 0x0800; const uint32_t DISPOPTSCATTER = 0x1000; -enum priv_lvl_t { - RPC_PRIVLVL_ALL = 0, - RPC_PRIVLVL_MIN = 9, - RPC_PRIVLVL_NONE = 10 -}; +enum priv_lvl_t { RPC_PRIVLVL_ALL = 0, RPC_PRIVLVL_MIN = 9, RPC_PRIVLVL_NONE = 10 }; enum KnobType { - KNOBBOOL, KNOBCHAR, KNOBINT, KNOBFLOAT, - KNOBDOUBLE, KNOBSTRING, KNOBLONG, KNOBVECBOOL, - KNOBCOMPLEX, KNOBCOMPLEXD, - KNOBVECCHAR, KNOBVECINT, KNOBVECFLOAT, KNOBVECDOUBLE, - KNOBVECSTRING, KNOBVECLONG + KNOBBOOL, + KNOBCHAR, + KNOBINT, + KNOBFLOAT, + KNOBDOUBLE, + KNOBSTRING, + KNOBLONG, + KNOBVECBOOL, + KNOBCOMPLEX, + KNOBCOMPLEXD, + KNOBVECCHAR, + KNOBVECINT, + KNOBVECFLOAT, + KNOBVECDOUBLE, + KNOBVECSTRING, + KNOBVECLONG }; -struct callbackregister_base -{ - struct callback_base_t - { - public: - callback_base_t(const priv_lvl_t priv_, const std::string& units_, - const DisplayType display_, const std::string& desc_, - const pmt::pmt_t min_, const pmt::pmt_t max_, const pmt::pmt_t def) - : priv(priv_), units(units_), description(desc_), - min(min_), max(max_), defaultvalue(def), display(display_) - { - } - - priv_lvl_t priv; - std::string units, description; - pmt::pmt_t min, max, defaultvalue; - DisplayType display; - }; - - template<typename T, typename Tsptr> - class callback_t : public callback_base_t - { - public: - callback_t(T* callback_, priv_lvl_t priv_, - const std::string& units_, const DisplayType display_, const:: std::string& desc_, - const pmt::pmt_t& min_, const pmt::pmt_t& max_, const pmt::pmt_t& def_) : - callback_base_t(priv_, units_, display_, desc_, min_, max_, def_), - callback(callback_) - { - } - - callback_t(T* callback_, priv_lvl_t priv_, const:: std::string& desc_) : - callback_base_t(priv_, "", 0, desc_, pmt::pmt_t(), pmt::pmt_t(), pmt::pmt_t()), - callback(callback_) +struct callbackregister_base { + struct callback_base_t { + public: + callback_base_t(const priv_lvl_t priv_, + const std::string& units_, + const DisplayType display_, + const std::string& desc_, + const pmt::pmt_t min_, + const pmt::pmt_t max_, + const pmt::pmt_t def) + : priv(priv_), + units(units_), + description(desc_), + min(min_), + max(max_), + defaultvalue(def), + display(display_) + { + } + + priv_lvl_t priv; + std::string units, description; + pmt::pmt_t min, max, defaultvalue; + DisplayType display; + }; + + template <typename T, typename Tsptr> + class callback_t : public callback_base_t { - } - - Tsptr callback; - }; - - typedef callback_t<gr::messages::msg_accepter, gr::messages::msg_accepter_sptr> configureCallback_t; - typedef callback_t<gr::messages::msg_producer, gr::messages::msg_producer_sptr> queryCallback_t; - typedef callback_t<gr::messages::msg_accepter, gr::messages::msg_accepter_sptr> handlerCallback_t; - - callbackregister_base() {;} - virtual ~callbackregister_base() {;} - - virtual void registerConfigureCallback(const std::string &id, const configureCallback_t callback) = 0; - virtual void unregisterConfigureCallback(const std::string &id) = 0; - virtual void registerQueryCallback(const std::string &id, const queryCallback_t callback) = 0; - virtual void unregisterQueryCallback(const std::string &id) = 0; - virtual void registerHandlerCallback(const std::string &id, const handlerCallback_t callback) = 0; - virtual void unregisterHandlerCallback(const std::string &id) = 0; + public: + callback_t(T* callback_, + priv_lvl_t priv_, + const std::string& units_, + const DisplayType display_, + const ::std::string& desc_, + const pmt::pmt_t& min_, + const pmt::pmt_t& max_, + const pmt::pmt_t& def_) + : callback_base_t(priv_, units_, display_, desc_, min_, max_, def_), + callback(callback_) + { + } + + callback_t(T* callback_, priv_lvl_t priv_, const ::std::string& desc_) + : callback_base_t( + priv_, "", 0, desc_, pmt::pmt_t(), pmt::pmt_t(), pmt::pmt_t()), + callback(callback_) + { + } + + Tsptr callback; + }; + + typedef callback_t<gr::messages::msg_accepter, gr::messages::msg_accepter_sptr> + configureCallback_t; + typedef callback_t<gr::messages::msg_producer, gr::messages::msg_producer_sptr> + queryCallback_t; + typedef callback_t<gr::messages::msg_accepter, gr::messages::msg_accepter_sptr> + handlerCallback_t; + + callbackregister_base() { ; } + virtual ~callbackregister_base() { ; } + + virtual void registerConfigureCallback(const std::string& id, + const configureCallback_t callback) = 0; + virtual void unregisterConfigureCallback(const std::string& id) = 0; + virtual void registerQueryCallback(const std::string& id, + const queryCallback_t callback) = 0; + virtual void unregisterQueryCallback(const std::string& id) = 0; + virtual void registerHandlerCallback(const std::string& id, + const handlerCallback_t callback) = 0; + virtual void unregisterHandlerCallback(const std::string& id) = 0; }; #endif /* RPCCALLBACKREGISTER_BASE_H */ diff --git a/gnuradio-runtime/include/gnuradio/rpcmanager.h b/gnuradio-runtime/include/gnuradio/rpcmanager.h index d12aae7ada..89b6b79ba2 100644 --- a/gnuradio-runtime/include/gnuradio/rpcmanager.h +++ b/gnuradio-runtime/include/gnuradio/rpcmanager.h @@ -31,31 +31,30 @@ class GR_RUNTIME_API rpcmanager : public virtual rpcmanager_base { - public: - rpcmanager(); - ~rpcmanager(); - - static rpcserver_booter_base* get(); - - static void register_booter(rpcserver_booter_base* booter); - - template<typename T> class rpcserver_booter_register_helper - { - public: - rpcserver_booter_register_helper() { - rpcmanager::register_booter(new T()); - } - - //TODO: unregister - }; - - private: - static bool make_aggregator; - static bool booter_registered; - static bool aggregator_registered; - static void rpcserver_booter_base_sptr_dest(rpcserver_booter_base* b) {(void) b;} - static std::unique_ptr<rpcserver_booter_base> boot; - static std::unique_ptr<rpcserver_booter_aggregator> aggregator; +public: + rpcmanager(); + ~rpcmanager(); + + static rpcserver_booter_base* get(); + + static void register_booter(rpcserver_booter_base* booter); + + template <typename T> + class rpcserver_booter_register_helper + { + public: + rpcserver_booter_register_helper() { rpcmanager::register_booter(new T()); } + + // TODO: unregister + }; + +private: + static bool make_aggregator; + static bool booter_registered; + static bool aggregator_registered; + static void rpcserver_booter_base_sptr_dest(rpcserver_booter_base* b) { (void)b; } + static std::unique_ptr<rpcserver_booter_base> boot; + static std::unique_ptr<rpcserver_booter_aggregator> aggregator; }; #endif /* RPCMANAGER_H */ diff --git a/gnuradio-runtime/include/gnuradio/rpcmanager_base.h b/gnuradio-runtime/include/gnuradio/rpcmanager_base.h index 16ff956b01..e92df5bd16 100644 --- a/gnuradio-runtime/include/gnuradio/rpcmanager_base.h +++ b/gnuradio-runtime/include/gnuradio/rpcmanager_base.h @@ -26,19 +26,19 @@ #include <boost/shared_ptr.hpp> class rpcserver_booter_base; -//class rpcserver_booter_aggregator; +// class rpcserver_booter_aggregator; class rpcmanager_base { - public: - typedef boost::shared_ptr<rpcserver_booter_base> rpcserver_booter_base_sptr; +public: + typedef boost::shared_ptr<rpcserver_booter_base> rpcserver_booter_base_sptr; - rpcmanager_base() {;} - ~rpcmanager_base() {;} + rpcmanager_base() { ; } + ~rpcmanager_base() { ; } - //static rpcserver_booter_base* get(); + // static rpcserver_booter_base* get(); - //static void register_booter(rpcserver_booter_base_sptr booter); + // static void register_booter(rpcserver_booter_base_sptr booter); private: }; diff --git a/gnuradio-runtime/include/gnuradio/rpcpmtconverters_thrift.h b/gnuradio-runtime/include/gnuradio/rpcpmtconverters_thrift.h index d55e7eb3b9..2cfb6ddab4 100644 --- a/gnuradio-runtime/include/gnuradio/rpcpmtconverters_thrift.h +++ b/gnuradio-runtime/include/gnuradio/rpcpmtconverters_thrift.h @@ -28,48 +28,80 @@ #include "thrift/gnuradio_types.h" -namespace rpcpmtconverter -{ - GNURadio::Knob from_pmt(const pmt::pmt_t& knob); +namespace rpcpmtconverter { +GNURadio::Knob from_pmt(const pmt::pmt_t& knob); - struct to_pmt_f { - to_pmt_f() {;} +struct to_pmt_f { + to_pmt_f() { ; } virtual ~to_pmt_f() {} virtual pmt::pmt_t operator()(const GNURadio::Knob& knob); - }; +}; - struct to_pmt_byte_f : public to_pmt_f { pmt::pmt_t operator()(const GNURadio::Knob& knob); }; - struct to_pmt_short_f : public to_pmt_f { pmt::pmt_t operator()(const GNURadio::Knob& knob); }; - struct to_pmt_int_f : public to_pmt_f { pmt::pmt_t operator()(const GNURadio::Knob& knob); }; - struct to_pmt_long_f : public to_pmt_f { pmt::pmt_t operator()(const GNURadio::Knob& knob); }; - struct to_pmt_double_f : public to_pmt_f { pmt::pmt_t operator()(const GNURadio::Knob& knob); }; - struct to_pmt_string_f : public to_pmt_f { pmt::pmt_t operator()(const GNURadio::Knob& knob); }; - struct to_pmt_bool_f : public to_pmt_f { pmt::pmt_t operator()(const GNURadio::Knob& knob); }; - struct to_pmt_complex_f: public to_pmt_f { pmt::pmt_t operator()(const GNURadio::Knob& knob); }; - struct to_pmt_f32vect_f: public to_pmt_f { pmt::pmt_t operator()(const GNURadio::Knob& knob); }; - struct to_pmt_f64vect_f: public to_pmt_f { pmt::pmt_t operator()(const GNURadio::Knob& knob); }; - struct to_pmt_s64vect_f: public to_pmt_f { pmt::pmt_t operator()(const GNURadio::Knob& knob); }; - struct to_pmt_s32vect_f: public to_pmt_f { pmt::pmt_t operator()(const GNURadio::Knob& knob); }; - struct to_pmt_s16vect_f: public to_pmt_f { pmt::pmt_t operator()(const GNURadio::Knob& knob); }; - struct to_pmt_s8vect_f : public to_pmt_f { pmt::pmt_t operator()(const GNURadio::Knob& knob); }; - struct to_pmt_c32vect_f: public to_pmt_f { pmt::pmt_t operator()(const GNURadio::Knob& knob); }; +struct to_pmt_byte_f : public to_pmt_f { + pmt::pmt_t operator()(const GNURadio::Knob& knob); +}; +struct to_pmt_short_f : public to_pmt_f { + pmt::pmt_t operator()(const GNURadio::Knob& knob); +}; +struct to_pmt_int_f : public to_pmt_f { + pmt::pmt_t operator()(const GNURadio::Knob& knob); +}; +struct to_pmt_long_f : public to_pmt_f { + pmt::pmt_t operator()(const GNURadio::Knob& knob); +}; +struct to_pmt_double_f : public to_pmt_f { + pmt::pmt_t operator()(const GNURadio::Knob& knob); +}; +struct to_pmt_string_f : public to_pmt_f { + pmt::pmt_t operator()(const GNURadio::Knob& knob); +}; +struct to_pmt_bool_f : public to_pmt_f { + pmt::pmt_t operator()(const GNURadio::Knob& knob); +}; +struct to_pmt_complex_f : public to_pmt_f { + pmt::pmt_t operator()(const GNURadio::Knob& knob); +}; +struct to_pmt_f32vect_f : public to_pmt_f { + pmt::pmt_t operator()(const GNURadio::Knob& knob); +}; +struct to_pmt_f64vect_f : public to_pmt_f { + pmt::pmt_t operator()(const GNURadio::Knob& knob); +}; +struct to_pmt_s64vect_f : public to_pmt_f { + pmt::pmt_t operator()(const GNURadio::Knob& knob); +}; +struct to_pmt_s32vect_f : public to_pmt_f { + pmt::pmt_t operator()(const GNURadio::Knob& knob); +}; +struct to_pmt_s16vect_f : public to_pmt_f { + pmt::pmt_t operator()(const GNURadio::Knob& knob); +}; +struct to_pmt_s8vect_f : public to_pmt_f { + pmt::pmt_t operator()(const GNURadio::Knob& knob); +}; +struct to_pmt_c32vect_f : public to_pmt_f { + pmt::pmt_t operator()(const GNURadio::Knob& knob); +}; - class To_PMT : private boost::noncopyable { - public: - static To_PMT instance; - template<typename TO_PMT_F> friend struct to_pmt_reg; - pmt::pmt_t operator()(const GNURadio::Knob& knob); +class To_PMT : private boost::noncopyable +{ +public: + static To_PMT instance; + template <typename TO_PMT_F> + friend struct to_pmt_reg; + pmt::pmt_t operator()(const GNURadio::Knob& knob); - protected: - boost::ptr_map<GNURadio::BaseTypes::type, to_pmt_f> to_pmt_map; +protected: + boost::ptr_map<GNURadio::BaseTypes::type, to_pmt_f> to_pmt_map; - private: - To_PMT() {;} - }; +private: + To_PMT() { ; } +}; - template<typename TO_PMT_F> struct to_pmt_reg { +template <typename TO_PMT_F> +struct to_pmt_reg { to_pmt_reg(To_PMT& instance, const GNURadio::BaseTypes::type type); - }; -} +}; +} // namespace rpcpmtconverter #endif /* RPCPMTCONVERTERS_THRIFT_H */ diff --git a/gnuradio-runtime/include/gnuradio/rpcregisterhelpers.h b/gnuradio-runtime/include/gnuradio/rpcregisterhelpers.h index 40e4afedc5..3e81a76f98 100644 --- a/gnuradio-runtime/include/gnuradio/rpcregisterhelpers.h +++ b/gnuradio-runtime/include/gnuradio/rpcregisterhelpers.h @@ -46,56 +46,61 @@ typedef boost::shared_ptr<rpcbasic_base> rpcbasic_sptr; *\brief Base class for registering a ControlPort Extractor. Acts as * a message acceptor. */ -template<typename T, typename Tto> -class rpcextractor_base - : public virtual gr::messages::msg_accepter +template <typename T, typename Tto> +class rpcextractor_base : public virtual gr::messages::msg_accepter { public: - rpcextractor_base(T* source, void (T::*func)(Tto)) : - _source(source), _func(func) {;} - ~rpcextractor_base() {;} - - void post(pmt::pmt_t which_port, pmt::pmt_t msg) { - (void) which_port; - (void) msg; - throw std::runtime_error("rpcextractor_base: no post defined for this data type.\n"); - } + rpcextractor_base(T* source, void (T::*func)(Tto)) : _source(source), _func(func) + { + ; + } + ~rpcextractor_base() { ; } + + void post(pmt::pmt_t which_port, pmt::pmt_t msg) + { + (void)which_port; + (void)msg; + throw std::runtime_error( + "rpcextractor_base: no post defined for this data type.\n"); + } protected: - T* _source; - void (T::*_func)(Tto); + T* _source; + void (T::*_func)(Tto); }; -template<typename T> -class rpcextractor_base<T,void> - : public virtual gr::messages::msg_accepter +template <typename T> +class rpcextractor_base<T, void> : public virtual gr::messages::msg_accepter { public: - rpcextractor_base(T* source, void (T::*func)()) : - _source(source), _func(func) {;} - ~rpcextractor_base() {;} + rpcextractor_base(T* source, void (T::*func)()) : _source(source), _func(func) { ; } + ~rpcextractor_base() { ; } - void post(pmt::pmt_t which_port, pmt::pmt_t msg) { - (void) which_port; - (void) msg; - throw std::runtime_error("rpcextractor_base: no post defined for this data type.\n"); - } + void post(pmt::pmt_t which_port, pmt::pmt_t msg) + { + (void)which_port; + (void)msg; + throw std::runtime_error( + "rpcextractor_base: no post defined for this data type.\n"); + } protected: - T* _source; - void (T::*_func)(); + T* _source; + void (T::*_func)(); }; /*! * \brief Templated parent class for registering a ControlPort Extractor. */ -template<typename T, typename Tto> -class rpcbasic_extractor : public virtual rpcextractor_base<T,Tto> +template <typename T, typename Tto> +class rpcbasic_extractor : public virtual rpcextractor_base<T, Tto> { public: - rpcbasic_extractor(T* source, void (T::*func)(Tto)) : - rpcextractor_base<T,Tto>(source, func) - {;} + rpcbasic_extractor(T* source, void (T::*func)(Tto)) + : rpcextractor_base<T, Tto>(source, func) + { + ; + } }; @@ -107,18 +112,22 @@ public: * \brief Base class for registering a ControlPort Inserter. Produces a * message. */ -template<typename T, typename Tfrom> +template <typename T, typename Tfrom> class rpcinserter_base : public virtual gr::messages::msg_producer { public: - rpcinserter_base(T* source, Tfrom (T::*func)()) : _source(source), _func(func) {;} - rpcinserter_base() {;} + rpcinserter_base(T* source, Tfrom (T::*func)()) : _source(source), _func(func) { ; } + rpcinserter_base() { ; } - pmt::pmt_t retrieve() { assert(0); return pmt::pmt_t(); } + pmt::pmt_t retrieve() + { + assert(0); + return pmt::pmt_t(); + } protected: - T* _source; - Tfrom (T::*_func)(); + T* _source; + Tfrom (T::*_func)(); }; @@ -126,28 +135,30 @@ protected: * \brief Templated parent class for registering a ControlPort * Inserter. */ -template<typename T, typename Tfrom> -class rpcbasic_inserter : - public virtual rpcinserter_base<T,Tfrom> +template <typename T, typename Tfrom> +class rpcbasic_inserter : public virtual rpcinserter_base<T, Tfrom> { public: - rpcbasic_inserter(T* source, Tfrom (T::*func)()const) - : rpcinserter_base<T,Tfrom>(source, func) - {;} - - rpcbasic_inserter(T* source, Tfrom (T::*func)()) - : rpcinserter_base<T,Tfrom>(source, func) - {;} - - pmt::pmt_t retrieve() - { - return pmt::mp((rpcinserter_base<T,Tfrom>:: - _source->*rpcinserter_base<T,Tfrom>::_func)()); - } + rpcbasic_inserter(T* source, Tfrom (T::*func)() const) + : rpcinserter_base<T, Tfrom>(source, func) + { + ; + } + + rpcbasic_inserter(T* source, Tfrom (T::*func)()) + : rpcinserter_base<T, Tfrom>(source, func) + { + ; + } + + pmt::pmt_t retrieve() + { + return pmt::mp( + (rpcinserter_base<T, Tfrom>::_source->*rpcinserter_base<T, Tfrom>::_func)()); + } }; - /********************************************************************* * RPC Handler Base Classes ********************************************************************/ @@ -156,40 +167,38 @@ public: *\brief Base class for registering a ControlPort Handler. Acts as * a message acceptor. */ -template<typename T> -class rpchandler_base - : public virtual gr::messages::msg_accepter +template <typename T> +class rpchandler_base : public virtual gr::messages::msg_accepter { public: - rpchandler_base(T* source, const char* handler) : - _source(source), _handler(handler) {;} - ~rpchandler_base() {;} + rpchandler_base(T* source, const char* handler) : _source(source), _handler(handler) + { + ; + } + ~rpchandler_base() { ; } - void post(pmt::pmt_t which_port, pmt::pmt_t msg) { - _source->post(which_port, msg); - } + void post(pmt::pmt_t which_port, pmt::pmt_t msg) { _source->post(which_port, msg); } protected: - T* _source; - const char* _handler; + T* _source; + const char* _handler; }; /*! * \brief Templated parent class for registering a ControlPort Extractor. */ -template<typename T> +template <typename T> class rpcbasic_handler : public virtual rpchandler_base<T> { public: - rpcbasic_handler(T* source, const char* handler) : - rpchandler_base<T>(source, handler) - {;} + rpcbasic_handler(T* source, const char* handler) : rpchandler_base<T>(source, handler) + { + ; + } }; - - /********************************************************************* * RPC Specialized Extractors ********************************************************************/ @@ -198,214 +207,236 @@ public: * \brief Specialized extractor class to make calls to functions that * do not take data (enable, reset, start, etc.). */ -template<typename T> -class rpcbasic_extractor<T,void> : public virtual rpcextractor_base<T,void> +template <typename T> +class rpcbasic_extractor<T, void> : public virtual rpcextractor_base<T, void> { public: - rpcbasic_extractor(T* source, void (T::*func)()) - : rpcextractor_base<T,void>(source, func) - {;} - - void post(pmt::pmt_t which_port, pmt::pmt_t msg) - { - (void) which_port; - (void) msg; - (rpcextractor_base<T,void>::_source->*rpcextractor_base<T,void>::_func)(); - } + rpcbasic_extractor(T* source, void (T::*func)()) + : rpcextractor_base<T, void>(source, func) + { + ; + } + + void post(pmt::pmt_t which_port, pmt::pmt_t msg) + { + (void)which_port; + (void)msg; + (rpcextractor_base<T, void>::_source->*rpcextractor_base<T, void>::_func)(); + } }; /*! * \brief Specialized extractor class for char data. */ -template<typename T> -class rpcbasic_extractor<T,char> : public virtual rpcextractor_base<T,char> +template <typename T> +class rpcbasic_extractor<T, char> : public virtual rpcextractor_base<T, char> { public: - rpcbasic_extractor(T* source, void (T::*func)(char)) - : rpcextractor_base<T,char>(source, func) - {;} - - void post(pmt::pmt_t which_port, pmt::pmt_t msg) - { - (void) which_port; - (rpcextractor_base<T,char>::_source->*rpcextractor_base<T,char>::_func) - (static_cast<char>(pmt::to_long(msg))); - } + rpcbasic_extractor(T* source, void (T::*func)(char)) + : rpcextractor_base<T, char>(source, func) + { + ; + } + + void post(pmt::pmt_t which_port, pmt::pmt_t msg) + { + (void)which_port; + (rpcextractor_base<T, char>::_source->*rpcextractor_base<T, char>::_func)( + static_cast<char>(pmt::to_long(msg))); + } }; /*! * \brief Specialized extractor class for short data. */ -template<typename T> -class rpcbasic_extractor<T,short> : public virtual rpcextractor_base<T,short> +template <typename T> +class rpcbasic_extractor<T, short> : public virtual rpcextractor_base<T, short> { public: - rpcbasic_extractor(T* source, void (T::*func)(short)) - : rpcextractor_base<T,short>(source, func) - {;} - - void post(pmt::pmt_t which_port, pmt::pmt_t msg) - { - (void) which_port; - (rpcextractor_base<T,short>::_source->*rpcextractor_base<T,short>::_func) - (static_cast<short>(pmt::to_long(msg))); - } + rpcbasic_extractor(T* source, void (T::*func)(short)) + : rpcextractor_base<T, short>(source, func) + { + ; + } + + void post(pmt::pmt_t which_port, pmt::pmt_t msg) + { + (void)which_port; + (rpcextractor_base<T, short>::_source->*rpcextractor_base<T, short>::_func)( + static_cast<short>(pmt::to_long(msg))); + } }; /*! * \brief Specialized extractor class for double data. */ -template<typename T> -class rpcbasic_extractor<T,double> : public virtual rpcextractor_base<T,double> +template <typename T> +class rpcbasic_extractor<T, double> : public virtual rpcextractor_base<T, double> { public: - rpcbasic_extractor(T* source, void (T::*func)(double)) - : rpcextractor_base<T,double>(source, func) - {;} - - void post(pmt::pmt_t which_port, pmt::pmt_t msg) - { - (void) which_port; - (rpcextractor_base<T,double>::_source->*rpcextractor_base<T,double>::_func) - (pmt::to_double(msg)); - } + rpcbasic_extractor(T* source, void (T::*func)(double)) + : rpcextractor_base<T, double>(source, func) + { + ; + } + + void post(pmt::pmt_t which_port, pmt::pmt_t msg) + { + (void)which_port; + (rpcextractor_base<T, double>::_source->*rpcextractor_base<T, double>::_func)( + pmt::to_double(msg)); + } }; /*! * \brief Specialized extractor class for float data. */ -template<typename T> -class rpcbasic_extractor<T,float> : public virtual rpcextractor_base<T,float> +template <typename T> +class rpcbasic_extractor<T, float> : public virtual rpcextractor_base<T, float> { public: - rpcbasic_extractor(T* source, void (T::*func)(float)) - : rpcextractor_base<T,float>(source, func) - {;} - - void post(pmt::pmt_t which_port, pmt::pmt_t msg) - { - (void) which_port; - (rpcextractor_base<T,float>::_source->*rpcextractor_base<T,float>::_func) - (pmt::to_double(msg)); - } + rpcbasic_extractor(T* source, void (T::*func)(float)) + : rpcextractor_base<T, float>(source, func) + { + ; + } + + void post(pmt::pmt_t which_port, pmt::pmt_t msg) + { + (void)which_port; + (rpcextractor_base<T, float>::_source->*rpcextractor_base<T, float>::_func)( + pmt::to_double(msg)); + } }; /*! * \brief Specialized extractor class for long data. */ -template<typename T> -class rpcbasic_extractor<T,long> : public virtual rpcextractor_base<T,long> +template <typename T> +class rpcbasic_extractor<T, long> : public virtual rpcextractor_base<T, long> { public: - rpcbasic_extractor(T* source, void (T::*func)(long)) - : rpcextractor_base<T,long>(source, func) - {;} - - void post(pmt::pmt_t which_port, pmt::pmt_t msg) - { - (void) which_port; - (rpcextractor_base<T,long>::_source->*rpcextractor_base<T,long>::_func) - (pmt::to_long(msg)); - } + rpcbasic_extractor(T* source, void (T::*func)(long)) + : rpcextractor_base<T, long>(source, func) + { + ; + } + + void post(pmt::pmt_t which_port, pmt::pmt_t msg) + { + (void)which_port; + (rpcextractor_base<T, long>::_source->*rpcextractor_base<T, long>::_func)( + pmt::to_long(msg)); + } }; /*! * \brief Specialized extractor class for int data. */ -template<typename T> -class rpcbasic_extractor<T,int> : public virtual rpcextractor_base<T,int> +template <typename T> +class rpcbasic_extractor<T, int> : public virtual rpcextractor_base<T, int> { public: - rpcbasic_extractor(T* source, void (T::*func)(int)) - : rpcextractor_base<T,int>(source, func) - {;} - - void post(pmt::pmt_t which_port, pmt::pmt_t msg) - { - (void) which_port; - (rpcextractor_base<T,int>::_source->*rpcextractor_base<T,int>::_func) - (pmt::to_long(msg)); - } + rpcbasic_extractor(T* source, void (T::*func)(int)) + : rpcextractor_base<T, int>(source, func) + { + ; + } + + void post(pmt::pmt_t which_port, pmt::pmt_t msg) + { + (void)which_port; + (rpcextractor_base<T, int>::_source->*rpcextractor_base<T, int>::_func)( + pmt::to_long(msg)); + } }; /*! * \brief Specialized extractor class for bool data. */ -template<typename T> -class rpcbasic_extractor<T,bool> : public virtual rpcextractor_base<T,bool> +template <typename T> +class rpcbasic_extractor<T, bool> : public virtual rpcextractor_base<T, bool> { public: - rpcbasic_extractor(T* source, void (T::*func)(bool)) - : rpcextractor_base<T,bool>(source, func) - {;} - - void post(pmt::pmt_t which_port, pmt::pmt_t msg) - { - (void) which_port; - (rpcextractor_base<T,bool>::_source->*rpcextractor_base<T,bool>::_func) - (pmt::to_bool(msg)); - } + rpcbasic_extractor(T* source, void (T::*func)(bool)) + : rpcextractor_base<T, bool>(source, func) + { + ; + } + + void post(pmt::pmt_t which_port, pmt::pmt_t msg) + { + (void)which_port; + (rpcextractor_base<T, bool>::_source->*rpcextractor_base<T, bool>::_func)( + pmt::to_bool(msg)); + } }; /*! * \brief Specialized extractor class for complex (float) data. */ -template<typename T> -class rpcbasic_extractor<T,std::complex<float> > - : public virtual rpcextractor_base<T,std::complex<float> > +template <typename T> +class rpcbasic_extractor<T, std::complex<float>> + : public virtual rpcextractor_base<T, std::complex<float>> { public: - rpcbasic_extractor(T* source, void (T::*func)(std::complex<float>)) - : rpcextractor_base<T,std::complex<float> >(source, func) - {;} - - void post(pmt::pmt_t which_port, pmt::pmt_t msg) - { - (void) which_port; - std::complex<float> k = static_cast<std::complex<float> >(pmt::to_complex(msg)); - (rpcextractor_base<T,std::complex<float> >:: - _source->*rpcextractor_base<T,std::complex<float> >::_func)(k); - } + rpcbasic_extractor(T* source, void (T::*func)(std::complex<float>)) + : rpcextractor_base<T, std::complex<float>>(source, func) + { + ; + } + + void post(pmt::pmt_t which_port, pmt::pmt_t msg) + { + (void)which_port; + std::complex<float> k = static_cast<std::complex<float>>(pmt::to_complex(msg)); + (rpcextractor_base<T, std::complex<float>>::_source + ->*rpcextractor_base<T, std::complex<float>>::_func)(k); + } }; /*! * \brief Specialized extractor class for complex (double) data. */ -template<typename T> -class rpcbasic_extractor<T,std::complex<double> > - : public virtual rpcextractor_base<T,std::complex<double> > +template <typename T> +class rpcbasic_extractor<T, std::complex<double>> + : public virtual rpcextractor_base<T, std::complex<double>> { public: - rpcbasic_extractor(T* source, void (T::*func)(std::complex<double>)) - : rpcextractor_base<T,std::complex<double> >(source, func) - {;} - - void post(pmt::pmt_t which_port, pmt::pmt_t msg) - { - (void) which_port; - (rpcextractor_base<T,std::complex<double> >:: - _source->*rpcextractor_base<T,std::complex<double> >::_func)(pmt::to_complex(msg)); - } + rpcbasic_extractor(T* source, void (T::*func)(std::complex<double>)) + : rpcextractor_base<T, std::complex<double>>(source, func) + { + ; + } + + void post(pmt::pmt_t which_port, pmt::pmt_t msg) + { + (void)which_port; + (rpcextractor_base<T, std::complex<double>>::_source + ->*rpcextractor_base<T, std::complex<double>>::_func)(pmt::to_complex(msg)); + } }; /*! * \brief Specialized extractor class for string data. */ -template<typename T> -class rpcbasic_extractor<T,std::string> - : public virtual rpcextractor_base<T,std::string> +template <typename T> +class rpcbasic_extractor<T, std::string> + : public virtual rpcextractor_base<T, std::string> { public: - rpcbasic_extractor(T* source, void (T::*func)(std::string)) - : rpcextractor_base<T,std::string>(source, func) - {;} - - void post(pmt::pmt_t which_port, pmt::pmt_t msg) - { - (void) which_port; - (rpcextractor_base<T,std::string>:: - _source->*rpcextractor_base<T,std::string>::_func)(pmt::symbol_to_string(msg)); - } + rpcbasic_extractor(T* source, void (T::*func)(std::string)) + : rpcextractor_base<T, std::string>(source, func) + { + ; + } + + void post(pmt::pmt_t which_port, pmt::pmt_t msg) + { + (void)which_port; + (rpcextractor_base<T, std::string>::_source + ->*rpcextractor_base<T, std::string>::_func)(pmt::symbol_to_string(msg)); + } }; @@ -416,251 +447,295 @@ public: /*! * \brief Specialized inserter class for uint64_t data. */ -template<typename T> -class rpcbasic_inserter<T,uint64_t> : public virtual rpcinserter_base<T,uint64_t> +template <typename T> +class rpcbasic_inserter<T, uint64_t> : public virtual rpcinserter_base<T, uint64_t> { public: - rpcbasic_inserter(T* source, uint64_t (T::*func)() const) - : rpcinserter_base<T,uint64_t>(source, func) - {;} - - rpcbasic_inserter(T* source, uint64_t (T::*func)()) - : rpcinserter_base<T,uint64_t>(source, func) - {;} - - pmt::pmt_t retrieve() - { - return pmt::from_uint64((rpcinserter_base<T,uint64_t>:: - _source->*rpcinserter_base<T,uint64_t>::_func)()); - } + rpcbasic_inserter(T* source, uint64_t (T::*func)() const) + : rpcinserter_base<T, uint64_t>(source, func) + { + ; + } + + rpcbasic_inserter(T* source, uint64_t (T::*func)()) + : rpcinserter_base<T, uint64_t>(source, func) + { + ; + } + + pmt::pmt_t retrieve() + { + return pmt::from_uint64((rpcinserter_base<T, uint64_t>::_source + ->*rpcinserter_base<T, uint64_t>::_func)()); + } }; /*! * \brief Specialized inserter class for vectors of signed char data. */ -template<typename T> -class rpcbasic_inserter<T,std::vector< signed char > > - : public virtual rpcinserter_base<T,std::vector< signed char > > +template <typename T> +class rpcbasic_inserter<T, std::vector<signed char>> + : public virtual rpcinserter_base<T, std::vector<signed char>> { public: - rpcbasic_inserter(T* source, std::vector< signed char > (T::*func)() const) - : rpcinserter_base<T,std::vector< signed char > >(source, func) - {;} - - rpcbasic_inserter(T* source, std::vector< signed char > (T::*func)()) - : rpcinserter_base<T,std::vector< signed char > >(source, func) - {;} - - pmt::pmt_t retrieve() - { - std::vector< signed char > - vec((rpcinserter_base<T,std::vector< signed char > >:: - _source->*rpcinserter_base<T,std::vector< signed char > >::_func)()); - return pmt::init_s8vector(vec.size(), &vec[0]); - } + rpcbasic_inserter(T* source, std::vector<signed char> (T::*func)() const) + : rpcinserter_base<T, std::vector<signed char>>(source, func) + { + ; + } + + rpcbasic_inserter(T* source, std::vector<signed char> (T::*func)()) + : rpcinserter_base<T, std::vector<signed char>>(source, func) + { + ; + } + + pmt::pmt_t retrieve() + { + std::vector<signed char> vec( + (rpcinserter_base<T, std::vector<signed char>>::_source + ->*rpcinserter_base<T, std::vector<signed char>>::_func)()); + return pmt::init_s8vector(vec.size(), &vec[0]); + } }; /*! * \brief Specialized inserter class for vectors of short data. */ -template<typename T> -class rpcbasic_inserter<T,std::vector< short > > - : public virtual rpcinserter_base<T,std::vector< short > > +template <typename T> +class rpcbasic_inserter<T, std::vector<short>> + : public virtual rpcinserter_base<T, std::vector<short>> { public: - rpcbasic_inserter(T* source, std::vector< short > (T::*func)() const) - : rpcinserter_base<T,std::vector< short > >(source, func) - {;} - - rpcbasic_inserter(T* source, std::vector< short > (T::*func)()) - : rpcinserter_base<T,std::vector< short > >(source, func) - {;} - - pmt::pmt_t retrieve() - { - std::vector< short > - vec((rpcinserter_base<T,std::vector< short > >:: - _source->*rpcinserter_base<T,std::vector< short > >::_func)()); - return pmt::init_s16vector(vec.size(), &vec[0]); - } + rpcbasic_inserter(T* source, std::vector<short> (T::*func)() const) + : rpcinserter_base<T, std::vector<short>>(source, func) + { + ; + } + + rpcbasic_inserter(T* source, std::vector<short> (T::*func)()) + : rpcinserter_base<T, std::vector<short>>(source, func) + { + ; + } + + pmt::pmt_t retrieve() + { + std::vector<short> vec((rpcinserter_base<T, std::vector<short>>::_source + ->*rpcinserter_base<T, std::vector<short>>::_func)()); + return pmt::init_s16vector(vec.size(), &vec[0]); + } }; /*! * \brief Specialized inserter class for vectors of int data. */ -template<typename T> -class rpcbasic_inserter<T,std::vector< int > > - : public virtual rpcinserter_base<T,std::vector< int > > +template <typename T> +class rpcbasic_inserter<T, std::vector<int>> + : public virtual rpcinserter_base<T, std::vector<int>> { public: - rpcbasic_inserter(T* source, std::vector<int > (T::*func)() const) - : rpcinserter_base<T,std::vector<int > >(source, func) - {;} - - rpcbasic_inserter(T* source, std::vector<int > (T::*func)()) - : rpcinserter_base<T,std::vector<int > >(source, func) - {;} - - pmt::pmt_t retrieve() - { - std::vector< int > - vec((rpcinserter_base<T,std::vector<int > >:: - _source->*rpcinserter_base<T,std::vector< int > >::_func)()); - return pmt::init_s32vector(vec.size(), &vec[0]); - } + rpcbasic_inserter(T* source, std::vector<int> (T::*func)() const) + : rpcinserter_base<T, std::vector<int>>(source, func) + { + ; + } + + rpcbasic_inserter(T* source, std::vector<int> (T::*func)()) + : rpcinserter_base<T, std::vector<int>>(source, func) + { + ; + } + + pmt::pmt_t retrieve() + { + std::vector<int> vec((rpcinserter_base<T, std::vector<int>>::_source + ->*rpcinserter_base<T, std::vector<int>>::_func)()); + return pmt::init_s32vector(vec.size(), &vec[0]); + } }; /*! * \brief Specialized inserter class for vectors of int64_t data. */ -template<typename T> -class rpcbasic_inserter<T,std::vector< int64_t > > - : public virtual rpcinserter_base<T,std::vector< int64_t > > +template <typename T> +class rpcbasic_inserter<T, std::vector<int64_t>> + : public virtual rpcinserter_base<T, std::vector<int64_t>> { public: - rpcbasic_inserter(T* source, std::vector<int64_t > (T::*func)() const) - : rpcinserter_base<T,std::vector<int64_t > >(source, func) - {;} - - rpcbasic_inserter(T* source, std::vector<int64_t > (T::*func)()) - : rpcinserter_base<T,std::vector<int64_t > >(source, func) - {;} - - pmt::pmt_t retrieve() - { - std::vector< int64_t > - vec((rpcinserter_base<T,std::vector<int64_t > >:: - _source->*rpcinserter_base<T,std::vector< int64_t > >::_func)()); - return pmt::init_s64vector(vec.size(), &vec[0]); - } + rpcbasic_inserter(T* source, std::vector<int64_t> (T::*func)() const) + : rpcinserter_base<T, std::vector<int64_t>>(source, func) + { + ; + } + + rpcbasic_inserter(T* source, std::vector<int64_t> (T::*func)()) + : rpcinserter_base<T, std::vector<int64_t>>(source, func) + { + ; + } + + pmt::pmt_t retrieve() + { + std::vector<int64_t> vec( + (rpcinserter_base<T, std::vector<int64_t>>::_source + ->*rpcinserter_base<T, std::vector<int64_t>>::_func)()); + return pmt::init_s64vector(vec.size(), &vec[0]); + } }; /*! * \brief Specialized inserter class for vectors of complex (float) data. */ -template<typename T> -class rpcbasic_inserter<T,std::vector< std::complex<float> > > - : public virtual rpcinserter_base<T,std::vector< std::complex<float> > > +template <typename T> +class rpcbasic_inserter<T, std::vector<std::complex<float>>> + : public virtual rpcinserter_base<T, std::vector<std::complex<float>>> { public: - rpcbasic_inserter(T* source, std::vector<std::complex<float> > (T::*func)() const) - : rpcinserter_base<T,std::vector<std::complex<float> > >(source, func) - {;} - - rpcbasic_inserter(T* source, std::vector<std::complex<float> > (T::*func)()) - : rpcinserter_base<T,std::vector<std::complex<float> > >(source, func) - {;} - - pmt::pmt_t retrieve() - { - std::vector< std::complex<float> > - vec((rpcinserter_base<T,std::vector<std::complex<float> > >:: - _source->*rpcinserter_base<T,std::vector< std::complex<float> > >::_func)()); - return pmt::init_c32vector(vec.size(), &vec[0]); - } + rpcbasic_inserter(T* source, std::vector<std::complex<float>> (T::*func)() const) + : rpcinserter_base<T, std::vector<std::complex<float>>>(source, func) + { + ; + } + + rpcbasic_inserter(T* source, std::vector<std::complex<float>> (T::*func)()) + : rpcinserter_base<T, std::vector<std::complex<float>>>(source, func) + { + ; + } + + pmt::pmt_t retrieve() + { + std::vector<std::complex<float>> vec( + (rpcinserter_base<T, std::vector<std::complex<float>>>::_source + ->*rpcinserter_base<T, std::vector<std::complex<float>>>::_func)()); + return pmt::init_c32vector(vec.size(), &vec[0]); + } }; /*! * \brief Specialized inserter class for vectors of float data. */ -template<typename T> -class rpcbasic_inserter<T,std::vector< float> > - : public virtual rpcinserter_base<T,std::vector< float > > +template <typename T> +class rpcbasic_inserter<T, std::vector<float>> + : public virtual rpcinserter_base<T, std::vector<float>> { public: - rpcbasic_inserter(T* source, std::vector<float> (T::*func)() const) - : rpcinserter_base<T,std::vector<float > >(source, func) - {;} - - rpcbasic_inserter(T* source, std::vector<float> (T::*func)()) - : rpcinserter_base<T,std::vector<float> >(source, func) - {;} - - pmt::pmt_t retrieve() - { - std::vector< float > vec((rpcinserter_base<T,std::vector<float> >:: - _source->*rpcinserter_base<T,std::vector< float> >::_func)()); - return pmt::init_f32vector(vec.size(), &vec[0]); - } + rpcbasic_inserter(T* source, std::vector<float> (T::*func)() const) + : rpcinserter_base<T, std::vector<float>>(source, func) + { + ; + } + + rpcbasic_inserter(T* source, std::vector<float> (T::*func)()) + : rpcinserter_base<T, std::vector<float>>(source, func) + { + ; + } + + pmt::pmt_t retrieve() + { + std::vector<float> vec((rpcinserter_base<T, std::vector<float>>::_source + ->*rpcinserter_base<T, std::vector<float>>::_func)()); + return pmt::init_f32vector(vec.size(), &vec[0]); + } }; /*! * \brief Specialized inserter class for vectors of uint8_t data. */ -template<typename T> -class rpcbasic_inserter<T,std::vector< uint8_t> > - : public virtual rpcinserter_base<T,std::vector< uint8_t > > { +template <typename T> +class rpcbasic_inserter<T, std::vector<uint8_t>> + : public virtual rpcinserter_base<T, std::vector<uint8_t>> +{ public: - rpcbasic_inserter(T* source, std::vector<uint8_t> (T::*func)() const) - : rpcinserter_base<T,std::vector<uint8_t > >(source, func) - {;} - - rpcbasic_inserter(T* source, std::vector<uint8_t> (T::*func)()) - : rpcinserter_base<T,std::vector<uint8_t> >(source, func) - {;} - - pmt::pmt_t retrieve() - { - std::vector< uint8_t > vec((rpcinserter_base<T,std::vector<uint8_t> >:: - _source->*rpcinserter_base<T,std::vector< uint8_t> >::_func)()); - return pmt::init_u8vector(vec.size(), &vec[0]); - } + rpcbasic_inserter(T* source, std::vector<uint8_t> (T::*func)() const) + : rpcinserter_base<T, std::vector<uint8_t>>(source, func) + { + ; + } + + rpcbasic_inserter(T* source, std::vector<uint8_t> (T::*func)()) + : rpcinserter_base<T, std::vector<uint8_t>>(source, func) + { + ; + } + + pmt::pmt_t retrieve() + { + std::vector<uint8_t> vec( + (rpcinserter_base<T, std::vector<uint8_t>>::_source + ->*rpcinserter_base<T, std::vector<uint8_t>>::_func)()); + return pmt::init_u8vector(vec.size(), &vec[0]); + } }; /*! * \brief Specialized inserter class for complex (float) data. */ -template<typename T> -class rpcbasic_inserter<T,std::complex<float> > - : public virtual rpcinserter_base<T,std::complex<float > > { +template <typename T> +class rpcbasic_inserter<T, std::complex<float>> + : public virtual rpcinserter_base<T, std::complex<float>> +{ public: - rpcbasic_inserter(T* source, std::complex<float> (T::*func)() const) - : rpcinserter_base<T,std::complex<float> >(source, func) - {;} - - rpcbasic_inserter(T* source, std::complex<float> (T::*func)()) - : rpcinserter_base<T,std::complex<float> >(source, func) - {;} - - pmt::pmt_t retrieve() - { - std::complex<float > k((rpcinserter_base<T,std::complex<float> >:: - _source->*rpcinserter_base<T,std::complex<float> >::_func)()); - return pmt::from_complex(k); - } + rpcbasic_inserter(T* source, std::complex<float> (T::*func)() const) + : rpcinserter_base<T, std::complex<float>>(source, func) + { + ; + } + + rpcbasic_inserter(T* source, std::complex<float> (T::*func)()) + : rpcinserter_base<T, std::complex<float>>(source, func) + { + ; + } + + pmt::pmt_t retrieve() + { + std::complex<float> k((rpcinserter_base<T, std::complex<float>>::_source + ->*rpcinserter_base<T, std::complex<float>>::_func)()); + return pmt::from_complex(k); + } }; /*! * \brief Specialized inserter class for complex (double) data. */ -template<typename T> -class rpcbasic_inserter<T,std::complex<double> > - : public virtual rpcinserter_base<T,std::complex<double > > { +template <typename T> +class rpcbasic_inserter<T, std::complex<double>> + : public virtual rpcinserter_base<T, std::complex<double>> +{ public: - rpcbasic_inserter(T* source, std::complex<double> (T::*func)() const) - : rpcinserter_base<T,std::complex<double> >(source, func) - {;} - - rpcbasic_inserter(T* source, std::complex<double> (T::*func)()) - : rpcinserter_base<T,std::complex<double> >(source, func) - {;} - - pmt::pmt_t retrieve() - { - std::complex<double > k((rpcinserter_base<T,std::complex<double> >:: - _source->*rpcinserter_base<T,std::complex<double> >::_func)()); - return pmt::from_complex(k); - } + rpcbasic_inserter(T* source, std::complex<double> (T::*func)() const) + : rpcinserter_base<T, std::complex<double>>(source, func) + { + ; + } + + rpcbasic_inserter(T* source, std::complex<double> (T::*func)()) + : rpcinserter_base<T, std::complex<double>>(source, func) + { + ; + } + + pmt::pmt_t retrieve() + { + std::complex<double> k( + (rpcinserter_base<T, std::complex<double>>::_source + ->*rpcinserter_base<T, std::complex<double>>::_func)()); + return pmt::from_complex(k); + } }; /*! * \brief Base class for registering a ControlPort function. */ template <typename T> -struct rpc_register_base -{ - rpc_register_base() {count++;} -protected: static int count; +struct rpc_register_base { + rpc_register_base() { count++; } + +protected: + static int count; }; /*! @@ -669,12 +744,11 @@ protected: static int count; class rpcbasic_base { public: - rpcbasic_base() {} - virtual ~rpcbasic_base() {}; + rpcbasic_base() {} + virtual ~rpcbasic_base(){}; }; - /********************************************************************* * RPC Register Set Classes ********************************************************************/ @@ -710,150 +784,164 @@ public: * Options" features. See "Display Options" in \ref page_ctrlport for * details. */ -template<typename T, typename Tto> -struct rpcbasic_register_set : public rpcbasic_base -{ - /*! - * \brief Adds the ability to set the variable over ControlPort. - * - * \details - * - * This constructor is specifically for gr::block's to use to add - * settable variables to ControlPort. Generally meant to be used - * in gr::block::setup_rpc. - * - * Uses the block's alias to create the ControlPort interface. This - * alias is cross-referenced by the global_block_registry (static - * variable of type gr::block_registry) to get the pointer to the - * block. - * - * \param block_alias Block's alias; use alias() to get it from the block. - * \param functionbase The name of the function that we'll access over ControlPort - * \param function A function pointer to the real function accessed when called - * something like: &[block class]\::set_[variable]() - * \param min Expected minimum value the parameter can hold - * \param max Expected maximum value the parameter can hold - * \param def Expected default value the parameter can hold - * \param units_ A string to describe what units to represent the variable with - * \param desc_ A string to describing the variable. - * \param minpriv_ The required minimum privilege level - * \param display_ The display mask - */ - rpcbasic_register_set(const std::string& block_alias, - const char* functionbase, - void (T::*function)(Tto), - const pmt::pmt_t &min, const pmt::pmt_t &max, const pmt::pmt_t &def, - const char* units_ = "", - const char* desc_ = "", - priv_lvl_t minpriv_ = RPC_PRIVLVL_MIN, - DisplayType display_ = DISPNULL) - { - d_min = min; - d_max = max; - d_def = def; - d_units = units_; - d_desc = desc_; - d_minpriv = minpriv_; - d_display = display_; - d_object = dynamic_cast<T*>(global_block_registry.block_lookup(pmt::intern(block_alias)).get()); +template <typename T, typename Tto> +struct rpcbasic_register_set : public rpcbasic_base { + /*! + * \brief Adds the ability to set the variable over ControlPort. + * + * \details + * + * This constructor is specifically for gr::block's to use to add + * settable variables to ControlPort. Generally meant to be used + * in gr::block::setup_rpc. + * + * Uses the block's alias to create the ControlPort interface. This + * alias is cross-referenced by the global_block_registry (static + * variable of type gr::block_registry) to get the pointer to the + * block. + * + * \param block_alias Block's alias; use alias() to get it from the block. + * \param functionbase The name of the function that we'll access over ControlPort + * \param function A function pointer to the real function accessed when called + * something like: &[block class]\::set_[variable]() + * \param min Expected minimum value the parameter can hold + * \param max Expected maximum value the parameter can hold + * \param def Expected default value the parameter can hold + * \param units_ A string to describe what units to represent the variable with + * \param desc_ A string to describing the variable. + * \param minpriv_ The required minimum privilege level + * \param display_ The display mask + */ + rpcbasic_register_set(const std::string& block_alias, + const char* functionbase, + void (T::*function)(Tto), + const pmt::pmt_t& min, + const pmt::pmt_t& max, + const pmt::pmt_t& def, + const char* units_ = "", + const char* desc_ = "", + priv_lvl_t minpriv_ = RPC_PRIVLVL_MIN, + DisplayType display_ = DISPNULL) + { + d_min = min; + d_max = max; + d_def = def; + d_units = units_; + d_desc = desc_; + d_minpriv = minpriv_; + d_display = display_; + d_object = dynamic_cast<T*>( + global_block_registry.block_lookup(pmt::intern(block_alias)).get()); #ifdef GR_RPCSERVER_ENABLED - callbackregister_base::configureCallback_t - extractor(new rpcbasic_extractor<T,Tto>(d_object, function), - minpriv_, std::string(units_), - display_, std::string(desc_), min, max, def); - std::ostringstream oss(std::ostringstream::out); - oss << block_alias << "::" << functionbase; - d_id = oss.str(); - //std::cerr << "REGISTERING SET: " << d_id << " " << desc_ << std::endl; - rpcmanager::get()->i()->registerConfigureCallback(d_id, extractor); + callbackregister_base::configureCallback_t extractor( + new rpcbasic_extractor<T, Tto>(d_object, function), + minpriv_, + std::string(units_), + display_, + std::string(desc_), + min, + max, + def); + std::ostringstream oss(std::ostringstream::out); + oss << block_alias << "::" << functionbase; + d_id = oss.str(); + // std::cerr << "REGISTERING SET: " << d_id << " " << desc_ << std::endl; + rpcmanager::get()->i()->registerConfigureCallback(d_id, extractor); #endif - } - - /*! - * \brief Adds the ability to set the variable over ControlPort. - * - * \details - * - * Allows us to add non gr::block related objects to - * ControlPort. Instead of using the block's alias, we give it a \p - * name and the actual pointer to the object as \p obj. We just need - * to make sure that the pointer to this object is always valid. - * - * \param name Name of the object being set up for ControlPort access - * \param functionbase The name of the function that we'll access over ControlPort - * \param obj A pointer to the object itself - * \param function A function pointer to the real function accessed when called - * something like: &[block class]\::set_[variable]() - * \param min Expected minimum value the parameter can hold - * \param max Expected maximum value the parameter can hold - * \param def Expected default value the parameter can hold - * \param units_ A string to describe what units to represent the variable with - * \param desc_ A string to describing the variable. - * \param minpriv_ The required minimum privilege level - * \param display_ The display mask - */ - rpcbasic_register_set(const std::string& name, - const char* functionbase, - T* obj, - void (T::*function)(Tto), - const pmt::pmt_t &min, const pmt::pmt_t &max, const pmt::pmt_t &def, - const char* units_ = "", - const char* desc_ = "", - priv_lvl_t minpriv_ = RPC_PRIVLVL_MIN, - DisplayType display_ = DISPNULL) - { - d_min = min; - d_max = max; - d_def = def; - d_units = units_; - d_desc = desc_; - d_minpriv = minpriv_; - d_display = display_; - d_object = obj; + } + + /*! + * \brief Adds the ability to set the variable over ControlPort. + * + * \details + * + * Allows us to add non gr::block related objects to + * ControlPort. Instead of using the block's alias, we give it a \p + * name and the actual pointer to the object as \p obj. We just need + * to make sure that the pointer to this object is always valid. + * + * \param name Name of the object being set up for ControlPort access + * \param functionbase The name of the function that we'll access over ControlPort + * \param obj A pointer to the object itself + * \param function A function pointer to the real function accessed when called + * something like: &[block class]\::set_[variable]() + * \param min Expected minimum value the parameter can hold + * \param max Expected maximum value the parameter can hold + * \param def Expected default value the parameter can hold + * \param units_ A string to describe what units to represent the variable with + * \param desc_ A string to describing the variable. + * \param minpriv_ The required minimum privilege level + * \param display_ The display mask + */ + rpcbasic_register_set(const std::string& name, + const char* functionbase, + T* obj, + void (T::*function)(Tto), + const pmt::pmt_t& min, + const pmt::pmt_t& max, + const pmt::pmt_t& def, + const char* units_ = "", + const char* desc_ = "", + priv_lvl_t minpriv_ = RPC_PRIVLVL_MIN, + DisplayType display_ = DISPNULL) + { + d_min = min; + d_max = max; + d_def = def; + d_units = units_; + d_desc = desc_; + d_minpriv = minpriv_; + d_display = display_; + d_object = obj; #ifdef GR_RPCSERVER_ENABLED - callbackregister_base::configureCallback_t - extractor(new rpcbasic_extractor<T,Tto>(d_object, function), - minpriv_, std::string(units_), - display_, std::string(desc_), min, max, def); - std::ostringstream oss(std::ostringstream::out); - oss << name << "::" << functionbase; - d_id = oss.str(); - //std::cerr << "REGISTERING SET: " << d_id << " " << desc_ << std::endl; - rpcmanager::get()->i()->registerConfigureCallback(d_id, extractor); + callbackregister_base::configureCallback_t extractor( + new rpcbasic_extractor<T, Tto>(d_object, function), + minpriv_, + std::string(units_), + display_, + std::string(desc_), + min, + max, + def); + std::ostringstream oss(std::ostringstream::out); + oss << name << "::" << functionbase; + d_id = oss.str(); + // std::cerr << "REGISTERING SET: " << d_id << " " << desc_ << std::endl; + rpcmanager::get()->i()->registerConfigureCallback(d_id, extractor); #endif - } + } - ~rpcbasic_register_set() - { + ~rpcbasic_register_set() + { #ifdef GR_RPCSERVER_ENABLED - rpcmanager::get()->i()->unregisterConfigureCallback(d_id); + rpcmanager::get()->i()->unregisterConfigureCallback(d_id); #endif - } + } - pmt::pmt_t min() const { return d_min; } - pmt::pmt_t max() const { return d_max; } - pmt::pmt_t def() const { return d_def; } - std::string units() const { return d_units; } - std::string description() const { return d_desc; } - priv_lvl_t privilege_level() const { return d_minpriv; } - DisplayType default_display() const { return d_display; } + pmt::pmt_t min() const { return d_min; } + pmt::pmt_t max() const { return d_max; } + pmt::pmt_t def() const { return d_def; } + std::string units() const { return d_units; } + std::string description() const { return d_desc; } + priv_lvl_t privilege_level() const { return d_minpriv; } + DisplayType default_display() const { return d_display; } - void set_min(pmt::pmt_t p) { d_min = p; } - void set_max(pmt::pmt_t p) { d_max = p; } - void set_def(pmt::pmt_t p) { d_def = p; } - void units(std::string u) { d_units = u; } - void description(std::string d) { d_desc = d; } - void privilege_level(priv_lvl_t p) { d_minpriv = p; } - void default_display(DisplayType d) { d_display = d; } + void set_min(pmt::pmt_t p) { d_min = p; } + void set_max(pmt::pmt_t p) { d_max = p; } + void set_def(pmt::pmt_t p) { d_def = p; } + void units(std::string u) { d_units = u; } + void description(std::string d) { d_desc = d; } + void privilege_level(priv_lvl_t p) { d_minpriv = p; } + void default_display(DisplayType d) { d_display = d; } private: - std::string d_id; - pmt::pmt_t d_min, d_max, d_def; - std::string d_units, d_desc; - priv_lvl_t d_minpriv; - DisplayType d_display; - T *d_object; + std::string d_id; + pmt::pmt_t d_min, d_max, d_def; + std::string d_units, d_desc; + priv_lvl_t d_minpriv; + DisplayType d_display; + T* d_object; }; @@ -881,114 +969,115 @@ private: * action, a description (\p desc_), and a privilege level (\p * minpriv_). */ -template<typename T> -struct rpcbasic_register_trigger : public rpcbasic_base -{ - /*! - * \brief Adds the ability to trigger a function over ControlPort. - * - * \details - * - * This constructor is specifically for gr::block's to use to add - * trigger functions to ControlPort. Generally meant to be used - * in gr::block::setup_rpc. - * - * Uses the block's alias to create the ControlPort interface. This - * alias is cross-referenced by the global_block_registry (static - * variable of type gr::block_registry) to get the pointer to the - * block. - * - * \param block_alias Block's alias; use alias() to get it from the block. - * \param functionbase The name of the function that we'll access over ControlPort - * \param function A function pointer to the real function accessed when called - * something like: &[block class]\::set_[variable] - * \param desc_ A string to describing the variable. - * \param minpriv_ The required minimum privilege level - */ - rpcbasic_register_trigger(const std::string& block_alias, - const char* functionbase, - void (T::*function)(), - const char* desc_ = "", - priv_lvl_t minpriv_ = RPC_PRIVLVL_MIN) - { - d_desc = desc_; - d_minpriv = minpriv_; - d_object = dynamic_cast<T*>(global_block_registry.block_lookup(pmt::intern(block_alias)).get()); +template <typename T> +struct rpcbasic_register_trigger : public rpcbasic_base { + /*! + * \brief Adds the ability to trigger a function over ControlPort. + * + * \details + * + * This constructor is specifically for gr::block's to use to add + * trigger functions to ControlPort. Generally meant to be used + * in gr::block::setup_rpc. + * + * Uses the block's alias to create the ControlPort interface. This + * alias is cross-referenced by the global_block_registry (static + * variable of type gr::block_registry) to get the pointer to the + * block. + * + * \param block_alias Block's alias; use alias() to get it from the block. + * \param functionbase The name of the function that we'll access over ControlPort + * \param function A function pointer to the real function accessed when called + * something like: &[block class]\::set_[variable] + * \param desc_ A string to describing the variable. + * \param minpriv_ The required minimum privilege level + */ + rpcbasic_register_trigger(const std::string& block_alias, + const char* functionbase, + void (T::*function)(), + const char* desc_ = "", + priv_lvl_t minpriv_ = RPC_PRIVLVL_MIN) + { + d_desc = desc_; + d_minpriv = minpriv_; + d_object = dynamic_cast<T*>( + global_block_registry.block_lookup(pmt::intern(block_alias)).get()); #ifdef GR_RPCSERVER_ENABLED - callbackregister_base::configureCallback_t - extractor(new rpcbasic_extractor<T,void>(d_object, function), - minpriv_, std::string(desc_)); - std::ostringstream oss(std::ostringstream::out); - oss << block_alias << "::" << functionbase; - d_id = oss.str(); - //std::cerr << "REGISTERING TRIGGER: " << d_id << " " << desc_ << std::endl; - rpcmanager::get()->i()->registerConfigureCallback(d_id, extractor); + callbackregister_base::configureCallback_t extractor( + new rpcbasic_extractor<T, void>(d_object, function), + minpriv_, + std::string(desc_)); + std::ostringstream oss(std::ostringstream::out); + oss << block_alias << "::" << functionbase; + d_id = oss.str(); + // std::cerr << "REGISTERING TRIGGER: " << d_id << " " << desc_ << std::endl; + rpcmanager::get()->i()->registerConfigureCallback(d_id, extractor); #endif - } - - /*! - * \brief Adds the ability to trigger a function over ControlPort. - * - * \details - * - * Allows us to add non gr::block related objects to - * ControlPort. Instead of using the block's alias, we give it a \p - * name and the actual pointer to the object as \p obj. We just need - * to make sure that the pointer to this object is always valid. - * - * \param name Name of the object being set up for ControlPort access - * \param functionbase The name of the function that we'll access over ControlPort - * \param obj A pointer to the object itself - * \param function A function pointer to the real function accessed when called - * something like: &[block class]\::set_[variable] - * \param desc_ A string to describing the variable. - * \param minpriv_ The required minimum privilege level - */ - rpcbasic_register_trigger(const std::string& name, - const char* functionbase, - T* obj, - void (T::*function)(), - const char* desc_ = "", - priv_lvl_t minpriv_ = RPC_PRIVLVL_MIN) - { - d_desc = desc_; - d_minpriv = minpriv_; - d_object = obj; + } + + /*! + * \brief Adds the ability to trigger a function over ControlPort. + * + * \details + * + * Allows us to add non gr::block related objects to + * ControlPort. Instead of using the block's alias, we give it a \p + * name and the actual pointer to the object as \p obj. We just need + * to make sure that the pointer to this object is always valid. + * + * \param name Name of the object being set up for ControlPort access + * \param functionbase The name of the function that we'll access over ControlPort + * \param obj A pointer to the object itself + * \param function A function pointer to the real function accessed when called + * something like: &[block class]\::set_[variable] + * \param desc_ A string to describing the variable. + * \param minpriv_ The required minimum privilege level + */ + rpcbasic_register_trigger(const std::string& name, + const char* functionbase, + T* obj, + void (T::*function)(), + const char* desc_ = "", + priv_lvl_t minpriv_ = RPC_PRIVLVL_MIN) + { + d_desc = desc_; + d_minpriv = minpriv_; + d_object = obj; #ifdef GR_RPCSERVER_ENABLED - callbackregister_base::configureCallback_t - extractor(new rpcbasic_extractor<T,void>(d_object, function), - minpriv_, std::string(desc_)); - std::ostringstream oss(std::ostringstream::out); - oss << name << "::" << functionbase; - d_id = oss.str(); - //std::cerr << "REGISTERING TRIGGER: " << d_id << " " << desc_ << std::endl; - rpcmanager::get()->i()->registerConfigureCallback(d_id, extractor); + callbackregister_base::configureCallback_t extractor( + new rpcbasic_extractor<T, void>(d_object, function), + minpriv_, + std::string(desc_)); + std::ostringstream oss(std::ostringstream::out); + oss << name << "::" << functionbase; + d_id = oss.str(); + // std::cerr << "REGISTERING TRIGGER: " << d_id << " " << desc_ << std::endl; + rpcmanager::get()->i()->registerConfigureCallback(d_id, extractor); #endif - } + } - ~rpcbasic_register_trigger() - { + ~rpcbasic_register_trigger() + { #ifdef GR_RPCSERVER_ENABLED - rpcmanager::get()->i()->unregisterConfigureCallback(d_id); + rpcmanager::get()->i()->unregisterConfigureCallback(d_id); #endif - } + } - std::string description() const { return d_desc; } - priv_lvl_t privilege_level() const { return d_minpriv; } + std::string description() const { return d_desc; } + priv_lvl_t privilege_level() const { return d_minpriv; } - void description(std::string d) { d_desc = d; } - void privilege_level(priv_lvl_t p) { d_minpriv = p; } + void description(std::string d) { d_desc = d; } + void privilege_level(priv_lvl_t p) { d_minpriv = p; } private: - std::string d_id; - std::string d_desc; - priv_lvl_t d_minpriv; - T *d_object; + std::string d_id; + std::string d_desc; + priv_lvl_t d_minpriv; + T* d_object; }; - /********************************************************************* * RPC Register Get Classes ********************************************************************/ @@ -1024,223 +1113,257 @@ private: * Options" features. See "Display Options" in \ref page_ctrlport for * details. */ -template<typename T, typename Tfrom> +template <typename T, typename Tfrom> class rpcbasic_register_get : public rpcbasic_base { public: - - /*! - * \brief Adds the ability to get the variable over ControlPort. - * - * \details - * - * This constructor is specifically for gr::block's to use to add - * gettable variables to ControlPort. Generally meant to be used - * in gr::block::setup_rpc. - * - * Uses the block's alias to create the ControlPort interface. This - * alias is cross-referenced by the global_block_registry (static - * variable of type gr::block_registry) to get the pointer to the - * block. - * - * \param block_alias Block's alias; use alias() to get it from the block. - * \param functionbase The name of the function that we'll access over ControlPort - * \param function A function pointer to the real function accessed when called - * something like: &[block class]\::[variable]() - * \param min Expected minimum value the parameter can hold - * \param max Expected maximum value the parameter can hold - * \param def Expected default value the parameter can hold - * \param units_ A string to describe what units to represent the variable with - * \param desc_ A string to describing the variable. - * \param minpriv_ The required minimum privilege level - * \param display_ The display mask - */ - rpcbasic_register_get(const std::string& block_alias, - const char* functionbase, - Tfrom (T::*function)(), - const pmt::pmt_t &min, const pmt::pmt_t &max, const pmt::pmt_t &def, - const char* units_ = "", - const char* desc_ = "", - priv_lvl_t minpriv_ = RPC_PRIVLVL_MIN, - DisplayType display_ = DISPNULL) - { - d_min = min; - d_max = max; - d_def = def; - d_units = units_; - d_desc = desc_; - d_minpriv = minpriv_; - d_display = display_; - d_object = dynamic_cast<T*>(global_block_registry.block_lookup(pmt::intern(block_alias)).get()); + /*! + * \brief Adds the ability to get the variable over ControlPort. + * + * \details + * + * This constructor is specifically for gr::block's to use to add + * gettable variables to ControlPort. Generally meant to be used + * in gr::block::setup_rpc. + * + * Uses the block's alias to create the ControlPort interface. This + * alias is cross-referenced by the global_block_registry (static + * variable of type gr::block_registry) to get the pointer to the + * block. + * + * \param block_alias Block's alias; use alias() to get it from the block. + * \param functionbase The name of the function that we'll access over ControlPort + * \param function A function pointer to the real function accessed when called + * something like: &[block class]\::[variable]() + * \param min Expected minimum value the parameter can hold + * \param max Expected maximum value the parameter can hold + * \param def Expected default value the parameter can hold + * \param units_ A string to describe what units to represent the variable with + * \param desc_ A string to describing the variable. + * \param minpriv_ The required minimum privilege level + * \param display_ The display mask + */ + rpcbasic_register_get(const std::string& block_alias, + const char* functionbase, + Tfrom (T::*function)(), + const pmt::pmt_t& min, + const pmt::pmt_t& max, + const pmt::pmt_t& def, + const char* units_ = "", + const char* desc_ = "", + priv_lvl_t minpriv_ = RPC_PRIVLVL_MIN, + DisplayType display_ = DISPNULL) + { + d_min = min; + d_max = max; + d_def = def; + d_units = units_; + d_desc = desc_; + d_minpriv = minpriv_; + d_display = display_; + d_object = dynamic_cast<T*>( + global_block_registry.block_lookup(pmt::intern(block_alias)).get()); #ifdef GR_RPCSERVER_ENABLED - callbackregister_base::queryCallback_t - inserter(new rpcbasic_inserter<T,Tfrom>(d_object, function), - minpriv_, std::string(units_), display_, std::string(desc_), min, max, def); - std::ostringstream oss(std::ostringstream::out); - oss << block_alias << "::" << functionbase; - d_id = oss.str(); - //std::cerr << "REGISTERING GET: " << d_id << " " << desc_ << std::endl; - rpcmanager::get()->i()->registerQueryCallback(d_id, inserter); + callbackregister_base::queryCallback_t inserter( + new rpcbasic_inserter<T, Tfrom>(d_object, function), + minpriv_, + std::string(units_), + display_, + std::string(desc_), + min, + max, + def); + std::ostringstream oss(std::ostringstream::out); + oss << block_alias << "::" << functionbase; + d_id = oss.str(); + // std::cerr << "REGISTERING GET: " << d_id << " " << desc_ << std::endl; + rpcmanager::get()->i()->registerQueryCallback(d_id, inserter); #endif - } - - - /*! - * \brief Same as rpcbasic_register_get::rpcbasic_register_get that allows using - * '[variable]() const' getter functions. - */ - rpcbasic_register_get(const std::string& block_alias, - const char* functionbase, - Tfrom (T::*function)() const, - const pmt::pmt_t &min, const pmt::pmt_t &max, const pmt::pmt_t &def, - const char* units_ = "", - const char* desc_ = "", - priv_lvl_t minpriv_ = RPC_PRIVLVL_MIN, - DisplayType display_ = DISPNULL) - { - d_min = min; - d_max = max; - d_def = def; - d_units = units_; - d_desc = desc_; - d_minpriv = minpriv_; - d_display = display_; - d_object = dynamic_cast<T*>(global_block_registry.block_lookup(pmt::intern(block_alias)).get()); + } + + + /*! + * \brief Same as rpcbasic_register_get::rpcbasic_register_get that allows using + * '[variable]() const' getter functions. + */ + rpcbasic_register_get(const std::string& block_alias, + const char* functionbase, + Tfrom (T::*function)() const, + const pmt::pmt_t& min, + const pmt::pmt_t& max, + const pmt::pmt_t& def, + const char* units_ = "", + const char* desc_ = "", + priv_lvl_t minpriv_ = RPC_PRIVLVL_MIN, + DisplayType display_ = DISPNULL) + { + d_min = min; + d_max = max; + d_def = def; + d_units = units_; + d_desc = desc_; + d_minpriv = minpriv_; + d_display = display_; + d_object = dynamic_cast<T*>( + global_block_registry.block_lookup(pmt::intern(block_alias)).get()); #ifdef GR_RPCSERVER_ENABLED - callbackregister_base::queryCallback_t - inserter(new rpcbasic_inserter<T,Tfrom>(d_object, (Tfrom (T::*)())function), - minpriv_, std::string(units_), display_, std::string(desc_), min, max, def); - std::ostringstream oss(std::ostringstream::out); - oss << block_alias << "::" << functionbase; - d_id = oss.str(); - //std::cerr << "REGISTERING GET CONST: " << d_id << " " << desc_ << " " << display_ << std::endl; - rpcmanager::get()->i()->registerQueryCallback(d_id, inserter); + callbackregister_base::queryCallback_t inserter( + new rpcbasic_inserter<T, Tfrom>(d_object, (Tfrom(T::*)())function), + minpriv_, + std::string(units_), + display_, + std::string(desc_), + min, + max, + def); + std::ostringstream oss(std::ostringstream::out); + oss << block_alias << "::" << functionbase; + d_id = oss.str(); + // std::cerr << "REGISTERING GET CONST: " << d_id << " " << desc_ << " " << + // display_ << std::endl; + rpcmanager::get()->i()->registerQueryCallback(d_id, inserter); #endif - } - - - /*! - * \brief Adds the ability to get the variable over ControlPort. - * - * \details - * - * Allows us to add non gr::block related objects to - * ControlPort. Instead of using the block's alias, we give it a \p - * name and the actual pointer to the object as \p obj. We just need - * to make sure that the pointer to this object is always valid. - * - * \param name Name of the object being set up for ControlPort access - * \param functionbase The name of the function that we'll access over ControlPort - * \param obj A pointer to the object itself - * \param function A function pointer to the real function accessed when called - * something like: &[block class]\::set_[variable]() - * \param min Expected minimum value the parameter can hold - * \param max Expected maximum value the parameter can hold - * \param def Expected default value the parameter can hold - * \param units_ A string to describe what units to represent the variable with - * \param desc_ A string to describing the variable. - * \param minpriv_ The required minimum privilege level - * \param display_ The display mask - */ - rpcbasic_register_get(const std::string& name, - const char* functionbase, - T* obj, - Tfrom (T::*function)(), - const pmt::pmt_t &min, const pmt::pmt_t &max, const pmt::pmt_t &def, - const char* units_ = "", - const char* desc_ = "", - priv_lvl_t minpriv_ = RPC_PRIVLVL_MIN, - DisplayType display_ = DISPNULL) - { - d_min = min; - d_max = max; - d_def = def; - d_units = units_; - d_desc = desc_; - d_minpriv = minpriv_; - d_display = display_; - d_object = obj; + } + + + /*! + * \brief Adds the ability to get the variable over ControlPort. + * + * \details + * + * Allows us to add non gr::block related objects to + * ControlPort. Instead of using the block's alias, we give it a \p + * name and the actual pointer to the object as \p obj. We just need + * to make sure that the pointer to this object is always valid. + * + * \param name Name of the object being set up for ControlPort access + * \param functionbase The name of the function that we'll access over ControlPort + * \param obj A pointer to the object itself + * \param function A function pointer to the real function accessed when called + * something like: &[block class]\::set_[variable]() + * \param min Expected minimum value the parameter can hold + * \param max Expected maximum value the parameter can hold + * \param def Expected default value the parameter can hold + * \param units_ A string to describe what units to represent the variable with + * \param desc_ A string to describing the variable. + * \param minpriv_ The required minimum privilege level + * \param display_ The display mask + */ + rpcbasic_register_get(const std::string& name, + const char* functionbase, + T* obj, + Tfrom (T::*function)(), + const pmt::pmt_t& min, + const pmt::pmt_t& max, + const pmt::pmt_t& def, + const char* units_ = "", + const char* desc_ = "", + priv_lvl_t minpriv_ = RPC_PRIVLVL_MIN, + DisplayType display_ = DISPNULL) + { + d_min = min; + d_max = max; + d_def = def; + d_units = units_; + d_desc = desc_; + d_minpriv = minpriv_; + d_display = display_; + d_object = obj; #ifdef GR_RPCSERVER_ENABLED - callbackregister_base::queryCallback_t - inserter(new rpcbasic_inserter<T,Tfrom>(d_object, function), - minpriv_, std::string(units_), display_, std::string(desc_), min, max, def); - std::ostringstream oss(std::ostringstream::out); - oss << name << "::" << functionbase; - d_id = oss.str(); - //std::cerr << "REGISTERING GET: " << d_id << " " << desc_ << std::endl; - rpcmanager::get()->i()->registerQueryCallback(d_id, inserter); + callbackregister_base::queryCallback_t inserter( + new rpcbasic_inserter<T, Tfrom>(d_object, function), + minpriv_, + std::string(units_), + display_, + std::string(desc_), + min, + max, + def); + std::ostringstream oss(std::ostringstream::out); + oss << name << "::" << functionbase; + d_id = oss.str(); + // std::cerr << "REGISTERING GET: " << d_id << " " << desc_ << std::endl; + rpcmanager::get()->i()->registerQueryCallback(d_id, inserter); #endif - } - - - /*! - * \brief Same as above that allows using '[variable]() const' - * getter functions. - */ - rpcbasic_register_get(const std::string& name, - const char* functionbase, - T* obj, - Tfrom (T::*function)() const, - const pmt::pmt_t &min, const pmt::pmt_t &max, const pmt::pmt_t &def, - const char* units_ = "", - const char* desc_ = "", - priv_lvl_t minpriv_ = RPC_PRIVLVL_MIN, - DisplayType display_ = DISPNULL) - { - d_min = min; - d_max = max; - d_def = def; - d_units = units_; - d_desc = desc_; - d_minpriv = minpriv_; - d_display = display_; - d_object = obj; + } + + + /*! + * \brief Same as above that allows using '[variable]() const' + * getter functions. + */ + rpcbasic_register_get(const std::string& name, + const char* functionbase, + T* obj, + Tfrom (T::*function)() const, + const pmt::pmt_t& min, + const pmt::pmt_t& max, + const pmt::pmt_t& def, + const char* units_ = "", + const char* desc_ = "", + priv_lvl_t minpriv_ = RPC_PRIVLVL_MIN, + DisplayType display_ = DISPNULL) + { + d_min = min; + d_max = max; + d_def = def; + d_units = units_; + d_desc = desc_; + d_minpriv = minpriv_; + d_display = display_; + d_object = obj; #ifdef GR_RPCSERVER_ENABLED - callbackregister_base::queryCallback_t - inserter(new rpcbasic_inserter<T,Tfrom>(d_object, (Tfrom (T::*)())function), - minpriv_, std::string(units_), display_, std::string(desc_), min, max, def); - std::ostringstream oss(std::ostringstream::out); - oss << name << "::" << functionbase; - d_id = oss.str(); - //std::cerr << "REGISTERING GET CONST: " << d_id << " " << desc_ << " " << display_ << std::endl; - rpcmanager::get()->i()->registerQueryCallback(d_id, inserter); + callbackregister_base::queryCallback_t inserter( + new rpcbasic_inserter<T, Tfrom>(d_object, (Tfrom(T::*)())function), + minpriv_, + std::string(units_), + display_, + std::string(desc_), + min, + max, + def); + std::ostringstream oss(std::ostringstream::out); + oss << name << "::" << functionbase; + d_id = oss.str(); + // std::cerr << "REGISTERING GET CONST: " << d_id << " " << desc_ << " " << + // display_ << std::endl; + rpcmanager::get()->i()->registerQueryCallback(d_id, inserter); #endif - } + } - ~rpcbasic_register_get() - { + ~rpcbasic_register_get() + { #ifdef GR_RPCSERVER_ENABLED - rpcmanager::get()->i()->unregisterQueryCallback(d_id); + rpcmanager::get()->i()->unregisterQueryCallback(d_id); #endif - } - - pmt::pmt_t min() const { return d_min; } - pmt::pmt_t max() const { return d_max; } - pmt::pmt_t def() const { return d_def; } - std::string units() const { return d_units; } - std::string description() const { return d_desc; } - priv_lvl_t privilege_level() const { return d_minpriv; } - DisplayType default_display() const { return d_display; } - - void set_min(pmt::pmt_t p) { d_min = p; } - void set_max(pmt::pmt_t p) { d_max = p; } - void set_def(pmt::pmt_t p) { d_def = p; } - void units(std::string u) { d_units = u; } - void description(std::string d) { d_desc = d; } - void privilege_level(priv_lvl_t p) { d_minpriv = p; } - void default_display(DisplayType d) { d_display = d; } + } + + pmt::pmt_t min() const { return d_min; } + pmt::pmt_t max() const { return d_max; } + pmt::pmt_t def() const { return d_def; } + std::string units() const { return d_units; } + std::string description() const { return d_desc; } + priv_lvl_t privilege_level() const { return d_minpriv; } + DisplayType default_display() const { return d_display; } + + void set_min(pmt::pmt_t p) { d_min = p; } + void set_max(pmt::pmt_t p) { d_max = p; } + void set_def(pmt::pmt_t p) { d_def = p; } + void units(std::string u) { d_units = u; } + void description(std::string d) { d_desc = d; } + void privilege_level(priv_lvl_t p) { d_minpriv = p; } + void default_display(DisplayType d) { d_display = d; } private: - std::string d_id; - pmt::pmt_t d_min, d_max, d_def; - std::string d_units, d_desc; - priv_lvl_t d_minpriv; - DisplayType d_display; - T *d_object; + std::string d_id; + pmt::pmt_t d_min, d_max, d_def; + std::string d_units, d_desc; + priv_lvl_t d_minpriv; + DisplayType d_display; + T* d_object; }; - /********************************************************************* * RPC Register Variable Classes ********************************************************************/ @@ -1278,66 +1401,85 @@ private: * Options" features. See "Display Options" in \ref page_ctrlport for * details. */ -template<typename Tfrom> -class rpcbasic_register_variable - : public rpcbasic_base +template <typename Tfrom> +class rpcbasic_register_variable : public rpcbasic_base { protected: - rpcbasic_register_get< rpcbasic_register_variable<Tfrom>, Tfrom > d_rpc_reg; - Tfrom *d_variable; - Tfrom get() { return *d_variable; } + rpcbasic_register_get<rpcbasic_register_variable<Tfrom>, Tfrom> d_rpc_reg; + Tfrom* d_variable; + Tfrom get() { return *d_variable; } public: - - void setptr(Tfrom* _variable) - { - rpcbasic_register_variable<Tfrom>::d_variable = _variable; - } - - /*! Empty constructor which should never be called but needs to - * exist for ues in varous STL data structures - */ - rpcbasic_register_variable() : - d_rpc_reg("FAIL", "FAIL", this, &rpcbasic_register_variable::get, - pmt::PMT_NIL, pmt::PMT_NIL, pmt::PMT_NIL, DISPNULL, - "FAIL", "FAIL", RPC_PRIVLVL_MIN), - d_variable(NULL) - { - throw std::runtime_error("ERROR: rpcbasic_register_variable called with no args. If this happens, someone has tried to use rpcbasic_register_variable incorrectly."); - }; - - /*! - * \brief Adds the ability to get the variable over ControlPort. - * - * \details - * - * Creates a new getter accessor function to read \p variable. - * - * \param namebase Name of the object being set up for ControlPort access - * \param functionbase The name of the function that we'll access over ControlPort - * \param variable A pointer to the variable, possibly as a member of a class - * \param min Expected minimum value the parameter can hold - * \param max Expected maximum value the parameter can hold - * \param def Expected default value the parameter can hold - * \param units_ A string to describe what units to represent the variable with - * \param desc_ A string to describing the variable. - * \param minpriv_ The required minimum privilege level - * \param display_ The display mask - */ - rpcbasic_register_variable(const std::string& namebase, - const char* functionbase, - Tfrom *variable, - const pmt::pmt_t &min, const pmt::pmt_t &max, const pmt::pmt_t &def, - const char* units_ = "", - const char* desc_ = "", - priv_lvl_t minpriv_ = RPC_PRIVLVL_MIN, - DisplayType display_ = DISPNULL) : - d_rpc_reg(namebase, functionbase, this, &rpcbasic_register_variable::get, - min, max, def, units_, desc_, minpriv_, display_), - d_variable(variable) - { - //std::cerr << "REGISTERING VAR: " << " " << desc_ << std::endl; - } + void setptr(Tfrom* _variable) + { + rpcbasic_register_variable<Tfrom>::d_variable = _variable; + } + + /*! Empty constructor which should never be called but needs to + * exist for ues in varous STL data structures + */ + rpcbasic_register_variable() + : d_rpc_reg("FAIL", + "FAIL", + this, + &rpcbasic_register_variable::get, + pmt::PMT_NIL, + pmt::PMT_NIL, + pmt::PMT_NIL, + DISPNULL, + "FAIL", + "FAIL", + RPC_PRIVLVL_MIN), + d_variable(NULL) + { + throw std::runtime_error( + "ERROR: rpcbasic_register_variable called with no args. If this happens, " + "someone has tried to use rpcbasic_register_variable incorrectly."); + }; + + /*! + * \brief Adds the ability to get the variable over ControlPort. + * + * \details + * + * Creates a new getter accessor function to read \p variable. + * + * \param namebase Name of the object being set up for ControlPort access + * \param functionbase The name of the function that we'll access over ControlPort + * \param variable A pointer to the variable, possibly as a member of a class + * \param min Expected minimum value the parameter can hold + * \param max Expected maximum value the parameter can hold + * \param def Expected default value the parameter can hold + * \param units_ A string to describe what units to represent the variable with + * \param desc_ A string to describing the variable. + * \param minpriv_ The required minimum privilege level + * \param display_ The display mask + */ + rpcbasic_register_variable(const std::string& namebase, + const char* functionbase, + Tfrom* variable, + const pmt::pmt_t& min, + const pmt::pmt_t& max, + const pmt::pmt_t& def, + const char* units_ = "", + const char* desc_ = "", + priv_lvl_t minpriv_ = RPC_PRIVLVL_MIN, + DisplayType display_ = DISPNULL) + : d_rpc_reg(namebase, + functionbase, + this, + &rpcbasic_register_variable::get, + min, + max, + def, + units_, + desc_, + minpriv_, + display_), + d_variable(variable) + { + // std::cerr << "REGISTERING VAR: " << " " << desc_ << std::endl; + } }; @@ -1376,66 +1518,83 @@ public: * Options" features. See "Display Options" in \ref page_ctrlport for * details. */ -template<typename Tfrom> -class rpcbasic_register_variable_rw - : public rpcbasic_register_variable<Tfrom> +template <typename Tfrom> +class rpcbasic_register_variable_rw : public rpcbasic_register_variable<Tfrom> { private: - rpcbasic_register_set< rpcbasic_register_variable_rw<Tfrom>, Tfrom > d_rpc_regset; + rpcbasic_register_set<rpcbasic_register_variable_rw<Tfrom>, Tfrom> d_rpc_regset; public: - /*! Empty constructor which should never be called but needs to - * exist for ues in varous STL data structures. - */ - rpcbasic_register_variable_rw() : - d_rpc_regset("FAIL", "FAIL", this, - &rpcbasic_register_variable<Tfrom>::get, - pmt::PMT_NIL, pmt::PMT_NIL, pmt::PMT_NIL, - DISPNULL, "FAIL", "FAIL", RPC_PRIVLVL_MIN) - { - throw std::runtime_error("ERROR: rpcbasic_register_variable_rw called with no args. if this happens someone used rpcbasic_register_variable_rw incorrectly.\n"); - }; - - void set(Tfrom _variable) - { - *(rpcbasic_register_variable<Tfrom>::d_variable) = _variable; - } - - /*! - * \brief Adds the ability to set and get the variable over ControlPort. - * - * \details - * - * Creates new getter and setter accessor functions to read and write \p variable. - * - * \param namebase Name of the object being set up for ControlPort access - * \param functionbase The name of the function that we'll access over ControlPort - * \param variable A pointer to the variable, possibly as a member of a class - * \param min Expected minimum value the parameter can hold - * \param max Expected maximum value the parameter can hold - * \param def Expected default value the parameter can hold - * \param units_ A string to describe what units to represent the variable with - * \param desc_ A string to describing the variable. - * \param minpriv The required minimum privilege level - * \param display_ The display mask - */ - rpcbasic_register_variable_rw( - const std::string& namebase, - const char* functionbase, - Tfrom *variable, - const pmt::pmt_t &min, const pmt::pmt_t &max, const pmt::pmt_t &def, - const char* units_ = "", - const char* desc_ = "", - priv_lvl_t minpriv = RPC_PRIVLVL_MIN, - DisplayType display_=DISPNULL) - : rpcbasic_register_variable<Tfrom>(namebase, functionbase, variable, - min, max, def, units_, desc_), - d_rpc_regset(namebase, functionbase, this, - &rpcbasic_register_variable_rw::set, - min, max, def, units_, desc_, minpriv, display_) - { - // no action - } + /*! Empty constructor which should never be called but needs to + * exist for ues in varous STL data structures. + */ + rpcbasic_register_variable_rw() + : d_rpc_regset("FAIL", + "FAIL", + this, + &rpcbasic_register_variable<Tfrom>::get, + pmt::PMT_NIL, + pmt::PMT_NIL, + pmt::PMT_NIL, + DISPNULL, + "FAIL", + "FAIL", + RPC_PRIVLVL_MIN) + { + throw std::runtime_error( + "ERROR: rpcbasic_register_variable_rw called with no args. if this happens " + "someone used rpcbasic_register_variable_rw incorrectly.\n"); + }; + + void set(Tfrom _variable) + { + *(rpcbasic_register_variable<Tfrom>::d_variable) = _variable; + } + + /*! + * \brief Adds the ability to set and get the variable over ControlPort. + * + * \details + * + * Creates new getter and setter accessor functions to read and write \p variable. + * + * \param namebase Name of the object being set up for ControlPort access + * \param functionbase The name of the function that we'll access over ControlPort + * \param variable A pointer to the variable, possibly as a member of a class + * \param min Expected minimum value the parameter can hold + * \param max Expected maximum value the parameter can hold + * \param def Expected default value the parameter can hold + * \param units_ A string to describe what units to represent the variable with + * \param desc_ A string to describing the variable. + * \param minpriv The required minimum privilege level + * \param display_ The display mask + */ + rpcbasic_register_variable_rw(const std::string& namebase, + const char* functionbase, + Tfrom* variable, + const pmt::pmt_t& min, + const pmt::pmt_t& max, + const pmt::pmt_t& def, + const char* units_ = "", + const char* desc_ = "", + priv_lvl_t minpriv = RPC_PRIVLVL_MIN, + DisplayType display_ = DISPNULL) + : rpcbasic_register_variable<Tfrom>( + namebase, functionbase, variable, min, max, def, units_, desc_), + d_rpc_regset(namebase, + functionbase, + this, + &rpcbasic_register_variable_rw::set, + min, + max, + def, + units_, + desc_, + minpriv, + display_) + { + // no action + } }; @@ -1443,77 +1602,81 @@ public: * \brief Registers a message handler function to post a message to a * block's handler. */ -template<typename T> +template <typename T> class rpcbasic_register_handler : public rpcbasic_base { public: - - /*! - * \brief Adds the ability to pass a message over ControlPort. - * - * \details - * This makes any message handler function available over - * ControlPort. Since message handlers always take in a single PMT - * message input, this interface provides a very generic way of - * setting values in a block in a flowgraph. - * - * \param block_alias Alias of the block - * \param handler The name of the message port in the block - * \param units_ A string to describe what units to represent the variable with - * \param desc_ A string to describing the variable. - * \param minpriv_ The required minimum privilege level - * \param display_ The display mask - */ - rpcbasic_register_handler(const std::string& block_alias, - const char* handler, - const char* units_ = "", - const char* desc_ = "", - priv_lvl_t minpriv_ = RPC_PRIVLVL_MIN, - DisplayType display_ = DISPNULL) - { - d_units = units_; - d_desc = desc_; - d_minpriv = minpriv_; - d_display = display_; - d_object = dynamic_cast<T*>(global_block_registry.block_lookup(pmt::intern(block_alias)).get()); + /*! + * \brief Adds the ability to pass a message over ControlPort. + * + * \details + * This makes any message handler function available over + * ControlPort. Since message handlers always take in a single PMT + * message input, this interface provides a very generic way of + * setting values in a block in a flowgraph. + * + * \param block_alias Alias of the block + * \param handler The name of the message port in the block + * \param units_ A string to describe what units to represent the variable with + * \param desc_ A string to describing the variable. + * \param minpriv_ The required minimum privilege level + * \param display_ The display mask + */ + rpcbasic_register_handler(const std::string& block_alias, + const char* handler, + const char* units_ = "", + const char* desc_ = "", + priv_lvl_t minpriv_ = RPC_PRIVLVL_MIN, + DisplayType display_ = DISPNULL) + { + d_units = units_; + d_desc = desc_; + d_minpriv = minpriv_; + d_display = display_; + d_object = dynamic_cast<T*>( + global_block_registry.block_lookup(pmt::intern(block_alias)).get()); #ifdef GR_RPCSERVER_ENABLED - callbackregister_base::handlerCallback_t - inserter(new rpcbasic_handler<T>(d_object, handler), - minpriv_, std::string(units_), display_, std::string(desc_), - 0, 0, 0); - std::ostringstream oss(std::ostringstream::out); - oss << block_alias << "::" << handler; - d_id = oss.str(); - //std::cerr << "REGISTERING GET: " << d_id << " " << desc_ << std::endl; - rpcmanager::get()->i()->registerHandlerCallback(d_id, inserter); + callbackregister_base::handlerCallback_t inserter( + new rpcbasic_handler<T>(d_object, handler), + minpriv_, + std::string(units_), + display_, + std::string(desc_), + 0, + 0, + 0); + std::ostringstream oss(std::ostringstream::out); + oss << block_alias << "::" << handler; + d_id = oss.str(); + // std::cerr << "REGISTERING GET: " << d_id << " " << desc_ << std::endl; + rpcmanager::get()->i()->registerHandlerCallback(d_id, inserter); #endif - } + } - ~rpcbasic_register_handler() - { + ~rpcbasic_register_handler() + { #ifdef GR_RPCSERVER_ENABLED - rpcmanager::get()->i()->unregisterHandlerCallback(d_id); + rpcmanager::get()->i()->unregisterHandlerCallback(d_id); #endif - } + } - std::string units() const { return d_units; } - std::string description() const { return d_desc; } - priv_lvl_t privilege_level() const { return d_minpriv; } - DisplayType default_display() const { return d_display; } + std::string units() const { return d_units; } + std::string description() const { return d_desc; } + priv_lvl_t privilege_level() const { return d_minpriv; } + DisplayType default_display() const { return d_display; } - void units(std::string u) { d_units = u; } - void description(std::string d) { d_desc = d; } - void privilege_level(priv_lvl_t p) { d_minpriv = p; } - void default_display(DisplayType d) { d_display = d; } + void units(std::string u) { d_units = u; } + void description(std::string d) { d_desc = d; } + void privilege_level(priv_lvl_t p) { d_minpriv = p; } + void default_display(DisplayType d) { d_display = d; } private: - std::string d_id; - std::string d_units, d_desc; - priv_lvl_t d_minpriv; - DisplayType d_display; - T *d_object; + std::string d_id; + std::string d_units, d_desc; + priv_lvl_t d_minpriv; + DisplayType d_display; + T* d_object; }; - #endif diff --git a/gnuradio-runtime/include/gnuradio/rpcserver_aggregator.h b/gnuradio-runtime/include/gnuradio/rpcserver_aggregator.h index 08426bb00c..75484ba1a2 100644 --- a/gnuradio-runtime/include/gnuradio/rpcserver_aggregator.h +++ b/gnuradio-runtime/include/gnuradio/rpcserver_aggregator.h @@ -31,99 +31,95 @@ class rpcserver_aggregator : public virtual rpcserver_base { public: - rpcserver_aggregator(); - virtual ~rpcserver_aggregator(); + rpcserver_aggregator(); + virtual ~rpcserver_aggregator(); - void registerConfigureCallback(const std::string &id, const configureCallback_t callback); - void unregisterConfigureCallback(const std::string &id); + void registerConfigureCallback(const std::string& id, + const configureCallback_t callback); + void unregisterConfigureCallback(const std::string& id); - void registerQueryCallback(const std::string &id, const queryCallback_t callback); - void unregisterQueryCallback(const std::string &id); + void registerQueryCallback(const std::string& id, const queryCallback_t callback); + void unregisterQueryCallback(const std::string& id); - void registerHandlerCallback(const std::string &id, const handlerCallback_t callback); - void unregisterHandlerCallback(const std::string &id); + void registerHandlerCallback(const std::string& id, const handlerCallback_t callback); + void unregisterHandlerCallback(const std::string& id); - void registerServer(rpcmanager_base::rpcserver_booter_base_sptr server); + void registerServer(rpcmanager_base::rpcserver_booter_base_sptr server); - const std::string& type(); + const std::string& type(); - const std::vector<std::string>& registeredServers(); + const std::vector<std::string>& registeredServers(); private: - template<class T, typename Tcallback> - struct registerConfigureCallback_f: public std::unary_function<T,void> - { - registerConfigureCallback_f(const std::string &_id, const Tcallback _callback) - : id(_id), callback(_callback) - {;} - - void operator()(T& x) { x->i()->registerConfigureCallback(id, callback); } - const std::string& id; const Tcallback& callback; - }; - - template<class T, typename Tcallback> - struct unregisterConfigureCallback_f: public std::unary_function<T,void> - { - unregisterConfigureCallback_f(const std::string &_id) - : id(_id) - {;} - - void operator()(T& x) { x->i()->unregisterConfigureCallback(id); } - const std::string& id; - }; - - template<class T, typename Tcallback> - struct registerQueryCallback_f: public std::unary_function<T,void> - { - registerQueryCallback_f(const std::string &_id, const Tcallback _callback) - : id(_id), callback(_callback) - {;} - - void operator()(T& x) { x->i()->registerQueryCallback(id, callback); } - const std::string& id; const Tcallback& callback; - }; - - template<class T, typename Tcallback> - struct unregisterQueryCallback_f: public std::unary_function<T,void> - { - unregisterQueryCallback_f(const std::string &_id) - : id(_id) - {;} - - void operator()(T& x) { x->i()->unregisterQueryCallback(id); } - const std::string& id; - }; - - - - template<class T, typename Tcallback> - struct registerHandlerCallback_f: public std::unary_function<T,void> - { - registerHandlerCallback_f(const std::string &_id, const Tcallback _callback) - : id(_id), callback(_callback) - {;} - - void operator()(T& x) { x->i()->registerHandlerCallback(id, callback); } - const std::string& id; const Tcallback& callback; - }; - - template<class T, typename Tcallback> - struct unregisterHandlerCallback_f: public std::unary_function<T,void> - { - unregisterHandlerCallback_f(const std::string &_id) - : id(_id) - {;} - - void operator()(T& x) { x->i()->unregisterHandlerCallback(id); } - const std::string& id; - }; - - - - const std::string d_type; - typedef std::vector<rpcmanager_base::rpcserver_booter_base_sptr> rpcServerMap_t; - std::vector<std::string> d_registeredServers; - rpcServerMap_t d_serverlist; + template <class T, typename Tcallback> + struct registerConfigureCallback_f : public std::unary_function<T, void> { + registerConfigureCallback_f(const std::string& _id, const Tcallback _callback) + : id(_id), callback(_callback) + { + ; + } + + void operator()(T& x) { x->i()->registerConfigureCallback(id, callback); } + const std::string& id; + const Tcallback& callback; + }; + + template <class T, typename Tcallback> + struct unregisterConfigureCallback_f : public std::unary_function<T, void> { + unregisterConfigureCallback_f(const std::string& _id) : id(_id) { ; } + + void operator()(T& x) { x->i()->unregisterConfigureCallback(id); } + const std::string& id; + }; + + template <class T, typename Tcallback> + struct registerQueryCallback_f : public std::unary_function<T, void> { + registerQueryCallback_f(const std::string& _id, const Tcallback _callback) + : id(_id), callback(_callback) + { + ; + } + + void operator()(T& x) { x->i()->registerQueryCallback(id, callback); } + const std::string& id; + const Tcallback& callback; + }; + + template <class T, typename Tcallback> + struct unregisterQueryCallback_f : public std::unary_function<T, void> { + unregisterQueryCallback_f(const std::string& _id) : id(_id) { ; } + + void operator()(T& x) { x->i()->unregisterQueryCallback(id); } + const std::string& id; + }; + + + template <class T, typename Tcallback> + struct registerHandlerCallback_f : public std::unary_function<T, void> { + registerHandlerCallback_f(const std::string& _id, const Tcallback _callback) + : id(_id), callback(_callback) + { + ; + } + + void operator()(T& x) { x->i()->registerHandlerCallback(id, callback); } + const std::string& id; + const Tcallback& callback; + }; + + template <class T, typename Tcallback> + struct unregisterHandlerCallback_f : public std::unary_function<T, void> { + unregisterHandlerCallback_f(const std::string& _id) : id(_id) { ; } + + void operator()(T& x) { x->i()->unregisterHandlerCallback(id); } + const std::string& id; + }; + + + const std::string d_type; + typedef std::vector<rpcmanager_base::rpcserver_booter_base_sptr> rpcServerMap_t; + std::vector<std::string> d_registeredServers; + rpcServerMap_t d_serverlist; }; #endif /* RPCSERVER_AGGREGATOR_H */ diff --git a/gnuradio-runtime/include/gnuradio/rpcserver_base.h b/gnuradio-runtime/include/gnuradio/rpcserver_base.h index 276dec5d1e..46b088474a 100644 --- a/gnuradio-runtime/include/gnuradio/rpcserver_base.h +++ b/gnuradio-runtime/include/gnuradio/rpcserver_base.h @@ -28,23 +28,27 @@ class rpcserver_base : public virtual callbackregister_base { public: - rpcserver_base() : cur_priv(RPC_PRIVLVL_ALL) {;} - virtual ~rpcserver_base() {;} + rpcserver_base() : cur_priv(RPC_PRIVLVL_ALL) { ; } + virtual ~rpcserver_base() { ; } - virtual void registerConfigureCallback(const std::string &id, const configureCallback_t callback) = 0; - virtual void unregisterConfigureCallback(const std::string &id) = 0; + virtual void registerConfigureCallback(const std::string& id, + const configureCallback_t callback) = 0; + virtual void unregisterConfigureCallback(const std::string& id) = 0; - virtual void registerQueryCallback(const std::string &id, const queryCallback_t callback) = 0; - virtual void unregisterQueryCallback(const std::string &id) = 0; + virtual void registerQueryCallback(const std::string& id, + const queryCallback_t callback) = 0; + virtual void unregisterQueryCallback(const std::string& id) = 0; - virtual void registerHandlerCallback(const std::string &id, const handlerCallback_t callback) = 0; - virtual void unregisterHandlerCallback(const std::string &id) = 0; + virtual void registerHandlerCallback(const std::string& id, + const handlerCallback_t callback) = 0; + virtual void unregisterHandlerCallback(const std::string& id) = 0; - virtual void setCurPrivLevel(const priv_lvl_t priv) { cur_priv = priv; } + virtual void setCurPrivLevel(const priv_lvl_t priv) { cur_priv = priv; } + + typedef boost::shared_ptr<rpcserver_base> rpcserver_base_sptr; - typedef boost::shared_ptr<rpcserver_base> rpcserver_base_sptr; protected: - priv_lvl_t cur_priv; + priv_lvl_t cur_priv; private: }; diff --git a/gnuradio-runtime/include/gnuradio/rpcserver_booter_aggregator.h b/gnuradio-runtime/include/gnuradio/rpcserver_booter_aggregator.h index bf95c60165..579a346d57 100644 --- a/gnuradio-runtime/include/gnuradio/rpcserver_booter_aggregator.h +++ b/gnuradio-runtime/include/gnuradio/rpcserver_booter_aggregator.h @@ -31,26 +31,25 @@ class rpcserver_server; -class GR_RUNTIME_API rpcserver_booter_aggregator : - public virtual rpcserver_booter_base +class GR_RUNTIME_API rpcserver_booter_aggregator : public virtual rpcserver_booter_base { - public: - rpcserver_booter_aggregator(); - ~rpcserver_booter_aggregator(); +public: + rpcserver_booter_aggregator(); + ~rpcserver_booter_aggregator(); - rpcserver_base* i(); - const std::string& type(); - const std::vector<std::string> endpoints(); + rpcserver_base* i(); + const std::string& type(); + const std::vector<std::string> endpoints(); - const std::vector<std::string>& registeredServers(); + const std::vector<std::string>& registeredServers(); - protected: - friend class rpcmanager; - rpcserver_aggregator* agg(); +protected: + friend class rpcmanager; + rpcserver_aggregator* agg(); private: - std::string d_type; - boost::shared_ptr<rpcserver_aggregator> server; + std::string d_type; + boost::shared_ptr<rpcserver_aggregator> server; }; #endif /* RPCSERVER_BOOTER_AGGREGATOR */ diff --git a/gnuradio-runtime/include/gnuradio/rpcserver_booter_base.h b/gnuradio-runtime/include/gnuradio/rpcserver_booter_base.h index 127ceaa88d..d9d92dc061 100644 --- a/gnuradio-runtime/include/gnuradio/rpcserver_booter_base.h +++ b/gnuradio-runtime/include/gnuradio/rpcserver_booter_base.h @@ -31,12 +31,12 @@ class rpcserver_base; class rpcserver_booter_base { public: - rpcserver_booter_base() {;} - virtual ~rpcserver_booter_base() {;} + rpcserver_booter_base() { ; } + virtual ~rpcserver_booter_base() { ; } - virtual rpcserver_base* i()=0; - virtual const std::vector<std::string> endpoints()=0; - virtual const std::string& type()=0; + virtual rpcserver_base* i() = 0; + virtual const std::vector<std::string> endpoints() = 0; + virtual const std::string& type() = 0; private: }; diff --git a/gnuradio-runtime/include/gnuradio/rpcserver_booter_thrift.h b/gnuradio-runtime/include/gnuradio/rpcserver_booter_thrift.h index fd1da09fa6..ca475e57fe 100644 --- a/gnuradio-runtime/include/gnuradio/rpcserver_booter_thrift.h +++ b/gnuradio-runtime/include/gnuradio/rpcserver_booter_thrift.h @@ -31,21 +31,21 @@ class rpcserver_base; class rpcserver_thrift; class rpcserver_booter_thrift - : public virtual rpcserver_booter_base, - public virtual thrift_server_template<rpcserver_base, - rpcserver_thrift, - rpcserver_booter_thrift> + : public virtual rpcserver_booter_base, + public virtual thrift_server_template<rpcserver_base, + rpcserver_thrift, + rpcserver_booter_thrift> { - public: - rpcserver_booter_thrift(); - ~rpcserver_booter_thrift(); +public: + rpcserver_booter_thrift(); + ~rpcserver_booter_thrift(); - rpcserver_base* i(); - const std::string & type() {return d_type;} - const std::vector<std::string> endpoints(); + rpcserver_base* i(); + const std::string& type() { return d_type; } + const std::vector<std::string> endpoints(); - private: - std::string d_type; +private: + std::string d_type; }; #endif /* RPCSERVER_BOOTER_THRIFT_H */ diff --git a/gnuradio-runtime/include/gnuradio/rpcserver_thrift.h b/gnuradio-runtime/include/gnuradio/rpcserver_thrift.h index dc7ad40161..cc762acd39 100644 --- a/gnuradio-runtime/include/gnuradio/rpcserver_thrift.h +++ b/gnuradio-runtime/include/gnuradio/rpcserver_thrift.h @@ -38,253 +38,243 @@ #define S_(x) S(x) #define S__LINE__ S_(__LINE__) -class rpcserver_thrift - : public virtual rpcserver_base, - public GNURadio::ControlPortIf +class rpcserver_thrift : public virtual rpcserver_base, public GNURadio::ControlPortIf { public: - rpcserver_thrift(); - virtual ~rpcserver_thrift(); - - void registerConfigureCallback(const std::string &id, - const configureCallback_t callback); - void unregisterConfigureCallback(const std::string &id); - - void registerQueryCallback(const std::string &id, - const queryCallback_t callback); - void unregisterQueryCallback(const std::string &id); - - void registerHandlerCallback(const std::string &id, - const handlerCallback_t callback); - void unregisterHandlerCallback(const std::string &id); - - void setKnobs(const GNURadio::KnobMap&); - void getKnobs(GNURadio::KnobMap&, - const GNURadio::KnobIDList&); - void getRe(GNURadio::KnobMap&, - const GNURadio::KnobIDList&); - void properties(GNURadio::KnobPropMap&, - const GNURadio::KnobIDList& knobs); - - /*! - * \brief Call this to post a message to the \p port for the block - * identified by \p alias. - * - * The message, \p msg, is passed as a serialized PMT that is then - * passed to the message handler function identified by \p port to - * the block identified by \p alias. The \p alias and \p port - * values are passed as serialized PMT symbols (see - * pmt::intern). The message is whatever PMT format is appropriate - * for the message handler function. - * - * To use this function, the message handler function must have - * been registered (most likely in setup_rpc) in the block during - * construction using rpcbasic_register_handler. - * - * \param alias The alias of the block, which is used to map to the - * real block through the global_block_registry. Passed in - * as a serialized PMT symbol. - * \param port The name of the message port. Passed in as a - * serialized PMT symbol. - * \param msg The actual message to pass to \p port. This is a - * serialized PMT where the PMT is whatever form appropriate - * for the message handler function. - */ - void postMessage(const std::string& alias, - const std::string& port, - const std::string& msg); - - virtual void shutdown(); - - private: - boost::mutex d_callback_map_lock; - - typedef std::map<std::string, configureCallback_t> ConfigureCallbackMap_t; - ConfigureCallbackMap_t d_setcallbackmap; - - typedef std::map<std::string, queryCallback_t> QueryCallbackMap_t; - QueryCallbackMap_t d_getcallbackmap; - - typedef std::map<std::string, handlerCallback_t> HandlerCallbackMap_t; - HandlerCallbackMap_t d_handlercallbackmap; - - /*! - * \brief Manages calling the callback function for a message handler posting. - */ - void - set_h(const handlerCallback_t &_handlerCallback, - const priv_lvl_t &_cur_priv, - pmt::pmt_t port, pmt::pmt_t msg) - { - if(cur_priv <= _handlerCallback.priv) { - _handlerCallback.callback->post(port, msg); - } - else { - std::cerr << "Message " << _handlerCallback.description << " requires PRIVLVL <= " - << _handlerCallback.priv << " to set, currently at: " - << cur_priv << std::endl; - } - } - - - template<typename T, typename TMap> struct set_f - : public std::unary_function<T,void> - { - set_f(TMap &_setcallbackmap, const priv_lvl_t &_cur_priv) - : d_setcallbackmap(_setcallbackmap), cur_priv(_cur_priv) - { - ; - } - - void operator()(const T& p) + rpcserver_thrift(); + virtual ~rpcserver_thrift(); + + void registerConfigureCallback(const std::string& id, + const configureCallback_t callback); + void unregisterConfigureCallback(const std::string& id); + + void registerQueryCallback(const std::string& id, const queryCallback_t callback); + void unregisterQueryCallback(const std::string& id); + + void registerHandlerCallback(const std::string& id, const handlerCallback_t callback); + void unregisterHandlerCallback(const std::string& id); + + void setKnobs(const GNURadio::KnobMap&); + void getKnobs(GNURadio::KnobMap&, const GNURadio::KnobIDList&); + void getRe(GNURadio::KnobMap&, const GNURadio::KnobIDList&); + void properties(GNURadio::KnobPropMap&, const GNURadio::KnobIDList& knobs); + + /*! + * \brief Call this to post a message to the \p port for the block + * identified by \p alias. + * + * The message, \p msg, is passed as a serialized PMT that is then + * passed to the message handler function identified by \p port to + * the block identified by \p alias. The \p alias and \p port + * values are passed as serialized PMT symbols (see + * pmt::intern). The message is whatever PMT format is appropriate + * for the message handler function. + * + * To use this function, the message handler function must have + * been registered (most likely in setup_rpc) in the block during + * construction using rpcbasic_register_handler. + * + * \param alias The alias of the block, which is used to map to the + * real block through the global_block_registry. Passed in + * as a serialized PMT symbol. + * \param port The name of the message port. Passed in as a + * serialized PMT symbol. + * \param msg The actual message to pass to \p port. This is a + * serialized PMT where the PMT is whatever form appropriate + * for the message handler function. + */ + void postMessage(const std::string& alias, + const std::string& port, + const std::string& msg); + + virtual void shutdown(); + +private: + boost::mutex d_callback_map_lock; + + typedef std::map<std::string, configureCallback_t> ConfigureCallbackMap_t; + ConfigureCallbackMap_t d_setcallbackmap; + + typedef std::map<std::string, queryCallback_t> QueryCallbackMap_t; + QueryCallbackMap_t d_getcallbackmap; + + typedef std::map<std::string, handlerCallback_t> HandlerCallbackMap_t; + HandlerCallbackMap_t d_handlercallbackmap; + + /*! + * \brief Manages calling the callback function for a message handler posting. + */ + void set_h(const handlerCallback_t& _handlerCallback, + const priv_lvl_t& _cur_priv, + pmt::pmt_t port, + pmt::pmt_t msg) { - ConfigureCallbackMap_t::const_iterator iter(d_setcallbackmap.find(p.first)); - if(iter != d_setcallbackmap.end()) { - if(cur_priv <= iter->second.priv) { - (*iter->second.callback).post(pmt::PMT_NIL, rpcpmtconverter::To_PMT::instance(p.second)); + if (cur_priv <= _handlerCallback.priv) { + _handlerCallback.callback->post(port, msg); + } else { + std::cerr << "Message " << _handlerCallback.description + << " requires PRIVLVL <= " << _handlerCallback.priv + << " to set, currently at: " << cur_priv << std::endl; } - else { - std::cerr << "Key " << p.first << " requires PRIVLVL <= " - << iter->second.priv << " to set, currently at: " - << cur_priv << std::endl; - } - } - else { - throw apache::thrift::TApplicationException(__FILE__ " " S__LINE__); - } } - TMap& d_setcallbackmap; - const priv_lvl_t& cur_priv; - }; - - template<typename T, typename TMap> - struct get_f : public std::unary_function<T,void> - { - get_f(TMap &_getcallbackmap, const priv_lvl_t &_cur_priv, GNURadio::KnobMap &_outknobs) : - d_getcallbackmap(_getcallbackmap), cur_priv(_cur_priv), outknobs(_outknobs) - {} - void operator()(const T& p) - { - QueryCallbackMap_t::const_iterator iter(d_getcallbackmap.find(p)); - if(iter != d_getcallbackmap.end()) { - if(cur_priv <= iter->second.priv) { - outknobs[p] = rpcpmtconverter::from_pmt((*iter->second.callback).retrieve()); + template <typename T, typename TMap> + struct set_f : public std::unary_function<T, void> { + set_f(TMap& _setcallbackmap, const priv_lvl_t& _cur_priv) + : d_setcallbackmap(_setcallbackmap), cur_priv(_cur_priv) + { + ; } - else { - std::cerr << "Key " << iter->first << " requires PRIVLVL: <= " - << iter->second.priv << " to get, currently at: " - << cur_priv << std::endl; + + void operator()(const T& p) + { + ConfigureCallbackMap_t::const_iterator iter(d_setcallbackmap.find(p.first)); + if (iter != d_setcallbackmap.end()) { + if (cur_priv <= iter->second.priv) { + (*iter->second.callback) + .post(pmt::PMT_NIL, rpcpmtconverter::To_PMT::instance(p.second)); + } else { + std::cerr << "Key " << p.first + << " requires PRIVLVL <= " << iter->second.priv + << " to set, currently at: " << cur_priv << std::endl; + } + } else { + throw apache::thrift::TApplicationException(__FILE__ " " S__LINE__); + } } - } - else { - std::stringstream ss; - ss << "Ctrlport Key called with unregistered key (" << p << ")\n"; - std::cerr << ss.str(); - throw apache::thrift::TApplicationException(__FILE__ " " S__LINE__); - } - } - TMap& d_getcallbackmap; - const priv_lvl_t& cur_priv; - GNURadio::KnobMap& outknobs; - }; + TMap& d_setcallbackmap; + const priv_lvl_t& cur_priv; + }; + + template <typename T, typename TMap> + struct get_f : public std::unary_function<T, void> { + get_f(TMap& _getcallbackmap, + const priv_lvl_t& _cur_priv, + GNURadio::KnobMap& _outknobs) + : d_getcallbackmap(_getcallbackmap), cur_priv(_cur_priv), outknobs(_outknobs) + { + } - template<typename T, typename TMap, typename TKnobMap> - struct get_all_f : public std::unary_function<T,void> - { - get_all_f(TMap &_getcallbackmap, const priv_lvl_t &_cur_priv, TKnobMap &_outknobs) : - d_getcallbackmap(_getcallbackmap), cur_priv(_cur_priv), outknobs(_outknobs) - {;} + void operator()(const T& p) + { + QueryCallbackMap_t::const_iterator iter(d_getcallbackmap.find(p)); + if (iter != d_getcallbackmap.end()) { + if (cur_priv <= iter->second.priv) { + outknobs[p] = + rpcpmtconverter::from_pmt((*iter->second.callback).retrieve()); + } else { + std::cerr << "Key " << iter->first + << " requires PRIVLVL: <= " << iter->second.priv + << " to get, currently at: " << cur_priv << std::endl; + } + } else { + std::stringstream ss; + ss << "Ctrlport Key called with unregistered key (" << p << ")\n"; + std::cerr << ss.str(); + throw apache::thrift::TApplicationException(__FILE__ " " S__LINE__); + } + } - void operator()(const T& p) - { - if(cur_priv <= p.second.priv) { - outknobs[p.first] = rpcpmtconverter::from_pmt(p.second.callback->retrieve()); - } - else { - std::cerr << "Key " << p.first << " requires PRIVLVL <= " - << p.second.priv << " to get, currently at: " - << cur_priv << std::endl; - } - } + TMap& d_getcallbackmap; + const priv_lvl_t& cur_priv; + GNURadio::KnobMap& outknobs; + }; + + template <typename T, typename TMap, typename TKnobMap> + struct get_all_f : public std::unary_function<T, void> { + get_all_f(TMap& _getcallbackmap, const priv_lvl_t& _cur_priv, TKnobMap& _outknobs) + : d_getcallbackmap(_getcallbackmap), cur_priv(_cur_priv), outknobs(_outknobs) + { + ; + } - TMap& d_getcallbackmap; - const priv_lvl_t& cur_priv; - TKnobMap& outknobs; - }; - - template<typename T, typename TMap, typename TKnobMap> - struct properties_all_f : public std::unary_function<T,void> - { - properties_all_f(QueryCallbackMap_t &_getcallbackmap, - const priv_lvl_t &_cur_priv, - GNURadio::KnobPropMap &_outknobs) - : d_getcallbackmap(_getcallbackmap), - cur_priv(_cur_priv), - outknobs(_outknobs) - {;} - - void operator()(const T& p) - { - if(cur_priv <= p.second.priv) { - GNURadio::KnobProp prop; - prop.type = GNURadio::KnobType::KNOBDOUBLE; - prop.units = p.second.units; - prop.description = p.second.description; - prop.min = rpcpmtconverter::from_pmt(p.second.min); - prop.max = rpcpmtconverter::from_pmt(p.second.max); - prop.display = static_cast<uint32_t>(p.second.display); - outknobs[p.first] = prop; - } - else { - std::cerr << "Key " << p.first << " requires PRIVLVL <= " - << p.second.priv << " to get, currently at: " - << cur_priv << std::endl; - } - } + void operator()(const T& p) + { + if (cur_priv <= p.second.priv) { + outknobs[p.first] = + rpcpmtconverter::from_pmt(p.second.callback->retrieve()); + } else { + std::cerr << "Key " << p.first << " requires PRIVLVL <= " << p.second.priv + << " to get, currently at: " << cur_priv << std::endl; + } + } - TMap& d_getcallbackmap; - const priv_lvl_t& cur_priv; - TKnobMap& outknobs; - }; + TMap& d_getcallbackmap; + const priv_lvl_t& cur_priv; + TKnobMap& outknobs; + }; + + template <typename T, typename TMap, typename TKnobMap> + struct properties_all_f : public std::unary_function<T, void> { + properties_all_f(QueryCallbackMap_t& _getcallbackmap, + const priv_lvl_t& _cur_priv, + GNURadio::KnobPropMap& _outknobs) + : d_getcallbackmap(_getcallbackmap), cur_priv(_cur_priv), outknobs(_outknobs) + { + ; + } - template<class T, typename TMap, typename TKnobMap> - struct properties_f : public std::unary_function<T,void> - { - properties_f(TMap &_getcallbackmap, const priv_lvl_t &_cur_priv, TKnobMap &_outknobs) : - d_getcallbackmap(_getcallbackmap), cur_priv(_cur_priv), outknobs(_outknobs) - {;} + void operator()(const T& p) + { + if (cur_priv <= p.second.priv) { + GNURadio::KnobProp prop; + prop.type = GNURadio::KnobType::KNOBDOUBLE; + prop.units = p.second.units; + prop.description = p.second.description; + prop.min = rpcpmtconverter::from_pmt(p.second.min); + prop.max = rpcpmtconverter::from_pmt(p.second.max); + prop.display = static_cast<uint32_t>(p.second.display); + outknobs[p.first] = prop; + } else { + std::cerr << "Key " << p.first << " requires PRIVLVL <= " << p.second.priv + << " to get, currently at: " << cur_priv << std::endl; + } + } - void operator()(const T& p) - { - typename TMap::const_iterator iter(d_getcallbackmap.find(p)); - if(iter != d_getcallbackmap.end()) { - if(cur_priv <= iter->second.priv) { - GNURadio::KnobProp prop; - prop.type = GNURadio::KnobType::KNOBDOUBLE; - prop.units = iter->second.units; - prop.description = iter->second.description; - prop.min = rpcpmtconverter::from_pmt(iter->second.min); - prop.max = rpcpmtconverter::from_pmt(iter->second.max); - prop.display = static_cast<uint32_t>(iter->second.display); - outknobs[p] = prop; + TMap& d_getcallbackmap; + const priv_lvl_t& cur_priv; + TKnobMap& outknobs; + }; + + template <class T, typename TMap, typename TKnobMap> + struct properties_f : public std::unary_function<T, void> { + properties_f(TMap& _getcallbackmap, + const priv_lvl_t& _cur_priv, + TKnobMap& _outknobs) + : d_getcallbackmap(_getcallbackmap), cur_priv(_cur_priv), outknobs(_outknobs) + { + ; } - else { - std::cerr << "Key " << iter->first << " requires PRIVLVL: <= " - << iter->second.priv << " to get, currently at: " << cur_priv << std::endl; + + void operator()(const T& p) + { + typename TMap::const_iterator iter(d_getcallbackmap.find(p)); + if (iter != d_getcallbackmap.end()) { + if (cur_priv <= iter->second.priv) { + GNURadio::KnobProp prop; + prop.type = GNURadio::KnobType::KNOBDOUBLE; + prop.units = iter->second.units; + prop.description = iter->second.description; + prop.min = rpcpmtconverter::from_pmt(iter->second.min); + prop.max = rpcpmtconverter::from_pmt(iter->second.max); + prop.display = static_cast<uint32_t>(iter->second.display); + outknobs[p] = prop; + } else { + std::cerr << "Key " << iter->first + << " requires PRIVLVL: <= " << iter->second.priv + << " to get, currently at: " << cur_priv << std::endl; + } + } else { + throw apache::thrift::TApplicationException(__FILE__ " " S__LINE__); + } } - } - else { - throw apache::thrift::TApplicationException(__FILE__ " " S__LINE__); - } - } - TMap& d_getcallbackmap; - const priv_lvl_t& cur_priv; - TKnobMap& outknobs; - }; + TMap& d_getcallbackmap; + const priv_lvl_t& cur_priv; + TKnobMap& outknobs; + }; }; #endif /* RPCSERVER_THRIFT_H */ diff --git a/gnuradio-runtime/include/gnuradio/runtime_types.h b/gnuradio-runtime/include/gnuradio/runtime_types.h index f4674c0f0c..a0085ef5e8 100644 --- a/gnuradio-runtime/include/gnuradio/runtime_types.h +++ b/gnuradio-runtime/include/gnuradio/runtime_types.h @@ -28,28 +28,28 @@ namespace gr { - /* - * typedefs for smart pointers we use throughout the runtime system - */ - class basic_block; - class block; - class block_detail; - class buffer; - class buffer_reader; - class hier_block2; - class flat_flowgraph; - class flowgraph; - class top_block; +/* + * typedefs for smart pointers we use throughout the runtime system + */ +class basic_block; +class block; +class block_detail; +class buffer; +class buffer_reader; +class hier_block2; +class flat_flowgraph; +class flowgraph; +class top_block; - typedef boost::shared_ptr<basic_block> basic_block_sptr; - typedef boost::shared_ptr<block> block_sptr; - typedef boost::shared_ptr<block_detail> block_detail_sptr; - typedef boost::shared_ptr<buffer> buffer_sptr; - typedef boost::shared_ptr<buffer_reader> buffer_reader_sptr; - typedef boost::shared_ptr<hier_block2> hier_block2_sptr; - typedef boost::shared_ptr<flat_flowgraph> flat_flowgraph_sptr; - typedef boost::shared_ptr<flowgraph> flowgraph_sptr; - typedef boost::shared_ptr<top_block> top_block_sptr; +typedef boost::shared_ptr<basic_block> basic_block_sptr; +typedef boost::shared_ptr<block> block_sptr; +typedef boost::shared_ptr<block_detail> block_detail_sptr; +typedef boost::shared_ptr<buffer> buffer_sptr; +typedef boost::shared_ptr<buffer_reader> buffer_reader_sptr; +typedef boost::shared_ptr<hier_block2> hier_block2_sptr; +typedef boost::shared_ptr<flat_flowgraph> flat_flowgraph_sptr; +typedef boost::shared_ptr<flowgraph> flowgraph_sptr; +typedef boost::shared_ptr<top_block> top_block_sptr; } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/sincos.h b/gnuradio-runtime/include/gnuradio/sincos.h index f162f6e31b..bf7b40af61 100644 --- a/gnuradio-runtime/include/gnuradio/sincos.h +++ b/gnuradio-runtime/include/gnuradio/sincos.h @@ -27,9 +27,9 @@ namespace gr { - // compute sine and cosine at the same time - GR_RUNTIME_API void sincos (double x, double *sin, double *cos); - GR_RUNTIME_API void sincosf (float x, float *sin, float *cos); -} +// compute sine and cosine at the same time +GR_RUNTIME_API void sincos(double x, double* sin, double* cos); +GR_RUNTIME_API void sincosf(float x, float* sin, float* cos); +} // namespace gr #endif /* INCLUDED_GR_SINCOS_H */ diff --git a/gnuradio-runtime/include/gnuradio/sptr_magic.h b/gnuradio-runtime/include/gnuradio/sptr_magic.h index d5e587186a..7dc95fc660 100644 --- a/gnuradio-runtime/include/gnuradio/sptr_magic.h +++ b/gnuradio-runtime/include/gnuradio/sptr_magic.h @@ -26,33 +26,32 @@ #include <boost/shared_ptr.hpp> namespace gr { - class basic_block; - class hier_block2; -} +class basic_block; +class hier_block2; +} // namespace gr namespace gnuradio { - namespace detail { +namespace detail { - class GR_RUNTIME_API sptr_magic - { - public: - static boost::shared_ptr<gr::basic_block> fetch_initial_sptr(gr::basic_block *p); - static void create_and_stash_initial_sptr(gr::hier_block2 *p); - static void cancel_initial_sptr(gr::hier_block2 *p); - }; - } +class GR_RUNTIME_API sptr_magic +{ +public: + static boost::shared_ptr<gr::basic_block> fetch_initial_sptr(gr::basic_block* p); + static void create_and_stash_initial_sptr(gr::hier_block2* p); + static void cancel_initial_sptr(gr::hier_block2* p); +}; +} // namespace detail - /* - * \brief New! Improved! Standard method to get/create the - * boost::shared_ptr for a block. - */ - template<class T> - boost::shared_ptr<T> - get_initial_sptr(T *p) - { - return boost::dynamic_pointer_cast<T, gr::basic_block> - (detail::sptr_magic::fetch_initial_sptr(p)); - } +/* + * \brief New! Improved! Standard method to get/create the + * boost::shared_ptr for a block. + */ +template <class T> +boost::shared_ptr<T> get_initial_sptr(T* p) +{ + return boost::dynamic_pointer_cast<T, gr::basic_block>( + detail::sptr_magic::fetch_initial_sptr(p)); } +} // namespace gnuradio #endif /* INCLUDED_GR_RUNTIME_SPTR_MAGIC_H */ diff --git a/gnuradio-runtime/include/gnuradio/sync_block.h b/gnuradio-runtime/include/gnuradio/sync_block.h index 4b0022ab7e..14c0cb3ead 100644 --- a/gnuradio-runtime/include/gnuradio/sync_block.h +++ b/gnuradio-runtime/include/gnuradio/sync_block.h @@ -28,21 +28,21 @@ namespace gr { - /*! - * \brief synchronous 1:1 input to output with history - * \ingroup base_blk - * - * Override work to provide the signal processing implementation. - */ - class GR_RUNTIME_API sync_block : public block - { - protected: +/*! + * \brief synchronous 1:1 input to output with history + * \ingroup base_blk + * + * Override work to provide the signal processing implementation. + */ +class GR_RUNTIME_API sync_block : public block +{ +protected: sync_block(void) {} // allows pure virtual interface sub-classes - sync_block(const std::string &name, + sync_block(const std::string& name, gr::io_signature::sptr input_signature, gr::io_signature::sptr output_signature); - public: +public: /*! * \brief just like gr::block::general_work, only this arranges to * call consume_each for you @@ -50,19 +50,19 @@ namespace gr { * The user must override work to define the signal processing code */ virtual int work(int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) = 0; + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items) = 0; // gr::sync_block overrides these to assist work - void forecast(int noutput_items, gr_vector_int &ninput_items_required); + void forecast(int noutput_items, gr_vector_int& ninput_items_required); int general_work(int noutput_items, - gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items); + gr_vector_int& ninput_items, + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items); int fixed_rate_ninput_to_noutput(int ninput); int fixed_rate_noutput_to_ninput(int noutput); - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/sync_decimator.h b/gnuradio-runtime/include/gnuradio/sync_decimator.h index f6306f169a..bf455eba29 100644 --- a/gnuradio-runtime/include/gnuradio/sync_decimator.h +++ b/gnuradio-runtime/include/gnuradio/sync_decimator.h @@ -28,44 +28,44 @@ namespace gr { - /*! - * \brief synchronous N:1 input to output with history - * \ingroup base_blk - * - * Override work to provide the signal processing implementation. - */ - class GR_RUNTIME_API sync_decimator : public sync_block - { - private: +/*! + * \brief synchronous N:1 input to output with history + * \ingroup base_blk + * + * Override work to provide the signal processing implementation. + */ +class GR_RUNTIME_API sync_decimator : public sync_block +{ +private: unsigned d_decimation; - protected: +protected: sync_decimator(void) {} // allows pure virtual interface sub-classes - sync_decimator(const std::string &name, + sync_decimator(const std::string& name, gr::io_signature::sptr input_signature, gr::io_signature::sptr output_signature, unsigned decimation); - public: +public: unsigned decimation() const { return d_decimation; } void set_decimation(unsigned decimation) { - d_decimation = decimation; - set_relative_rate(1, (uint64_t) decimation); + d_decimation = decimation; + set_relative_rate(1, (uint64_t)decimation); } // gr::sync_decimator overrides these to assist work - void forecast(int noutput_items, gr_vector_int &ninput_items_required); - int general_work(int noutput_items, - gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items); + void forecast(int noutput_items, gr_vector_int& ninput_items_required); + int general_work(int noutput_items, + gr_vector_int& ninput_items, + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items); // derived classes should override work int fixed_rate_ninput_to_noutput(int ninput); int fixed_rate_noutput_to_ninput(int noutput); - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/sync_interpolator.h b/gnuradio-runtime/include/gnuradio/sync_interpolator.h index 58351a51ea..8296ff3168 100644 --- a/gnuradio-runtime/include/gnuradio/sync_interpolator.h +++ b/gnuradio-runtime/include/gnuradio/sync_interpolator.h @@ -28,46 +28,45 @@ namespace gr { - /*! - * \brief synchronous 1:N input to output with history - * \ingroup base_blk - * - * Override work to provide the signal processing implementation. - */ - class GR_RUNTIME_API sync_interpolator : public sync_block - { - private: +/*! + * \brief synchronous 1:N input to output with history + * \ingroup base_blk + * + * Override work to provide the signal processing implementation. + */ +class GR_RUNTIME_API sync_interpolator : public sync_block +{ +private: unsigned d_interpolation; - protected: +protected: sync_interpolator(void) {} // allows pure virtual interface sub-classes - sync_interpolator(const std::string &name, + sync_interpolator(const std::string& name, gr::io_signature::sptr input_signature, gr::io_signature::sptr output_signature, unsigned interpolation); - public: +public: unsigned interpolation() const { return d_interpolation; } void set_interpolation(unsigned interpolation) { - d_interpolation = interpolation; - set_relative_rate((uint64_t) interpolation, 1); - set_output_multiple(interpolation); + d_interpolation = interpolation; + set_relative_rate((uint64_t)interpolation, 1); + set_output_multiple(interpolation); } // gr::sync_interpolator overrides these to assist work - void forecast(int noutput_items, - gr_vector_int &ninput_items_required); - int general_work(int noutput_items, - gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items); + void forecast(int noutput_items, gr_vector_int& ninput_items_required); + int general_work(int noutput_items, + gr_vector_int& ninput_items, + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items); // derived classes should override work int fixed_rate_ninput_to_noutput(int ninput); int fixed_rate_noutput_to_ninput(int noutput); - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/sys_paths.h b/gnuradio-runtime/include/gnuradio/sys_paths.h index efea07b599..6be2b8847b 100644 --- a/gnuradio-runtime/include/gnuradio/sys_paths.h +++ b/gnuradio-runtime/include/gnuradio/sys_paths.h @@ -26,14 +26,14 @@ namespace gr { - //! directory to create temporary files - GR_RUNTIME_API const char *tmp_path(); +//! directory to create temporary files +GR_RUNTIME_API const char* tmp_path(); - //! directory to store application data - GR_RUNTIME_API const char *appdata_path(); +//! directory to store application data +GR_RUNTIME_API const char* appdata_path(); - //! directory to store user configuration - GR_RUNTIME_API const char *userconf_path(); +//! directory to store user configuration +GR_RUNTIME_API const char* userconf_path(); } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/tag_checker.h b/gnuradio-runtime/include/gnuradio/tag_checker.h index 71f5ff7042..46e736da6a 100644 --- a/gnuradio-runtime/include/gnuradio/tag_checker.h +++ b/gnuradio-runtime/include/gnuradio/tag_checker.h @@ -28,46 +28,42 @@ namespace gr { - class tag_checker - { - private: +class tag_checker +{ +private: std::vector<tag_t> d_tags; tag_t d_next_tag; bool d_has_next_tag; unsigned int d_next_tag_index; - public: - tag_checker(std::vector<tag_t> &tags): - d_has_next_tag(false), - d_next_tag_index(0) +public: + tag_checker(std::vector<tag_t>& tags) : d_has_next_tag(false), d_next_tag_index(0) { - d_tags = tags; - std::sort(d_tags.begin(), d_tags.end(), &gr::tag_t::offset_compare); - if(d_tags.size() > 0) { - d_has_next_tag = true; - d_next_tag = tags[0]; - } + d_tags = tags; + std::sort(d_tags.begin(), d_tags.end(), &gr::tag_t::offset_compare); + if (d_tags.size() > 0) { + d_has_next_tag = true; + d_next_tag = tags[0]; + } }; - ~tag_checker() {}; + ~tag_checker(){}; - void get_tags(std::vector<tag_t> &tag_list, unsigned int offset) + void get_tags(std::vector<tag_t>& tag_list, unsigned int offset) { - while(d_has_next_tag && (offset >= d_next_tag.offset)) { - if(offset == d_next_tag.offset) { - tag_list.push_back(d_next_tag); - } - d_next_tag_index += 1; - if(d_next_tag_index >= d_tags.size()) { - d_has_next_tag = false; + while (d_has_next_tag && (offset >= d_next_tag.offset)) { + if (offset == d_next_tag.offset) { + tag_list.push_back(d_next_tag); + } + d_next_tag_index += 1; + if (d_next_tag_index >= d_tags.size()) { + d_has_next_tag = false; + } else { + d_next_tag = d_tags[d_next_tag_index]; + } } - else { - d_next_tag = d_tags[d_next_tag_index]; - } - } }; - - }; -} +}; +} // namespace gr #endif /* INCLUDED_GR_RUNTIME_TAG_CHECKER_H */ diff --git a/gnuradio-runtime/include/gnuradio/tagged_stream_block.h b/gnuradio-runtime/include/gnuradio/tagged_stream_block.h index 86343f281d..8748413665 100644 --- a/gnuradio-runtime/include/gnuradio/tagged_stream_block.h +++ b/gnuradio-runtime/include/gnuradio/tagged_stream_block.h @@ -28,25 +28,27 @@ namespace gr { - /*! - * \brief Block that operates on PDUs in form of tagged streams - * \ingroup base_blk - * - * Override work to provide the signal processing implementation. - */ - class GR_RUNTIME_API tagged_stream_block : public block - { - private: - pmt::pmt_t d_length_tag_key; //!< This is the key for the tag that stores the PDU length - gr_vector_int d_n_input_items_reqd; //!< How many input items do I need to process the next PDU? +/*! + * \brief Block that operates on PDUs in form of tagged streams + * \ingroup base_blk + * + * Override work to provide the signal processing implementation. + */ +class GR_RUNTIME_API tagged_stream_block : public block +{ +private: + pmt::pmt_t + d_length_tag_key; //!< This is the key for the tag that stores the PDU length + gr_vector_int + d_n_input_items_reqd; //!< How many input items do I need to process the next PDU? - protected: +protected: std::string d_length_tag_key_str; tagged_stream_block(void) {} // allows pure virtual interface sub-classes - tagged_stream_block(const std::string &name, + tagged_stream_block(const std::string& name, gr::io_signature::sptr input_signature, gr::io_signature::sptr output_signature, - const std::string &length_tag_key); + const std::string& length_tag_key); /*! * \brief Parse all tags on the first sample of a PDU, return the @@ -57,15 +59,16 @@ namespace gr { * * Default behaviour: * - Go through all input ports - * - On every input port, search for the tag with the key specified in \p length_tag_key + * - On every input port, search for the tag with the key specified in \p + * length_tag_key * - Copy that value as an int to the corresponding position in \p n_input_items_reqd * - Remove the length tag. * * \param[in] tags All the tags found on the first item of every input port. * \param[out] n_input_items_reqd Number of items which will be read from every input */ - virtual void parse_length_tags(const std::vector<std::vector<tag_t> > &tags, - gr_vector_int &n_input_items_reqd); + virtual void parse_length_tags(const std::vector<std::vector<tag_t>>& tags, + gr_vector_int& n_input_items_reqd); /*! * \brief Calculate the number of output items. @@ -77,7 +80,7 @@ namespace gr { * You most likely need to override this function, unless your * block is a sync block or integer interpolator/decimator. */ - virtual int calculate_output_stream_length(const gr_vector_int &ninput_items); + virtual int calculate_output_stream_length(const gr_vector_int& ninput_items); /*! * \brief Set the new length tags on the output stream @@ -92,10 +95,10 @@ namespace gr { */ virtual void update_length_tags(int n_produced, int n_ports); - public: +public: /*! \brief Don't override this. */ - void /* final */ forecast (int noutput_items, gr_vector_int &ninput_items_required); + void /* final */ forecast(int noutput_items, gr_vector_int& ninput_items_required); bool check_topology(int ninputs, int /* noutputs */); @@ -107,9 +110,9 @@ namespace gr { * - Updates the tags using update_length_tags() */ int general_work(int noutput_items, - gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items); + gr_vector_int& ninput_items, + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items); /*! * \brief Just like gr::block::general_work, but makes sure the input is valid @@ -129,18 +132,16 @@ namespace gr { * do anything here. * * \param noutput_items The size of the writable output buffer - * \param ninput_items The exact size of the items on every input for this particular PDU. - * These will be consumed if a length tag key is provided! - * \param input_items See gr::block - * \param output_items See gr::block + * \param ninput_items The exact size of the items on every input for this particular + * PDU. These will be consumed if a length tag key is provided! \param input_items See + * gr::block \param output_items See gr::block */ virtual int work(int noutput_items, - gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) = 0; - }; + gr_vector_int& ninput_items, + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items) = 0; +}; -} /* namespace gr */ +} /* namespace gr */ #endif /* INCLUDED_GR_RUNTIME_TAGGED_STREAM_BLOCK_H */ - diff --git a/gnuradio-runtime/include/gnuradio/tags.h b/gnuradio-runtime/include/gnuradio/tags.h index df65e50698..d523544e8d 100644 --- a/gnuradio-runtime/include/gnuradio/tags.h +++ b/gnuradio-runtime/include/gnuradio/tags.h @@ -28,8 +28,7 @@ namespace gr { - struct GR_RUNTIME_API tag_t - { +struct GR_RUNTIME_API tag_t { //! the item \p tag occurred at (as a uint64_t) uint64_t offset; @@ -42,55 +41,50 @@ namespace gr { //! the source ID of \p tag (as a PMT) pmt::pmt_t srcid; - //! Used by gr_buffer to mark a tagged as deleted by a specific block. You can usually ignore this. + //! Used by gr_buffer to mark a tagged as deleted by a specific block. You can usually + //! ignore this. std::vector<long> marked_deleted; /*! * Comparison function to test which tag, \p x or \p y, came * first in time */ - static inline bool offset_compare(const tag_t &x, - const tag_t &y) + static inline bool offset_compare(const tag_t& x, const tag_t& y) { - return x.offset < y.offset; + return x.offset < y.offset; } - inline bool operator == (const tag_t &t) const + inline bool operator==(const tag_t& t) const { - return (t.key == key) && (t.value == value) && \ - (t.srcid == srcid) && (t.offset == offset); + return (t.key == key) && (t.value == value) && (t.srcid == srcid) && + (t.offset == offset); } tag_t() - : offset(0), - key(pmt::PMT_NIL), - value(pmt::PMT_NIL), - srcid(pmt::PMT_F) // consistent with default srcid value in block::add_item_tag + : offset(0), + key(pmt::PMT_NIL), + value(pmt::PMT_NIL), + srcid(pmt::PMT_F) // consistent with default srcid value in block::add_item_tag { } - tag_t(const tag_t &rhs) - : offset(rhs.offset), - key(rhs.key), - value(rhs.value), - srcid(rhs.srcid) + tag_t(const tag_t& rhs) + : offset(rhs.offset), key(rhs.key), value(rhs.value), srcid(rhs.srcid) { } - tag_t& operator=(const tag_t &rhs) + tag_t& operator=(const tag_t& rhs) { - if (this != &rhs) { - offset = rhs.offset; - key = rhs.key; - value = rhs.value; - srcid = rhs.srcid; - } - return (*this); + if (this != &rhs) { + offset = rhs.offset; + key = rhs.key; + value = rhs.value; + srcid = rhs.srcid; + } + return (*this); } - ~tag_t() - { - } - }; + ~tag_t() {} +}; } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/thread/thread.h b/gnuradio-runtime/include/gnuradio/thread/thread.h index 3fda5d86ce..49306e4b26 100644 --- a/gnuradio-runtime/include/gnuradio/thread/thread.h +++ b/gnuradio-runtime/include/gnuradio/thread/thread.h @@ -42,118 +42,116 @@ #endif namespace gr { - namespace thread { +namespace thread { - typedef boost::thread thread; - typedef boost::mutex mutex; - typedef boost::unique_lock<boost::mutex> scoped_lock; - typedef boost::condition_variable condition_variable; - typedef boost::barrier barrier; - typedef boost::shared_ptr<barrier> barrier_sptr; +typedef boost::thread thread; +typedef boost::mutex mutex; +typedef boost::unique_lock<boost::mutex> scoped_lock; +typedef boost::condition_variable condition_variable; +typedef boost::barrier barrier; +typedef boost::shared_ptr<barrier> barrier_sptr; - /*! \brief a system-dependent typedef for the underlying thread type. - */ +/*! \brief a system-dependent typedef for the underlying thread type. + */ #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) - typedef HANDLE gr_thread_t; +typedef HANDLE gr_thread_t; #elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) - typedef pthread_t gr_thread_t; +typedef pthread_t gr_thread_t; #else - typedef pthread_t gr_thread_t; +typedef pthread_t gr_thread_t; #endif - /*! \brief Get the current thread's ID as a gr_thread_t - * - * We use this when setting the thread affinity or any other - * low-level thread settings. Can be called within a GNU Radio - * block to get a reference to its current thread ID. - */ - GR_RUNTIME_API gr_thread_t get_current_thread_id(); - - /*! \brief Bind the current thread to a set of cores. - * - * Wrapper for system-dependent calls to set the affinity of the - * current thread to the processor mask. The mask is simply a - * 1-demensional vector containing the processor or core number - * from 0 to N-1 for N cores. - * - * Note: this does not work on OSX; it is a nop call since OSX - * does not support the concept of thread affinity (and what they - * do support in this way since 10.5 is not what we want or can - * use in this fashion). - */ - GR_RUNTIME_API void thread_bind_to_processor(const std::vector<int> &mask); - - /*! \brief Convineince function to bind the current thread to a single core. - * - * Wrapper for system-dependent calls to set the affinity of the - * current thread to a given core from 0 to N-1 for N cores. - * - * Note: this does not work on OSX; it is a nop call since OSX - * does not support the concept of thread affinity (and what they - * do support in this way since 10.5 is not what we want or can - * use in this fashion). - */ - GR_RUNTIME_API void thread_bind_to_processor(int n); - - /*! \brief Bind a thread to a set of cores. - * - * Wrapper for system-dependent calls to set the affinity of the - * given thread ID to the processor mask. The mask is simply a - * 1-demensional vector containing the processor or core number - * from 0 to N-1 for N cores. - * - * Note: this does not work on OSX; it is a nop call since OSX - * does not support the concept of thread affinity (and what they - * do support in this way since 10.5 is not what we want or can - * use in this fashion). - */ - GR_RUNTIME_API void thread_bind_to_processor(gr_thread_t thread, - const std::vector<int> &mask); - - - /*! \brief Convineince function to bind the a thread to a single core. - * - * Wrapper for system-dependent calls to set the affinity of the - * given thread ID to a given core from 0 to N-1 for N cores. - * - * Note: this does not work on OSX; it is a nop call since OSX - * does not support the concept of thread affinity (and what they - * do support in this way since 10.5 is not what we want or can - * use in this fashion). - */ - GR_RUNTIME_API void thread_bind_to_processor(gr_thread_t thread, - unsigned int n); - - /*! \brief Remove any thread-processor affinity for the current thread. - * - * Note: this does not work on OSX; it is a nop call since OSX - * does not support the concept of thread affinity (and what they - * do support in this way since 10.5 is not what we want or can - * use in this fashion). - */ - GR_RUNTIME_API void thread_unbind(); - - /*! \brief Remove any thread-processor affinity for a given thread ID. - * - * Note: this does not work on OSX; it is a nop call since OSX - * does not support the concept of thread affinity (and what they - * do support in this way since 10.5 is not what we want or can - * use in this fashion). - */ - GR_RUNTIME_API void thread_unbind(gr_thread_t thread); - - /*! \brief get current thread priority for a given thread ID - */ - GR_RUNTIME_API int thread_priority(gr_thread_t thread); - - /*! \brief set current thread priority for a given thread ID - */ - GR_RUNTIME_API int set_thread_priority(gr_thread_t thread, int priority); - - GR_RUNTIME_API void set_thread_name(gr_thread_t thread, - std::string name); - - } /* namespace thread */ +/*! \brief Get the current thread's ID as a gr_thread_t + * + * We use this when setting the thread affinity or any other + * low-level thread settings. Can be called within a GNU Radio + * block to get a reference to its current thread ID. + */ +GR_RUNTIME_API gr_thread_t get_current_thread_id(); + +/*! \brief Bind the current thread to a set of cores. + * + * Wrapper for system-dependent calls to set the affinity of the + * current thread to the processor mask. The mask is simply a + * 1-demensional vector containing the processor or core number + * from 0 to N-1 for N cores. + * + * Note: this does not work on OSX; it is a nop call since OSX + * does not support the concept of thread affinity (and what they + * do support in this way since 10.5 is not what we want or can + * use in this fashion). + */ +GR_RUNTIME_API void thread_bind_to_processor(const std::vector<int>& mask); + +/*! \brief Convineince function to bind the current thread to a single core. + * + * Wrapper for system-dependent calls to set the affinity of the + * current thread to a given core from 0 to N-1 for N cores. + * + * Note: this does not work on OSX; it is a nop call since OSX + * does not support the concept of thread affinity (and what they + * do support in this way since 10.5 is not what we want or can + * use in this fashion). + */ +GR_RUNTIME_API void thread_bind_to_processor(int n); + +/*! \brief Bind a thread to a set of cores. + * + * Wrapper for system-dependent calls to set the affinity of the + * given thread ID to the processor mask. The mask is simply a + * 1-demensional vector containing the processor or core number + * from 0 to N-1 for N cores. + * + * Note: this does not work on OSX; it is a nop call since OSX + * does not support the concept of thread affinity (and what they + * do support in this way since 10.5 is not what we want or can + * use in this fashion). + */ +GR_RUNTIME_API void thread_bind_to_processor(gr_thread_t thread, + const std::vector<int>& mask); + + +/*! \brief Convineince function to bind the a thread to a single core. + * + * Wrapper for system-dependent calls to set the affinity of the + * given thread ID to a given core from 0 to N-1 for N cores. + * + * Note: this does not work on OSX; it is a nop call since OSX + * does not support the concept of thread affinity (and what they + * do support in this way since 10.5 is not what we want or can + * use in this fashion). + */ +GR_RUNTIME_API void thread_bind_to_processor(gr_thread_t thread, unsigned int n); + +/*! \brief Remove any thread-processor affinity for the current thread. + * + * Note: this does not work on OSX; it is a nop call since OSX + * does not support the concept of thread affinity (and what they + * do support in this way since 10.5 is not what we want or can + * use in this fashion). + */ +GR_RUNTIME_API void thread_unbind(); + +/*! \brief Remove any thread-processor affinity for a given thread ID. + * + * Note: this does not work on OSX; it is a nop call since OSX + * does not support the concept of thread affinity (and what they + * do support in this way since 10.5 is not what we want or can + * use in this fashion). + */ +GR_RUNTIME_API void thread_unbind(gr_thread_t thread); + +/*! \brief get current thread priority for a given thread ID + */ +GR_RUNTIME_API int thread_priority(gr_thread_t thread); + +/*! \brief set current thread priority for a given thread ID + */ +GR_RUNTIME_API int set_thread_priority(gr_thread_t thread, int priority); + +GR_RUNTIME_API void set_thread_name(gr_thread_t thread, std::string name); + +} /* namespace thread */ } /* namespace gr */ #endif /* INCLUDED_THREAD_H */ diff --git a/gnuradio-runtime/include/gnuradio/thread/thread_body_wrapper.h b/gnuradio-runtime/include/gnuradio/thread/thread_body_wrapper.h index 9761d3fbe2..4342aea3f5 100644 --- a/gnuradio-runtime/include/gnuradio/thread/thread_body_wrapper.h +++ b/gnuradio-runtime/include/gnuradio/thread/thread_body_wrapper.h @@ -28,45 +28,39 @@ #include <iostream> namespace gr { - namespace thread { +namespace thread { - GR_RUNTIME_API void mask_signals(); +GR_RUNTIME_API void mask_signals(); - template <class F> - class thread_body_wrapper - { - private: - F d_f; - std::string d_name; +template <class F> +class thread_body_wrapper +{ +private: + F d_f; + std::string d_name; - public: - explicit thread_body_wrapper(F f, const std::string &name="") - : d_f(f), d_name(name) {} +public: + explicit thread_body_wrapper(F f, const std::string& name = "") : d_f(f), d_name(name) + { + } - void operator()() - { + void operator()() + { mask_signals(); try { - d_f(); - } - catch(boost::thread_interrupted const &) - { - } - catch(std::exception const &e) - { - std::cerr << "thread[" << d_name << "]: " - << e.what() << std::endl; - } - catch(...) - { + d_f(); + } catch (boost::thread_interrupted const&) { + } catch (std::exception const& e) { + std::cerr << "thread[" << d_name << "]: " << e.what() << std::endl; + } catch (...) { std::cerr << "thread[" << d_name << "]: " << "caught unrecognized exception\n"; - } - } - }; + } + } +}; - } /* namespace thread */ +} /* namespace thread */ } /* namespace gr */ #endif /* INCLUDED_THREAD_BODY_WRAPPER_H */ diff --git a/gnuradio-runtime/include/gnuradio/thread/thread_group.h b/gnuradio-runtime/include/gnuradio/thread/thread_group.h index 830017d11e..aa2336e944 100644 --- a/gnuradio-runtime/include/gnuradio/thread/thread_group.h +++ b/gnuradio-runtime/include/gnuradio/thread/thread_group.h @@ -22,27 +22,27 @@ #include <boost/function.hpp> namespace gr { - namespace thread { - - class GR_RUNTIME_API thread_group : public boost::noncopyable - { - public: - thread_group(); - ~thread_group(); - - boost::thread* create_thread(const boost::function0<void>& threadfunc); - void add_thread(boost::thread* thrd); - void remove_thread(boost::thread* thrd); - void join_all(); - void interrupt_all(); - size_t size() const; - - private: - std::list<boost::thread*> m_threads; - mutable boost::shared_mutex m_mutex; - }; - - } /* namespace thread */ +namespace thread { + +class GR_RUNTIME_API thread_group : public boost::noncopyable +{ +public: + thread_group(); + ~thread_group(); + + boost::thread* create_thread(const boost::function0<void>& threadfunc); + void add_thread(boost::thread* thrd); + void remove_thread(boost::thread* thrd); + void join_all(); + void interrupt_all(); + size_t size() const; + +private: + std::list<boost::thread*> m_threads; + mutable boost::shared_mutex m_mutex; +}; + +} /* namespace thread */ } /* namespace gr */ #endif /* INCLUDED_THREAD_GROUP_H */ diff --git a/gnuradio-runtime/include/gnuradio/thrift_application_base.h b/gnuradio-runtime/include/gnuradio/thrift_application_base.h index 34622cacfe..343209f0e0 100644 --- a/gnuradio-runtime/include/gnuradio/thrift_application_base.h +++ b/gnuradio-runtime/include/gnuradio/thrift_application_base.h @@ -31,12 +31,18 @@ #include <boost/scoped_ptr.hpp> namespace { - // Time, in milliseconds, to wait between checks to the Thrift runtime to see if - // it has fully initialized. - static const unsigned int THRIFTAPPLICATION_ACTIVATION_TIMEOUT_MS(200); -}; - -namespace apache { namespace thrift { namespace server { class TServer; } } } +// Time, in milliseconds, to wait between checks to the Thrift runtime to see if +// it has fully initialized. +static const unsigned int THRIFTAPPLICATION_ACTIVATION_TIMEOUT_MS(200); +}; // namespace + +namespace apache { +namespace thrift { +namespace server { +class TServer; +} +} // namespace thrift +} // namespace apache /*! * \brief Class to be statically initialized by thrift_application_base. Used @@ -46,17 +52,18 @@ namespace apache { namespace thrift { namespace server { class TServer; } } } class thrift_application_base_impl { public: - thrift_application_base_impl() : - d_application_initilized(false), - d_endpointStr(""), - d_start_thrift_thread() {;} - - // Used to ensure the Thrift runtime is initialized on the first call to ::i(). - bool d_application_initilized; - // Stores the generated endpoint string after the Thrift runtime has initialized. - std::string d_endpointStr; - // Thread to execute the Thrift runtime's blocking serve() function. - boost::shared_ptr<gr::thread::thread> d_start_thrift_thread; + thrift_application_base_impl() + : d_application_initilized(false), d_endpointStr(""), d_start_thrift_thread() + { + ; + } + + // Used to ensure the Thrift runtime is initialized on the first call to ::i(). + bool d_application_initilized; + // Stores the generated endpoint string after the Thrift runtime has initialized. + std::string d_endpointStr; + // Thread to execute the Thrift runtime's blocking serve() function. + boost::shared_ptr<gr::thread::thread> d_start_thrift_thread; }; /*! @@ -75,178 +82,182 @@ public: * be returned by thrift_application_base::i(). */ -template<typename TserverBase, typename TserverClass> +template <typename TserverBase, typename TserverClass> class thrift_application_base { public: - thrift_application_base(TserverClass* _app); - - /*! - * Destructor for the application. Since shutdown and cleanup of the - * runtime is typically custom to a particular booter - * implementation, this must be implemented as a specialized function - * for a particular booter. Thus a template implementation is not - * provided here. - */ - ~thrift_application_base(); - - /*! - * The application singleton instance function. - */ - static TserverBase* i(); - - /*! - * Returns the endpoint string of this application. - */ - static const std::vector<std::string> endpoints(); + thrift_application_base(TserverClass* _app); + + /*! + * Destructor for the application. Since shutdown and cleanup of the + * runtime is typically custom to a particular booter + * implementation, this must be implemented as a specialized function + * for a particular booter. Thus a template implementation is not + * provided here. + */ + ~thrift_application_base(); + + /*! + * The application singleton instance function. + */ + static TserverBase* i(); + + /*! + * Returns the endpoint string of this application. + */ + static const std::vector<std::string> endpoints(); protected: - /*! - * Allows this application's booter to set the endpoint string after - * the Thrift runtime has initialized. - * - * \param[in] endpoint The endpoint string reported by this class. - */ - void set_endpoint(const std::string& endpoint); - - virtual TserverBase* i_impl() = 0; - - /*! - * Reference to the fully derived application instance. - */ - static TserverClass* d_application; - - /*! - * Reference to the Thrift runtime. - */ - boost::scoped_ptr<apache::thrift::server::TServer> d_thriftserver; - - /*! - * Max number of attempts when checking the Thrift runtime for - * Initialization before giving up. Set in the Thrift config file - * (see \ref ctrlport_thrift_prefs). - */ - static const unsigned int d_default_max_init_attempts; - - /*! - * Default port for the runtime to listen on, if a static port is - * not specified. Set in the Thrift config file (see \ref - * ctrlport_thrift_prefs). - */ - static const unsigned int d_default_thrift_port; - - /*! - * Maximum number of threads to create when serving multiple rpc - * clients. Set in the Thrift config file (see \ref - * ctrlport_thrift_prefs). - */ - static const unsigned int d_default_num_thrift_threads; - - /*! - * Default packet size for the IP payload of thrift packets. Set in - * the Thrift config file (see \ref ctrlport_thrift_prefs). - */ - static const unsigned int d_default_thrift_buffer_size; - - /*! - * \ref page_logger instances. - */ - gr::logger_ptr d_logger, d_debug_logger; + /*! + * Allows this application's booter to set the endpoint string after + * the Thrift runtime has initialized. + * + * \param[in] endpoint The endpoint string reported by this class. + */ + void set_endpoint(const std::string& endpoint); + + virtual TserverBase* i_impl() = 0; + + /*! + * Reference to the fully derived application instance. + */ + static TserverClass* d_application; + + /*! + * Reference to the Thrift runtime. + */ + boost::scoped_ptr<apache::thrift::server::TServer> d_thriftserver; + + /*! + * Max number of attempts when checking the Thrift runtime for + * Initialization before giving up. Set in the Thrift config file + * (see \ref ctrlport_thrift_prefs). + */ + static const unsigned int d_default_max_init_attempts; + + /*! + * Default port for the runtime to listen on, if a static port is + * not specified. Set in the Thrift config file (see \ref + * ctrlport_thrift_prefs). + */ + static const unsigned int d_default_thrift_port; + + /*! + * Maximum number of threads to create when serving multiple rpc + * clients. Set in the Thrift config file (see \ref + * ctrlport_thrift_prefs). + */ + static const unsigned int d_default_num_thrift_threads; + + /*! + * Default packet size for the IP payload of thrift packets. Set in + * the Thrift config file (see \ref ctrlport_thrift_prefs). + */ + static const unsigned int d_default_thrift_buffer_size; + + /*! + * \ref page_logger instances. + */ + gr::logger_ptr d_logger, d_debug_logger; private: - - // Function to be called in a separate thread to invoke the blocking - // ThriftServer::serve() function. Must be specialized for a particular - // booter implementation, therefore a template implementation is - // not provided here. - void start_thrift(); - - // Non-blocking function that returns true when the Thrift - // runtime has finished initialization. Must be implemented - // as a specialized template function for a particular booter - // implementation, therefore template implementation is not - // provided here. - bool application_started(); - - // Internal function to start the initialization of the runtime. - // Since this singleton uses lazy instantiation, this function - // will be called on the first call to the instance function ::i(), - // and since ::i() is static, this function must be static as well. - static void start_application(); - - // Pointer to the structure containing statically allocated - // state information for the applicaiton_base singleton. - static boost::scoped_ptr<thrift_application_base_impl > p_impl; - - // Mutex to protect the endpoint string. - gr::thread::mutex d_lock; - - // Will be set to true by a the application_started() function, - // specialized for a particular booter implementation, once the - // thrift runtime has successfully initialized. - bool d_thirft_is_running; + // Function to be called in a separate thread to invoke the blocking + // ThriftServer::serve() function. Must be specialized for a particular + // booter implementation, therefore a template implementation is + // not provided here. + void start_thrift(); + + // Non-blocking function that returns true when the Thrift + // runtime has finished initialization. Must be implemented + // as a specialized template function for a particular booter + // implementation, therefore template implementation is not + // provided here. + bool application_started(); + + // Internal function to start the initialization of the runtime. + // Since this singleton uses lazy instantiation, this function + // will be called on the first call to the instance function ::i(), + // and since ::i() is static, this function must be static as well. + static void start_application(); + + // Pointer to the structure containing statically allocated + // state information for the applicaiton_base singleton. + static boost::scoped_ptr<thrift_application_base_impl> p_impl; + + // Mutex to protect the endpoint string. + gr::thread::mutex d_lock; + + // Will be set to true by a the application_started() function, + // specialized for a particular booter implementation, once the + // thrift runtime has successfully initialized. + bool d_thirft_is_running; }; -template<typename TserverBase, typename TserverClass> +template <typename TserverBase, typename TserverClass> TserverClass* thrift_application_base<TserverBase, TserverClass>::d_application(0); -template<typename TserverBase, typename TserverClass> -thrift_application_base<TserverBase, TserverClass>::thrift_application_base(TserverClass* _app) - : d_lock(), - d_thirft_is_running(false) +template <typename TserverBase, typename TserverClass> +thrift_application_base<TserverBase, TserverClass>::thrift_application_base( + TserverClass* _app) + : d_lock(), d_thirft_is_running(false) { - gr::configure_default_loggers(d_logger, d_debug_logger, "controlport"); - d_application = _app; + gr::configure_default_loggers(d_logger, d_debug_logger, "controlport"); + d_application = _app; } -template<typename TserverBase, typename TserverClass> +template <typename TserverBase, typename TserverClass> void thrift_application_base<TserverBase, TserverClass>::start_application() { - unsigned int max_init_attempts = \ - static_cast<unsigned int>(gr::prefs::singleton()->get_long("thrift", "init_attempts", - d_default_max_init_attempts)); - - if(!p_impl->d_application_initilized) { - p_impl->d_start_thrift_thread.reset( - (new gr::thread::thread(boost::bind(&thrift_application_base::start_thrift, d_application)))); - - bool app_started(false); - for(unsigned int attempts(0); (!app_started && attempts < max_init_attempts); ++attempts) { - boost::this_thread::sleep(boost::posix_time::milliseconds(THRIFTAPPLICATION_ACTIVATION_TIMEOUT_MS)); - app_started = d_application->application_started(); - } - - if(!app_started) { - GR_WARN("thrift_application_base", "thrift_application_base::start_application(), " - "timeout waiting to port number might have failed?"); + unsigned int max_init_attempts = + static_cast<unsigned int>(gr::prefs::singleton()->get_long( + "thrift", "init_attempts", d_default_max_init_attempts)); + + if (!p_impl->d_application_initilized) { + p_impl->d_start_thrift_thread.reset((new gr::thread::thread( + boost::bind(&thrift_application_base::start_thrift, d_application)))); + + bool app_started(false); + for (unsigned int attempts(0); (!app_started && attempts < max_init_attempts); + ++attempts) { + boost::this_thread::sleep( + boost::posix_time::milliseconds(THRIFTAPPLICATION_ACTIVATION_TIMEOUT_MS)); + app_started = d_application->application_started(); + } + + if (!app_started) { + GR_WARN("thrift_application_base", + "thrift_application_base::start_application(), " + "timeout waiting to port number might have failed?"); + } + + p_impl->d_application_initilized = true; } - - p_impl->d_application_initilized = true; - } } -template<typename TserverBase, typename TserverClass> -const std::vector<std::string> thrift_application_base<TserverBase, TserverClass>::endpoints() +template <typename TserverBase, typename TserverClass> +const std::vector<std::string> +thrift_application_base<TserverBase, TserverClass>::endpoints() { - std::vector<std::string> ep; - ep.push_back(p_impl->d_endpointStr); - return ep; + std::vector<std::string> ep; + ep.push_back(p_impl->d_endpointStr); + return ep; } -template<typename TserverBase, typename TserverClass> -void thrift_application_base<TserverBase, TserverClass>::set_endpoint(const std::string& endpoint) +template <typename TserverBase, typename TserverClass> +void thrift_application_base<TserverBase, TserverClass>::set_endpoint( + const std::string& endpoint) { - gr::thread::scoped_lock guard(d_lock); - p_impl->d_endpointStr = endpoint; + gr::thread::scoped_lock guard(d_lock); + p_impl->d_endpointStr = endpoint; } -template<typename TserverBase, typename TserverClass> +template <typename TserverBase, typename TserverClass> TserverBase* thrift_application_base<TserverBase, TserverClass>::i() { - if(!p_impl->d_application_initilized) { - start_application(); - } - return d_application->i_impl(); + if (!p_impl->d_application_initilized) { + start_application(); + } + return d_application->i_impl(); } #endif diff --git a/gnuradio-runtime/include/gnuradio/thrift_server_template.h b/gnuradio-runtime/include/gnuradio/thrift_server_template.h index 632a902360..a8ca18cb1a 100644 --- a/gnuradio-runtime/include/gnuradio/thrift_server_template.h +++ b/gnuradio-runtime/include/gnuradio/thrift_server_template.h @@ -38,121 +38,130 @@ using namespace apache; -template<typename TserverBase, typename TserverClass, typename TImplClass> +template <typename TserverBase, typename TserverClass, typename TImplClass> class thrift_server_template : public thrift_application_base<TserverBase, TImplClass> { public: - thrift_server_template(TImplClass* _this); - ~thrift_server_template(); + thrift_server_template(TImplClass* _this); + ~thrift_server_template(); protected: - TserverBase* i_impl(); - friend class thrift_application_base<TserverBase, TImplClass>; + TserverBase* i_impl(); + friend class thrift_application_base<TserverBase, TImplClass>; private: - boost::shared_ptr<TserverClass> d_handler; - boost::shared_ptr<thrift::TProcessor> d_processor; - boost::shared_ptr<thrift::transport::TServerTransport> d_serverTransport; - boost::shared_ptr<thrift::transport::TTransportFactory> d_transportFactory; - boost::shared_ptr<thrift::protocol::TProtocolFactory> d_protocolFactory; - /** - * Custom TransportFactory that allows you to override the default Thrift buffer size - * of 512 bytes. - * - */ - class TBufferedTransportFactory : public thrift::transport::TTransportFactory - { - public: - TBufferedTransportFactory(const unsigned int _bufferSize) : bufferSize(_bufferSize) {;} - - virtual ~TBufferedTransportFactory() {} - - virtual boost::shared_ptr<thrift::transport::TTransport> getTransport( - boost::shared_ptr<thrift::transport::TTransport> trans) + boost::shared_ptr<TserverClass> d_handler; + boost::shared_ptr<thrift::TProcessor> d_processor; + boost::shared_ptr<thrift::transport::TServerTransport> d_serverTransport; + boost::shared_ptr<thrift::transport::TTransportFactory> d_transportFactory; + boost::shared_ptr<thrift::protocol::TProtocolFactory> d_protocolFactory; + /** + * Custom TransportFactory that allows you to override the default Thrift buffer size + * of 512 bytes. + * + */ + class TBufferedTransportFactory : public thrift::transport::TTransportFactory { - return boost::shared_ptr<thrift::transport::TTransport> - (new thrift::transport::TBufferedTransport(trans, bufferSize)); - } - private: - unsigned int bufferSize; - }; + public: + TBufferedTransportFactory(const unsigned int _bufferSize) + : bufferSize(_bufferSize) + { + ; + } + + virtual ~TBufferedTransportFactory() {} + + virtual boost::shared_ptr<thrift::transport::TTransport> + getTransport(boost::shared_ptr<thrift::transport::TTransport> trans) + { + return boost::shared_ptr<thrift::transport::TTransport>( + new thrift::transport::TBufferedTransport(trans, bufferSize)); + } + + private: + unsigned int bufferSize; + }; }; -template<typename TserverBase, typename TserverClass, typename TImplClass> -thrift_server_template<TserverBase, TserverClass, TImplClass>::thrift_server_template(TImplClass* _this) - : thrift_application_base<TserverBase, TImplClass>(_this), - d_handler(new TserverClass()), - d_processor(new GNURadio::ControlPortProcessor(d_handler)), - d_serverTransport(), - d_transportFactory(), - d_protocolFactory(new thrift::protocol::TBinaryProtocolFactory()) +template <typename TserverBase, typename TserverClass, typename TImplClass> +thrift_server_template<TserverBase, TserverClass, TImplClass>::thrift_server_template( + TImplClass* _this) + : thrift_application_base<TserverBase, TImplClass>(_this), + d_handler(new TserverClass()), + d_processor(new GNURadio::ControlPortProcessor(d_handler)), + d_serverTransport(), + d_transportFactory(), + d_protocolFactory(new thrift::protocol::TBinaryProtocolFactory()) { - gr::logger_ptr logger, debug_logger; - gr::configure_default_loggers(logger, debug_logger, "controlport"); - - unsigned int port, nthreads, buffersize; - std::string thrift_config_file = gr::prefs::singleton()->get_string("ControlPort", "config", ""); - - if(thrift_config_file.length() > 0) { - gr::prefs::singleton()->add_config_file(thrift_config_file); - } - - // Collect configuration options from the Thrift config file; - // defaults if the config file doesn't exist or list the specific - // options. - port = static_cast<unsigned int> - (gr::prefs::singleton()->get_long("thrift", "port", - thrift_application_base<TserverBase, - TImplClass>::d_default_thrift_port)); - nthreads = static_cast<unsigned int> - (gr::prefs::singleton()->get_long("thrift", "nthreads", - thrift_application_base<TserverBase, - TImplClass>::d_default_num_thrift_threads)); - buffersize = static_cast<unsigned int> - (gr::prefs::singleton()->get_long("thrift", "buffersize", - thrift_application_base<TserverBase, - TImplClass>::d_default_thrift_buffer_size)); - - d_serverTransport.reset(new thrift::transport::TServerSocket(port)); - - d_transportFactory.reset(new thrift_server_template::TBufferedTransportFactory(buffersize)); - - if(nthreads <= 1) { - // "Thrift: Single-threaded server" - //std::cout << "Thrift Single-threaded server" << std::endl; - thrift_application_base<TserverBase, TImplClass>::d_thriftserver.reset - (new thrift::server::TSimpleServer(d_processor, d_serverTransport, - d_transportFactory, d_protocolFactory)); - } - else { - //std::cout << "Thrift Multi-threaded server : " << d_nthreads << std::endl; - boost::shared_ptr<thrift::concurrency::ThreadManager> threadManager - (thrift::concurrency::ThreadManager::newSimpleThreadManager(nthreads)); - - threadManager->threadFactory - (boost::shared_ptr<thrift::concurrency::PlatformThreadFactory> - (new thrift::concurrency::PlatformThreadFactory())); - - threadManager->start(); - - thrift_application_base<TserverBase, TImplClass>::d_thriftserver.reset - (new thrift::server::TThreadPoolServer(d_processor, d_serverTransport, - d_transportFactory, d_protocolFactory, - threadManager)); - } + gr::logger_ptr logger, debug_logger; + gr::configure_default_loggers(logger, debug_logger, "controlport"); + + unsigned int port, nthreads, buffersize; + std::string thrift_config_file = + gr::prefs::singleton()->get_string("ControlPort", "config", ""); + + if (thrift_config_file.length() > 0) { + gr::prefs::singleton()->add_config_file(thrift_config_file); + } + + // Collect configuration options from the Thrift config file; + // defaults if the config file doesn't exist or list the specific + // options. + port = static_cast<unsigned int>(gr::prefs::singleton()->get_long( + "thrift", + "port", + thrift_application_base<TserverBase, TImplClass>::d_default_thrift_port)); + nthreads = static_cast<unsigned int>(gr::prefs::singleton()->get_long( + "thrift", + "nthreads", + thrift_application_base<TserverBase, TImplClass>::d_default_num_thrift_threads)); + buffersize = static_cast<unsigned int>(gr::prefs::singleton()->get_long( + "thrift", + "buffersize", + thrift_application_base<TserverBase, TImplClass>::d_default_thrift_buffer_size)); + + d_serverTransport.reset(new thrift::transport::TServerSocket(port)); + + d_transportFactory.reset( + new thrift_server_template::TBufferedTransportFactory(buffersize)); + + if (nthreads <= 1) { + // "Thrift: Single-threaded server" + // std::cout << "Thrift Single-threaded server" << std::endl; + thrift_application_base<TserverBase, TImplClass>::d_thriftserver.reset( + new thrift::server::TSimpleServer( + d_processor, d_serverTransport, d_transportFactory, d_protocolFactory)); + } else { + // std::cout << "Thrift Multi-threaded server : " << d_nthreads << std::endl; + boost::shared_ptr<thrift::concurrency::ThreadManager> threadManager( + thrift::concurrency::ThreadManager::newSimpleThreadManager(nthreads)); + + threadManager->threadFactory( + boost::shared_ptr<thrift::concurrency::PlatformThreadFactory>( + new thrift::concurrency::PlatformThreadFactory())); + + threadManager->start(); + + thrift_application_base<TserverBase, TImplClass>::d_thriftserver.reset( + new thrift::server::TThreadPoolServer(d_processor, + d_serverTransport, + d_transportFactory, + d_protocolFactory, + threadManager)); + } } -template<typename TserverBase, typename TserverClass, typename TImplClass> -thrift_server_template<TserverBase, TserverClass,TImplClass>::~thrift_server_template() +template <typename TserverBase, typename TserverClass, typename TImplClass> +thrift_server_template<TserverBase, TserverClass, TImplClass>::~thrift_server_template() { } -template<typename TserverBase, typename TserverClass, typename TImplClass> +template <typename TserverBase, typename TserverClass, typename TImplClass> TserverBase* thrift_server_template<TserverBase, TserverClass, TImplClass>::i_impl() { - //std::cerr << "thrift_server_template: i_impl" << std::endl; + // std::cerr << "thrift_server_template: i_impl" << std::endl; - return d_handler.get(); + return d_handler.get(); } #endif /* THRIFT_SERVER_TEMPLATE_H */ diff --git a/gnuradio-runtime/include/gnuradio/top_block.h b/gnuradio-runtime/include/gnuradio/top_block.h index 7f3556a546..d0e62d1aaf 100644 --- a/gnuradio-runtime/include/gnuradio/top_block.h +++ b/gnuradio-runtime/include/gnuradio/top_block.h @@ -28,26 +28,25 @@ namespace gr { - class top_block_impl; +class top_block_impl; - GR_RUNTIME_API top_block_sptr make_top_block(const std::string &name); +GR_RUNTIME_API top_block_sptr make_top_block(const std::string& name); - /*! - *\brief Top-level hierarchical block representing a flowgraph - * \ingroup container_blk - */ - class GR_RUNTIME_API top_block : public hier_block2 - { - private: - friend GR_RUNTIME_API top_block_sptr - make_top_block(const std::string &name); +/*! + *\brief Top-level hierarchical block representing a flowgraph + * \ingroup container_blk + */ +class GR_RUNTIME_API top_block : public hier_block2 +{ +private: + friend GR_RUNTIME_API top_block_sptr make_top_block(const std::string& name); - top_block_impl *d_impl; + top_block_impl* d_impl; - protected: - top_block(const std::string &name); +protected: + top_block(const std::string& name); - public: +public: ~top_block(); /*! @@ -60,7 +59,7 @@ namespace gr { * allowed for any block in the flowgraph. This passes through to * the start function; see that function for more details. */ - void run(int max_noutput_items=100000000); + void run(int max_noutput_items = 100000000); /*! * Start the contained flowgraph. Creates one or more threads to @@ -74,7 +73,7 @@ namespace gr { * maximum. Use this to adjust the maximum latency a flowgraph can * exhibit. */ - void start(int max_noutput_items=100000000); + void start(int max_noutput_items = 100000000); /*! * Stop the running flowgraph. Notifies each thread created by the @@ -141,12 +140,13 @@ namespace gr { top_block_sptr to_top_block(); // Needed for Python type coercion void setup_rpc(); - }; +}; - inline top_block_sptr cast_to_top_block_sptr(basic_block_sptr block) { +inline top_block_sptr cast_to_top_block_sptr(basic_block_sptr block) +{ return boost::dynamic_pointer_cast<top_block, basic_block>(block); - } +} -} /* namespce gr */ +} // namespace gr #endif /* INCLUDED_GR_TOP_BLOCK_H */ diff --git a/gnuradio-runtime/include/gnuradio/tpb_detail.h b/gnuradio-runtime/include/gnuradio/tpb_detail.h index 4e660144f2..db857393fd 100644 --- a/gnuradio-runtime/include/gnuradio/tpb_detail.h +++ b/gnuradio-runtime/include/gnuradio/tpb_detail.h @@ -29,67 +29,67 @@ namespace gr { - class block_detail; +class block_detail; - /*! - * \brief used by thread-per-block scheduler - */ - struct GR_RUNTIME_API tpb_detail { - gr::thread::mutex mutex; //< protects all vars - bool input_changed; - gr::thread::condition_variable input_cond; - bool output_changed; - gr::thread::condition_variable output_cond; +/*! + * \brief used by thread-per-block scheduler + */ +struct GR_RUNTIME_API tpb_detail { + gr::thread::mutex mutex; //< protects all vars + bool input_changed; + gr::thread::condition_variable input_cond; + bool output_changed; + gr::thread::condition_variable output_cond; - public: - tpb_detail() - : input_changed(false), output_changed(false) { } +public: + tpb_detail() : input_changed(false), output_changed(false) {} //! Called by us to tell all our upstream blocks that their output //! may have changed. - void notify_upstream(block_detail *d); + void notify_upstream(block_detail* d); //! Called by us to tell all our downstream blocks that their //! input may have changed. - void notify_downstream(block_detail *d); + void notify_downstream(block_detail* d); //! Called by us to notify both upstream and downstream - void notify_neighbors(block_detail *d); + void notify_neighbors(block_detail* d); //! Called by pmt msg posters - void notify_msg() { - gr::thread::scoped_lock guard(mutex); - input_changed = true; - input_cond.notify_one(); - output_changed = true; - output_cond.notify_one(); + void notify_msg() + { + gr::thread::scoped_lock guard(mutex); + input_changed = true; + input_cond.notify_one(); + output_changed = true; + output_cond.notify_one(); } //! Called by us void clear_changed() { - gr::thread::scoped_lock guard(mutex); - input_changed = false; - output_changed = false; + gr::thread::scoped_lock guard(mutex); + input_changed = false; + output_changed = false; } - private: +private: //! Used by notify_downstream void set_input_changed() { - gr::thread::scoped_lock guard(mutex); - input_changed = true; - input_cond.notify_one(); + gr::thread::scoped_lock guard(mutex); + input_changed = true; + input_cond.notify_one(); } //! Used by notify_upstream void set_output_changed() { - gr::thread::scoped_lock guard(mutex); - output_changed = true; - output_cond.notify_one(); + gr::thread::scoped_lock guard(mutex); + output_changed = true; + output_cond.notify_one(); } - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/include/gnuradio/types.h b/gnuradio-runtime/include/gnuradio/types.h index 5d645ad3f9..f08bf3158d 100644 --- a/gnuradio-runtime/include/gnuradio/types.h +++ b/gnuradio-runtime/include/gnuradio/types.h @@ -26,17 +26,17 @@ #include <gnuradio/api.h> #include <boost/shared_ptr.hpp> #include <vector> -#include <stddef.h> // size_t +#include <stddef.h> // size_t #include <gnuradio/gr_complex.h> #include <stdint.h> -typedef std::vector<int> gr_vector_int; -typedef std::vector<unsigned int> gr_vector_uint; -typedef std::vector<float> gr_vector_float; -typedef std::vector<double> gr_vector_double; -typedef std::vector<void *> gr_vector_void_star; -typedef std::vector<const void *> gr_vector_const_void_star; +typedef std::vector<int> gr_vector_int; +typedef std::vector<unsigned int> gr_vector_uint; +typedef std::vector<float> gr_vector_float; +typedef std::vector<double> gr_vector_double; +typedef std::vector<void*> gr_vector_void_star; +typedef std::vector<const void*> gr_vector_const_void_star; #endif /* INCLUDED_GR_TYPES_H */ diff --git a/gnuradio-runtime/include/gnuradio/unittests.h b/gnuradio-runtime/include/gnuradio/unittests.h index 14c201ecb1..42d7b81d9d 100644 --- a/gnuradio-runtime/include/gnuradio/unittests.h +++ b/gnuradio-runtime/include/gnuradio/unittests.h @@ -34,8 +34,10 @@ #include <boost/filesystem/operations.hpp> #include <boost/filesystem/path.hpp> -static std::string get_unittest_path(const std::string &filename){ +static std::string get_unittest_path(const std::string& filename) +{ boost::filesystem::path path = boost::filesystem::current_path() / ".unittests"; - if (!boost::filesystem::is_directory(path)) boost::filesystem::create_directory(path); + if (!boost::filesystem::is_directory(path)) + boost::filesystem::create_directory(path); return (path / filename).string(); } diff --git a/gnuradio-runtime/include/gnuradio/xoroshiro128p.h b/gnuradio-runtime/include/gnuradio/xoroshiro128p.h index b3e6dcb12d..aa09128cea 100644 --- a/gnuradio-runtime/include/gnuradio/xoroshiro128p.h +++ b/gnuradio-runtime/include/gnuradio/xoroshiro128p.h @@ -34,68 +34,75 @@ extern "C" { #include <stdint.h> /*! \brief rotating left shift helper - * According to the original authors, this will on most platforms reduce to a single instruction + * According to the original authors, this will on most platforms reduce to a single + * instruction */ -static inline uint64_t rotl(const uint64_t x, const int k) { - return (x << k) | (x >> (64 - k)); +static inline uint64_t rotl(const uint64_t x, const int k) +{ + return (x << k) | (x >> (64 - k)); } /*! \brief generate the next random number and update the state. * This is the workhorse, here! */ -static inline uint64_t xoroshiro128p_next(uint64_t *state) { - const uint64_t s0 = state[0]; - uint64_t s1 = state[1]; - const uint64_t result = s0 + s1; +static inline uint64_t xoroshiro128p_next(uint64_t* state) +{ + const uint64_t s0 = state[0]; + uint64_t s1 = state[1]; + const uint64_t result = s0 + s1; - s1 ^= s0; - state[0] = rotl(s0, 55) ^ s1 ^ (s1 << 14); // a, b - state[1] = rotl(s1, 36); // c + s1 ^= s0; + state[0] = rotl(s0, 55) ^ s1 ^ (s1 << 14); // a, b + state[1] = rotl(s1, 36); // c - return result; + return result; } -/*! \brief Advance the internal state by 2^64 steps; useful when coordinating multiple independent RNGs - This is the jump function for the generator. It is equivalent - to 2^64 calls to next(); it can be used to generate 2^64 - non-overlapping subsequences for parallel computations. */ -static inline void xoroshiro128p_jump(uint64_t *state) { - static const uint64_t JUMP[] = { 0xbeac0467eba5facb, 0xd86b048b86aa9922 }; +/*! \brief Advance the internal state by 2^64 steps; useful when coordinating multiple + independent RNGs This is the jump function for the generator. It is equivalent to 2^64 + calls to next(); it can be used to generate 2^64 non-overlapping subsequences for + parallel computations. */ +static inline void xoroshiro128p_jump(uint64_t* state) +{ + static const uint64_t JUMP[] = { 0xbeac0467eba5facb, 0xd86b048b86aa9922 }; - uint64_t s0 = 0; - uint64_t s1 = 0; - for(unsigned int i = 0; i < sizeof (JUMP) / sizeof (*JUMP); ++i) { - for(unsigned int b = 0; b < 64; ++b) { - if (JUMP[i] & UINT64_C(1) << b) { - s0 ^= state[0]; - s1 ^= state[1]; - } - xoroshiro128p_next(state); + uint64_t s0 = 0; + uint64_t s1 = 0; + for (unsigned int i = 0; i < sizeof(JUMP) / sizeof(*JUMP); ++i) { + for (unsigned int b = 0; b < 64; ++b) { + if (JUMP[i] & UINT64_C(1) << b) { + s0 ^= state[0]; + s1 ^= state[1]; + } + xoroshiro128p_next(state); + } } - } - state[0] = s0; - state[1] = s1; + state[0] = s0; + state[1] = s1; } /*! \brief step of the SPLITMIX64 RNG; only used internally for seeding - * This RNG isn't as good as XOROSHIRO128+, so it's only used to initialize a 128 bit state from a seed. + * This RNG isn't as good as XOROSHIRO128+, so it's only used to initialize a 128 bit + * state from a seed. */ -static inline uint64_t splitmix64_next(uint64_t *state) { - uint64_t z = (*state += 0x9e3779b97f4a7c15); - z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9; - z = (z ^ (z >> 27)) * 0x94d049bb133111eb; - return z ^ (z >> 31); +static inline uint64_t splitmix64_next(uint64_t* state) +{ + uint64_t z = (*state += 0x9e3779b97f4a7c15); + z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9; + z = (z ^ (z >> 27)) * 0x94d049bb133111eb; + return z ^ (z >> 31); } /*! \brief Seed the 128 bit state from a 64 bit seed */ -static inline void xoroshiro128p_seed(uint64_t *state, const uint64_t seed) { - state[0] = seed; - state[1] = splitmix64_next(state); - xoroshiro128p_jump(state); +static inline void xoroshiro128p_seed(uint64_t* state, const uint64_t seed) +{ + state[0] = seed; + state[1] = splitmix64_next(state); + xoroshiro128p_jump(state); } #ifdef __cplusplus } diff --git a/gnuradio-runtime/include/pmt/api.h b/gnuradio-runtime/include/pmt/api.h index 69674dbd77..daed8039cb 100644 --- a/gnuradio-runtime/include/pmt/api.h +++ b/gnuradio-runtime/include/pmt/api.h @@ -25,9 +25,9 @@ #include <gnuradio/attributes.h> #ifdef gnuradio_pmt_EXPORTS -# define PMT_API __GR_ATTR_EXPORT +#define PMT_API __GR_ATTR_EXPORT #else -# define PMT_API __GR_ATTR_IMPORT +#define PMT_API __GR_ATTR_IMPORT #endif #endif /* INCLUDED_PMT_API_H */ diff --git a/gnuradio-runtime/include/pmt/pmt.h b/gnuradio-runtime/include/pmt/pmt.h index e6e84e021f..ea188ca613 100644 --- a/gnuradio-runtime/include/pmt/pmt.h +++ b/gnuradio-runtime/include/pmt/pmt.h @@ -35,10 +35,10 @@ #include <vector> namespace gr { - namespace messages { - class msg_accepter; - } +namespace messages { +class msg_accepter; } +} // namespace gr /*! * This file defines a polymorphic type and the operations on it. @@ -53,40 +53,40 @@ namespace pmt { /*! * \brief base class of all pmt types */ -class pmt_base : boost::noncopyable { - - public: - pmt_base(){}; - virtual ~pmt_base(); - - 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_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; } - 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; } - - 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; } +class pmt_base : boost::noncopyable +{ +public: + pmt_base(){}; + virtual ~pmt_base(); + + 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_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; } + 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; } + + 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; } }; /*! @@ -98,25 +98,25 @@ typedef boost::shared_ptr<pmt_base> pmt_t; class PMT_API exception : public std::logic_error { public: - exception(const std::string &msg, pmt_t obj); + exception(const std::string& msg, pmt_t obj); }; class PMT_API wrong_type : public exception { public: - wrong_type(const std::string &msg, pmt_t obj); + wrong_type(const std::string& msg, pmt_t obj); }; class PMT_API out_of_range : public exception { public: - out_of_range(const std::string &msg, pmt_t obj); + out_of_range(const std::string& msg, pmt_t obj); }; class PMT_API notimplemented : public exception { public: - notimplemented(const std::string &msg, pmt_t obj); + notimplemented(const std::string& msg, pmt_t obj); }; @@ -137,7 +137,6 @@ PMT_API pmt_t get_PMT_EOF(); #define PMT_EOF get_PMT_EOF() - /* * ------------------------------------------------------------------------ * Booleans. Two constants, #t and #f. @@ -173,10 +172,10 @@ PMT_API bool to_bool(pmt_t val); PMT_API bool is_symbol(const pmt_t& obj); //! Return the symbol whose name is \p s. -PMT_API pmt_t string_to_symbol(const std::string &s); +PMT_API pmt_t string_to_symbol(const std::string& s); //! Alias for pmt_string_to_symbol -PMT_API pmt_t intern(const std::string &s); +PMT_API pmt_t intern(const std::string& s); /*! @@ -287,13 +286,13 @@ PMT_API pmt_t make_rectangular(double re, double im); PMT_API pmt_t from_complex(double re, double im); //! Return a complex number constructed of the given a complex number. -PMT_API pmt_t from_complex(const std::complex<double> &z); +PMT_API pmt_t from_complex(const std::complex<double>& z); //! Return a complex number constructed of the given real and imaginary parts. PMT_API pmt_t pmt_from_complex(double re, double im); //! Return a complex number constructed of the given a complex number. -PMT_API pmt_t pmt_from_complex(const std::complex<double> &z); +PMT_API pmt_t pmt_from_complex(const std::complex<double>& z); /*! * If \p z is complex, real or integer, return the closest complex<double>. @@ -349,27 +348,66 @@ PMT_API pmt_t cadddr(pmt_t pair); PMT_API bool is_tuple(pmt_t x); PMT_API pmt_t make_tuple(); -PMT_API pmt_t make_tuple(const pmt_t &e0); -PMT_API pmt_t make_tuple(const pmt_t &e0, const pmt_t &e1); -PMT_API pmt_t make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2); -PMT_API pmt_t make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3); -PMT_API pmt_t make_tuple(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3, const pmt_t &e4); -PMT_API pmt_t 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_API pmt_t 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_API pmt_t 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_API pmt_t 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_API pmt_t 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_API pmt_t make_tuple(const pmt_t& e0); +PMT_API pmt_t make_tuple(const pmt_t& e0, const pmt_t& e1); +PMT_API pmt_t make_tuple(const pmt_t& e0, const pmt_t& e1, const pmt_t& e2); +PMT_API pmt_t make_tuple(const pmt_t& e0, + const pmt_t& e1, + const pmt_t& e2, + const pmt_t& e3); +PMT_API pmt_t make_tuple( + const pmt_t& e0, const pmt_t& e1, const pmt_t& e2, const pmt_t& e3, const pmt_t& e4); +PMT_API pmt_t 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_API pmt_t 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_API pmt_t 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_API pmt_t 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_API pmt_t 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); /*! * If \p x is a vector or proper list, return a tuple containing the elements of x */ -PMT_API pmt_t to_tuple(const pmt_t &x); +PMT_API pmt_t to_tuple(const pmt_t& x); /*! * Return the contents of position \p k of \p tuple. * \p k must be a valid index of \p tuple. */ -PMT_API pmt_t tuple_ref(const pmt_t &tuple, size_t k); +PMT_API pmt_t tuple_ref(const pmt_t& tuple, size_t k); /* * ------------------------------------------------------------------------ @@ -416,10 +454,10 @@ PMT_API bool is_blob(pmt_t x); * * The data is copied into the blob. */ -PMT_API pmt_t make_blob(const void *buf, size_t len); +PMT_API pmt_t make_blob(const void* buf, size_t len); //! Return a pointer to the blob's data -PMT_API const void *blob_data(pmt_t blob); +PMT_API const void* blob_data(pmt_t blob); //! Return the blob's length in bytes PMT_API size_t blob_length(pmt_t blob); @@ -483,45 +521,45 @@ PMT_API pmt_t make_f64vector(size_t k, double fill); PMT_API pmt_t make_c32vector(size_t k, std::complex<float> fill); PMT_API pmt_t make_c64vector(size_t k, std::complex<double> fill); -PMT_API pmt_t init_u8vector(size_t k, const uint8_t *data); -PMT_API pmt_t init_u8vector(size_t k, const std::vector<uint8_t> &data); -PMT_API pmt_t init_s8vector(size_t k, const int8_t *data); -PMT_API pmt_t init_s8vector(size_t k, const std::vector<int8_t> &data); -PMT_API pmt_t init_u16vector(size_t k, const uint16_t *data); -PMT_API pmt_t init_u16vector(size_t k, const std::vector<uint16_t> &data); -PMT_API pmt_t init_s16vector(size_t k, const int16_t *data); -PMT_API pmt_t init_s16vector(size_t k, const std::vector<int16_t> &data); -PMT_API pmt_t init_u32vector(size_t k, const uint32_t *data); -PMT_API pmt_t init_u32vector(size_t k, const std::vector<uint32_t> &data); -PMT_API pmt_t init_s32vector(size_t k, const int32_t *data); -PMT_API pmt_t init_s32vector(size_t k, const std::vector<int32_t> &data); -PMT_API pmt_t init_u64vector(size_t k, const uint64_t *data); -PMT_API pmt_t init_u64vector(size_t k, const std::vector<uint64_t> &data); -PMT_API pmt_t init_s64vector(size_t k, const int64_t *data); -PMT_API pmt_t init_s64vector(size_t k, const std::vector<int64_t> &data); -PMT_API pmt_t init_f32vector(size_t k, const float *data); -PMT_API pmt_t init_f32vector(size_t k, const std::vector<float> &data); -PMT_API pmt_t init_f64vector(size_t k, const double *data); -PMT_API pmt_t init_f64vector(size_t k, const std::vector<double> &data); -PMT_API pmt_t init_c32vector(size_t k, const std::complex<float> *data); -PMT_API pmt_t init_c32vector(size_t k, const std::vector<std::complex<float> > &data); -PMT_API pmt_t init_c64vector(size_t k, const std::complex<double> *data); -PMT_API pmt_t init_c64vector(size_t k, const std::vector<std::complex<double> > &data); - -PMT_API uint8_t u8vector_ref(pmt_t v, size_t k); -PMT_API int8_t s8vector_ref(pmt_t v, size_t k); +PMT_API pmt_t init_u8vector(size_t k, const uint8_t* data); +PMT_API pmt_t init_u8vector(size_t k, const std::vector<uint8_t>& data); +PMT_API pmt_t init_s8vector(size_t k, const int8_t* data); +PMT_API pmt_t init_s8vector(size_t k, const std::vector<int8_t>& data); +PMT_API pmt_t init_u16vector(size_t k, const uint16_t* data); +PMT_API pmt_t init_u16vector(size_t k, const std::vector<uint16_t>& data); +PMT_API pmt_t init_s16vector(size_t k, const int16_t* data); +PMT_API pmt_t init_s16vector(size_t k, const std::vector<int16_t>& data); +PMT_API pmt_t init_u32vector(size_t k, const uint32_t* data); +PMT_API pmt_t init_u32vector(size_t k, const std::vector<uint32_t>& data); +PMT_API pmt_t init_s32vector(size_t k, const int32_t* data); +PMT_API pmt_t init_s32vector(size_t k, const std::vector<int32_t>& data); +PMT_API pmt_t init_u64vector(size_t k, const uint64_t* data); +PMT_API pmt_t init_u64vector(size_t k, const std::vector<uint64_t>& data); +PMT_API pmt_t init_s64vector(size_t k, const int64_t* data); +PMT_API pmt_t init_s64vector(size_t k, const std::vector<int64_t>& data); +PMT_API pmt_t init_f32vector(size_t k, const float* data); +PMT_API pmt_t init_f32vector(size_t k, const std::vector<float>& data); +PMT_API pmt_t init_f64vector(size_t k, const double* data); +PMT_API pmt_t init_f64vector(size_t k, const std::vector<double>& data); +PMT_API pmt_t init_c32vector(size_t k, const std::complex<float>* data); +PMT_API pmt_t init_c32vector(size_t k, const std::vector<std::complex<float>>& data); +PMT_API pmt_t init_c64vector(size_t k, const std::complex<double>* data); +PMT_API pmt_t init_c64vector(size_t k, const std::vector<std::complex<double>>& data); + +PMT_API uint8_t u8vector_ref(pmt_t v, size_t k); +PMT_API int8_t s8vector_ref(pmt_t v, size_t k); PMT_API uint16_t u16vector_ref(pmt_t v, size_t k); -PMT_API int16_t s16vector_ref(pmt_t v, size_t k); +PMT_API int16_t s16vector_ref(pmt_t v, size_t k); PMT_API uint32_t u32vector_ref(pmt_t v, size_t k); -PMT_API int32_t s32vector_ref(pmt_t v, size_t k); +PMT_API int32_t s32vector_ref(pmt_t v, size_t k); PMT_API uint64_t u64vector_ref(pmt_t v, size_t k); -PMT_API int64_t s64vector_ref(pmt_t v, size_t k); -PMT_API float f32vector_ref(pmt_t v, size_t k); -PMT_API double f64vector_ref(pmt_t v, size_t k); -PMT_API std::complex<float> c32vector_ref(pmt_t v, size_t k); +PMT_API int64_t s64vector_ref(pmt_t v, size_t k); +PMT_API float f32vector_ref(pmt_t v, size_t k); +PMT_API double f64vector_ref(pmt_t v, size_t k); +PMT_API std::complex<float> c32vector_ref(pmt_t v, size_t k); PMT_API std::complex<double> c64vector_ref(pmt_t v, size_t k); -PMT_API void u8vector_set(pmt_t v, size_t k, uint8_t x); //< v[k] = x +PMT_API void u8vector_set(pmt_t v, size_t k, uint8_t x); //< v[k] = x PMT_API void s8vector_set(pmt_t v, size_t k, int8_t x); PMT_API void u16vector_set(pmt_t v, size_t k, uint16_t x); PMT_API void s16vector_set(pmt_t v, size_t k, int16_t x); @@ -536,65 +574,75 @@ PMT_API void c64vector_set(pmt_t v, size_t k, std::complex<double> x); // Return const pointers to the elements -PMT_API const void *uniform_vector_elements(pmt_t v, size_t &len); //< works with any; len is in bytes - -PMT_API const uint8_t *u8vector_elements(pmt_t v, size_t &len); //< len is in elements -PMT_API const int8_t *s8vector_elements(pmt_t v, size_t &len); //< len is in elements -PMT_API const uint16_t *u16vector_elements(pmt_t v, size_t &len); //< len is in elements -PMT_API const int16_t *s16vector_elements(pmt_t v, size_t &len); //< len is in elements -PMT_API const uint32_t *u32vector_elements(pmt_t v, size_t &len); //< len is in elements -PMT_API const int32_t *s32vector_elements(pmt_t v, size_t &len); //< len is in elements -PMT_API const uint64_t *u64vector_elements(pmt_t v, size_t &len); //< len is in elements -PMT_API const int64_t *s64vector_elements(pmt_t v, size_t &len); //< len is in elements -PMT_API const float *f32vector_elements(pmt_t v, size_t &len); //< len is in elements -PMT_API const double *f64vector_elements(pmt_t v, size_t &len); //< len is in elements -PMT_API const std::complex<float> *c32vector_elements(pmt_t v, size_t &len); //< len is in elements -PMT_API const std::complex<double> *c64vector_elements(pmt_t v, size_t &len); //< len is in elements +PMT_API const void* +uniform_vector_elements(pmt_t v, size_t& len); //< works with any; len is in bytes + +PMT_API const uint8_t* u8vector_elements(pmt_t v, size_t& len); //< len is in elements +PMT_API const int8_t* s8vector_elements(pmt_t v, size_t& len); //< len is in elements +PMT_API const uint16_t* u16vector_elements(pmt_t v, size_t& len); //< len is in elements +PMT_API const int16_t* s16vector_elements(pmt_t v, size_t& len); //< len is in elements +PMT_API const uint32_t* u32vector_elements(pmt_t v, size_t& len); //< len is in elements +PMT_API const int32_t* s32vector_elements(pmt_t v, size_t& len); //< len is in elements +PMT_API const uint64_t* u64vector_elements(pmt_t v, size_t& len); //< len is in elements +PMT_API const int64_t* s64vector_elements(pmt_t v, size_t& len); //< len is in elements +PMT_API const float* f32vector_elements(pmt_t v, size_t& len); //< len is in elements +PMT_API const double* f64vector_elements(pmt_t v, size_t& len); //< len is in elements +PMT_API const std::complex<float>* c32vector_elements(pmt_t v, + size_t& len); //< len is in elements +PMT_API const std::complex<double>* +c64vector_elements(pmt_t v, size_t& len); //< len is in elements // len is in elements -PMT_API const std::vector<uint8_t> u8vector_elements(pmt_t v); -PMT_API const std::vector<int8_t> s8vector_elements(pmt_t v); +PMT_API const std::vector<uint8_t> u8vector_elements(pmt_t v); +PMT_API const std::vector<int8_t> s8vector_elements(pmt_t v); PMT_API const std::vector<uint16_t> u16vector_elements(pmt_t v); -PMT_API const std::vector<int16_t> s16vector_elements(pmt_t v); +PMT_API const std::vector<int16_t> s16vector_elements(pmt_t v); PMT_API const std::vector<uint32_t> u32vector_elements(pmt_t v); -PMT_API const std::vector<int32_t> s32vector_elements(pmt_t v); +PMT_API const std::vector<int32_t> s32vector_elements(pmt_t v); PMT_API const std::vector<uint64_t> u64vector_elements(pmt_t v); -PMT_API const std::vector<int64_t> s64vector_elements(pmt_t v); -PMT_API const std::vector<float> f32vector_elements(pmt_t v); -PMT_API const std::vector<double> f64vector_elements(pmt_t v); -PMT_API const std::vector<std::complex<float> > c32vector_elements(pmt_t v); -PMT_API const std::vector<std::complex<double> > c64vector_elements(pmt_t v); +PMT_API const std::vector<int64_t> s64vector_elements(pmt_t v); +PMT_API const std::vector<float> f32vector_elements(pmt_t v); +PMT_API const std::vector<double> f64vector_elements(pmt_t v); +PMT_API const std::vector<std::complex<float>> c32vector_elements(pmt_t v); +PMT_API const std::vector<std::complex<double>> c64vector_elements(pmt_t v); // len is in elements -PMT_API const std::vector<uint8_t> pmt_u8vector_elements(pmt_t v); -PMT_API const std::vector<int8_t> pmt_s8vector_elements(pmt_t v); +PMT_API const std::vector<uint8_t> pmt_u8vector_elements(pmt_t v); +PMT_API const std::vector<int8_t> pmt_s8vector_elements(pmt_t v); PMT_API const std::vector<uint16_t> pmt_u16vector_elements(pmt_t v); -PMT_API const std::vector<int16_t> pmt_s16vector_elements(pmt_t v); +PMT_API const std::vector<int16_t> pmt_s16vector_elements(pmt_t v); PMT_API const std::vector<uint32_t> pmt_u32vector_elements(pmt_t v); -PMT_API const std::vector<int32_t> pmt_s32vector_elements(pmt_t v); +PMT_API const std::vector<int32_t> pmt_s32vector_elements(pmt_t v); PMT_API const std::vector<uint64_t> pmt_u64vector_elements(pmt_t v); -PMT_API const std::vector<int64_t> pmt_s64vector_elements(pmt_t v); -PMT_API const std::vector<float> pmt_f32vector_elements(pmt_t v); -PMT_API const std::vector<double> pmt_f64vector_elements(pmt_t v); -PMT_API const std::vector<std::complex<float> > pmt_c32vector_elements(pmt_t v); -PMT_API const std::vector<std::complex<double> > pmt_c64vector_elements(pmt_t v); +PMT_API const std::vector<int64_t> pmt_s64vector_elements(pmt_t v); +PMT_API const std::vector<float> pmt_f32vector_elements(pmt_t v); +PMT_API const std::vector<double> pmt_f64vector_elements(pmt_t v); +PMT_API const std::vector<std::complex<float>> pmt_c32vector_elements(pmt_t v); +PMT_API const std::vector<std::complex<double>> pmt_c64vector_elements(pmt_t v); // Return non-const pointers to the elements -PMT_API void *uniform_vector_writable_elements(pmt_t v, size_t &len); //< works with any; len is in bytes - -PMT_API uint8_t *u8vector_writable_elements(pmt_t v, size_t &len); //< len is in elements -PMT_API int8_t *s8vector_writable_elements(pmt_t v, size_t &len); //< len is in elements -PMT_API uint16_t *u16vector_writable_elements(pmt_t v, size_t &len); //< len is in elements -PMT_API int16_t *s16vector_writable_elements(pmt_t v, size_t &len); //< len is in elements -PMT_API uint32_t *u32vector_writable_elements(pmt_t v, size_t &len); //< len is in elements -PMT_API int32_t *s32vector_writable_elements(pmt_t v, size_t &len); //< len is in elements -PMT_API uint64_t *u64vector_writable_elements(pmt_t v, size_t &len); //< len is in elements -PMT_API int64_t *s64vector_writable_elements(pmt_t v, size_t &len); //< len is in elements -PMT_API float *f32vector_writable_elements(pmt_t v, size_t &len); //< len is in elements -PMT_API double *f64vector_writable_elements(pmt_t v, size_t &len); //< len is in elements -PMT_API std::complex<float> *c32vector_writable_elements(pmt_t v, size_t &len); //< len is in elements -PMT_API std::complex<double> *c64vector_writable_elements(pmt_t v, size_t &len); //< len is in elements +PMT_API void* +uniform_vector_writable_elements(pmt_t v, + size_t& len); //< works with any; len is in bytes + +PMT_API uint8_t* u8vector_writable_elements(pmt_t v, size_t& len); //< len is in elements +PMT_API int8_t* s8vector_writable_elements(pmt_t v, size_t& len); //< len is in elements +PMT_API uint16_t* u16vector_writable_elements(pmt_t v, + size_t& len); //< len is in elements +PMT_API int16_t* s16vector_writable_elements(pmt_t v, size_t& len); //< len is in elements +PMT_API uint32_t* u32vector_writable_elements(pmt_t v, + size_t& len); //< len is in elements +PMT_API int32_t* s32vector_writable_elements(pmt_t v, size_t& len); //< len is in elements +PMT_API uint64_t* u64vector_writable_elements(pmt_t v, + size_t& len); //< len is in elements +PMT_API int64_t* s64vector_writable_elements(pmt_t v, size_t& len); //< len is in elements +PMT_API float* f32vector_writable_elements(pmt_t v, size_t& len); //< len is in elements +PMT_API double* f64vector_writable_elements(pmt_t v, size_t& len); //< len is in elements +PMT_API std::complex<float>* +c32vector_writable_elements(pmt_t v, size_t& len); //< len is in elements +PMT_API std::complex<double>* +c64vector_writable_elements(pmt_t v, size_t& len); //< len is in elements /* * ------------------------------------------------------------------------ @@ -607,22 +655,22 @@ PMT_API std::complex<double> *c64vector_writable_elements(pmt_t v, size_t &len); */ //! Return true if \p obj is a dictionary (warning: also returns true for a pair) -PMT_API bool is_dict(const pmt_t &obj); +PMT_API bool is_dict(const pmt_t& obj); //! Make an empty dictionary PMT_API pmt_t make_dict(); //! Return a new dictionary with \p key associated with \p value. -PMT_API pmt_t dict_add(const pmt_t &dict, const pmt_t &key, const pmt_t &value); +PMT_API pmt_t dict_add(const pmt_t& dict, const pmt_t& key, const pmt_t& value); //! Return a new dictionary with \p key removed. -PMT_API pmt_t dict_delete(const pmt_t &dict, const pmt_t &key); +PMT_API pmt_t dict_delete(const pmt_t& dict, const pmt_t& key); //! Return true if \p key exists in \p dict -PMT_API bool dict_has_key(const pmt_t &dict, const pmt_t &key); +PMT_API bool dict_has_key(const pmt_t& dict, const pmt_t& key); //! If \p key exists in \p dict, return associated value; otherwise return \p not_found. -PMT_API pmt_t dict_ref(const pmt_t &dict, const pmt_t &key, const pmt_t ¬_found); +PMT_API pmt_t dict_ref(const pmt_t& dict, const pmt_t& key, const pmt_t& not_found); //! Return list of (key . value) pairs PMT_API pmt_t dict_items(pmt_t dict); @@ -631,7 +679,7 @@ PMT_API pmt_t dict_items(pmt_t dict); PMT_API pmt_t dict_keys(pmt_t dict); //! Return a new dictionary \p dict1 with k=>v pairs from \p dict2 added. -PMT_API pmt_t dict_update(const pmt_t &dict1, const pmt_t &dict2); +PMT_API pmt_t dict_update(const pmt_t& dict1, const pmt_t& dict2); //! Return list of values PMT_API pmt_t dict_values(pmt_t dict); @@ -649,13 +697,13 @@ PMT_API pmt_t dict_values(pmt_t dict); PMT_API bool is_any(pmt_t obj); //! make an any -PMT_API pmt_t make_any(const boost::any &any); +PMT_API pmt_t make_any(const boost::any& any); //! Return underlying boost::any PMT_API boost::any any_ref(pmt_t obj); //! Store \p any in \p obj -PMT_API void any_set(pmt_t obj, const boost::any &any); +PMT_API void any_set(pmt_t obj, const boost::any& any); /* @@ -664,13 +712,13 @@ PMT_API void any_set(pmt_t obj, const boost::any &any); * ------------------------------------------------------------------------ */ //! Return true if \p obj is a msg_accepter -PMT_API bool is_msg_accepter(const pmt_t &obj); +PMT_API bool is_msg_accepter(const pmt_t& obj); //! make a msg_accepter PMT_API pmt_t make_msg_accepter(boost::shared_ptr<gr::messages::msg_accepter> ma); //! Return underlying msg_accepter -PMT_API boost::shared_ptr<gr::messages::msg_accepter> msg_accepter_ref(const pmt_t &obj); +PMT_API boost::shared_ptr<gr::messages::msg_accepter> msg_accepter_ref(const pmt_t& obj); /* * ------------------------------------------------------------------------ @@ -682,7 +730,8 @@ PMT_API boost::shared_ptr<gr::messages::msg_accepter> msg_accepter_ref(const pmt PMT_API bool eq(const pmt_t& x, const pmt_t& y); /*! - * \brief Return true if x and y should normally be regarded as the same object, else false. + * \brief Return true if x and y should normally be regarded as the same object, else + * false. * * <pre> * eqv returns true if: @@ -764,11 +813,7 @@ PMT_API pmt_t reverse_x(pmt_t list); /*! * \brief (acons x y a) == (cons (cons x y) a) */ -inline static pmt_t -acons(pmt_t x, pmt_t y, pmt_t a) -{ - return cons(cons(x, y), a); -} +inline static pmt_t acons(pmt_t x, pmt_t y, pmt_t a) { return cons(cons(x, y), a); } /*! * \brief locates \p nth element of \n list where the car is the 'zeroth' element. @@ -803,8 +848,8 @@ PMT_API pmt_t memv(pmt_t obj, pmt_t list); PMT_API pmt_t member(pmt_t obj, pmt_t list); /*! - * \brief Return true if every element of \p list1 appears in \p list2, and false otherwise. - * Comparisons are done with pmt::eqv. + * \brief Return true if every element of \p list1 appears in \p list2, and false + * otherwise. Comparisons are done with pmt::eqv. */ PMT_API bool subsetp(pmt_t list1, pmt_t list2); @@ -831,13 +876,19 @@ PMT_API pmt_t list4(const pmt_t& x1, const pmt_t& x2, const pmt_t& x3, const pmt /*! * \brief Return a list of length 5 containing \p x1, \p x2, \p x3, \p x4, \p x5 */ -PMT_API pmt_t list5(const pmt_t& x1, const pmt_t& x2, const pmt_t& x3, const pmt_t& x4, const pmt_t& x5); +PMT_API pmt_t list5( + const pmt_t& x1, const pmt_t& x2, const pmt_t& x3, const pmt_t& x4, const pmt_t& x5); /*! * \brief Return a list of length 6 containing \p x1, \p x2, \p x3, \p x4, \p * x5, \p x6 */ -PMT_API pmt_t 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); +PMT_API pmt_t 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); /*! * \brief Return \p list with \p item added to it. @@ -879,12 +930,12 @@ PMT_API bool is_eof_object(pmt_t obj); * representation, but the external representation is incomplete and * therefore not parsable, an error is signaled. */ -PMT_API pmt_t read(std::istream &port); +PMT_API pmt_t read(std::istream& port); /*! * Write a written representation of \p obj to the given \p port. */ -PMT_API void write(pmt_t obj, std::ostream &port); +PMT_API void write(pmt_t obj, std::ostream& port); /*! * Return a string representation of \p obj. @@ -893,7 +944,7 @@ PMT_API void write(pmt_t obj, std::ostream &port); PMT_API std::string write_string(pmt_t obj); -PMT_API std::ostream& operator<<(std::ostream &os, pmt_t obj); +PMT_API std::ostream& operator<<(std::ostream& os, pmt_t obj); /*! * \brief Write pmt string representation to stdout. @@ -909,15 +960,15 @@ PMT_API void print(pmt_t v); /*! * \brief Write portable byte-serial representation of \p obj to \p sink */ -PMT_API bool serialize(pmt_t obj, std::streambuf &sink); +PMT_API bool serialize(pmt_t obj, std::streambuf& sink); /*! * \brief Create obj from portable byte-serial representation */ -PMT_API pmt_t deserialize(std::streambuf &source); +PMT_API pmt_t deserialize(std::streambuf& source); -PMT_API void dump_sizeof(); // debugging +PMT_API void dump_sizeof(); // debugging /*! * \brief Provide a simple string generating interface to pmt's serialize function @@ -932,17 +983,23 @@ PMT_API pmt_t deserialize_str(std::string str); /*! * \brief Provide a comparator function object to allow pmt use in stl types */ -class comparator { - public: - bool operator()(pmt::pmt_t const& p1, pmt::pmt_t const& p2) const - { return pmt::eqv(p1,p2)?false:p1.get()>p2.get(); } +class comparator +{ +public: + bool operator()(pmt::pmt_t const& p1, pmt::pmt_t const& p2) const + { + return pmt::eqv(p1, p2) ? false : p1.get() > p2.get(); + } }; // FIXME: Remove in 3.8. -class comperator { - public: - bool operator()(pmt::pmt_t const& p1, pmt::pmt_t const& p2) const - { return pmt::eqv(p1,p2)?false:p1.get()>p2.get(); } +class comperator +{ +public: + bool operator()(pmt::pmt_t const& p1, pmt::pmt_t const& p2) const + { + return pmt::eqv(p1, p2) ? false : p1.get() > p2.get(); + } }; } /* namespace pmt */ diff --git a/gnuradio-runtime/include/pmt/pmt_pool.h b/gnuradio-runtime/include/pmt/pmt_pool.h index a8cb8e6314..b31b051682 100644 --- a/gnuradio-runtime/include/pmt/pmt_pool.h +++ b/gnuradio-runtime/include/pmt/pmt_pool.h @@ -34,38 +34,41 @@ namespace pmt { * FIXME may want to go to global allocation with per-thread free list. * This would eliminate virtually all lock contention. */ -class PMT_API pmt_pool { +class PMT_API pmt_pool +{ - struct PMT_API item { - struct item *d_next; - }; + struct PMT_API item { + struct item* d_next; + }; - typedef boost::unique_lock<boost::mutex> scoped_lock; - mutable boost::mutex d_mutex; - boost::condition_variable d_cond; + typedef boost::unique_lock<boost::mutex> scoped_lock; + mutable boost::mutex d_mutex; + boost::condition_variable d_cond; - size_t d_itemsize; - size_t d_alignment; - size_t d_allocation_size; - size_t d_max_items; - size_t d_n_items; - item *d_freelist; - std::vector<char *> d_allocations; + size_t d_itemsize; + size_t d_alignment; + size_t d_allocation_size; + size_t d_max_items; + size_t d_n_items; + item* d_freelist; + std::vector<char*> d_allocations; public: - /*! - * \param itemsize size in bytes of the items to be allocated. - * \param alignment alignment in bytes of all objects to be allocated (must be power-of-2). - * \param allocation_size number of bytes to allocate at a time from the underlying allocator. - * \param max_items is the maximum number of items to allocate. If this number is exceeded, - * the allocate blocks. 0 implies no limit. - */ - pmt_pool(size_t itemsize, size_t alignment = 16, - size_t allocation_size = 4096, size_t max_items = 0); - ~pmt_pool(); + /*! + * \param itemsize size in bytes of the items to be allocated. + * \param alignment alignment in bytes of all objects to be allocated (must be + *power-of-2). \param allocation_size number of bytes to allocate at a time from the + *underlying allocator. \param max_items is the maximum number of items to allocate. + *If this number is exceeded, the allocate blocks. 0 implies no limit. + */ + pmt_pool(size_t itemsize, + size_t alignment = 16, + size_t allocation_size = 4096, + size_t max_items = 0); + ~pmt_pool(); - void *malloc(); - void free(void *p); + void* malloc(); + void free(void* p); }; } /* namespace pmt */ diff --git a/gnuradio-runtime/include/pmt/pmt_sugar.h b/gnuradio-runtime/include/pmt/pmt_sugar.h index 424f85cb01..2d62089617 100644 --- a/gnuradio-runtime/include/pmt/pmt_sugar.h +++ b/gnuradio-runtime/include/pmt/pmt_sugar.h @@ -31,147 +31,140 @@ namespace pmt { - //! Make pmt symbol - static inline pmt_t - mp(const std::string &s) - { - return string_to_symbol(s); - } - - //! Make pmt symbol - static inline pmt_t - mp(const char *s) - { - return string_to_symbol(s); - } - - //! Make pmt long - static inline pmt_t - mp(long x){ - return from_long(x); - } - - //! Make pmt uint64 - static inline pmt_t - mp(long unsigned x){ - return from_uint64(x); - } - - //! Make pmt uint64 - static inline pmt_t - mp(long long unsigned x){ - return from_uint64(x); - } - - //! Make pmt long - static inline pmt_t - mp(int x){ - return from_long(x); - } - - //! Make pmt double - static inline pmt_t - mp(double x){ - return from_double(x); - } - - //! Make pmt complex - static inline pmt_t - mp(std::complex<double> z) - { +//! Make pmt symbol +static inline pmt_t mp(const std::string& s) { return string_to_symbol(s); } + +//! Make pmt symbol +static inline pmt_t mp(const char* s) { return string_to_symbol(s); } + +//! Make pmt long +static inline pmt_t mp(long x) { return from_long(x); } + +//! Make pmt uint64 +static inline pmt_t mp(long unsigned x) { return from_uint64(x); } + +//! Make pmt uint64 +static inline pmt_t mp(long long unsigned x) { return from_uint64(x); } + +//! Make pmt long +static inline pmt_t mp(int x) { return from_long(x); } + +//! Make pmt double +static inline pmt_t mp(double x) { return from_double(x); } + +//! Make pmt complex +static inline pmt_t mp(std::complex<double> z) +{ return make_rectangular(z.real(), z.imag()); - } +} - //! Make pmt complex - static inline pmt_t - mp(std::complex<float> z) - { +//! Make pmt complex +static inline pmt_t mp(std::complex<float> z) +{ return make_rectangular(z.real(), z.imag()); - } +} - //! Make pmt msg_accepter - static inline pmt_t - mp(boost::shared_ptr<gr::messages::msg_accepter> ma) - { +//! Make pmt msg_accepter +static inline pmt_t mp(boost::shared_ptr<gr::messages::msg_accepter> ma) +{ return make_msg_accepter(ma); - } +} - //! Make pmt Binary Large Object (BLOB) - static inline pmt_t - mp(const void *data, size_t len_in_bytes) - { +//! Make pmt Binary Large Object (BLOB) +static inline pmt_t mp(const void* data, size_t len_in_bytes) +{ return make_blob(data, len_in_bytes); - } - - //! Make tuple - static inline pmt_t - mp(const pmt_t &e0) - { - return make_tuple(e0); - } - - //! Make tuple - static inline pmt_t - mp(const pmt_t &e0, const pmt_t &e1) - { - return make_tuple(e0, e1); - } - - //! Make tuple - static inline pmt_t - mp(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2) - { +} + +//! Make tuple +static inline pmt_t mp(const pmt_t& e0) { return make_tuple(e0); } + +//! Make tuple +static inline pmt_t mp(const pmt_t& e0, const pmt_t& e1) { return make_tuple(e0, e1); } + +//! Make tuple +static inline pmt_t mp(const pmt_t& e0, const pmt_t& e1, const pmt_t& e2) +{ return make_tuple(e0, e1, e2); - } +} - //! Make tuple - static inline pmt_t - mp(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3) - { +//! Make tuple +static inline pmt_t mp(const pmt_t& e0, const pmt_t& e1, const pmt_t& e2, const pmt_t& e3) +{ return make_tuple(e0, e1, e2, e3); - } +} - //! Make tuple - static inline pmt_t - mp(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3, const pmt_t &e4) - { +//! Make tuple +static inline pmt_t +mp(const pmt_t& e0, const pmt_t& e1, const pmt_t& e2, const pmt_t& e3, const pmt_t& e4) +{ return make_tuple(e0, e1, e2, e3, e4); - } - - //! Make tuple - static inline pmt_t - mp(const pmt_t &e0, const pmt_t &e1, const pmt_t &e2, const pmt_t &e3, const pmt_t &e4, const pmt_t &e5) - { +} + +//! Make tuple +static inline pmt_t mp(const pmt_t& e0, + const pmt_t& e1, + const pmt_t& e2, + const pmt_t& e3, + const pmt_t& e4, + const pmt_t& e5) +{ return make_tuple(e0, e1, e2, e3, e4, e5); - } - - //! Make tuple - static inline pmt_t - mp(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) - { +} + +//! Make tuple +static inline pmt_t mp(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) +{ return make_tuple(e0, e1, e2, e3, e4, e5, e6); - } - - //! Make tuple - static inline pmt_t - mp(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) - { +} + +//! Make tuple +static inline pmt_t mp(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) +{ return make_tuple(e0, e1, e2, e3, e4, e5, e6, e7); - } - - //! Make tuple - static inline pmt_t - mp(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) - { +} + +//! Make tuple +static inline pmt_t mp(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) +{ return make_tuple(e0, e1, e2, e3, e4, e5, e6, e7, e8); - } - - //! Make tuple - static inline pmt_t - mp(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) - { +} + +//! Make tuple +static inline pmt_t mp(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) +{ return make_tuple(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9); - } +} } /* namespace pmt */ diff --git a/gnuradio-runtime/lib/basic_block.cc b/gnuradio-runtime/lib/basic_block.cc index 89aa9b8671..60aaa86c46 100644 --- a/gnuradio-runtime/lib/basic_block.cc +++ b/gnuradio-runtime/lib/basic_block.cc @@ -33,18 +33,14 @@ namespace gr { - static long s_next_id = 0; - static long s_ncurrently_allocated = 0; - - long - basic_block_ncurrently_allocated() - { - return s_ncurrently_allocated; - } - - basic_block::basic_block(const std::string &name, - io_signature::sptr input_signature, - io_signature::sptr output_signature) +static long s_next_id = 0; +static long s_ncurrently_allocated = 0; + +long basic_block_ncurrently_allocated() { return s_ncurrently_allocated; } + +basic_block::basic_block(const std::string& name, + io_signature::sptr input_signature, + io_signature::sptr output_signature) : d_name(name), d_input_signature(input_signature), d_output_signature(output_signature), @@ -54,155 +50,147 @@ namespace gr { d_color(WHITE), d_rpc_set(false), d_message_subscribers(pmt::make_dict()) - { +{ s_ncurrently_allocated++; - } +} - basic_block::~basic_block() - { +basic_block::~basic_block() +{ s_ncurrently_allocated--; global_block_registry.block_unregister(this); - } +} - basic_block_sptr - basic_block::to_basic_block() - { - return shared_from_this(); - } +basic_block_sptr basic_block::to_basic_block() { return shared_from_this(); } - void - basic_block::set_block_alias(std::string name) - { +void basic_block::set_block_alias(std::string name) +{ // Only keep one alias'd name around for each block. If we don't // have an alias, add it; if we do, update the entry in the // registry. - if(alias_set()) - global_block_registry.update_symbolic_name(this, name); + if (alias_set()) + global_block_registry.update_symbolic_name(this, name); else - global_block_registry.register_symbolic_name(this, name); + global_block_registry.register_symbolic_name(this, name); // set the block's alias d_symbol_alias = name; update_logger_alias(symbol_name(), d_symbol_alias); - } +} - // ** Message passing interface ** +// ** Message passing interface ** - // - register a new input message port - void - basic_block::message_port_register_in(pmt::pmt_t port_id) - { - if(!pmt::is_symbol(port_id)) { - throw std::runtime_error("message_port_register_in: bad port id"); +// - register a new input message port +void basic_block::message_port_register_in(pmt::pmt_t port_id) +{ + if (!pmt::is_symbol(port_id)) { + throw std::runtime_error("message_port_register_in: bad port id"); } msg_queue[port_id] = msg_queue_t(); - msg_queue_ready[port_id] = boost::shared_ptr<boost::condition_variable>(new boost::condition_variable()); - } + msg_queue_ready[port_id] = + boost::shared_ptr<boost::condition_variable>(new boost::condition_variable()); +} - pmt::pmt_t - basic_block::message_ports_in() - { +pmt::pmt_t basic_block::message_ports_in() +{ pmt::pmt_t port_names = pmt::make_vector(msg_queue.size(), pmt::PMT_NIL); msg_queue_map_itr itr = msg_queue.begin(); - for(size_t i = 0; i < msg_queue.size(); i++) { - pmt::vector_set(port_names, i, (*itr).first); - itr++; + for (size_t i = 0; i < msg_queue.size(); i++) { + pmt::vector_set(port_names, i, (*itr).first); + itr++; } return port_names; - } - - // - register a new output message port - void - basic_block::message_port_register_out(pmt::pmt_t port_id) - { - if(!pmt::is_symbol(port_id)) { - throw std::runtime_error("message_port_register_out: bad port id"); +} + +// - register a new output message port +void basic_block::message_port_register_out(pmt::pmt_t port_id) +{ + if (!pmt::is_symbol(port_id)) { + throw std::runtime_error("message_port_register_out: bad port id"); } - if(pmt::dict_has_key(d_message_subscribers, port_id)) { - throw std::runtime_error("message_port_register_out: port already in use"); + if (pmt::dict_has_key(d_message_subscribers, port_id)) { + throw std::runtime_error("message_port_register_out: port already in use"); } d_message_subscribers = pmt::dict_add(d_message_subscribers, port_id, pmt::PMT_NIL); - } +} - pmt::pmt_t - basic_block::message_ports_out() - { +pmt::pmt_t basic_block::message_ports_out() +{ size_t len = pmt::length(d_message_subscribers); pmt::pmt_t port_names = pmt::make_vector(len, pmt::PMT_NIL); pmt::pmt_t keys = pmt::dict_keys(d_message_subscribers); - for(size_t i = 0; i < len; i++) { - pmt::vector_set(port_names, i, pmt::nth(i, keys)); + for (size_t i = 0; i < len; i++) { + pmt::vector_set(port_names, i, pmt::nth(i, keys)); } return port_names; - } +} - // - publish a message on a message port - void basic_block::message_port_pub(pmt::pmt_t port_id, pmt::pmt_t msg) - { - if(!pmt::dict_has_key(d_message_subscribers, port_id)) { - throw std::runtime_error("port does not exist"); +// - publish a message on a message port +void basic_block::message_port_pub(pmt::pmt_t port_id, pmt::pmt_t msg) +{ + if (!pmt::dict_has_key(d_message_subscribers, port_id)) { + throw std::runtime_error("port does not exist"); } pmt::pmt_t currlist = pmt::dict_ref(d_message_subscribers, port_id, pmt::PMT_NIL); // iterate through subscribers on port - while(pmt::is_pair(currlist)) { - pmt::pmt_t target = pmt::car(currlist); + while (pmt::is_pair(currlist)) { + pmt::pmt_t target = pmt::car(currlist); - pmt::pmt_t block = pmt::car(target); - pmt::pmt_t port = pmt::cdr(target); + pmt::pmt_t block = pmt::car(target); + pmt::pmt_t port = pmt::cdr(target); - currlist = pmt::cdr(currlist); - basic_block_sptr blk = global_block_registry.block_lookup(block); - //blk->post(msg); - blk->post(port, msg); + currlist = pmt::cdr(currlist); + basic_block_sptr blk = global_block_registry.block_lookup(block); + // blk->post(msg); + blk->post(port, msg); } - } - - // - subscribe to a message port - void - basic_block::message_port_sub(pmt::pmt_t port_id, pmt::pmt_t target){ - if(!pmt::dict_has_key(d_message_subscribers, port_id)){ - std::stringstream ss; - ss << "Port does not exist: \"" << pmt::write_string(port_id) << "\" on block: " - << pmt::write_string(target) << std::endl; - throw std::runtime_error(ss.str()); +} + +// - subscribe to a message port +void basic_block::message_port_sub(pmt::pmt_t port_id, pmt::pmt_t target) +{ + if (!pmt::dict_has_key(d_message_subscribers, port_id)) { + std::stringstream ss; + ss << "Port does not exist: \"" << pmt::write_string(port_id) + << "\" on block: " << pmt::write_string(target) << std::endl; + throw std::runtime_error(ss.str()); } - pmt::pmt_t currlist = pmt::dict_ref(d_message_subscribers,port_id,pmt::PMT_NIL); + pmt::pmt_t currlist = pmt::dict_ref(d_message_subscribers, port_id, pmt::PMT_NIL); // ignore re-adds of the same target - if(!pmt::list_has(currlist, target)) - d_message_subscribers = pmt::dict_add(d_message_subscribers,port_id,pmt::list_add(currlist,target)); - } - - void - basic_block::message_port_unsub(pmt::pmt_t port_id, pmt::pmt_t target) - { - if(!pmt::dict_has_key(d_message_subscribers, port_id)) { - std::stringstream ss; - ss << "Port does not exist: \"" << pmt::write_string(port_id) << "\" on block: " - << pmt::write_string(target) << std::endl; - throw std::runtime_error(ss.str()); + if (!pmt::list_has(currlist, target)) + d_message_subscribers = pmt::dict_add( + d_message_subscribers, port_id, pmt::list_add(currlist, target)); +} + +void basic_block::message_port_unsub(pmt::pmt_t port_id, pmt::pmt_t target) +{ + if (!pmt::dict_has_key(d_message_subscribers, port_id)) { + std::stringstream ss; + ss << "Port does not exist: \"" << pmt::write_string(port_id) + << "\" on block: " << pmt::write_string(target) << std::endl; + throw std::runtime_error(ss.str()); } // ignore unsubs of unknown targets - pmt::pmt_t currlist = pmt::dict_ref(d_message_subscribers,port_id,pmt::PMT_NIL); - d_message_subscribers = pmt::dict_add(d_message_subscribers,port_id,pmt::list_rm(currlist,target)); - } + pmt::pmt_t currlist = pmt::dict_ref(d_message_subscribers, port_id, pmt::PMT_NIL); + d_message_subscribers = + pmt::dict_add(d_message_subscribers, port_id, pmt::list_rm(currlist, target)); +} - void - basic_block::_post(pmt::pmt_t which_port, pmt::pmt_t msg) - { +void basic_block::_post(pmt::pmt_t which_port, pmt::pmt_t msg) +{ insert_tail(which_port, msg); - } +} - void - basic_block::insert_tail(pmt::pmt_t which_port, pmt::pmt_t msg) - { +void basic_block::insert_tail(pmt::pmt_t which_port, pmt::pmt_t msg) +{ gr::thread::scoped_lock guard(mutex); - if((msg_queue.find(which_port) == msg_queue.end()) || (msg_queue_ready.find(which_port) == msg_queue_ready.end())) { - std::cout << "target port = " << pmt::symbol_to_string(which_port) << std::endl; - throw std::runtime_error("attempted to insert_tail on invalid queue!"); + if ((msg_queue.find(which_port) == msg_queue.end()) || + (msg_queue_ready.find(which_port) == msg_queue_ready.end())) { + std::cout << "target port = " << pmt::symbol_to_string(which_port) << std::endl; + throw std::runtime_error("attempted to insert_tail on invalid queue!"); } msg_queue[which_port].push_back(msg); @@ -210,28 +198,26 @@ namespace gr { // wake up thread if BLKD_IN or BLKD_OUT global_block_registry.notify_blk(alias()); - } +} - pmt::pmt_t - basic_block::delete_head_nowait(pmt::pmt_t which_port) - { +pmt::pmt_t basic_block::delete_head_nowait(pmt::pmt_t which_port) +{ gr::thread::scoped_lock guard(mutex); - if(empty_p(which_port)) { - return pmt::pmt_t(); + if (empty_p(which_port)) { + return pmt::pmt_t(); } pmt::pmt_t m(msg_queue[which_port].front()); msg_queue[which_port].pop_front(); return m; - } +} - pmt::pmt_t - basic_block::message_subscribers(pmt::pmt_t port) - { - return pmt::dict_ref(d_message_subscribers,port,pmt::PMT_NIL); - } +pmt::pmt_t basic_block::message_subscribers(pmt::pmt_t port) +{ + return pmt::dict_ref(d_message_subscribers, port, pmt::PMT_NIL); +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/block.cc b/gnuradio-runtime/lib/block.cc index 710e6c7d6c..65399bfc3e 100644 --- a/gnuradio-runtime/lib/block.cc +++ b/gnuradio-runtime/lib/block.cc @@ -34,15 +34,15 @@ namespace gr { - block::block(const std::string &name, - io_signature::sptr input_signature, - io_signature::sptr output_signature) +block::block(const std::string& name, + io_signature::sptr input_signature, + io_signature::sptr output_signature) : basic_block(name, input_signature, output_signature), - d_output_multiple (1), + d_output_multiple(1), d_output_multiple_set(false), d_unaligned(0), d_is_unaligned(false), - d_relative_rate (1.0), + d_relative_rate(1.0), d_mp_relative_rate(1.0), d_history(1), d_attr_delay(0), @@ -54,901 +54,856 @@ namespace gr { d_priority(-1), d_pc_rpc_set(false), d_update_rate(false), - d_max_output_buffer(std::max(output_signature->max_streams(),1), -1), - d_min_output_buffer(std::max(output_signature->max_streams(),1), -1), + d_max_output_buffer(std::max(output_signature->max_streams(), 1), -1), + d_min_output_buffer(std::max(output_signature->max_streams(), 1), -1), d_pmt_done(pmt::intern("done")), d_system_port(pmt::intern("system")) - { +{ global_block_registry.register_primitive(alias(), this); message_port_register_in(d_system_port); set_msg_handler(d_system_port, boost::bind(&block::system_handler, this, _1)); configure_default_loggers(d_logger, d_debug_logger, symbol_name()); - } - - block::~block() - { - global_block_registry.unregister_primitive(symbol_name()); - } - - unsigned - block::history() const - { - return d_history; - } - - void - block::set_history(unsigned history) - { - d_history = history; - } - - void - block::declare_sample_delay(unsigned delay) - { +} + +block::~block() { global_block_registry.unregister_primitive(symbol_name()); } + +unsigned block::history() const { return d_history; } + +void block::set_history(unsigned history) { d_history = history; } + +void block::declare_sample_delay(unsigned delay) +{ d_attr_delay = delay; - if(d_detail) { - unsigned int nins = static_cast<unsigned int>(d_detail->ninputs()); - for(unsigned int n = 0; n < nins; n++) { - d_detail->input(n)->declare_sample_delay(d_attr_delay); - } + if (d_detail) { + unsigned int nins = static_cast<unsigned int>(d_detail->ninputs()); + for (unsigned int n = 0; n < nins; n++) { + d_detail->input(n)->declare_sample_delay(d_attr_delay); + } } - } +} - void - block::declare_sample_delay(int which, unsigned delay) - { +void block::declare_sample_delay(int which, unsigned delay) +{ d_attr_delay = delay; - if(d_detail) { - d_detail->input(which)->declare_sample_delay(d_attr_delay); - } - } - - unsigned - block::sample_delay(int which) const - { - return d_attr_delay; - } - - // stub implementation: 1:1 - - void - block::forecast(int noutput_items, gr_vector_int &ninput_items_required) - { - unsigned ninputs = ninput_items_required.size (); - for(unsigned i = 0; i < ninputs; i++) - ninput_items_required[i] = noutput_items + history() - 1; - } - - // default implementation - - bool - block::start() - { - return true; - } - - bool - block::stop() - { - return true; - } - - void - block::set_output_multiple(int multiple) - { - if(multiple < 1) - throw std::invalid_argument("block::set_output_multiple"); + if (d_detail) { + d_detail->input(which)->declare_sample_delay(d_attr_delay); + } +} + +unsigned block::sample_delay(int which) const { return d_attr_delay; } + +// stub implementation: 1:1 + +void block::forecast(int noutput_items, gr_vector_int& ninput_items_required) +{ + unsigned ninputs = ninput_items_required.size(); + for (unsigned i = 0; i < ninputs; i++) + ninput_items_required[i] = noutput_items + history() - 1; +} + +// default implementation + +bool block::start() { return true; } + +bool block::stop() { return true; } + +void block::set_output_multiple(int multiple) +{ + if (multiple < 1) + throw std::invalid_argument("block::set_output_multiple"); d_output_multiple_set = true; d_output_multiple = multiple; - } +} - void - block::set_alignment(int multiple) - { - if(multiple < 1) - throw std::invalid_argument("block::set_alignment_multiple"); +void block::set_alignment(int multiple) +{ + if (multiple < 1) + throw std::invalid_argument("block::set_alignment_multiple"); d_output_multiple = multiple; - } +} - void - block::set_unaligned(int na) - { +void block::set_unaligned(int na) +{ // unaligned value must be less than 0 and it doesn't make sense // that it's larger than the alignment value. - if((na < 0) || (na > d_output_multiple)) - throw std::invalid_argument("block::set_unaligned"); + if ((na < 0) || (na > d_output_multiple)) + throw std::invalid_argument("block::set_unaligned"); d_unaligned = na; - } +} - void - block::set_is_unaligned(bool u) - { - d_is_unaligned = u; - } +void block::set_is_unaligned(bool u) { d_is_unaligned = u; } - void - block::set_relative_rate(double relative_rate) - { - if(relative_rate <= 0.0) - throw std::invalid_argument("block::set_relative_rate: relative rate must be > 0.0"); +void block::set_relative_rate(double relative_rate) +{ + if (relative_rate <= 0.0) + throw std::invalid_argument( + "block::set_relative_rate: relative rate must be > 0.0"); d_relative_rate = relative_rate; d_mp_relative_rate = mpq_class(relative_rate); - } +} - void - block::set_inverse_relative_rate(double inverse_relative_rate) - { - if(inverse_relative_rate <= 0.0) - throw std::invalid_argument("block::set_inverse_relative_rate: inverse relative rate must be > 0.0"); +void block::set_inverse_relative_rate(double inverse_relative_rate) +{ + if (inverse_relative_rate <= 0.0) + throw std::invalid_argument( + "block::set_inverse_relative_rate: inverse relative rate must be > 0.0"); mpq_class inv_rr_q(inverse_relative_rate); - set_relative_rate((uint64_t) inv_rr_q.get_den().get_ui(), - (uint64_t) inv_rr_q.get_num().get_ui()); - } + set_relative_rate((uint64_t)inv_rr_q.get_den().get_ui(), + (uint64_t)inv_rr_q.get_num().get_ui()); +} - void - block::set_relative_rate(uint64_t interpolation, uint64_t decimation) - { +void block::set_relative_rate(uint64_t interpolation, uint64_t decimation) +{ mpz_class interp, decim; if (interpolation < 1) - throw std::invalid_argument("block::set_relative_rate: interpolation rate cannot be 0"); + throw std::invalid_argument( + "block::set_relative_rate: interpolation rate cannot be 0"); if (decimation < 1) - throw std::invalid_argument("block::set_relative_rate: decimation rate cannot be 0"); + throw std::invalid_argument( + "block::set_relative_rate: decimation rate cannot be 0"); mpz_import(interp.get_mpz_t(), 1, 1, sizeof(interpolation), 0, 0, &interpolation); mpz_import(decim.get_mpz_t(), 1, 1, sizeof(decimation), 0, 0, &decimation); d_mp_relative_rate = mpq_class(interp, decim); d_mp_relative_rate.canonicalize(); d_relative_rate = d_mp_relative_rate.get_d(); - } +} - void - block::consume(int which_input, int how_many_items) - { +void block::consume(int which_input, int how_many_items) +{ d_detail->consume(which_input, how_many_items); - } +} - void - block::consume_each(int how_many_items) - { - d_detail->consume_each(how_many_items); - } +void block::consume_each(int how_many_items) { d_detail->consume_each(how_many_items); } - void - block::produce(int which_output, int how_many_items) - { +void block::produce(int which_output, int how_many_items) +{ d_detail->produce(which_output, how_many_items); - } +} - int - block::fixed_rate_ninput_to_noutput(int ninput) - { +int block::fixed_rate_ninput_to_noutput(int ninput) +{ throw std::runtime_error("Unimplemented"); - } +} - int - block::fixed_rate_noutput_to_ninput(int noutput) - { +int block::fixed_rate_noutput_to_ninput(int noutput) +{ throw std::runtime_error("Unimplemented"); - } +} - uint64_t - block::nitems_read(unsigned int which_input) - { - if(d_detail) { - return d_detail->nitems_read(which_input); - } - else { - //throw std::runtime_error("No block_detail associated with block yet"); - return 0; +uint64_t block::nitems_read(unsigned int which_input) +{ + if (d_detail) { + return d_detail->nitems_read(which_input); + } else { + // throw std::runtime_error("No block_detail associated with block yet"); + return 0; } - } +} - uint64_t - block::nitems_written(unsigned int which_output) - { - if(d_detail) { - return d_detail->nitems_written(which_output); - } - else { - //throw std::runtime_error("No block_detail associated with block yet"); - return 0; +uint64_t block::nitems_written(unsigned int which_output) +{ + if (d_detail) { + return d_detail->nitems_written(which_output); + } else { + // throw std::runtime_error("No block_detail associated with block yet"); + return 0; } - } +} - void - block::add_item_tag(unsigned int which_output, - const tag_t &tag) - { +void block::add_item_tag(unsigned int which_output, const tag_t& tag) +{ d_detail->add_item_tag(which_output, tag); - } +} - void - block::remove_item_tag(unsigned int which_input, - const tag_t &tag) - { +void block::remove_item_tag(unsigned int which_input, const tag_t& tag) +{ d_detail->remove_item_tag(which_input, tag, unique_id()); - } +} - void - block::get_tags_in_range(std::vector<tag_t> &v, - unsigned int which_input, - uint64_t start, uint64_t end) - { +void block::get_tags_in_range(std::vector<tag_t>& v, + unsigned int which_input, + uint64_t start, + uint64_t end) +{ d_detail->get_tags_in_range(v, which_input, start, end, unique_id()); - } - - void - block::get_tags_in_range(std::vector<tag_t> &v, - unsigned int which_input, - uint64_t start, uint64_t end, - const pmt::pmt_t &key) - { +} + +void block::get_tags_in_range(std::vector<tag_t>& v, + unsigned int which_input, + uint64_t start, + uint64_t end, + const pmt::pmt_t& key) +{ d_detail->get_tags_in_range(v, which_input, start, end, key, unique_id()); - } - - void - block::get_tags_in_window(std::vector<tag_t> &v, - unsigned int which_input, - uint64_t start, uint64_t end) - { - d_detail->get_tags_in_range(v, which_input, +} + +void block::get_tags_in_window(std::vector<tag_t>& v, + unsigned int which_input, + uint64_t start, + uint64_t end) +{ + d_detail->get_tags_in_range(v, + which_input, nitems_read(which_input) + start, nitems_read(which_input) + end, unique_id()); - } - - void - block::get_tags_in_window(std::vector<tag_t> &v, - unsigned int which_input, - uint64_t start, uint64_t end, - const pmt::pmt_t &key) - { - d_detail->get_tags_in_range(v, which_input, +} + +void block::get_tags_in_window(std::vector<tag_t>& v, + unsigned int which_input, + uint64_t start, + uint64_t end, + const pmt::pmt_t& key) +{ + d_detail->get_tags_in_range(v, + which_input, nitems_read(which_input) + start, nitems_read(which_input) + end, - key, unique_id()); - } + key, + unique_id()); +} - block::tag_propagation_policy_t - block::tag_propagation_policy() - { +block::tag_propagation_policy_t block::tag_propagation_policy() +{ return d_tag_propagation_policy; - } +} - void - block::set_tag_propagation_policy(tag_propagation_policy_t p) - { +void block::set_tag_propagation_policy(tag_propagation_policy_t p) +{ d_tag_propagation_policy = p; - } +} - int - block::max_noutput_items() - { - return d_max_noutput_items; - } +int block::max_noutput_items() { return d_max_noutput_items; } - void - block::set_max_noutput_items(int m) - { - if(m <= 0) - throw std::runtime_error("block::set_max_noutput_items: value for max_noutput_items must be greater than 0.\n"); +void block::set_max_noutput_items(int m) +{ + if (m <= 0) + throw std::runtime_error("block::set_max_noutput_items: value for " + "max_noutput_items must be greater than 0.\n"); d_max_noutput_items = m; d_max_noutput_items_set = true; - } - - void - block::unset_max_noutput_items() - { - d_max_noutput_items_set = false; - } - - bool - block::is_set_max_noutput_items() - { - return d_max_noutput_items_set; - } - - void - block::set_processor_affinity(const std::vector<int> &mask) - { +} + +void block::unset_max_noutput_items() { d_max_noutput_items_set = false; } + +bool block::is_set_max_noutput_items() { return d_max_noutput_items_set; } + +void block::set_processor_affinity(const std::vector<int>& mask) +{ d_affinity = mask; - if(d_detail) { - d_detail->set_processor_affinity(d_affinity); + if (d_detail) { + d_detail->set_processor_affinity(d_affinity); } - } +} - void - block::unset_processor_affinity() - { +void block::unset_processor_affinity() +{ d_affinity.clear(); - if(d_detail) { - d_detail->unset_processor_affinity(); + if (d_detail) { + d_detail->unset_processor_affinity(); } - } +} - int - block::active_thread_priority() - { - if(d_detail) { - return d_detail->thread_priority(); +int block::active_thread_priority() +{ + if (d_detail) { + return d_detail->thread_priority(); } return -1; - } +} - int - block::thread_priority() - { - return d_priority; - } +int block::thread_priority() { return d_priority; } - int - block::set_thread_priority(int priority) - { +int block::set_thread_priority(int priority) +{ d_priority = priority; - if(d_detail) { - return d_detail->set_thread_priority(priority); + if (d_detail) { + return d_detail->set_thread_priority(priority); } return d_priority; - } - - void - block::expand_minmax_buffer(int port) - { - if((size_t)port >= d_max_output_buffer.size()) - set_max_output_buffer(port, -1); - if((size_t)port >= d_min_output_buffer.size()) - set_min_output_buffer(port, -1); - } - - long - block::max_output_buffer(size_t i) - { - if(i >= d_max_output_buffer.size()) - throw std::invalid_argument("basic_block::max_output_buffer: port out of range."); +} + +void block::expand_minmax_buffer(int port) +{ + if ((size_t)port >= d_max_output_buffer.size()) + set_max_output_buffer(port, -1); + if ((size_t)port >= d_min_output_buffer.size()) + set_min_output_buffer(port, -1); +} + +long block::max_output_buffer(size_t i) +{ + if (i >= d_max_output_buffer.size()) + throw std::invalid_argument("basic_block::max_output_buffer: port out of range."); return d_max_output_buffer[i]; - } +} - void - block::set_max_output_buffer(long max_output_buffer) - { - for(int i = 0; i < output_signature()->max_streams(); i++) { - set_max_output_buffer(i, max_output_buffer); +void block::set_max_output_buffer(long max_output_buffer) +{ + for (int i = 0; i < output_signature()->max_streams(); i++) { + set_max_output_buffer(i, max_output_buffer); } - } +} - void - block::set_max_output_buffer(int port, long max_output_buffer) - { - if((size_t)port >= d_max_output_buffer.size()) - d_max_output_buffer.push_back(max_output_buffer); +void block::set_max_output_buffer(int port, long max_output_buffer) +{ + if ((size_t)port >= d_max_output_buffer.size()) + d_max_output_buffer.push_back(max_output_buffer); else - d_max_output_buffer[port] = max_output_buffer; - } - - long - block::min_output_buffer(size_t i) - { - if(i >= d_min_output_buffer.size()) - throw std::invalid_argument("basic_block::min_output_buffer: port out of range."); + d_max_output_buffer[port] = max_output_buffer; +} + +long block::min_output_buffer(size_t i) +{ + if (i >= d_min_output_buffer.size()) + throw std::invalid_argument("basic_block::min_output_buffer: port out of range."); return d_min_output_buffer[i]; - } - - void - block::set_min_output_buffer(long min_output_buffer) - { - std::cout << "set_min_output_buffer on block " << unique_id() << " to " << min_output_buffer << std::endl; - for(int i=0; i<output_signature()->max_streams(); i++) { - set_min_output_buffer(i, min_output_buffer); - } - } - - void - block::set_min_output_buffer(int port, long min_output_buffer) - { - if((size_t)port >= d_min_output_buffer.size()) - d_min_output_buffer.push_back(min_output_buffer); +} + +void block::set_min_output_buffer(long min_output_buffer) +{ + std::cout << "set_min_output_buffer on block " << unique_id() << " to " + << min_output_buffer << std::endl; + for (int i = 0; i < output_signature()->max_streams(); i++) { + set_min_output_buffer(i, min_output_buffer); + } +} + +void block::set_min_output_buffer(int port, long min_output_buffer) +{ + if ((size_t)port >= d_min_output_buffer.size()) + d_min_output_buffer.push_back(min_output_buffer); else - d_min_output_buffer[port] = min_output_buffer; - } + d_min_output_buffer[port] = min_output_buffer; +} - bool - block::update_rate() const - { - return d_update_rate; - } +bool block::update_rate() const { return d_update_rate; } - void - block::enable_update_rate(bool en) - { - d_update_rate = en; - } +void block::enable_update_rate(bool en) { d_update_rate = en; } - float - block::pc_noutput_items() - { - if(d_detail) { - return d_detail->pc_noutput_items(); - } - else { - return 0; +float block::pc_noutput_items() +{ + if (d_detail) { + return d_detail->pc_noutput_items(); + } else { + return 0; } - } +} - float - block::pc_noutput_items_avg() - { - if(d_detail) { - return d_detail->pc_noutput_items_avg(); - } - else { - return 0; +float block::pc_noutput_items_avg() +{ + if (d_detail) { + return d_detail->pc_noutput_items_avg(); + } else { + return 0; } - } +} - float - block::pc_noutput_items_var() - { - if(d_detail) { - return d_detail->pc_noutput_items_var(); - } - else { - return 0; +float block::pc_noutput_items_var() +{ + if (d_detail) { + return d_detail->pc_noutput_items_var(); + } else { + return 0; } - } +} - float - block::pc_nproduced() - { - if(d_detail) { - return d_detail->pc_nproduced(); - } - else { - return 0; +float block::pc_nproduced() +{ + if (d_detail) { + return d_detail->pc_nproduced(); + } else { + return 0; } - } +} - float - block::pc_nproduced_avg() - { - if(d_detail) { - return d_detail->pc_nproduced_avg(); - } - else { - return 0; +float block::pc_nproduced_avg() +{ + if (d_detail) { + return d_detail->pc_nproduced_avg(); + } else { + return 0; } - } +} - float - block::pc_nproduced_var() - { - if(d_detail) { - return d_detail->pc_nproduced_var(); - } - else { - return 0; +float block::pc_nproduced_var() +{ + if (d_detail) { + return d_detail->pc_nproduced_var(); + } else { + return 0; } - } +} - float - block::pc_input_buffers_full(int which) - { - if(d_detail) { - return d_detail->pc_input_buffers_full(static_cast<size_t>(which)); - } - else { - return 0; +float block::pc_input_buffers_full(int which) +{ + if (d_detail) { + return d_detail->pc_input_buffers_full(static_cast<size_t>(which)); + } else { + return 0; } - } +} - float - block::pc_input_buffers_full_avg(int which) - { - if(d_detail) { - return d_detail->pc_input_buffers_full_avg(static_cast<size_t>(which)); - } - else { - return 0; +float block::pc_input_buffers_full_avg(int which) +{ + if (d_detail) { + return d_detail->pc_input_buffers_full_avg(static_cast<size_t>(which)); + } else { + return 0; } - } +} - float - block::pc_input_buffers_full_var(int which) - { - if(d_detail) { - return d_detail->pc_input_buffers_full_var(static_cast<size_t>(which)); - } - else { - return 0; +float block::pc_input_buffers_full_var(int which) +{ + if (d_detail) { + return d_detail->pc_input_buffers_full_var(static_cast<size_t>(which)); + } else { + return 0; } - } +} - std::vector<float> - block::pc_input_buffers_full() - { - if(d_detail) { - return d_detail->pc_input_buffers_full(); - } - else { - return std::vector<float>(1,0); +std::vector<float> block::pc_input_buffers_full() +{ + if (d_detail) { + return d_detail->pc_input_buffers_full(); + } else { + return std::vector<float>(1, 0); } - } +} - std::vector<float> - block::pc_input_buffers_full_avg() - { - if(d_detail) { - return d_detail->pc_input_buffers_full_avg(); - } - else { - return std::vector<float>(1,0); +std::vector<float> block::pc_input_buffers_full_avg() +{ + if (d_detail) { + return d_detail->pc_input_buffers_full_avg(); + } else { + return std::vector<float>(1, 0); } - } +} - std::vector<float> - block::pc_input_buffers_full_var() - { - if(d_detail) { - return d_detail->pc_input_buffers_full_var(); - } - else { - return std::vector<float>(1,0); +std::vector<float> block::pc_input_buffers_full_var() +{ + if (d_detail) { + return d_detail->pc_input_buffers_full_var(); + } else { + return std::vector<float>(1, 0); } - } +} - float - block::pc_output_buffers_full(int which) - { - if(d_detail) { - return d_detail->pc_output_buffers_full(static_cast<size_t>(which)); - } - else { - return 0; +float block::pc_output_buffers_full(int which) +{ + if (d_detail) { + return d_detail->pc_output_buffers_full(static_cast<size_t>(which)); + } else { + return 0; } - } +} - float - block::pc_output_buffers_full_avg(int which) - { - if(d_detail) { - return d_detail->pc_output_buffers_full_avg(static_cast<size_t>(which)); - } - else { - return 0; +float block::pc_output_buffers_full_avg(int which) +{ + if (d_detail) { + return d_detail->pc_output_buffers_full_avg(static_cast<size_t>(which)); + } else { + return 0; } - } +} - float - block::pc_output_buffers_full_var(int which) - { - if(d_detail) { - return d_detail->pc_output_buffers_full_var(static_cast<size_t>(which)); - } - else { - return 0; +float block::pc_output_buffers_full_var(int which) +{ + if (d_detail) { + return d_detail->pc_output_buffers_full_var(static_cast<size_t>(which)); + } else { + return 0; } - } +} - std::vector<float> - block::pc_output_buffers_full() - { - if(d_detail) { - return d_detail->pc_output_buffers_full(); - } - else { - return std::vector<float>(1,0); +std::vector<float> block::pc_output_buffers_full() +{ + if (d_detail) { + return d_detail->pc_output_buffers_full(); + } else { + return std::vector<float>(1, 0); } - } +} - std::vector<float> - block::pc_output_buffers_full_avg() - { - if(d_detail) { - return d_detail->pc_output_buffers_full_avg(); - } - else { - return std::vector<float>(1,0); +std::vector<float> block::pc_output_buffers_full_avg() +{ + if (d_detail) { + return d_detail->pc_output_buffers_full_avg(); + } else { + return std::vector<float>(1, 0); } - } +} - std::vector<float> - block::pc_output_buffers_full_var() - { - if(d_detail) { - return d_detail->pc_output_buffers_full_var(); - } - else { - return std::vector<float>(1,0); +std::vector<float> block::pc_output_buffers_full_var() +{ + if (d_detail) { + return d_detail->pc_output_buffers_full_var(); + } else { + return std::vector<float>(1, 0); } - } +} - float - block::pc_work_time() - { - if(d_detail) { - return d_detail->pc_work_time(); - } - else { - return 0; +float block::pc_work_time() +{ + if (d_detail) { + return d_detail->pc_work_time(); + } else { + return 0; } - } +} - float - block::pc_work_time_avg() - { - if(d_detail) { - return d_detail->pc_work_time_avg(); - } - else { - return 0; +float block::pc_work_time_avg() +{ + if (d_detail) { + return d_detail->pc_work_time_avg(); + } else { + return 0; } - } +} - float - block::pc_work_time_var() - { - if(d_detail) { - return d_detail->pc_work_time_var(); - } - else { - return 0; +float block::pc_work_time_var() +{ + if (d_detail) { + return d_detail->pc_work_time_var(); + } else { + return 0; } - } +} - float - block::pc_work_time_total() - { - if(d_detail) { - return d_detail->pc_work_time_total(); - } - else { - return 0; +float block::pc_work_time_total() +{ + if (d_detail) { + return d_detail->pc_work_time_total(); + } else { + return 0; } - } +} - float - block::pc_throughput_avg() { - if(d_detail) { - return d_detail->pc_throughput_avg(); - } - else { - return 0; +float block::pc_throughput_avg() +{ + if (d_detail) { + return d_detail->pc_throughput_avg(); + } else { + return 0; } - } +} - void - block::reset_perf_counters() - { - if(d_detail) { - d_detail->reset_perf_counters(); +void block::reset_perf_counters() +{ + if (d_detail) { + d_detail->reset_perf_counters(); } - } +} - void - block::system_handler(pmt::pmt_t msg) - { - //std::cout << "system_handler " << msg << "\n"; +void block::system_handler(pmt::pmt_t msg) +{ + // std::cout << "system_handler " << msg << "\n"; pmt::pmt_t op = pmt::car(msg); - if(pmt::eqv(op, d_pmt_done)){ + if (pmt::eqv(op, d_pmt_done)) { d_finished = pmt::to_long(pmt::cdr(msg)); global_block_registry.notify_blk(alias()); } else { std::cout << "WARNING: bad message op on system port!\n"; pmt::print(msg); } - } +} - void - block::set_log_level(std::string level) - { - logger_set_level(d_logger, level); - } +void block::set_log_level(std::string level) { logger_set_level(d_logger, level); } - std::string - block::log_level() - { +std::string block::log_level() +{ std::string level; logger_get_level(d_logger, level); return level; - } +} - void - block::notify_msg_neighbors() - { +void block::notify_msg_neighbors() +{ size_t len = pmt::length(d_message_subscribers); pmt::pmt_t port_names = pmt::make_vector(len, pmt::PMT_NIL); pmt::pmt_t keys = pmt::dict_keys(d_message_subscribers); - for(size_t i = 0; i < len; i++) { - // for each output port - pmt::pmt_t oport = pmt::nth(i,keys); + for (size_t i = 0; i < len; i++) { + // for each output port + pmt::pmt_t oport = pmt::nth(i, keys); - // for each subscriber on this port - pmt::pmt_t currlist = pmt::dict_ref(d_message_subscribers, oport, pmt::PMT_NIL); + // for each subscriber on this port + pmt::pmt_t currlist = pmt::dict_ref(d_message_subscribers, oport, pmt::PMT_NIL); - // iterate through subscribers on port - while(pmt::is_pair(currlist)) { - pmt::pmt_t target = pmt::car(currlist); + // iterate through subscribers on port + while (pmt::is_pair(currlist)) { + pmt::pmt_t target = pmt::car(currlist); - pmt::pmt_t block = pmt::car(target); + pmt::pmt_t block = pmt::car(target); - currlist = pmt::cdr(currlist); - basic_block_sptr blk = global_block_registry.block_lookup(block); - blk->post(d_system_port, pmt::cons(d_pmt_done, pmt::mp(true))); + currlist = pmt::cdr(currlist); + basic_block_sptr blk = global_block_registry.block_lookup(block); + blk->post(d_system_port, pmt::cons(d_pmt_done, pmt::mp(true))); } } - } +} - bool - block::finished() - { - if(detail()->ninputs() != 0) - return false; +bool block::finished() +{ + if (detail()->ninputs() != 0) + return false; else - return d_finished; - } - + return d_finished; +} - void - block::setup_pc_rpc() - { +void block::setup_pc_rpc() +{ d_pc_rpc_set = true; #if defined(GR_CTRLPORT) && defined(GR_PERFORMANCE_COUNTERS) #include <gnuradio/rpcregisterhelpers.h> - d_rpc_vars.push_back( - rpcbasic_sptr(new rpcbasic_register_trigger<block>( - alias(), "reset_perf_counters", &block::reset_perf_counters, - "Reset the Performance Counters", RPC_PRIVLVL_MIN))); - - d_rpc_vars.push_back( - rpcbasic_sptr(new rpcbasic_register_get<block, float>( - alias(), "noutput_items", &block::pc_noutput_items, - pmt::mp(0), pmt::mp(32768), pmt::mp(0), - "", "noutput items", RPC_PRIVLVL_MIN, - DISPTIME | DISPOPTSTRIP))); - - d_rpc_vars.push_back( - rpcbasic_sptr(new rpcbasic_register_get<block, float>( - alias(), "avg noutput_items", &block::pc_noutput_items_avg, - pmt::mp(0), pmt::mp(32768), pmt::mp(0), - "", "Average noutput items", RPC_PRIVLVL_MIN, - DISPTIME | DISPOPTSTRIP))); - - d_rpc_vars.push_back( - rpcbasic_sptr(new rpcbasic_register_get<block, float>( - alias(), "var noutput_items", &block::pc_noutput_items_var, - pmt::mp(0), pmt::mp(32768), pmt::mp(0), - "", "Var. noutput items", RPC_PRIVLVL_MIN, - DISPTIME | DISPOPTSTRIP))); - - d_rpc_vars.push_back( - rpcbasic_sptr(new rpcbasic_register_get<block, float>( - alias(), "nproduced", &block::pc_nproduced, - pmt::mp(0), pmt::mp(32768), pmt::mp(0), - "", "items produced", RPC_PRIVLVL_MIN, - DISPTIME | DISPOPTSTRIP))); - - d_rpc_vars.push_back( - rpcbasic_sptr(new rpcbasic_register_get<block, float>( - alias(), "avg nproduced", &block::pc_nproduced_avg, - pmt::mp(0), pmt::mp(32768), pmt::mp(0), - "", "Average items produced", RPC_PRIVLVL_MIN, - DISPTIME | DISPOPTSTRIP))); - - d_rpc_vars.push_back( - rpcbasic_sptr(new rpcbasic_register_get<block, float>( - alias(), "var nproduced", &block::pc_nproduced_var, - pmt::mp(0), pmt::mp(32768), pmt::mp(0), - "", "Var. items produced", RPC_PRIVLVL_MIN, - DISPTIME | DISPOPTSTRIP))); + d_rpc_vars.push_back(rpcbasic_sptr( + new rpcbasic_register_trigger<block>(alias(), + "reset_perf_counters", + &block::reset_perf_counters, + "Reset the Performance Counters", + RPC_PRIVLVL_MIN))); d_rpc_vars.push_back( - rpcbasic_sptr(new rpcbasic_register_get<block, float>( - alias(), "work time", &block::pc_work_time, - pmt::mp(0), pmt::mp(1e9), pmt::mp(0), - "", "clock cycles in call to work", RPC_PRIVLVL_MIN, - DISPTIME | DISPOPTSTRIP))); + rpcbasic_sptr(new rpcbasic_register_get<block, float>(alias(), + "noutput_items", + &block::pc_noutput_items, + pmt::mp(0), + pmt::mp(32768), + pmt::mp(0), + "", + "noutput items", + RPC_PRIVLVL_MIN, + DISPTIME | DISPOPTSTRIP))); + + d_rpc_vars.push_back(rpcbasic_sptr( + new rpcbasic_register_get<block, float>(alias(), + "avg noutput_items", + &block::pc_noutput_items_avg, + pmt::mp(0), + pmt::mp(32768), + pmt::mp(0), + "", + "Average noutput items", + RPC_PRIVLVL_MIN, + DISPTIME | DISPOPTSTRIP))); + + d_rpc_vars.push_back(rpcbasic_sptr( + new rpcbasic_register_get<block, float>(alias(), + "var noutput_items", + &block::pc_noutput_items_var, + pmt::mp(0), + pmt::mp(32768), + pmt::mp(0), + "", + "Var. noutput items", + RPC_PRIVLVL_MIN, + DISPTIME | DISPOPTSTRIP))); d_rpc_vars.push_back( - rpcbasic_sptr(new rpcbasic_register_get<block, float>( - alias(), "avg work time", &block::pc_work_time_avg, - pmt::mp(0), pmt::mp(1e9), pmt::mp(0), - "", "Average clock cycles in call to work", RPC_PRIVLVL_MIN, - DISPTIME | DISPOPTSTRIP))); + rpcbasic_sptr(new rpcbasic_register_get<block, float>(alias(), + "nproduced", + &block::pc_nproduced, + pmt::mp(0), + pmt::mp(32768), + pmt::mp(0), + "", + "items produced", + RPC_PRIVLVL_MIN, + DISPTIME | DISPOPTSTRIP))); d_rpc_vars.push_back( - rpcbasic_sptr(new rpcbasic_register_get<block, float>( - alias(), "var work time", &block::pc_work_time_var, - pmt::mp(0), pmt::mp(1e9), pmt::mp(0), - "", "Var. clock cycles in call to work", RPC_PRIVLVL_MIN, - DISPTIME | DISPOPTSTRIP))); + rpcbasic_sptr(new rpcbasic_register_get<block, float>(alias(), + "avg nproduced", + &block::pc_nproduced_avg, + pmt::mp(0), + pmt::mp(32768), + pmt::mp(0), + "", + "Average items produced", + RPC_PRIVLVL_MIN, + DISPTIME | DISPOPTSTRIP))); d_rpc_vars.push_back( - rpcbasic_sptr(new rpcbasic_register_get<block, float>( - alias(), "total work time", &block::pc_work_time_total, - pmt::mp(0), pmt::mp(1e9), pmt::mp(0), - "", "Total clock cycles in calls to work", RPC_PRIVLVL_MIN, + rpcbasic_sptr(new rpcbasic_register_get<block, float>(alias(), + "var nproduced", + &block::pc_nproduced_var, + pmt::mp(0), + pmt::mp(32768), + pmt::mp(0), + "", + "Var. items produced", + RPC_PRIVLVL_MIN, + DISPTIME | DISPOPTSTRIP))); + + d_rpc_vars.push_back(rpcbasic_sptr( + new rpcbasic_register_get<block, float>(alias(), + "work time", + &block::pc_work_time, + pmt::mp(0), + pmt::mp(1e9), + pmt::mp(0), + "", + "clock cycles in call to work", + RPC_PRIVLVL_MIN, + DISPTIME | DISPOPTSTRIP))); + + d_rpc_vars.push_back(rpcbasic_sptr( + new rpcbasic_register_get<block, float>(alias(), + "avg work time", + &block::pc_work_time_avg, + pmt::mp(0), + pmt::mp(1e9), + pmt::mp(0), + "", + "Average clock cycles in call to work", + RPC_PRIVLVL_MIN, + DISPTIME | DISPOPTSTRIP))); + + d_rpc_vars.push_back(rpcbasic_sptr( + new rpcbasic_register_get<block, float>(alias(), + "var work time", + &block::pc_work_time_var, + pmt::mp(0), + pmt::mp(1e9), + pmt::mp(0), + "", + "Var. clock cycles in call to work", + RPC_PRIVLVL_MIN, + DISPTIME | DISPOPTSTRIP))); + + d_rpc_vars.push_back(rpcbasic_sptr( + new rpcbasic_register_get<block, float>(alias(), + "total work time", + &block::pc_work_time_total, + pmt::mp(0), + pmt::mp(1e9), + pmt::mp(0), + "", + "Total clock cycles in calls to work", + RPC_PRIVLVL_MIN, + DISPTIME | DISPOPTSTRIP))); + + d_rpc_vars.push_back(rpcbasic_sptr(new rpcbasic_register_get<block, float>( + alias(), + "avg throughput", + &block::pc_throughput_avg, + pmt::mp(0), + pmt::mp(1e9), + pmt::mp(0), + "items/s", + "Average items throughput in call to work", + RPC_PRIVLVL_MIN, DISPTIME | DISPOPTSTRIP))); d_rpc_vars.push_back( - rpcbasic_sptr(new rpcbasic_register_get<block, float>( - alias(), "avg throughput", &block::pc_throughput_avg, - pmt::mp(0), pmt::mp(1e9), pmt::mp(0), - "items/s", "Average items throughput in call to work", RPC_PRIVLVL_MIN, - DISPTIME | DISPOPTSTRIP))); + rpcbasic_sptr(new rpcbasic_register_get<block, std::vector<float>>( + alias(), + "input \% full", + &block::pc_input_buffers_full, + pmt::make_f32vector(0, 0), + pmt::make_f32vector(0, 1), + pmt::make_f32vector(0, 0), + "", + "how full input buffers are", + RPC_PRIVLVL_MIN, + DISPTIME | DISPOPTSTRIP))); d_rpc_vars.push_back( - rpcbasic_sptr(new rpcbasic_register_get<block, std::vector<float> >( - alias(), "input \% full", &block::pc_input_buffers_full, - pmt::make_f32vector(0,0), pmt::make_f32vector(0,1), pmt::make_f32vector(0,0), - "", "how full input buffers are", RPC_PRIVLVL_MIN, - DISPTIME | DISPOPTSTRIP))); + rpcbasic_sptr(new rpcbasic_register_get<block, std::vector<float>>( + alias(), + "avg input \% full", + &block::pc_input_buffers_full_avg, + pmt::make_f32vector(0, 0), + pmt::make_f32vector(0, 1), + pmt::make_f32vector(0, 0), + "", + "Average of how full input buffers are", + RPC_PRIVLVL_MIN, + DISPTIME | DISPOPTSTRIP))); d_rpc_vars.push_back( - rpcbasic_sptr(new rpcbasic_register_get<block, std::vector<float> >( - alias(), "avg input \% full", &block::pc_input_buffers_full_avg, - pmt::make_f32vector(0,0), pmt::make_f32vector(0,1), pmt::make_f32vector(0,0), - "", "Average of how full input buffers are", RPC_PRIVLVL_MIN, - DISPTIME | DISPOPTSTRIP))); + rpcbasic_sptr(new rpcbasic_register_get<block, std::vector<float>>( + alias(), + "var input \% full", + &block::pc_input_buffers_full_var, + pmt::make_f32vector(0, 0), + pmt::make_f32vector(0, 1), + pmt::make_f32vector(0, 0), + "", + "Var. of how full input buffers are", + RPC_PRIVLVL_MIN, + DISPTIME | DISPOPTSTRIP))); d_rpc_vars.push_back( - rpcbasic_sptr(new rpcbasic_register_get<block, std::vector<float> >( - alias(), "var input \% full", &block::pc_input_buffers_full_var, - pmt::make_f32vector(0,0), pmt::make_f32vector(0,1), pmt::make_f32vector(0,0), - "", "Var. of how full input buffers are", RPC_PRIVLVL_MIN, - DISPTIME | DISPOPTSTRIP))); + rpcbasic_sptr(new rpcbasic_register_get<block, std::vector<float>>( + alias(), + "output \% full", + &block::pc_output_buffers_full, + pmt::make_f32vector(0, 0), + pmt::make_f32vector(0, 1), + pmt::make_f32vector(0, 0), + "", + "how full output buffers are", + RPC_PRIVLVL_MIN, + DISPTIME | DISPOPTSTRIP))); d_rpc_vars.push_back( - rpcbasic_sptr(new rpcbasic_register_get<block, std::vector<float> >( - alias(), "output \% full", &block::pc_output_buffers_full, - pmt::make_f32vector(0,0), pmt::make_f32vector(0,1), pmt::make_f32vector(0,0), - "", "how full output buffers are", RPC_PRIVLVL_MIN, - DISPTIME | DISPOPTSTRIP))); - - d_rpc_vars.push_back( - rpcbasic_sptr(new rpcbasic_register_get<block, std::vector<float> >( - alias(), "avg output \% full", &block::pc_output_buffers_full_avg, - pmt::make_f32vector(0,0), pmt::make_f32vector(0,1), pmt::make_f32vector(0,0), - "", "Average of how full output buffers are", RPC_PRIVLVL_MIN, - DISPTIME | DISPOPTSTRIP))); + rpcbasic_sptr(new rpcbasic_register_get<block, std::vector<float>>( + alias(), + "avg output \% full", + &block::pc_output_buffers_full_avg, + pmt::make_f32vector(0, 0), + pmt::make_f32vector(0, 1), + pmt::make_f32vector(0, 0), + "", + "Average of how full output buffers are", + RPC_PRIVLVL_MIN, + DISPTIME | DISPOPTSTRIP))); d_rpc_vars.push_back( - rpcbasic_sptr(new rpcbasic_register_get<block, std::vector<float> >( - alias(), "var output \% full", &block::pc_output_buffers_full_var, - pmt::make_f32vector(0,0), pmt::make_f32vector(0,1), pmt::make_f32vector(0,0), - "", "Var. of how full output buffers are", RPC_PRIVLVL_MIN, - DISPTIME | DISPOPTSTRIP))); + rpcbasic_sptr(new rpcbasic_register_get<block, std::vector<float>>( + alias(), + "var output \% full", + &block::pc_output_buffers_full_var, + pmt::make_f32vector(0, 0), + pmt::make_f32vector(0, 1), + pmt::make_f32vector(0, 0), + "", + "Var. of how full output buffers are", + RPC_PRIVLVL_MIN, + DISPTIME | DISPOPTSTRIP))); #endif /* defined(GR_CTRLPORT) && defined(GR_PERFORMANCE_COUNTERS) */ - } +} - std::string block::identifier() const { +std::string block::identifier() const +{ return d_name + "(" + std::to_string(d_unique_id) + ")"; - } +} - std::ostream& - operator << (std::ostream& os, const block *m) - { +std::ostream& operator<<(std::ostream& os, const block* m) +{ os << "<block " << m->identifier() << ">"; return os; - } - - int - block::general_work(int noutput_items, - gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) - { +} + +int block::general_work(int noutput_items, + gr_vector_int& ninput_items, + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items) +{ throw std::runtime_error("block::general_work() not implemented"); return 0; - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/block_detail.cc b/gnuradio-runtime/lib/block_detail.cc index 3da150ed8f..fb90995343 100644 --- a/gnuradio-runtime/lib/block_detail.cc +++ b/gnuradio-runtime/lib/block_detail.cc @@ -30,18 +30,16 @@ namespace gr { - static long s_ncurrently_allocated = 0; +static long s_ncurrently_allocated = 0; - long - block_detail_ncurrently_allocated() - { - return s_ncurrently_allocated; - } +long block_detail_ncurrently_allocated() { return s_ncurrently_allocated; } - block_detail::block_detail(unsigned int ninputs, unsigned int noutputs) +block_detail::block_detail(unsigned int ninputs, unsigned int noutputs) : d_produce_or(0), - d_ninputs(ninputs), d_noutputs(noutputs), - d_input(ninputs), d_output(noutputs), + d_ninputs(ninputs), + d_noutputs(noutputs), + d_input(ninputs), + d_output(noutputs), d_done(false), d_ins_noutput_items(0), d_avg_noutput_items(0), @@ -61,177 +59,155 @@ namespace gr { d_var_work_time(0), d_avg_throughput(0), d_pc_counter(0) - { +{ s_ncurrently_allocated++; d_pc_start_time = gr::high_res_timer_now(); - } +} - block_detail::~block_detail() - { +block_detail::~block_detail() +{ // should take care of itself s_ncurrently_allocated--; - } +} - void - block_detail::set_input(unsigned int which, buffer_reader_sptr reader) - { - if(which >= d_ninputs) - throw std::invalid_argument("block_detail::set_input"); +void block_detail::set_input(unsigned int which, buffer_reader_sptr reader) +{ + if (which >= d_ninputs) + throw std::invalid_argument("block_detail::set_input"); d_input[which] = reader; - } +} - void - block_detail::set_output(unsigned int which, buffer_sptr buffer) - { - if(which >= d_noutputs) - throw std::invalid_argument("block_detail::set_output"); +void block_detail::set_output(unsigned int which, buffer_sptr buffer) +{ + if (which >= d_noutputs) + throw std::invalid_argument("block_detail::set_output"); d_output[which] = buffer; - } +} - block_detail_sptr - make_block_detail(unsigned int ninputs, unsigned int noutputs) - { - return block_detail_sptr (new block_detail(ninputs, noutputs)); - } +block_detail_sptr make_block_detail(unsigned int ninputs, unsigned int noutputs) +{ + return block_detail_sptr(new block_detail(ninputs, noutputs)); +} - void - block_detail::set_done(bool done) - { +void block_detail::set_done(bool done) +{ d_done = done; - for(unsigned int i = 0; i < d_noutputs; i++) - d_output[i]->set_done(done); + for (unsigned int i = 0; i < d_noutputs; i++) + d_output[i]->set_done(done); - for(unsigned int i = 0; i < d_ninputs; i++) - d_input[i]->set_done(done); - } + for (unsigned int i = 0; i < d_ninputs; i++) + d_input[i]->set_done(done); +} - void - block_detail::consume(int which_input, int how_many_items) - { +void block_detail::consume(int which_input, int how_many_items) +{ d_consumed = how_many_items; - if(how_many_items > 0) { - input(which_input)->update_read_pointer(how_many_items); + if (how_many_items > 0) { + input(which_input)->update_read_pointer(how_many_items); } - } +} - int - block_detail::consumed() const - { - return d_consumed; - } +int block_detail::consumed() const { return d_consumed; } - void - block_detail::consume_each(int how_many_items) - { +void block_detail::consume_each(int how_many_items) +{ d_consumed = how_many_items; - if(how_many_items > 0) { - for(int i = 0; i < ninputs (); i++) { - d_input[i]->update_read_pointer(how_many_items); - } + if (how_many_items > 0) { + for (int i = 0; i < ninputs(); i++) { + d_input[i]->update_read_pointer(how_many_items); + } } - } - - void - block_detail::produce(int which_output, int how_many_items) - { - if(how_many_items > 0) { - d_output[which_output]->update_write_pointer(how_many_items); - d_produce_or |= how_many_items; +} + +void block_detail::produce(int which_output, int how_many_items) +{ + if (how_many_items > 0) { + d_output[which_output]->update_write_pointer(how_many_items); + d_produce_or |= how_many_items; } - } - - void - block_detail::produce_each(int how_many_items) - { - if(how_many_items > 0) { - for(int i = 0; i < noutputs (); i++) { - d_output[i]->update_write_pointer (how_many_items); - } - d_produce_or |= how_many_items; +} + +void block_detail::produce_each(int how_many_items) +{ + if (how_many_items > 0) { + for (int i = 0; i < noutputs(); i++) { + d_output[i]->update_write_pointer(how_many_items); + } + d_produce_or |= how_many_items; } - } +} - uint64_t - block_detail::nitems_read(unsigned int which_input) - { - if(which_input >= d_ninputs) - throw std::invalid_argument ("block_detail::n_input_items"); +uint64_t block_detail::nitems_read(unsigned int which_input) +{ + if (which_input >= d_ninputs) + throw std::invalid_argument("block_detail::n_input_items"); return d_input[which_input]->nitems_read(); - } +} - uint64_t - block_detail::nitems_written(unsigned int which_output) - { - if(which_output >= d_noutputs) - throw std::invalid_argument ("block_detail::n_output_items"); +uint64_t block_detail::nitems_written(unsigned int which_output) +{ + if (which_output >= d_noutputs) + throw std::invalid_argument("block_detail::n_output_items"); return d_output[which_output]->nitems_written(); - } +} - void - block_detail::reset_nitem_counters() - { - for(unsigned int i = 0; i < d_ninputs; i++) { - d_input[i]->reset_nitem_counter(); - } - for(unsigned int o = 0; o < d_noutputs; o++) { - d_output[o]->reset_nitem_counter(); +void block_detail::reset_nitem_counters() +{ + for (unsigned int i = 0; i < d_ninputs; i++) { + d_input[i]->reset_nitem_counter(); } - } - - void - block_detail::clear_tags() - { - for(unsigned int i = 0; i < d_ninputs; i++) { - uint64_t max_time = 0xFFFFFFFFFFFFFFFF; // from now to the end of time - d_input[i]->buffer()->prune_tags(max_time); + for (unsigned int o = 0; o < d_noutputs; o++) { + d_output[o]->reset_nitem_counter(); } - } +} - void - block_detail::add_item_tag(unsigned int which_output, const tag_t &tag) - { - if(!pmt::is_symbol(tag.key)) { - throw pmt::wrong_type("block_detail::add_item_tag key", tag.key); +void block_detail::clear_tags() +{ + for (unsigned int i = 0; i < d_ninputs; i++) { + uint64_t max_time = 0xFFFFFFFFFFFFFFFF; // from now to the end of time + d_input[i]->buffer()->prune_tags(max_time); } - else { - // Add tag to gr_buffer's deque tags - d_output[which_output]->add_item_tag(tag); +} + +void block_detail::add_item_tag(unsigned int which_output, const tag_t& tag) +{ + if (!pmt::is_symbol(tag.key)) { + throw pmt::wrong_type("block_detail::add_item_tag key", tag.key); + } else { + // Add tag to gr_buffer's deque tags + d_output[which_output]->add_item_tag(tag); } - } - - void - block_detail::remove_item_tag(unsigned int which_input, const tag_t &tag, long id) - { - if(!pmt::is_symbol(tag.key)) { - throw pmt::wrong_type("block_detail::add_item_tag key", tag.key); +} + +void block_detail::remove_item_tag(unsigned int which_input, const tag_t& tag, long id) +{ + if (!pmt::is_symbol(tag.key)) { + throw pmt::wrong_type("block_detail::add_item_tag key", tag.key); + } else { + // Add tag to gr_buffer's deque tags + d_input[which_input]->buffer()->remove_item_tag(tag, id); } - else { - // Add tag to gr_buffer's deque tags - d_input[which_input]->buffer()->remove_item_tag(tag, id); - } - } - - void - block_detail::get_tags_in_range(std::vector<tag_t> &v, - unsigned int which_input, - uint64_t abs_start, - uint64_t abs_end, - long id) - { +} + +void block_detail::get_tags_in_range(std::vector<tag_t>& v, + unsigned int which_input, + uint64_t abs_start, + uint64_t abs_end, + long id) +{ // get from gr_buffer_reader's deque of tags d_input[which_input]->get_tags_in_range(v, abs_start, abs_end, id); - } - - void - block_detail::get_tags_in_range(std::vector<tag_t> &v, - unsigned int which_input, - uint64_t abs_start, - uint64_t abs_end, - const pmt::pmt_t &key, - long id) - { +} + +void block_detail::get_tags_in_range(std::vector<tag_t>& v, + unsigned int which_input, + uint64_t abs_start, + uint64_t abs_end, + const pmt::pmt_t& key, + long id) +{ std::vector<tag_t> found_items; v.resize(0); @@ -242,308 +218,249 @@ namespace gr { // Filter further by key name pmt::pmt_t itemkey; std::vector<tag_t>::iterator itr; - for(itr = found_items.begin(); itr != found_items.end(); itr++) { - itemkey = (*itr).key; - if(pmt::eqv(key, itemkey)) { - v.push_back(*itr); - } + for (itr = found_items.begin(); itr != found_items.end(); itr++) { + itemkey = (*itr).key; + if (pmt::eqv(key, itemkey)) { + v.push_back(*itr); + } } - } - - void - block_detail::set_processor_affinity(const std::vector<int> &mask) - { - if(threaded) { - try { - gr::thread::thread_bind_to_processor(thread, mask); - } - catch (std::runtime_error e) { - std::cerr << "set_processor_affinity: invalid mask." << std::endl;; - } +} + +void block_detail::set_processor_affinity(const std::vector<int>& mask) +{ + if (threaded) { + try { + gr::thread::thread_bind_to_processor(thread, mask); + } catch (std::runtime_error e) { + std::cerr << "set_processor_affinity: invalid mask." << std::endl; + ; + } } - } +} - void - block_detail::unset_processor_affinity() - { - if(threaded) { - gr::thread::thread_unbind(thread); +void block_detail::unset_processor_affinity() +{ + if (threaded) { + gr::thread::thread_unbind(thread); } - } +} - int - block_detail::thread_priority(){ - if(threaded) { - return gr::thread::thread_priority(thread); +int block_detail::thread_priority() +{ + if (threaded) { + return gr::thread::thread_priority(thread); } return -1; - } +} - int - block_detail::set_thread_priority(int priority){ - if(threaded) { - return gr::thread::set_thread_priority(thread,priority); +int block_detail::set_thread_priority(int priority) +{ + if (threaded) { + return gr::thread::set_thread_priority(thread, priority); } return -1; - } +} - void - block_detail::start_perf_counters() - { +void block_detail::start_perf_counters() +{ d_start_of_work = gr::high_res_timer_now_perfmon(); - } +} - void - block_detail::stop_perf_counters(int noutput_items, int nproduced) - { +void block_detail::stop_perf_counters(int noutput_items, int nproduced) +{ d_end_of_work = gr::high_res_timer_now_perfmon(); gr::high_res_timer_type diff = d_end_of_work - d_start_of_work; - if(d_pc_counter == 0) { - d_ins_work_time = diff; - d_avg_work_time = diff; - d_var_work_time = 0; - d_total_work_time = diff; - d_ins_nproduced = nproduced; - d_avg_nproduced = nproduced; - d_var_nproduced = 0; - d_ins_noutput_items = noutput_items; - d_avg_noutput_items = noutput_items; - d_var_noutput_items = 0; - d_total_noutput_items = noutput_items; - d_pc_start_time = (float)gr::high_res_timer_now(); - for(size_t i=0; i < d_input.size(); i++) { - buffer_reader_sptr in_buf = d_input[i]; - gr::thread::scoped_lock guard(*in_buf->mutex()); - float pfull = static_cast<float>(in_buf->items_available()) / - static_cast<float>(in_buf->max_possible_items_available()); - d_ins_input_buffers_full[i] = pfull; - d_avg_input_buffers_full[i] = pfull; - d_var_input_buffers_full[i] = 0; - } - for(size_t i=0; i < d_output.size(); i++) { - buffer_sptr out_buf = d_output[i]; - gr::thread::scoped_lock guard(*out_buf->mutex()); - float pfull = 1.0f - static_cast<float>(out_buf->space_available()) / - static_cast<float>(out_buf->bufsize()); - d_ins_output_buffers_full[i] = pfull; - d_avg_output_buffers_full[i] = pfull; - d_var_output_buffers_full[i] = 0; - } - } - else { - float d = diff - d_avg_work_time; - d_ins_work_time = diff; - d_avg_work_time = d_avg_work_time + d/d_pc_counter; - d_var_work_time = d_var_work_time + d*d; - d_total_work_time += diff; - - d = nproduced - d_avg_nproduced; - d_ins_nproduced = nproduced; - d_avg_nproduced = d_avg_nproduced + d/d_pc_counter; - d_var_nproduced = d_var_nproduced + d*d; - - d = noutput_items - d_avg_noutput_items; - d_ins_noutput_items = noutput_items; - d_avg_noutput_items = d_avg_noutput_items + d/d_pc_counter; - d_var_noutput_items = d_var_noutput_items + d*d; - d_total_noutput_items += noutput_items; - d_pc_last_work_time = gr::high_res_timer_now(); - float monitor_time = (float)(d_pc_last_work_time - d_pc_start_time) / (float)gr::high_res_timer_tps(); - d_avg_throughput = d_total_noutput_items / monitor_time; - - for(size_t i=0; i < d_input.size(); i++) { - buffer_reader_sptr in_buf = d_input[i]; - gr::thread::scoped_lock guard(*in_buf->mutex()); - float pfull = static_cast<float>(in_buf->items_available()) / - static_cast<float>(in_buf->max_possible_items_available()); - - d = pfull - d_avg_input_buffers_full[i]; - d_ins_input_buffers_full[i] = pfull; - d_avg_input_buffers_full[i] = d_avg_input_buffers_full[i] + d/d_pc_counter; - d_var_input_buffers_full[i] = d_var_input_buffers_full[i] + d*d; - } - - for(size_t i=0; i < d_output.size(); i++) { - buffer_sptr out_buf = d_output[i]; - gr::thread::scoped_lock guard(*out_buf->mutex()); - float pfull = 1.0f - static_cast<float>(out_buf->space_available()) / - static_cast<float>(out_buf->bufsize()); - - d = pfull - d_avg_output_buffers_full[i]; - d_ins_output_buffers_full[i] = pfull; - d_avg_output_buffers_full[i] = d_avg_output_buffers_full[i] + d/d_pc_counter; - d_var_output_buffers_full[i] = d_var_output_buffers_full[i] + d*d; - } + if (d_pc_counter == 0) { + d_ins_work_time = diff; + d_avg_work_time = diff; + d_var_work_time = 0; + d_total_work_time = diff; + d_ins_nproduced = nproduced; + d_avg_nproduced = nproduced; + d_var_nproduced = 0; + d_ins_noutput_items = noutput_items; + d_avg_noutput_items = noutput_items; + d_var_noutput_items = 0; + d_total_noutput_items = noutput_items; + d_pc_start_time = (float)gr::high_res_timer_now(); + for (size_t i = 0; i < d_input.size(); i++) { + buffer_reader_sptr in_buf = d_input[i]; + gr::thread::scoped_lock guard(*in_buf->mutex()); + float pfull = static_cast<float>(in_buf->items_available()) / + static_cast<float>(in_buf->max_possible_items_available()); + d_ins_input_buffers_full[i] = pfull; + d_avg_input_buffers_full[i] = pfull; + d_var_input_buffers_full[i] = 0; + } + for (size_t i = 0; i < d_output.size(); i++) { + buffer_sptr out_buf = d_output[i]; + gr::thread::scoped_lock guard(*out_buf->mutex()); + float pfull = 1.0f - static_cast<float>(out_buf->space_available()) / + static_cast<float>(out_buf->bufsize()); + d_ins_output_buffers_full[i] = pfull; + d_avg_output_buffers_full[i] = pfull; + d_var_output_buffers_full[i] = 0; + } + } else { + float d = diff - d_avg_work_time; + d_ins_work_time = diff; + d_avg_work_time = d_avg_work_time + d / d_pc_counter; + d_var_work_time = d_var_work_time + d * d; + d_total_work_time += diff; + + d = nproduced - d_avg_nproduced; + d_ins_nproduced = nproduced; + d_avg_nproduced = d_avg_nproduced + d / d_pc_counter; + d_var_nproduced = d_var_nproduced + d * d; + + d = noutput_items - d_avg_noutput_items; + d_ins_noutput_items = noutput_items; + d_avg_noutput_items = d_avg_noutput_items + d / d_pc_counter; + d_var_noutput_items = d_var_noutput_items + d * d; + d_total_noutput_items += noutput_items; + d_pc_last_work_time = gr::high_res_timer_now(); + float monitor_time = (float)(d_pc_last_work_time - d_pc_start_time) / + (float)gr::high_res_timer_tps(); + d_avg_throughput = d_total_noutput_items / monitor_time; + + for (size_t i = 0; i < d_input.size(); i++) { + buffer_reader_sptr in_buf = d_input[i]; + gr::thread::scoped_lock guard(*in_buf->mutex()); + float pfull = static_cast<float>(in_buf->items_available()) / + static_cast<float>(in_buf->max_possible_items_available()); + + d = pfull - d_avg_input_buffers_full[i]; + d_ins_input_buffers_full[i] = pfull; + d_avg_input_buffers_full[i] = d_avg_input_buffers_full[i] + d / d_pc_counter; + d_var_input_buffers_full[i] = d_var_input_buffers_full[i] + d * d; + } + + for (size_t i = 0; i < d_output.size(); i++) { + buffer_sptr out_buf = d_output[i]; + gr::thread::scoped_lock guard(*out_buf->mutex()); + float pfull = 1.0f - static_cast<float>(out_buf->space_available()) / + static_cast<float>(out_buf->bufsize()); + + d = pfull - d_avg_output_buffers_full[i]; + d_ins_output_buffers_full[i] = pfull; + d_avg_output_buffers_full[i] = + d_avg_output_buffers_full[i] + d / d_pc_counter; + d_var_output_buffers_full[i] = d_var_output_buffers_full[i] + d * d; + } } d_pc_counter++; - } - - void - block_detail::reset_perf_counters() - { - d_pc_counter = 0; - } - - float - block_detail::pc_noutput_items() - { - return d_ins_noutput_items; - } - - float - block_detail::pc_nproduced() - { - return d_ins_nproduced; - } - - float - block_detail::pc_input_buffers_full(size_t which) - { - if(which < d_ins_input_buffers_full.size()) - return d_ins_input_buffers_full[which]; +} + +void block_detail::reset_perf_counters() { d_pc_counter = 0; } + +float block_detail::pc_noutput_items() { return d_ins_noutput_items; } + +float block_detail::pc_nproduced() { return d_ins_nproduced; } + +float block_detail::pc_input_buffers_full(size_t which) +{ + if (which < d_ins_input_buffers_full.size()) + return d_ins_input_buffers_full[which]; else - return 0; - } + return 0; +} - std::vector<float> - block_detail::pc_input_buffers_full() - { +std::vector<float> block_detail::pc_input_buffers_full() +{ return d_ins_input_buffers_full; - } +} - float - block_detail::pc_output_buffers_full(size_t which) - { - if(which < d_ins_output_buffers_full.size()) - return d_ins_output_buffers_full[which]; +float block_detail::pc_output_buffers_full(size_t which) +{ + if (which < d_ins_output_buffers_full.size()) + return d_ins_output_buffers_full[which]; else - return 0; - } + return 0; +} - std::vector<float> - block_detail::pc_output_buffers_full() - { +std::vector<float> block_detail::pc_output_buffers_full() +{ return d_ins_output_buffers_full; - } - - float - block_detail::pc_work_time() - { - return d_ins_work_time; - } - - float - block_detail::pc_noutput_items_avg() - { - return d_avg_noutput_items; - } - - float - block_detail::pc_nproduced_avg() - { - return d_avg_nproduced; - } - - float - block_detail::pc_input_buffers_full_avg(size_t which) - { - if(which < d_avg_input_buffers_full.size()) - return d_avg_input_buffers_full[which]; +} + +float block_detail::pc_work_time() { return d_ins_work_time; } + +float block_detail::pc_noutput_items_avg() { return d_avg_noutput_items; } + +float block_detail::pc_nproduced_avg() { return d_avg_nproduced; } + +float block_detail::pc_input_buffers_full_avg(size_t which) +{ + if (which < d_avg_input_buffers_full.size()) + return d_avg_input_buffers_full[which]; else - return 0; - } + return 0; +} - std::vector<float> - block_detail::pc_input_buffers_full_avg() - { +std::vector<float> block_detail::pc_input_buffers_full_avg() +{ return d_avg_input_buffers_full; - } +} - float - block_detail::pc_output_buffers_full_avg(size_t which) - { - if(which < d_avg_output_buffers_full.size()) - return d_avg_output_buffers_full[which]; +float block_detail::pc_output_buffers_full_avg(size_t which) +{ + if (which < d_avg_output_buffers_full.size()) + return d_avg_output_buffers_full[which]; else - return 0; - } + return 0; +} - std::vector<float> - block_detail::pc_output_buffers_full_avg() - { +std::vector<float> block_detail::pc_output_buffers_full_avg() +{ return d_avg_output_buffers_full; - } - - float - block_detail::pc_work_time_avg() - { - return d_avg_work_time; - } - - float - block_detail::pc_noutput_items_var() - { - return d_var_noutput_items/(d_pc_counter-1); - } - - float - block_detail::pc_nproduced_var() - { - return d_var_nproduced/(d_pc_counter-1); - } - - float - block_detail::pc_input_buffers_full_var(size_t which) - { - if(which < d_avg_input_buffers_full.size()) - return d_var_input_buffers_full[which]/(d_pc_counter-1); +} + +float block_detail::pc_work_time_avg() { return d_avg_work_time; } + +float block_detail::pc_noutput_items_var() +{ + return d_var_noutput_items / (d_pc_counter - 1); +} + +float block_detail::pc_nproduced_var() { return d_var_nproduced / (d_pc_counter - 1); } + +float block_detail::pc_input_buffers_full_var(size_t which) +{ + if (which < d_avg_input_buffers_full.size()) + return d_var_input_buffers_full[which] / (d_pc_counter - 1); else - return 0; - } + return 0; +} - std::vector<float> - block_detail::pc_input_buffers_full_var() - { +std::vector<float> block_detail::pc_input_buffers_full_var() +{ std::vector<float> var(d_avg_input_buffers_full.size(), 0); - for(size_t i = 0; i < d_avg_input_buffers_full.size(); i++) - var[i] = d_avg_input_buffers_full[i]/(d_pc_counter-1); + for (size_t i = 0; i < d_avg_input_buffers_full.size(); i++) + var[i] = d_avg_input_buffers_full[i] / (d_pc_counter - 1); return var; - } +} - float - block_detail::pc_output_buffers_full_var(size_t which) - { - if(which < d_avg_output_buffers_full.size()) - return d_var_output_buffers_full[which]/(d_pc_counter-1); +float block_detail::pc_output_buffers_full_var(size_t which) +{ + if (which < d_avg_output_buffers_full.size()) + return d_var_output_buffers_full[which] / (d_pc_counter - 1); else - return 0; - } + return 0; +} - std::vector<float> - block_detail::pc_output_buffers_full_var() - { +std::vector<float> block_detail::pc_output_buffers_full_var() +{ std::vector<float> var(d_avg_output_buffers_full.size(), 0); - for(size_t i = 0; i < d_avg_output_buffers_full.size(); i++) - var[i] = d_avg_output_buffers_full[i]/(d_pc_counter-1); + for (size_t i = 0; i < d_avg_output_buffers_full.size(); i++) + var[i] = d_avg_output_buffers_full[i] / (d_pc_counter - 1); return var; - } - - float - block_detail::pc_work_time_var() - { - return d_var_work_time/(d_pc_counter-1); - } - - float - block_detail::pc_work_time_total() - { - return d_total_work_time; - } - - float - block_detail::pc_throughput_avg() { - return d_avg_throughput; - } +} + +float block_detail::pc_work_time_var() { return d_var_work_time / (d_pc_counter - 1); } + +float block_detail::pc_work_time_total() { return d_total_work_time; } + +float block_detail::pc_throughput_avg() { return d_avg_throughput; } } /* namespace gr */ diff --git a/gnuradio-runtime/lib/block_executor.cc b/gnuradio-runtime/lib/block_executor.cc index 40521e10b5..9f0d7ded5e 100644 --- a/gnuradio-runtime/lib/block_executor.cc +++ b/gnuradio-runtime/lib/block_executor.cc @@ -42,529 +42,543 @@ namespace gr { #define ENABLE_LOGGING 0 #if (ENABLE_LOGGING) -#define LOG(x) do { x; } while(0) +#define LOG(x) \ + do { \ + x; \ + } while (0) #else -#define LOG(x) do {;} while(0) +#define LOG(x) \ + do { \ + ; \ + } while (0) #endif - static int which_scheduler = 0; +static int which_scheduler = 0; - inline static unsigned int - round_up(unsigned int n, unsigned int multiple) - { +inline static unsigned int round_up(unsigned int n, unsigned int multiple) +{ return ((n + multiple - 1) / multiple) * multiple; - } +} - inline static unsigned int - round_down(unsigned int n, unsigned int multiple) - { +inline static unsigned int round_down(unsigned int n, unsigned int multiple) +{ return (n / multiple) * multiple; - } - - // - // Return minimum available write space in all our downstream - // buffers or -1 if we're output blocked and the output we're - // blocked on is done. - // - static int - min_available_space(block_detail *d, int output_multiple, int min_noutput_items) - { +} + +// +// Return minimum available write space in all our downstream +// buffers or -1 if we're output blocked and the output we're +// blocked on is done. +// +static int +min_available_space(block_detail* d, int output_multiple, int min_noutput_items) +{ int min_space = std::numeric_limits<int>::max(); - if(min_noutput_items == 0) - min_noutput_items = 1; - for(int i = 0; i < d->noutputs (); i++) { - buffer_sptr out_buf = d->output(i); - gr::thread::scoped_lock guard(*out_buf->mutex()); - int avail_n = round_down(out_buf->space_available(), output_multiple); - int best_n = round_down(out_buf->bufsize()/2, output_multiple); - if(best_n < min_noutput_items) - throw std::runtime_error("Buffer too small for min_noutput_items"); - int n = std::min(avail_n, best_n); - if(n < min_noutput_items){ // We're blocked on output. - if(out_buf->done()){ // Downstream is done, therefore we're done. - return -1; + if (min_noutput_items == 0) + min_noutput_items = 1; + for (int i = 0; i < d->noutputs(); i++) { + buffer_sptr out_buf = d->output(i); + gr::thread::scoped_lock guard(*out_buf->mutex()); + int avail_n = round_down(out_buf->space_available(), output_multiple); + int best_n = round_down(out_buf->bufsize() / 2, output_multiple); + if (best_n < min_noutput_items) + throw std::runtime_error("Buffer too small for min_noutput_items"); + int n = std::min(avail_n, best_n); + if (n < min_noutput_items) { // We're blocked on output. + if (out_buf->done()) { // Downstream is done, therefore we're done. + return -1; + } + return 0; } - return 0; - } - min_space = std::min(min_space, n); + min_space = std::min(min_space, n); } return min_space; - } - - static bool - propagate_tags(block::tag_propagation_policy_t policy, block_detail *d, - const std::vector<uint64_t> &start_nitems_read, double rrate, - mpq_class &mp_rrate, bool use_fp_rrate, - std::vector<tag_t> &rtags, long block_id) - { +} + +static bool propagate_tags(block::tag_propagation_policy_t policy, + block_detail* d, + const std::vector<uint64_t>& start_nitems_read, + double rrate, + mpq_class& mp_rrate, + bool use_fp_rrate, + std::vector<tag_t>& rtags, + long block_id) +{ static const mpq_class one_half(1, 2); // Move tags downstream // if a sink, we don't need to move downstream - if(d->sink_p()) { - return true; + if (d->sink_p()) { + return true; } - switch(policy) { + switch (policy) { case block::TPP_DONT: case block::TPP_CUSTOM: - return true; - case block::TPP_ALL_TO_ALL: - { - // every tag on every input propagates to everyone downstream - std::vector<buffer_sptr> out_buf; - - for(int i = 0; i < d->ninputs(); i++) { - d->get_tags_in_range(rtags, i, start_nitems_read[i], - d->nitems_read(i), block_id); - - if (rtags.size() == 0) - continue; - - if (out_buf.size() == 0) { - out_buf.reserve(d->noutputs()); - for(int o = 0; o < d->noutputs(); o++) - out_buf.push_back(d->output(o)); - } + return true; + case block::TPP_ALL_TO_ALL: { + // every tag on every input propagates to everyone downstream + std::vector<buffer_sptr> out_buf; + + for (int i = 0; i < d->ninputs(); i++) { + d->get_tags_in_range( + rtags, i, start_nitems_read[i], d->nitems_read(i), block_id); + + if (rtags.size() == 0) + continue; + + if (out_buf.size() == 0) { + out_buf.reserve(d->noutputs()); + for (int o = 0; o < d->noutputs(); o++) + out_buf.push_back(d->output(o)); + } - std::vector<tag_t>::iterator t; - if(rrate == 1.0) { - for(t = rtags.begin(); t != rtags.end(); t++) { - for(int o = 0; o < d->noutputs(); o++) - out_buf[o]->add_item_tag(*t); - } - } - else if(use_fp_rrate) { - for(t = rtags.begin(); t != rtags.end(); t++) { - tag_t new_tag = *t; - new_tag.offset = ((double)new_tag.offset * rrate) + 0.5; - for(int o = 0; o < d->noutputs(); o++) - out_buf[o]->add_item_tag(new_tag); - } - } - else { - mpz_class offset; - for(t = rtags.begin(); t != rtags.end(); t++) { - tag_t new_tag = *t; - mpz_import(offset.get_mpz_t(), 1, 1, sizeof(new_tag.offset), 0, 0, &new_tag.offset); - offset = offset * mp_rrate + one_half; - new_tag.offset = offset.get_ui(); - for(int o = 0; o < d->noutputs(); o++) - out_buf[o]->add_item_tag(new_tag); - } + std::vector<tag_t>::iterator t; + if (rrate == 1.0) { + for (t = rtags.begin(); t != rtags.end(); t++) { + for (int o = 0; o < d->noutputs(); o++) + out_buf[o]->add_item_tag(*t); + } + } else if (use_fp_rrate) { + for (t = rtags.begin(); t != rtags.end(); t++) { + tag_t new_tag = *t; + new_tag.offset = ((double)new_tag.offset * rrate) + 0.5; + for (int o = 0; o < d->noutputs(); o++) + out_buf[o]->add_item_tag(new_tag); + } + } else { + mpz_class offset; + for (t = rtags.begin(); t != rtags.end(); t++) { + tag_t new_tag = *t; + mpz_import(offset.get_mpz_t(), + 1, + 1, + sizeof(new_tag.offset), + 0, + 0, + &new_tag.offset); + offset = offset * mp_rrate + one_half; + new_tag.offset = offset.get_ui(); + for (int o = 0; o < d->noutputs(); o++) + out_buf[o]->add_item_tag(new_tag); + } + } } - } - } - break; + } break; case block::TPP_ONE_TO_ONE: - // tags from input i only go to output i - // this requires d->ninputs() == d->noutputs; this is checked when this - // type of tag-propagation system is selected in block_detail - if(d->ninputs() == d->noutputs()) { - buffer_sptr out_buf; - - for(int i = 0; i < d->ninputs(); i++) { - d->get_tags_in_range(rtags, i, start_nitems_read[i], - d->nitems_read(i), block_id); - - if (rtags.size() == 0) - continue; - - out_buf = d->output(i); - - std::vector<tag_t>::iterator t; - if(rrate == 1.0) { - for(t = rtags.begin(); t != rtags.end(); t++) { - out_buf->add_item_tag(*t); - } - } - else if(use_fp_rrate) { - for(t = rtags.begin(); t != rtags.end(); t++) { - tag_t new_tag = *t; - new_tag.offset = ((double)new_tag.offset * rrate) + 0.5; - out_buf->add_item_tag(new_tag); + // tags from input i only go to output i + // this requires d->ninputs() == d->noutputs; this is checked when this + // type of tag-propagation system is selected in block_detail + if (d->ninputs() == d->noutputs()) { + buffer_sptr out_buf; + + for (int i = 0; i < d->ninputs(); i++) { + d->get_tags_in_range( + rtags, i, start_nitems_read[i], d->nitems_read(i), block_id); + + if (rtags.size() == 0) + continue; + + out_buf = d->output(i); + + std::vector<tag_t>::iterator t; + if (rrate == 1.0) { + for (t = rtags.begin(); t != rtags.end(); t++) { + out_buf->add_item_tag(*t); + } + } else if (use_fp_rrate) { + for (t = rtags.begin(); t != rtags.end(); t++) { + tag_t new_tag = *t; + new_tag.offset = ((double)new_tag.offset * rrate) + 0.5; + out_buf->add_item_tag(new_tag); + } + } else { + mpz_class offset; + for (t = rtags.begin(); t != rtags.end(); t++) { + tag_t new_tag = *t; + mpz_import(offset.get_mpz_t(), + 1, + 1, + sizeof(new_tag.offset), + 0, + 0, + &new_tag.offset); + offset = offset * mp_rrate + one_half; + new_tag.offset = offset.get_ui(); + out_buf->add_item_tag(new_tag); + } + } } - } - else { - mpz_class offset; - for(t = rtags.begin(); t != rtags.end(); t++) { - tag_t new_tag = *t; - mpz_import(offset.get_mpz_t(), 1, 1, sizeof(new_tag.offset), 0, 0, &new_tag.offset); - offset = offset * mp_rrate + one_half; - new_tag.offset = offset.get_ui(); - out_buf->add_item_tag(new_tag); - } - } + } else { + std::cerr << "Error: block_executor: propagation_policy 'ONE-TO-ONE' " + "requires ninputs == noutputs" + << std::endl; + return false; } - } - else { - std::cerr << "Error: block_executor: propagation_policy 'ONE-TO-ONE' requires ninputs == noutputs" << std::endl; - return false; - } - break; + break; default: - return true; + return true; } return true; - } +} - block_executor::block_executor(block_sptr block, int max_noutput_items) +block_executor::block_executor(block_sptr block, int max_noutput_items) : d_block(block), d_log(0), d_max_noutput_items(max_noutput_items) - { - if(ENABLE_LOGGING) { - std::string name = str(boost::format("sst-%03d.log") % which_scheduler++); - d_log = new std::ofstream(name.c_str()); - std::unitbuf(*d_log); // make it unbuffered... - *d_log << "block_executor: " - << d_block << std::endl; +{ + if (ENABLE_LOGGING) { + std::string name = str(boost::format("sst-%03d.log") % which_scheduler++); + d_log = new std::ofstream(name.c_str()); + std::unitbuf(*d_log); // make it unbuffered... + *d_log << "block_executor: " << d_block << std::endl; } #ifdef GR_PERFORMANCE_COUNTERS - prefs *prefs = prefs::singleton(); + prefs* prefs = prefs::singleton(); d_use_pc = prefs->get_bool("PerfCounters", "on", false); #endif /* GR_PERFORMANCE_COUNTERS */ - d_block->start(); // enable any drivers, etc. - } + d_block->start(); // enable any drivers, etc. +} - block_executor::~block_executor() - { - if(ENABLE_LOGGING) - delete d_log; +block_executor::~block_executor() +{ + if (ENABLE_LOGGING) + delete d_log; - d_block->stop(); // stop any drivers, etc. - } + d_block->stop(); // stop any drivers, etc. +} - block_executor::state - block_executor::run_one_iteration() - { +block_executor::state block_executor::run_one_iteration() +{ int noutput_items; int max_items_avail; int max_noutput_items; int new_alignment = 0; int alignment_state = -1; - block *m = d_block.get(); - block_detail *d = m->detail().get(); + block* m = d_block.get(); + block_detail* d = m->detail().get(); LOG(*d_log << std::endl << m); max_noutput_items = round_down(d_max_noutput_items, m->output_multiple()); - if(d->done()){ - assert(0); - return DONE; + if (d->done()) { + assert(0); + return DONE; } - if(d->source_p ()) { - d_ninput_items_required.resize(0); - d_ninput_items.resize(0); - d_input_items.resize(0); - d_input_done.resize(0); - d_output_items.resize(d->noutputs()); - d_start_nitems_read.resize(0); - - // determine the minimum available output space - noutput_items = min_available_space(d, m->output_multiple (), m->min_noutput_items ()); - noutput_items = std::min(noutput_items, max_noutput_items); - LOG(*d_log << " source\n noutput_items = " << noutput_items << std::endl); - if(noutput_items == -1) // we're done - goto were_done; - - if(noutput_items == 0){ // we're output blocked - LOG(*d_log << " BLKD_OUT\n"); - return BLKD_OUT; - } - - goto setup_call_to_work; // jump to common code + if (d->source_p()) { + d_ninput_items_required.resize(0); + d_ninput_items.resize(0); + d_input_items.resize(0); + d_input_done.resize(0); + d_output_items.resize(d->noutputs()); + d_start_nitems_read.resize(0); + + // determine the minimum available output space + noutput_items = + min_available_space(d, m->output_multiple(), m->min_noutput_items()); + noutput_items = std::min(noutput_items, max_noutput_items); + LOG(*d_log << " source\n noutput_items = " << noutput_items << std::endl); + if (noutput_items == -1) // we're done + goto were_done; + + if (noutput_items == 0) { // we're output blocked + LOG(*d_log << " BLKD_OUT\n"); + return BLKD_OUT; + } + + goto setup_call_to_work; // jump to common code } - else if(d->sink_p ()) { - d_ninput_items_required.resize(d->ninputs ()); - d_ninput_items.resize(d->ninputs ()); - d_input_items.resize(d->ninputs ()); - d_input_done.resize(d->ninputs()); - d_output_items.resize (0); - d_start_nitems_read.resize(d->ninputs()); - LOG(*d_log << " sink\n"); - - max_items_avail = 0; - for(int i = 0; i < d->ninputs (); i++) { - { - /* - * Acquire the mutex and grab local copies of items_available and done. - */ - buffer_reader_sptr in_buf = d->input(i); - gr::thread::scoped_lock guard(*in_buf->mutex()); - d_ninput_items[i] = in_buf->items_available(); - d_input_done[i] = in_buf->done(); - } + else if (d->sink_p()) { + d_ninput_items_required.resize(d->ninputs()); + d_ninput_items.resize(d->ninputs()); + d_input_items.resize(d->ninputs()); + d_input_done.resize(d->ninputs()); + d_output_items.resize(0); + d_start_nitems_read.resize(d->ninputs()); + LOG(*d_log << " sink\n"); + + max_items_avail = 0; + for (int i = 0; i < d->ninputs(); i++) { + { + /* + * Acquire the mutex and grab local copies of items_available and done. + */ + buffer_reader_sptr in_buf = d->input(i); + gr::thread::scoped_lock guard(*in_buf->mutex()); + d_ninput_items[i] = in_buf->items_available(); + d_input_done[i] = in_buf->done(); + } - LOG(*d_log << " d_ninput_items[" << i << "] = " << d_ninput_items[i] << std::endl); - LOG(*d_log << " d_input_done[" << i << "] = " << d_input_done[i] << std::endl); + LOG(*d_log << " d_ninput_items[" << i << "] = " << d_ninput_items[i] + << std::endl); + LOG(*d_log << " d_input_done[" << i << "] = " << d_input_done[i] + << std::endl); - if (d_ninput_items[i] < m->output_multiple() && d_input_done[i]) - goto were_done; + if (d_ninput_items[i] < m->output_multiple() && d_input_done[i]) + goto were_done; - max_items_avail = std::max (max_items_avail, d_ninput_items[i]); - } + max_items_avail = std::max(max_items_avail, d_ninput_items[i]); + } - // take a swag at how much output we can sink - noutput_items = (int)(max_items_avail * m->relative_rate ()); - noutput_items = round_down(noutput_items, m->output_multiple ()); - noutput_items = std::min(noutput_items, max_noutput_items); - LOG(*d_log << " max_items_avail = " << max_items_avail << std::endl); - LOG(*d_log << " noutput_items = " << noutput_items << std::endl); + // take a swag at how much output we can sink + noutput_items = (int)(max_items_avail * m->relative_rate()); + noutput_items = round_down(noutput_items, m->output_multiple()); + noutput_items = std::min(noutput_items, max_noutput_items); + LOG(*d_log << " max_items_avail = " << max_items_avail << std::endl); + LOG(*d_log << " noutput_items = " << noutput_items << std::endl); - if(noutput_items == 0) { // we're blocked on input - LOG(*d_log << " BLKD_IN\n"); - return BLKD_IN; - } + if (noutput_items == 0) { // we're blocked on input + LOG(*d_log << " BLKD_IN\n"); + return BLKD_IN; + } - goto try_again; // Jump to code shared with regular case. + goto try_again; // Jump to code shared with regular case. } else { - // do the regular thing - d_ninput_items_required.resize (d->ninputs ()); - d_ninput_items.resize (d->ninputs ()); - d_input_items.resize (d->ninputs ()); - d_input_done.resize(d->ninputs()); - d_output_items.resize (d->noutputs ()); - d_start_nitems_read.resize(d->ninputs()); - - max_items_avail = 0; - for(int i = 0; i < d->ninputs (); i++) { - { - /* - * Acquire the mutex and grab local copies of items_available and done. - */ - buffer_reader_sptr in_buf = d->input(i); - gr::thread::scoped_lock guard(*in_buf->mutex()); - d_ninput_items[i] = in_buf->items_available (); - d_input_done[i] = in_buf->done(); + // do the regular thing + d_ninput_items_required.resize(d->ninputs()); + d_ninput_items.resize(d->ninputs()); + d_input_items.resize(d->ninputs()); + d_input_done.resize(d->ninputs()); + d_output_items.resize(d->noutputs()); + d_start_nitems_read.resize(d->ninputs()); + + max_items_avail = 0; + for (int i = 0; i < d->ninputs(); i++) { + { + /* + * Acquire the mutex and grab local copies of items_available and done. + */ + buffer_reader_sptr in_buf = d->input(i); + gr::thread::scoped_lock guard(*in_buf->mutex()); + d_ninput_items[i] = in_buf->items_available(); + d_input_done[i] = in_buf->done(); + } + max_items_avail = std::max(max_items_avail, d_ninput_items[i]); } - max_items_avail = std::max(max_items_avail, d_ninput_items[i]); - } - - // determine the minimum available output space - noutput_items = min_available_space(d, m->output_multiple(), m->min_noutput_items()); - if(ENABLE_LOGGING) { - *d_log << " regular "; - *d_log << m->relative_rate_i() << ":" - << m->relative_rate_d() << std::endl; - *d_log << " max_items_avail = " << max_items_avail << std::endl; - *d_log << " noutput_items = " << noutput_items << std::endl; - } - if(noutput_items == -1) // we're done - goto were_done; - - if(noutput_items == 0) { // we're output blocked - LOG(*d_log << " BLKD_OUT\n"); - return BLKD_OUT; - } - try_again: - if(m->fixed_rate()) { - // try to work it forward starting with max_items_avail. - // We want to try to consume all the input we've got. - int reqd_noutput_items = m->fixed_rate_ninput_to_noutput(max_items_avail); - - // only test this if we specifically set the output_multiple - if(m->output_multiple_set()) - reqd_noutput_items = round_down(reqd_noutput_items, m->output_multiple()); - - if(reqd_noutput_items > 0 && reqd_noutput_items <= noutput_items) - noutput_items = reqd_noutput_items; - - // if we need this many outputs, overrule the max_noutput_items setting - max_noutput_items = std::max(m->output_multiple(), max_noutput_items); - } - noutput_items = std::min(noutput_items, max_noutput_items); - - // Check if we're still unaligned; use up items until we're - // aligned again. Otherwise, make sure we set the alignment - // requirement. - if(!m->output_multiple_set()) { - if(m->is_unaligned()) { - // When unaligned, don't just set noutput_items to the remaining - // samples to meet alignment; this causes too much overhead in - // requiring a premature call back here. Set the maximum amount - // of samples to handle unalignment and get us back aligned. - if(noutput_items >= m->unaligned()) { - noutput_items = round_up(noutput_items, m->alignment()) \ - - (m->alignment() - m->unaligned()); - new_alignment = 0; - } - else { - new_alignment = m->unaligned() - noutput_items; - } - alignment_state = 0; + // determine the minimum available output space + noutput_items = + min_available_space(d, m->output_multiple(), m->min_noutput_items()); + if (ENABLE_LOGGING) { + *d_log << " regular "; + *d_log << m->relative_rate_i() << ":" << m->relative_rate_d() << std::endl; + *d_log << " max_items_avail = " << max_items_avail << std::endl; + *d_log << " noutput_items = " << noutput_items << std::endl; } - else if(noutput_items < m->alignment()) { - // if we don't have enough for an aligned call, keep track of - // misalignment, set unaligned flag, and proceed. - new_alignment = m->alignment() - noutput_items; - m->set_unaligned(new_alignment); - m->set_is_unaligned(true); - alignment_state = 1; + if (noutput_items == -1) // we're done + goto were_done; + + if (noutput_items == 0) { // we're output blocked + LOG(*d_log << " BLKD_OUT\n"); + return BLKD_OUT; } - else { - // enough to round down to the nearest alignment and process. - noutput_items = round_down(noutput_items, m->alignment()); - m->set_is_unaligned(false); - alignment_state = 2; + + try_again: + if (m->fixed_rate()) { + // try to work it forward starting with max_items_avail. + // We want to try to consume all the input we've got. + int reqd_noutput_items = m->fixed_rate_ninput_to_noutput(max_items_avail); + + // only test this if we specifically set the output_multiple + if (m->output_multiple_set()) + reqd_noutput_items = round_down(reqd_noutput_items, m->output_multiple()); + + if (reqd_noutput_items > 0 && reqd_noutput_items <= noutput_items) + noutput_items = reqd_noutput_items; + + // if we need this many outputs, overrule the max_noutput_items setting + max_noutput_items = std::max(m->output_multiple(), max_noutput_items); } - } - - // ask the block how much input they need to produce noutput_items - m->forecast (noutput_items, d_ninput_items_required); - - // See if we've got sufficient input available and make sure we - // didn't overflow on the input. - int i; - for(i = 0; i < d->ninputs (); i++) { - if(d_ninput_items_required[i] > d_ninput_items[i]) // not enough - break; - - if(d_ninput_items_required[i] < 0) { - std::cerr << "\nsched: <block " << m->name() - << " (" << m->unique_id() << ")>" - << " thinks its ninput_items required is " - << d_ninput_items_required[i] - << " and cannot be negative.\n" - << "Some parameterization is wrong. " - << "Too large a decimation value?\n\n"; - goto were_done; + noutput_items = std::min(noutput_items, max_noutput_items); + + // Check if we're still unaligned; use up items until we're + // aligned again. Otherwise, make sure we set the alignment + // requirement. + if (!m->output_multiple_set()) { + if (m->is_unaligned()) { + // When unaligned, don't just set noutput_items to the remaining + // samples to meet alignment; this causes too much overhead in + // requiring a premature call back here. Set the maximum amount + // of samples to handle unalignment and get us back aligned. + if (noutput_items >= m->unaligned()) { + noutput_items = round_up(noutput_items, m->alignment()) - + (m->alignment() - m->unaligned()); + new_alignment = 0; + } else { + new_alignment = m->unaligned() - noutput_items; + } + alignment_state = 0; + } else if (noutput_items < m->alignment()) { + // if we don't have enough for an aligned call, keep track of + // misalignment, set unaligned flag, and proceed. + new_alignment = m->alignment() - noutput_items; + m->set_unaligned(new_alignment); + m->set_is_unaligned(true); + alignment_state = 1; + } else { + // enough to round down to the nearest alignment and process. + noutput_items = round_down(noutput_items, m->alignment()); + m->set_is_unaligned(false); + alignment_state = 2; + } } - } - - if(i < d->ninputs()) { // not enough input on input[i] - // if we can, try reducing the size of our output request - if(noutput_items > m->output_multiple()) { - noutput_items /= 2; - noutput_items = round_up(noutput_items, m->output_multiple()); - goto try_again; + + // ask the block how much input they need to produce noutput_items + m->forecast(noutput_items, d_ninput_items_required); + + // See if we've got sufficient input available and make sure we + // didn't overflow on the input. + int i; + for (i = 0; i < d->ninputs(); i++) { + if (d_ninput_items_required[i] > d_ninput_items[i]) // not enough + break; + + if (d_ninput_items_required[i] < 0) { + std::cerr << "\nsched: <block " << m->name() << " (" << m->unique_id() + << ")>" + << " thinks its ninput_items required is " + << d_ninput_items_required[i] << " and cannot be negative.\n" + << "Some parameterization is wrong. " + << "Too large a decimation value?\n\n"; + goto were_done; + } } - // We're blocked on input - LOG(*d_log << " BLKD_IN\n"); - if(d_input_done[i]) // If the upstream block is done, we're done - goto were_done; + if (i < d->ninputs()) { // not enough input on input[i] + // if we can, try reducing the size of our output request + if (noutput_items > m->output_multiple()) { + noutput_items /= 2; + noutput_items = round_up(noutput_items, m->output_multiple()); + goto try_again; + } - // Is it possible to ever fulfill this request? - buffer_reader_sptr in_buf = d->input(i); - if(d_ninput_items_required[i] > in_buf->max_possible_items_available()) { - // Nope, never going to happen... - std::cerr << "\nsched: <block " << m->name() - << " (" << m->unique_id() << ")>" + // We're blocked on input + LOG(*d_log << " BLKD_IN\n"); + if (d_input_done[i]) // If the upstream block is done, we're done + goto were_done; + + // Is it possible to ever fulfill this request? + buffer_reader_sptr in_buf = d->input(i); + if (d_ninput_items_required[i] > in_buf->max_possible_items_available()) { + // Nope, never going to happen... + std::cerr + << "\nsched: <block " << m->name() << " (" << m->unique_id() << ")>" << " is requesting more input data\n" << " than we can provide.\n" - << " ninput_items_required = " - << d_ninput_items_required[i] << "\n" + << " ninput_items_required = " << d_ninput_items_required[i] << "\n" << " max_possible_items_available = " << in_buf->max_possible_items_available() << "\n" << " If this is a filter, consider reducing the number of taps.\n"; - goto were_done; - } + goto were_done; + } - // If we were made unaligned in this round but return here without - // processing; reset the unalignment claim before next entry. - if(alignment_state == 1) { - m->set_unaligned(0); - m->set_is_unaligned(false); + // If we were made unaligned in this round but return here without + // processing; reset the unalignment claim before next entry. + if (alignment_state == 1) { + m->set_unaligned(0); + m->set_is_unaligned(false); + } + return BLKD_IN; } - return BLKD_IN; - } - // We've got enough data on each input to produce noutput_items. - // Finish setting up the call to work. - for(int i = 0; i < d->ninputs (); i++) - d_input_items[i] = d->input(i)->read_pointer(); + // We've got enough data on each input to produce noutput_items. + // Finish setting up the call to work. + for (int i = 0; i < d->ninputs(); i++) + d_input_items[i] = d->input(i)->read_pointer(); setup_call_to_work: - d->d_produce_or = 0; - for(int i = 0; i < d->noutputs (); i++) - d_output_items[i] = d->output(i)->write_pointer(); + d->d_produce_or = 0; + for (int i = 0; i < d->noutputs(); i++) + d_output_items[i] = d->output(i)->write_pointer(); - // determine where to start looking for new tags - for(int i = 0; i < d->ninputs(); i++) - d_start_nitems_read[i] = d->nitems_read(i); + // determine where to start looking for new tags + for (int i = 0; i < d->ninputs(); i++) + d_start_nitems_read[i] = d->nitems_read(i); #ifdef GR_PERFORMANCE_COUNTERS - if(d_use_pc) - d->start_perf_counters(); + if (d_use_pc) + d->start_perf_counters(); #endif /* GR_PERFORMANCE_COUNTERS */ - // Do the actual work of the block - int n = m->general_work(noutput_items, d_ninput_items, - d_input_items, d_output_items); + // Do the actual work of the block + int n = + m->general_work(noutput_items, d_ninput_items, d_input_items, d_output_items); #ifdef GR_PERFORMANCE_COUNTERS - if(d_use_pc) - d->stop_perf_counters(noutput_items, n); + if (d_use_pc) + d->stop_perf_counters(noutput_items, n); #endif /* GR_PERFORMANCE_COUNTERS */ - LOG(*d_log << " general_work: noutput_items = " << noutput_items - << " result = " << n << std::endl); - - // Adjust number of unaligned items left to process - if(m->is_unaligned()) { - m->set_unaligned(new_alignment); - m->set_is_unaligned(m->unaligned() != 0); - } - - // Now propagate the tags based on the new relative rate - if(!propagate_tags(m->tag_propagation_policy(), d, - d_start_nitems_read, m->relative_rate(), - m->mp_relative_rate(), m->update_rate(), - d_returned_tags, m->unique_id())) - goto were_done; - - if(n == block::WORK_DONE) - goto were_done; - - if(n != block::WORK_CALLED_PRODUCE) - d->produce_each(n); // advance write pointers - - // For some blocks that can change their produce/consume ratio - // (the relative_rate), we might want to automatically update - // based on the amount of items written/read. - // In the block constructor, use enable_update_rate(true). - if(m->update_rate()) { - //rrate = ((double)(m->nitems_written(0))) / ((double)m->nitems_read(0)); - //if(rrate > 0.0) - // m->set_relative_rate(rrate); - if((n > 0) && (d->consumed() > 0)) - m->set_relative_rate((uint64_t)n, (uint64_t)d->consumed()); - } - - if(d->d_produce_or > 0) // block produced something - return READY; - - // We didn't produce any output even though we called general_work. - // We have (most likely) consumed some input. - - /* - // If this is a source, it's broken. - if(d->source_p()) { - std::cerr << "block_executor: source " << m - << " produced no output. We're marking it DONE.\n"; - // FIXME maybe we ought to raise an exception... - goto were_done; - } - */ - - // Have the caller try again... - return READY_NO_OUTPUT; + LOG(*d_log << " general_work: noutput_items = " << noutput_items + << " result = " << n << std::endl); + + // Adjust number of unaligned items left to process + if (m->is_unaligned()) { + m->set_unaligned(new_alignment); + m->set_is_unaligned(m->unaligned() != 0); + } + + // Now propagate the tags based on the new relative rate + if (!propagate_tags(m->tag_propagation_policy(), + d, + d_start_nitems_read, + m->relative_rate(), + m->mp_relative_rate(), + m->update_rate(), + d_returned_tags, + m->unique_id())) + goto were_done; + + if (n == block::WORK_DONE) + goto were_done; + + if (n != block::WORK_CALLED_PRODUCE) + d->produce_each(n); // advance write pointers + + // For some blocks that can change their produce/consume ratio + // (the relative_rate), we might want to automatically update + // based on the amount of items written/read. + // In the block constructor, use enable_update_rate(true). + if (m->update_rate()) { + // rrate = ((double)(m->nitems_written(0))) / ((double)m->nitems_read(0)); + // if(rrate > 0.0) + // m->set_relative_rate(rrate); + if ((n > 0) && (d->consumed() > 0)) + m->set_relative_rate((uint64_t)n, (uint64_t)d->consumed()); + } + + if (d->d_produce_or > 0) // block produced something + return READY; + + // We didn't produce any output even though we called general_work. + // We have (most likely) consumed some input. + + /* + // If this is a source, it's broken. + if(d->source_p()) { + std::cerr << "block_executor: source " << m + << " produced no output. We're marking it DONE.\n"; + // FIXME maybe we ought to raise an exception... + goto were_done; + } + */ + + // Have the caller try again... + return READY_NO_OUTPUT; } assert(0); - were_done: +were_done: LOG(*d_log << " were_done\n"); - d->set_done (true); + d->set_done(true); return DONE; - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/block_executor.h b/gnuradio-runtime/lib/block_executor.h index 4e1d2f1602..0214bf90aa 100644 --- a/gnuradio-runtime/lib/block_executor.h +++ b/gnuradio-runtime/lib/block_executor.h @@ -30,48 +30,48 @@ namespace gr { - /*! - * \brief Manage the execution of a single block. - * \ingroup internal - */ - class GR_RUNTIME_API block_executor - { - protected: - block_sptr d_block; // The block we're trying to run - std::ofstream *d_log; +/*! + * \brief Manage the execution of a single block. + * \ingroup internal + */ +class GR_RUNTIME_API block_executor +{ +protected: + block_sptr d_block; // The block we're trying to run + std::ofstream* d_log; // These are allocated here so we don't have to on each iteration - gr_vector_int d_ninput_items_required; - gr_vector_int d_ninput_items; - gr_vector_const_void_star d_input_items; - std::vector<bool> d_input_done; - gr_vector_void_star d_output_items; - std::vector<uint64_t> d_start_nitems_read; //stores where tag counts are before work - std::vector<tag_t> d_returned_tags; - int d_max_noutput_items; + gr_vector_int d_ninput_items_required; + gr_vector_int d_ninput_items; + gr_vector_const_void_star d_input_items; + std::vector<bool> d_input_done; + gr_vector_void_star d_output_items; + std::vector<uint64_t> d_start_nitems_read; // stores where tag counts are before work + std::vector<tag_t> d_returned_tags; + int d_max_noutput_items; #ifdef GR_PERFORMANCE_COUNTERS bool d_use_pc; #endif /* GR_PERFORMANCE_COUNTERS */ - public: - block_executor(block_sptr block, int max_noutput_items=100000); +public: + block_executor(block_sptr block, int max_noutput_items = 100000); ~block_executor(); enum state { - READY, // We made progress; everything's cool. - READY_NO_OUTPUT, // We consumed some input, but produced no output. - BLKD_IN, // no progress; we're blocked waiting for input data. - BLKD_OUT, // no progress; we're blocked waiting for output buffer space. - DONE, // we're done; don't call me again. + READY, // We made progress; everything's cool. + READY_NO_OUTPUT, // We consumed some input, but produced no output. + BLKD_IN, // no progress; we're blocked waiting for input data. + BLKD_OUT, // no progress; we're blocked waiting for output buffer space. + DONE, // we're done; don't call me again. }; /* * \brief Run one iteration. */ state run_one_iteration(); - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/lib/block_gateway_impl.cc b/gnuradio-runtime/lib/block_gateway_impl.cc index 535e4f74ca..67f9990c4a 100644 --- a/gnuradio-runtime/lib/block_gateway_impl.cc +++ b/gnuradio-runtime/lib/block_gateway_impl.cc @@ -26,161 +26,144 @@ namespace gr { - /*********************************************************************** - * Helper routines - **********************************************************************/ - template <typename OutType, typename InType> - void - copy_pointers(OutType &out, const InType &in) - { +/*********************************************************************** + * Helper routines + **********************************************************************/ +template <typename OutType, typename InType> +void copy_pointers(OutType& out, const InType& in) +{ out.resize(in.size()); - for(size_t i = 0; i < in.size(); i++) { - out[i] = (void *)(in[i]); + for (size_t i = 0; i < in.size(); i++) { + out[i] = (void*)(in[i]); } - } - - - block_gateway::sptr - block_gateway::make(feval_ll *handler, - const std::string &name, - gr::io_signature::sptr in_sig, - gr::io_signature::sptr out_sig, - const block_gw_work_type work_type, - const unsigned factor) - { - return block_gateway::sptr - (new block_gateway_impl(handler, name, in_sig, out_sig, - work_type, factor)); - } - - block_gateway_impl::block_gateway_impl(feval_ll *handler, - const std::string &name, - gr::io_signature::sptr in_sig, - gr::io_signature::sptr out_sig, - const block_gw_work_type work_type, - const unsigned factor) - : block(name, in_sig, out_sig), - _handler(handler), - _work_type(work_type) - { - switch(_work_type) { +} + + +block_gateway::sptr block_gateway::make(feval_ll* handler, + const std::string& name, + gr::io_signature::sptr in_sig, + gr::io_signature::sptr out_sig, + const block_gw_work_type work_type, + const unsigned factor) +{ + return block_gateway::sptr( + new block_gateway_impl(handler, name, in_sig, out_sig, work_type, factor)); +} + +block_gateway_impl::block_gateway_impl(feval_ll* handler, + const std::string& name, + gr::io_signature::sptr in_sig, + gr::io_signature::sptr out_sig, + const block_gw_work_type work_type, + const unsigned factor) + : block(name, in_sig, out_sig), _handler(handler), _work_type(work_type) +{ + switch (_work_type) { case GR_BLOCK_GW_WORK_GENERAL: - _decim = 1; //not relevant, but set anyway - _interp = 1; //not relevant, but set anyway - break; + _decim = 1; // not relevant, but set anyway + _interp = 1; // not relevant, but set anyway + break; case GR_BLOCK_GW_WORK_SYNC: - _decim = 1; - _interp = 1; - this->set_fixed_rate(true); - break; + _decim = 1; + _interp = 1; + this->set_fixed_rate(true); + break; case GR_BLOCK_GW_WORK_DECIM: - _decim = factor; - _interp = 1; - break; + _decim = factor; + _interp = 1; + break; case GR_BLOCK_GW_WORK_INTERP: - _decim = 1; - _interp = factor; - this->set_output_multiple(_interp); - break; + _decim = 1; + _interp = factor; + this->set_output_multiple(_interp); + break; } - } +} - void - block_gateway_impl::forecast(int noutput_items, - gr_vector_int &ninput_items_required) - { - switch(_work_type) { +void block_gateway_impl::forecast(int noutput_items, gr_vector_int& ninput_items_required) +{ + switch (_work_type) { case GR_BLOCK_GW_WORK_GENERAL: - _message.action = block_gw_message_type::ACTION_FORECAST; - _message.forecast_args_noutput_items = noutput_items; - _message.forecast_args_ninput_items_required = ninput_items_required; - _handler->calleval(0); - ninput_items_required = _message.forecast_args_ninput_items_required; - return; + _message.action = block_gw_message_type::ACTION_FORECAST; + _message.forecast_args_noutput_items = noutput_items; + _message.forecast_args_ninput_items_required = ninput_items_required; + _handler->calleval(0); + ninput_items_required = _message.forecast_args_ninput_items_required; + return; default: - unsigned ninputs = ninput_items_required.size(); - for(unsigned i = 0; i < ninputs; i++) - ninput_items_required[i] = fixed_rate_noutput_to_ninput(noutput_items); - return; + unsigned ninputs = ninput_items_required.size(); + for (unsigned i = 0; i < ninputs; i++) + ninput_items_required[i] = fixed_rate_noutput_to_ninput(noutput_items); + return; } - } - - int - block_gateway_impl::general_work(int noutput_items, - gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) - { - switch(_work_type) { +} + +int block_gateway_impl::general_work(int noutput_items, + gr_vector_int& ninput_items, + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items) +{ + switch (_work_type) { case GR_BLOCK_GW_WORK_GENERAL: - _message.action = block_gw_message_type::ACTION_GENERAL_WORK; - _message.general_work_args_noutput_items = noutput_items; - _message.general_work_args_ninput_items = ninput_items; - copy_pointers(_message.general_work_args_input_items, input_items); - _message.general_work_args_output_items = output_items; - _handler->calleval(0); - return _message.general_work_args_return_value; + _message.action = block_gw_message_type::ACTION_GENERAL_WORK; + _message.general_work_args_noutput_items = noutput_items; + _message.general_work_args_ninput_items = ninput_items; + copy_pointers(_message.general_work_args_input_items, input_items); + _message.general_work_args_output_items = output_items; + _handler->calleval(0); + return _message.general_work_args_return_value; default: - int r = work (noutput_items, input_items, output_items); - if(r > 0) - consume_each(r*_decim/_interp); - return r; + int r = work(noutput_items, input_items, output_items); + if (r > 0) + consume_each(r * _decim / _interp); + return r; } - } +} - int - block_gateway_impl::work(int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) - { +int block_gateway_impl::work(int noutput_items, + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items) +{ _message.action = block_gw_message_type::ACTION_WORK; _message.work_args_ninput_items = fixed_rate_noutput_to_ninput(noutput_items); - if(_message.work_args_ninput_items == 0) - return -1; + if (_message.work_args_ninput_items == 0) + return -1; _message.work_args_noutput_items = noutput_items; copy_pointers(_message.work_args_input_items, input_items); _message.work_args_output_items = output_items; _handler->calleval(0); return _message.work_args_return_value; - } - - int - block_gateway_impl::fixed_rate_noutput_to_ninput(int noutput_items) - { - return (noutput_items*_decim/_interp) + history() - 1; - } - - int - block_gateway_impl::fixed_rate_ninput_to_noutput(int ninput_items) - { - return std::max(0, ninput_items - (int)history() + 1)*_interp/_decim; - } - - bool - block_gateway_impl::start(void) - { +} + +int block_gateway_impl::fixed_rate_noutput_to_ninput(int noutput_items) +{ + return (noutput_items * _decim / _interp) + history() - 1; +} + +int block_gateway_impl::fixed_rate_ninput_to_noutput(int ninput_items) +{ + return std::max(0, ninput_items - (int)history() + 1) * _interp / _decim; +} + +bool block_gateway_impl::start(void) +{ _message.action = block_gw_message_type::ACTION_START; _handler->calleval(0); return _message.start_args_return_value; - } +} - bool - block_gateway_impl::stop(void) - { +bool block_gateway_impl::stop(void) +{ _message.action = block_gw_message_type::ACTION_STOP; _handler->calleval(0); return _message.stop_args_return_value; - } +} - block_gw_message_type& - block_gateway_impl::block_message(void) - { - return _message; - } +block_gw_message_type& block_gateway_impl::block_message(void) { return _message; } } /* namespace gr */ diff --git a/gnuradio-runtime/lib/block_gateway_impl.h b/gnuradio-runtime/lib/block_gateway_impl.h index 1707ecf1c8..b90b54d7a5 100644 --- a/gnuradio-runtime/lib/block_gateway_impl.h +++ b/gnuradio-runtime/lib/block_gateway_impl.h @@ -27,14 +27,14 @@ namespace gr { - /*********************************************************************** - * The gr::block gateway implementation class - **********************************************************************/ - class block_gateway_impl : public block_gateway - { - public: - block_gateway_impl(feval_ll *handler, - const std::string &name, +/*********************************************************************** + * The gr::block gateway implementation class + **********************************************************************/ +class block_gateway_impl : public block_gateway +{ +public: + block_gateway_impl(feval_ll* handler, + const std::string& name, gr::io_signature::sptr in_sig, gr::io_signature::sptr out_sig, const block_gw_work_type work_type, @@ -43,17 +43,16 @@ namespace gr { /******************************************************************* * Overloads for various scheduler-called functions ******************************************************************/ - void forecast(int noutput_items, - gr_vector_int &ninput_items_required); + void forecast(int noutput_items, gr_vector_int& ninput_items_required); int general_work(int noutput_items, - gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items); + gr_vector_int& ninput_items, + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items); int work(int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items); + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items); int fixed_rate_noutput_to_ninput(int noutput_items); int fixed_rate_ninput_to_noutput(int ninput_items); @@ -63,12 +62,12 @@ namespace gr { block_gw_message_type& block_message(void); - private: - feval_ll *_handler; +private: + feval_ll* _handler; block_gw_message_type _message; const block_gw_work_type _work_type; unsigned _decim, _interp; - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/lib/block_registry.cc b/gnuradio-runtime/lib/block_registry.cc index 5241ef9922..f25ad25b86 100644 --- a/gnuradio-runtime/lib/block_registry.cc +++ b/gnuradio-runtime/lib/block_registry.cc @@ -31,124 +31,111 @@ gr::block_registry global_block_registry; namespace gr { - block_registry::block_registry() - { - d_ref_map = pmt::make_dict(); - } - - long - block_registry::block_register(basic_block* block) - { +block_registry::block_registry() { d_ref_map = pmt::make_dict(); } + +long block_registry::block_register(basic_block* block) +{ gr::thread::scoped_lock guard(d_mutex); - if(d_map.find(block->name()) == d_map.end()) { - d_map[block->name()] = blocksubmap_t(); - d_map[block->name()][0] = block; - return 0; - } - else { - for(size_t i=0; i<=d_map[block->name()].size(); i++){ - if(d_map[block->name()].find(i) == d_map[block->name()].end()){ - d_map[block->name()][i] = block; - return i; + if (d_map.find(block->name()) == d_map.end()) { + d_map[block->name()] = blocksubmap_t(); + d_map[block->name()][0] = block; + return 0; + } else { + for (size_t i = 0; i <= d_map[block->name()].size(); i++) { + if (d_map[block->name()].find(i) == d_map[block->name()].end()) { + d_map[block->name()][i] = block; + return i; + } } - } } throw std::runtime_error("should not reach this"); - } +} - void - block_registry::block_unregister(basic_block* block) - { +void block_registry::block_unregister(basic_block* block) +{ gr::thread::scoped_lock guard(d_mutex); - d_map[block->name()].erase( d_map[block->name()].find(block->symbolic_id())); + d_map[block->name()].erase(d_map[block->name()].find(block->symbolic_id())); d_ref_map = pmt::dict_delete(d_ref_map, pmt::intern(block->symbol_name())); - if(block->alias_set()) { - d_ref_map = pmt::dict_delete(d_ref_map, pmt::intern(block->alias())); + if (block->alias_set()) { + d_ref_map = pmt::dict_delete(d_ref_map, pmt::intern(block->alias())); } - } +} - std::string - block_registry::register_symbolic_name(basic_block* block) - { +std::string block_registry::register_symbolic_name(basic_block* block) +{ std::stringstream ss; ss << block->name() << block->symbolic_id(); - //std::cout << "register_symbolic_name: " << ss.str() << std::endl; + // std::cout << "register_symbolic_name: " << ss.str() << std::endl; register_symbolic_name(block, ss.str()); return ss.str(); - } +} - void - block_registry::register_symbolic_name(basic_block* block, std::string name) - { +void block_registry::register_symbolic_name(basic_block* block, std::string name) +{ gr::thread::scoped_lock guard(d_mutex); - if(pmt::dict_has_key(d_ref_map, pmt::intern(name))) { - throw std::runtime_error("symbol already exists, can not re-use!"); + if (pmt::dict_has_key(d_ref_map, pmt::intern(name))) { + throw std::runtime_error("symbol already exists, can not re-use!"); } d_ref_map = pmt::dict_add(d_ref_map, pmt::intern(name), pmt::make_any(block)); - } +} - void - block_registry::update_symbolic_name(basic_block* block, std::string name) - { +void block_registry::update_symbolic_name(basic_block* block, std::string name) +{ gr::thread::scoped_lock guard(d_mutex); - if(pmt::dict_has_key(d_ref_map, pmt::intern(name))) { - throw std::runtime_error("symbol already exists, can not re-use!"); + if (pmt::dict_has_key(d_ref_map, pmt::intern(name))) { + throw std::runtime_error("symbol already exists, can not re-use!"); } // If we don't already have an alias, don't try and delete it. - if(block->alias_set()) { - // And make sure that the registry has the alias key. - // We test both in case the block's and registry ever get out of sync. - if(pmt::dict_has_key(d_ref_map, block->alias_pmt())) { - d_ref_map = pmt::dict_delete(d_ref_map, block->alias_pmt()); - } + if (block->alias_set()) { + // And make sure that the registry has the alias key. + // We test both in case the block's and registry ever get out of sync. + if (pmt::dict_has_key(d_ref_map, block->alias_pmt())) { + d_ref_map = pmt::dict_delete(d_ref_map, block->alias_pmt()); + } } d_ref_map = pmt::dict_add(d_ref_map, pmt::intern(name), pmt::make_any(block)); - } +} - basic_block_sptr - block_registry::block_lookup(pmt::pmt_t symbol) - { +basic_block_sptr block_registry::block_lookup(pmt::pmt_t symbol) +{ gr::thread::scoped_lock guard(d_mutex); pmt::pmt_t ref = pmt::dict_ref(d_ref_map, symbol, pmt::PMT_NIL); - if(pmt::eq(ref, pmt::PMT_NIL)) { - throw std::runtime_error("block lookup failed! block not found!"); + if (pmt::eq(ref, pmt::PMT_NIL)) { + throw std::runtime_error("block lookup failed! block not found!"); } basic_block* blk = boost::any_cast<basic_block*>(pmt::any_ref(ref)); return blk->shared_from_this(); - } +} - void - block_registry::register_primitive(std::string blk, block* ref) - { +void block_registry::register_primitive(std::string blk, block* ref) +{ gr::thread::scoped_lock guard(d_mutex); primitive_map[blk] = ref; - } +} - void - block_registry::unregister_primitive(std::string blk) - { +void block_registry::unregister_primitive(std::string blk) +{ gr::thread::scoped_lock guard(d_mutex); primitive_map.erase(primitive_map.find(blk)); - } +} - void - block_registry::notify_blk(std::string blk) - { +void block_registry::notify_blk(std::string blk) +{ gr::thread::scoped_lock guard(d_mutex); - if(primitive_map.find(blk) == primitive_map.end()) { - return; + if (primitive_map.find(blk) == primitive_map.end()) { + return; } - if(primitive_map[blk]->detail().get()) - primitive_map[blk]->detail()->d_tpb.notify_msg(); - } + if (primitive_map[blk]->detail().get()) + primitive_map[blk]->detail()->d_tpb.notify_msg(); +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/buffer.cc b/gnuradio-runtime/lib/buffer.cc index 1681c12763..e66e9ed6c6 100644 --- a/gnuradio-runtime/lib/buffer.cc +++ b/gnuradio-runtime/lib/buffer.cc @@ -44,217 +44,212 @@ namespace gr { - static long s_buffer_count = 0; // counts for debugging storage mgmt - static long s_buffer_reader_count = 0; - - /* ---------------------------------------------------------------------------- - Notes on storage management - - Pretty much all the fundamental classes are now using the - shared_ptr stuff for automatic reference counting. To ensure that - no mistakes are made, we make the constructors for classes private, - and then provide a free factory function that returns a smart - pointer to the desired class. - - gr::buffer and gr::buffer_reader are no exceptions. However, they - both want pointers to each other, and unless we do something, we'll - never delete any of them because of the circular structure. - They'll always have a reference count of at least one. We could - use boost::weak_ptr's from gr::buffer to gr::buffer_reader but that - introduces it's own problems. (gr::buffer_reader's destructor needs - to call gr::buffer::drop_reader, but has no easy way to get a - shared_ptr to itself.) - - Instead, we solve this problem by having gr::buffer hold a raw - pointer to gr::buffer_reader in its d_reader vector. - gr::buffer_reader's destructor calls gr::buffer::drop_reader, so - we're never left with an dangling pointer. gr::buffer_reader still - has a shared_ptr to the buffer ensuring that the buffer doesn't go - away under it. However, when the reference count of a - gr::buffer_reader goes to zero, we can successfully reclaim it. - ---------------------------------------------------------------------------- */ - - /* - * Compute the minimum number of buffer items that work (i.e., - * address space wrap-around works). To work is to satisfy this - * constraint for integer buffer_size and k: - * - * type_size * nitems == k * page_size - */ - static long - minimum_buffer_items(long type_size, long page_size) - { +static long s_buffer_count = 0; // counts for debugging storage mgmt +static long s_buffer_reader_count = 0; + +/* ---------------------------------------------------------------------------- + Notes on storage management + + Pretty much all the fundamental classes are now using the + shared_ptr stuff for automatic reference counting. To ensure that + no mistakes are made, we make the constructors for classes private, + and then provide a free factory function that returns a smart + pointer to the desired class. + + gr::buffer and gr::buffer_reader are no exceptions. However, they + both want pointers to each other, and unless we do something, we'll + never delete any of them because of the circular structure. + They'll always have a reference count of at least one. We could + use boost::weak_ptr's from gr::buffer to gr::buffer_reader but that + introduces it's own problems. (gr::buffer_reader's destructor needs + to call gr::buffer::drop_reader, but has no easy way to get a + shared_ptr to itself.) + + Instead, we solve this problem by having gr::buffer hold a raw + pointer to gr::buffer_reader in its d_reader vector. + gr::buffer_reader's destructor calls gr::buffer::drop_reader, so + we're never left with an dangling pointer. gr::buffer_reader still + has a shared_ptr to the buffer ensuring that the buffer doesn't go + away under it. However, when the reference count of a + gr::buffer_reader goes to zero, we can successfully reclaim it. + ---------------------------------------------------------------------------- */ + +/* + * Compute the minimum number of buffer items that work (i.e., + * address space wrap-around works). To work is to satisfy this + * constraint for integer buffer_size and k: + * + * type_size * nitems == k * page_size + */ +static long minimum_buffer_items(long type_size, long page_size) +{ #if (BOOST_VERSION < 105800) - return page_size / boost::math::gcd (type_size, page_size); + return page_size / boost::math::gcd(type_size, page_size); #else - return page_size / boost::integer::gcd (type_size, page_size); + return page_size / boost::integer::gcd(type_size, page_size); #endif - } - - - buffer::buffer(int nitems, size_t sizeof_item, block_sptr link) - : d_base(0), d_bufsize(0), d_max_reader_delay(0), d_vmcircbuf(0), - d_sizeof_item(sizeof_item), d_link(link), - d_write_index(0), d_abs_write_offset(0), d_done(false), +} + + +buffer::buffer(int nitems, size_t sizeof_item, block_sptr link) + : d_base(0), + d_bufsize(0), + d_max_reader_delay(0), + d_vmcircbuf(0), + d_sizeof_item(sizeof_item), + d_link(link), + d_write_index(0), + d_abs_write_offset(0), + d_done(false), d_last_min_items_read(0) - { - if(!allocate_buffer (nitems, sizeof_item)) - throw std::bad_alloc (); +{ + if (!allocate_buffer(nitems, sizeof_item)) + throw std::bad_alloc(); s_buffer_count++; - } +} - buffer_sptr - make_buffer(int nitems, size_t sizeof_item, block_sptr link) - { +buffer_sptr make_buffer(int nitems, size_t sizeof_item, block_sptr link) +{ return buffer_sptr(new buffer(nitems, sizeof_item, link)); - } +} - buffer::~buffer() - { +buffer::~buffer() +{ delete d_vmcircbuf; assert(d_readers.size() == 0); s_buffer_count--; - } - - /*! - * sets d_vmcircbuf, d_base, d_bufsize. - * returns true iff successful. - */ - bool - buffer::allocate_buffer(int nitems, size_t sizeof_item) - { +} + +/*! + * sets d_vmcircbuf, d_base, d_bufsize. + * returns true iff successful. + */ +bool buffer::allocate_buffer(int nitems, size_t sizeof_item) +{ int orig_nitems = nitems; // Any buffersize we come up with must be a multiple of min_nitems. int granularity = gr::vmcircbuf_sysconfig::granularity(); - int min_nitems = minimum_buffer_items(sizeof_item, granularity); + int min_nitems = minimum_buffer_items(sizeof_item, granularity); // Round-up nitems to a multiple of min_nitems. - if(nitems % min_nitems != 0) - nitems = ((nitems / min_nitems) + 1) * min_nitems; + if (nitems % min_nitems != 0) + nitems = ((nitems / min_nitems) + 1) * min_nitems; // If we rounded-up a whole bunch, give the user a heads up. // This only happens if sizeof_item is not a power of two. - if(nitems > 2 * orig_nitems && nitems * (int) sizeof_item > granularity){ - std::cerr << "gr::buffer::allocate_buffer: warning: tried to allocate\n" - << " " << orig_nitems << " items of size " - << sizeof_item << ". Due to alignment requirements\n" - << " " << nitems << " were allocated. If this isn't OK, consider padding\n" - << " your structure to a power-of-two bytes.\n" - << " On this platform, our allocation granularity is " << granularity << " bytes.\n"; + if (nitems > 2 * orig_nitems && nitems * (int)sizeof_item > granularity) { + std::cerr << "gr::buffer::allocate_buffer: warning: tried to allocate\n" + << " " << orig_nitems << " items of size " << sizeof_item + << ". Due to alignment requirements\n" + << " " << nitems + << " were allocated. If this isn't OK, consider padding\n" + << " your structure to a power-of-two bytes.\n" + << " On this platform, our allocation granularity is " << granularity + << " bytes.\n"; } d_bufsize = nitems; d_vmcircbuf = gr::vmcircbuf_sysconfig::make(d_bufsize * d_sizeof_item); - if(d_vmcircbuf == 0){ - std::cerr << "gr::buffer::allocate_buffer: failed to allocate buffer of size " - << d_bufsize * d_sizeof_item / 1024 << " KB\n"; - return false; + if (d_vmcircbuf == 0) { + std::cerr << "gr::buffer::allocate_buffer: failed to allocate buffer of size " + << d_bufsize * d_sizeof_item / 1024 << " KB\n"; + return false; } d_base = (char*)d_vmcircbuf->pointer_to_first_copy(); return true; - } +} - int - buffer::space_available() - { - if(d_readers.empty()) - return d_bufsize - 1; // See comment below +int buffer::space_available() +{ + if (d_readers.empty()) + return d_bufsize - 1; // See comment below else { - // Find out the maximum amount of data available to our readers - - int most_data = d_readers[0]->items_available(); - uint64_t min_items_read = d_readers[0]->nitems_read(); - for(size_t i = 1; i < d_readers.size (); i++) { - most_data = std::max(most_data, d_readers[i]->items_available()); - min_items_read = std::min(min_items_read, d_readers[i]->nitems_read()); - } - - if(min_items_read != d_last_min_items_read) { - prune_tags(d_last_min_items_read); - d_last_min_items_read = min_items_read; - } - - // The -1 ensures that the case d_write_index == d_read_index is - // unambiguous. It indicates that there is no data for the reader - return d_bufsize - most_data - 1; + // Find out the maximum amount of data available to our readers + + int most_data = d_readers[0]->items_available(); + uint64_t min_items_read = d_readers[0]->nitems_read(); + for (size_t i = 1; i < d_readers.size(); i++) { + most_data = std::max(most_data, d_readers[i]->items_available()); + min_items_read = std::min(min_items_read, d_readers[i]->nitems_read()); + } + + if (min_items_read != d_last_min_items_read) { + prune_tags(d_last_min_items_read); + d_last_min_items_read = min_items_read; + } + + // The -1 ensures that the case d_write_index == d_read_index is + // unambiguous. It indicates that there is no data for the reader + return d_bufsize - most_data - 1; } - } +} - void * - buffer::write_pointer() - { - return &d_base[d_write_index * d_sizeof_item]; - } +void* buffer::write_pointer() { return &d_base[d_write_index * d_sizeof_item]; } - void - buffer::update_write_pointer(int nitems) - { +void buffer::update_write_pointer(int nitems) +{ gr::thread::scoped_lock guard(*mutex()); d_write_index = index_add(d_write_index, nitems); d_abs_write_offset += nitems; - } +} - void - buffer::set_done(bool done) - { +void buffer::set_done(bool done) +{ gr::thread::scoped_lock guard(*mutex()); d_done = done; - } - - buffer_reader_sptr - buffer_add_reader(buffer_sptr buf, int nzero_preload, block_sptr link, int delay) - { - if(nzero_preload < 0) - throw std::invalid_argument("buffer_add_reader: nzero_preload must be >= 0"); - - buffer_reader_sptr r(new buffer_reader(buf, - buf->index_sub(buf->d_write_index, - nzero_preload), - link)); +} + +buffer_reader_sptr +buffer_add_reader(buffer_sptr buf, int nzero_preload, block_sptr link, int delay) +{ + if (nzero_preload < 0) + throw std::invalid_argument("buffer_add_reader: nzero_preload must be >= 0"); + + buffer_reader_sptr r( + new buffer_reader(buf, buf->index_sub(buf->d_write_index, nzero_preload), link)); r->declare_sample_delay(delay); - buf->d_readers.push_back(r.get ()); + buf->d_readers.push_back(r.get()); return r; - } +} - void - buffer::drop_reader(buffer_reader *reader) - { - std::vector<buffer_reader *>::iterator result = - std::find(d_readers.begin(), d_readers.end(), reader); +void buffer::drop_reader(buffer_reader* reader) +{ + std::vector<buffer_reader*>::iterator result = + std::find(d_readers.begin(), d_readers.end(), reader); - if(result == d_readers.end()) - throw std::invalid_argument("buffer::drop_reader"); // we didn't find it... + if (result == d_readers.end()) + throw std::invalid_argument("buffer::drop_reader"); // we didn't find it... d_readers.erase(result); - } +} - void - buffer::add_item_tag(const tag_t &tag) - { +void buffer::add_item_tag(const tag_t& tag) +{ gr::thread::scoped_lock guard(*mutex()); - d_item_tags.insert(std::pair<uint64_t,tag_t>(tag.offset,tag)); - } + d_item_tags.insert(std::pair<uint64_t, tag_t>(tag.offset, tag)); +} - void - buffer::remove_item_tag(const tag_t &tag, long id) - { +void buffer::remove_item_tag(const tag_t& tag, long id) +{ gr::thread::scoped_lock guard(*mutex()); - for(std::multimap<uint64_t,tag_t>::iterator it = d_item_tags.lower_bound(tag.offset); it != d_item_tags.upper_bound(tag.offset); ++it) { - if((*it).second == tag) { - (*it).second.marked_deleted.push_back(id); - } + for (std::multimap<uint64_t, tag_t>::iterator it = + d_item_tags.lower_bound(tag.offset); + it != d_item_tags.upper_bound(tag.offset); + ++it) { + if ((*it).second == tag) { + (*it).second.marked_deleted.push_back(id); + } } - } +} - void - buffer::prune_tags(uint64_t max_time) - { +void buffer::prune_tags(uint64_t max_time) +{ /* NOTE: this function _should_ lock the mutex before editing d_item_tags. In practice, this function is only called at runtime by min_available_space in block_executor.cc, which @@ -276,115 +271,101 @@ namespace gr { */ uint64_t item_time; - std::multimap<uint64_t,tag_t>::iterator itr(d_item_tags.begin()), tmp; - while(itr != d_item_tags.end()) { - item_time = (*itr).second.offset; - if(item_time+d_max_reader_delay + bufsize() < max_time) { - tmp = itr; - itr++; - d_item_tags.erase(tmp); - } - else { - // d_item_tags is a map sorted by offset, so when the if - // condition above fails, all future tags in the map must also - // fail. So just break here. - break; - } + std::multimap<uint64_t, tag_t>::iterator itr(d_item_tags.begin()), tmp; + while (itr != d_item_tags.end()) { + item_time = (*itr).second.offset; + if (item_time + d_max_reader_delay + bufsize() < max_time) { + tmp = itr; + itr++; + d_item_tags.erase(tmp); + } else { + // d_item_tags is a map sorted by offset, so when the if + // condition above fails, all future tags in the map must also + // fail. So just break here. + break; + } } - } +} - long - buffer_ncurrently_allocated() - { - return s_buffer_count; - } +long buffer_ncurrently_allocated() { return s_buffer_count; } - // ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- - buffer_reader::buffer_reader(buffer_sptr buffer, unsigned int read_index, - block_sptr link) - : d_buffer(buffer), d_read_index(read_index), d_abs_read_offset(0), d_link(link), +buffer_reader::buffer_reader(buffer_sptr buffer, unsigned int read_index, block_sptr link) + : d_buffer(buffer), + d_read_index(read_index), + d_abs_read_offset(0), + d_link(link), d_attr_delay(0) - { +{ s_buffer_reader_count++; buffer->d_max_reader_delay = 0; - } +} - buffer_reader::~buffer_reader() - { +buffer_reader::~buffer_reader() +{ d_buffer->drop_reader(this); s_buffer_reader_count--; - } +} - void - buffer_reader::declare_sample_delay(unsigned delay) - { +void buffer_reader::declare_sample_delay(unsigned delay) +{ d_attr_delay = delay; - d_buffer->d_max_reader_delay = std::max(d_attr_delay, - d_buffer->d_max_reader_delay); - } - - unsigned - buffer_reader::sample_delay() const - { - return d_attr_delay; - } - - int - buffer_reader::items_available() const - { + d_buffer->d_max_reader_delay = std::max(d_attr_delay, d_buffer->d_max_reader_delay); +} + +unsigned buffer_reader::sample_delay() const { return d_attr_delay; } + +int buffer_reader::items_available() const +{ return d_buffer->index_sub(d_buffer->d_write_index, d_read_index); - } +} - const void * - buffer_reader::read_pointer() - { +const void* buffer_reader::read_pointer() +{ return &d_buffer->d_base[d_read_index * d_buffer->d_sizeof_item]; - } +} - void - buffer_reader::update_read_pointer(int nitems) - { +void buffer_reader::update_read_pointer(int nitems) +{ gr::thread::scoped_lock guard(*mutex()); - d_read_index = d_buffer->index_add (d_read_index, nitems); + d_read_index = d_buffer->index_add(d_read_index, nitems); d_abs_read_offset += nitems; - } - - void - buffer_reader::get_tags_in_range(std::vector<tag_t> &v, - uint64_t abs_start, - uint64_t abs_end, - long id) - { +} + +void buffer_reader::get_tags_in_range(std::vector<tag_t>& v, + uint64_t abs_start, + uint64_t abs_end, + long id) +{ gr::thread::scoped_lock guard(*mutex()); v.clear(); - std::multimap<uint64_t,tag_t>::iterator itr = d_buffer->get_tags_lower_bound(std::min(abs_start, abs_start - d_attr_delay)); - std::multimap<uint64_t,tag_t>::iterator itr_end = d_buffer->get_tags_upper_bound(std::min(abs_end, abs_end - d_attr_delay)); + std::multimap<uint64_t, tag_t>::iterator itr = + d_buffer->get_tags_lower_bound(std::min(abs_start, abs_start - d_attr_delay)); + std::multimap<uint64_t, tag_t>::iterator itr_end = + d_buffer->get_tags_upper_bound(std::min(abs_end, abs_end - d_attr_delay)); uint64_t item_time; - while(itr != itr_end) { - item_time = (*itr).second.offset + d_attr_delay; - if((item_time >= abs_start) && (item_time < abs_end)) { - std::vector<long>::iterator id_itr; - id_itr = std::find(itr->second.marked_deleted.begin(), itr->second.marked_deleted.end(), id); - // If id is not in the vector of marked blocks - if(id_itr == itr->second.marked_deleted.end()) { - tag_t t = (*itr).second; - t.offset += d_attr_delay; - v.push_back(t); - v.back().marked_deleted.clear(); + while (itr != itr_end) { + item_time = (*itr).second.offset + d_attr_delay; + if ((item_time >= abs_start) && (item_time < abs_end)) { + std::vector<long>::iterator id_itr; + id_itr = std::find( + itr->second.marked_deleted.begin(), itr->second.marked_deleted.end(), id); + // If id is not in the vector of marked blocks + if (id_itr == itr->second.marked_deleted.end()) { + tag_t t = (*itr).second; + t.offset += d_attr_delay; + v.push_back(t); + v.back().marked_deleted.clear(); + } } - } - itr++; + itr++; } - } +} - long - buffer_reader_ncurrently_allocated() - { - return s_buffer_reader_count; - } +long buffer_reader_ncurrently_allocated() { return s_buffer_reader_count; } } /* namespace gr */ diff --git a/gnuradio-runtime/lib/circular_file.cc b/gnuradio-runtime/lib/circular_file.cc index 9cef419426..3569baf280 100644 --- a/gnuradio-runtime/lib/circular_file.cc +++ b/gnuradio-runtime/lib/circular_file.cc @@ -49,64 +49,62 @@ namespace gr { - static const int HEADER_SIZE = 4096; - static const int HEADER_MAGIC = 0xEB021026; +static const int HEADER_SIZE = 4096; +static const int HEADER_MAGIC = 0xEB021026; - static const int HD_MAGIC = 0; - static const int HD_HEADER_SIZE = 1; // integer offsets into header - static const int HD_BUFFER_SIZE = 2; - static const int HD_BUFFER_BASE = 3; - static const int HD_BUFFER_CURRENT = 4; +static const int HD_MAGIC = 0; +static const int HD_HEADER_SIZE = 1; // integer offsets into header +static const int HD_BUFFER_SIZE = 2; +static const int HD_BUFFER_BASE = 3; +static const int HD_BUFFER_CURRENT = 4; - circular_file::circular_file(const char *filename, - bool writable, int size) +circular_file::circular_file(const char* filename, bool writable, int size) : d_fd(-1), d_header(0), d_buffer(0), d_mapped_size(0), d_bytes_read(0) - { +{ int mm_prot; - if(writable) { + if (writable) { #ifdef HAVE_MMAP - mm_prot = PROT_READ | PROT_WRITE; + mm_prot = PROT_READ | PROT_WRITE; #endif - d_fd = open(filename, O_CREAT | O_RDWR | O_TRUNC, 0664); - if(d_fd < 0) { - perror(filename); - exit(1); - } -#ifdef HAVE_MMAP /* FIXME */ - if(ftruncate(d_fd, size + HEADER_SIZE) != 0) { - perror(filename); - exit(1); - } + d_fd = open(filename, O_CREAT | O_RDWR | O_TRUNC, 0664); + if (d_fd < 0) { + perror(filename); + exit(1); + } +#ifdef HAVE_MMAP /* FIXME */ + if (ftruncate(d_fd, size + HEADER_SIZE) != 0) { + perror(filename); + exit(1); + } #endif - } - else { + } else { #ifdef HAVE_MMAP - mm_prot = PROT_READ; + mm_prot = PROT_READ; #endif - d_fd = open (filename, O_RDONLY); - if(d_fd < 0) { - perror(filename); - exit(1); - } + d_fd = open(filename, O_RDONLY); + if (d_fd < 0) { + perror(filename); + exit(1); + } } struct stat statbuf; - if(fstat (d_fd, &statbuf) < 0) { - perror(filename); - exit(1); + if (fstat(d_fd, &statbuf) < 0) { + perror(filename); + exit(1); } - if(statbuf.st_size < HEADER_SIZE) { - fprintf(stderr, "%s: file too small to be circular buffer\n", filename); - exit(1); + if (statbuf.st_size < HEADER_SIZE) { + fprintf(stderr, "%s: file too small to be circular buffer\n", filename); + exit(1); } d_mapped_size = statbuf.st_size; #ifdef HAVE_MMAP - void *p = mmap (0, d_mapped_size, mm_prot, MAP_SHARED, d_fd, 0); - if(p == MAP_FAILED) { - perror("gr::circular_file: mmap failed"); - exit(1); + void* p = mmap(0, d_mapped_size, mm_prot, MAP_SHARED, d_fd, 0); + if (p == MAP_FAILED) { + perror("gr::circular_file: mmap failed"); + exit(1); } d_header = (int*)p; @@ -115,18 +113,18 @@ namespace gr { exit(1); #endif - if(writable) { // init header + if (writable) { // init header - if(size < 0) { - fprintf(stderr, "gr::circular_buffer: size must be > 0 when writable\n"); - exit(1); - } + if (size < 0) { + fprintf(stderr, "gr::circular_buffer: size must be > 0 when writable\n"); + exit(1); + } - d_header[HD_MAGIC] = HEADER_MAGIC; - d_header[HD_HEADER_SIZE] = HEADER_SIZE; - d_header[HD_BUFFER_SIZE] = size; - d_header[HD_BUFFER_BASE] = HEADER_SIZE; // right after header - d_header[HD_BUFFER_CURRENT] = 0; + d_header[HD_MAGIC] = HEADER_MAGIC; + d_header[HD_HEADER_SIZE] = HEADER_SIZE; + d_header[HD_BUFFER_SIZE] = size; + d_header[HD_BUFFER_BASE] = HEADER_SIZE; // right after header + d_header[HD_BUFFER_CURRENT] = 0; } // sanity check (the asserts are a bit unforgiving...) @@ -137,72 +135,66 @@ namespace gr { assert(d_header[HD_BUFFER_BASE] >= d_header[HD_HEADER_SIZE]); assert(d_header[HD_BUFFER_BASE] + d_header[HD_BUFFER_SIZE] <= d_mapped_size); assert(d_header[HD_BUFFER_CURRENT] >= 0 && - d_header[HD_BUFFER_CURRENT] < d_header[HD_BUFFER_SIZE]); + d_header[HD_BUFFER_CURRENT] < d_header[HD_BUFFER_SIZE]); d_bytes_read = 0; d_buffer = (unsigned char*)d_header + d_header[HD_BUFFER_BASE]; - } +} - circular_file::~circular_file() - { +circular_file::~circular_file() +{ #ifdef HAVE_MMAP - if(munmap ((char *) d_header, d_mapped_size) < 0) { - perror("gr::circular_file: munmap"); - exit(1); + if (munmap((char*)d_header, d_mapped_size) < 0) { + perror("gr::circular_file: munmap"); + exit(1); } #endif close(d_fd); - } +} - bool - circular_file::write(void *vdata, int nbytes) - { - unsigned char *data = (unsigned char*)vdata; +bool circular_file::write(void* vdata, int nbytes) +{ + unsigned char* data = (unsigned char*)vdata; int buffer_size = d_header[HD_BUFFER_SIZE]; int buffer_current = d_header[HD_BUFFER_CURRENT]; - while(nbytes > 0) { - int n = std::min(nbytes, buffer_size - buffer_current); - memcpy(d_buffer + buffer_current, data, n); + while (nbytes > 0) { + int n = std::min(nbytes, buffer_size - buffer_current); + memcpy(d_buffer + buffer_current, data, n); - buffer_current += n; - if(buffer_current >= buffer_size) - buffer_current = 0; + buffer_current += n; + if (buffer_current >= buffer_size) + buffer_current = 0; - data += n; - nbytes -= n; + data += n; + nbytes -= n; } d_header[HD_BUFFER_CURRENT] = buffer_current; return true; - } +} - int - circular_file::read(void *vdata, int nbytes) - { - unsigned char *data = (unsigned char *) vdata; +int circular_file::read(void* vdata, int nbytes) +{ + unsigned char* data = (unsigned char*)vdata; int buffer_current = d_header[HD_BUFFER_CURRENT]; int buffer_size = d_header[HD_BUFFER_SIZE]; int total = 0; nbytes = std::min(nbytes, buffer_size - d_bytes_read); - while(nbytes > 0) { - int offset = (buffer_current + d_bytes_read) % buffer_size; - int n = std::min (nbytes, buffer_size - offset); - memcpy(data, d_buffer + offset, n); - data += n; - d_bytes_read += n; - total += n; - nbytes -= n; + while (nbytes > 0) { + int offset = (buffer_current + d_bytes_read) % buffer_size; + int n = std::min(nbytes, buffer_size - offset); + memcpy(data, d_buffer + offset, n); + data += n; + d_bytes_read += n; + total += n; + nbytes -= n; } return total; - } +} - void - circular_file::reset_read_pointer() - { - d_bytes_read = 0; - } +void circular_file::reset_read_pointer() { d_bytes_read = 0; } } /* namespace gr */ diff --git a/gnuradio-runtime/lib/circular_file.h b/gnuradio-runtime/lib/circular_file.h index 1dc431d69a..69cb82c81c 100644 --- a/gnuradio-runtime/lib/circular_file.h +++ b/gnuradio-runtime/lib/circular_file.h @@ -27,38 +27,38 @@ namespace gr { - /* - * writes input data into a circular buffer on disk. - * - * the file contains a fixed header: - * 0x0000: int32 magic (0xEB021026) - * 0x0004: int32 size in bytes of header (constant 4096) - * 0x0008: int32 size in bytes of circular buffer (not including header) - * 0x000C: int32 file offset to beginning of circular buffer - * 0x0010: int32 byte offset from beginning of circular buffer to - * current start of data - */ - class GR_RUNTIME_API circular_file - { - private: - int d_fd; - int *d_header; - unsigned char *d_buffer; +/* + * writes input data into a circular buffer on disk. + * + * the file contains a fixed header: + * 0x0000: int32 magic (0xEB021026) + * 0x0004: int32 size in bytes of header (constant 4096) + * 0x0008: int32 size in bytes of circular buffer (not including header) + * 0x000C: int32 file offset to beginning of circular buffer + * 0x0010: int32 byte offset from beginning of circular buffer to + * current start of data + */ +class GR_RUNTIME_API circular_file +{ +private: + int d_fd; + int* d_header; + unsigned char* d_buffer; int d_mapped_size; int d_bytes_read; - public: - circular_file(const char *filename, bool writable = false, int size = 0); +public: + circular_file(const char* filename, bool writable = false, int size = 0); ~circular_file(); - bool write(void *data, int nbytes); + bool write(void* data, int nbytes); // returns # of bytes actually read or 0 if end of buffer, or -1 on error. - int read(void *data, int nbytes); + int read(void* data, int nbytes); // reset read pointer to beginning of buffer. void reset_read_pointer(); - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/lib/controlport/rpcmanager.cc b/gnuradio-runtime/lib/controlport/rpcmanager.cc index fee255498e..aa9fc08cde 100644 --- a/gnuradio-runtime/lib/controlport/rpcmanager.cc +++ b/gnuradio-runtime/lib/controlport/rpcmanager.cc @@ -24,40 +24,36 @@ #include <iostream> #include <stdexcept> -rpcmanager::rpcmanager() {;} +rpcmanager::rpcmanager() { ; } -rpcmanager::~rpcmanager() {;} +rpcmanager::~rpcmanager() { ; } -rpcserver_booter_base* -rpcmanager::get() +rpcserver_booter_base* rpcmanager::get() { - if(aggregator_registered) { - return aggregator.get(); - } - else if(booter_registered) { + if (aggregator_registered) { + return aggregator.get(); + } else if (booter_registered) { + return boot.get(); + } + assert(booter_registered || aggregator_registered); return boot.get(); - } - assert(booter_registered || aggregator_registered); - return boot.get(); } -void -rpcmanager::register_booter(rpcserver_booter_base* booter) +void rpcmanager::register_booter(rpcserver_booter_base* booter) { - if(make_aggregator && !aggregator_registered) { - aggregator.reset(new rpcserver_booter_aggregator()); - aggregator_registered = true; - } + if (make_aggregator && !aggregator_registered) { + aggregator.reset(new rpcserver_booter_aggregator()); + aggregator_registered = true; + } - if(aggregator_registered) { - rpcmanager::rpcserver_booter_base_sptr bootreg(booter); - aggregator->agg()->registerServer(bootreg); - } - else if(!booter_registered) { - boot.reset(booter); - booter_registered = true; - } - else { - throw std::runtime_error("rpcmanager: Aggregator not in use, and a rpc booter is already registered\n"); - } + if (aggregator_registered) { + rpcmanager::rpcserver_booter_base_sptr bootreg(booter); + aggregator->agg()->registerServer(bootreg); + } else if (!booter_registered) { + boot.reset(booter); + booter_registered = true; + } else { + throw std::runtime_error("rpcmanager: Aggregator not in use, and a rpc booter is " + "already registered\n"); + } } diff --git a/gnuradio-runtime/lib/controlport/rpcserver_aggregator.cc b/gnuradio-runtime/lib/controlport/rpcserver_aggregator.cc index e81a899626..6a2f6c80e4 100644 --- a/gnuradio-runtime/lib/controlport/rpcserver_aggregator.cc +++ b/gnuradio-runtime/lib/controlport/rpcserver_aggregator.cc @@ -26,87 +26,83 @@ #include <sstream> #include <stdexcept> -rpcserver_aggregator::rpcserver_aggregator() - : d_type(std::string("aggregator")) -{;} +rpcserver_aggregator::rpcserver_aggregator() : d_type(std::string("aggregator")) { ; } -rpcserver_aggregator::~rpcserver_aggregator() -{;} +rpcserver_aggregator::~rpcserver_aggregator() { ; } -const std::string& -rpcserver_aggregator::type() -{ - return d_type; -} +const std::string& rpcserver_aggregator::type() { return d_type; } -const std::vector<std::string>& -rpcserver_aggregator::registeredServers() +const std::vector<std::string>& rpcserver_aggregator::registeredServers() { - return d_registeredServers; + return d_registeredServers; } -void -rpcserver_aggregator::registerConfigureCallback(const std::string &id, - const configureCallback_t callback) +void rpcserver_aggregator::registerConfigureCallback(const std::string& id, + const configureCallback_t callback) { - std::for_each(d_serverlist.begin(), d_serverlist.end(), - registerConfigureCallback_f<rpcmanager_base::rpcserver_booter_base_sptr, configureCallback_t>(id, callback)); + std::for_each(d_serverlist.begin(), + d_serverlist.end(), + registerConfigureCallback_f<rpcmanager_base::rpcserver_booter_base_sptr, + configureCallback_t>(id, callback)); } -void -rpcserver_aggregator::unregisterConfigureCallback(const std::string &id) +void rpcserver_aggregator::unregisterConfigureCallback(const std::string& id) { - std::for_each(d_serverlist.begin(), d_serverlist.end(), - unregisterConfigureCallback_f<rpcmanager_base::rpcserver_booter_base_sptr, configureCallback_t>(id)); + std::for_each( + d_serverlist.begin(), + d_serverlist.end(), + unregisterConfigureCallback_f<rpcmanager_base::rpcserver_booter_base_sptr, + configureCallback_t>(id)); } -void -rpcserver_aggregator::registerQueryCallback(const std::string &id, const queryCallback_t callback) +void rpcserver_aggregator::registerQueryCallback(const std::string& id, + const queryCallback_t callback) { - std::for_each(d_serverlist.begin(), d_serverlist.end(), - registerQueryCallback_f<rpcmanager_base::rpcserver_booter_base_sptr, queryCallback_t>(id, callback)); + std::for_each(d_serverlist.begin(), + d_serverlist.end(), + registerQueryCallback_f<rpcmanager_base::rpcserver_booter_base_sptr, + queryCallback_t>(id, callback)); } -void -rpcserver_aggregator::unregisterQueryCallback(const std::string &id) +void rpcserver_aggregator::unregisterQueryCallback(const std::string& id) { - std::for_each(d_serverlist.begin(), d_serverlist.end(), - unregisterQueryCallback_f<rpcmanager_base::rpcserver_booter_base_sptr, queryCallback_t>(id)); + std::for_each(d_serverlist.begin(), + d_serverlist.end(), + unregisterQueryCallback_f<rpcmanager_base::rpcserver_booter_base_sptr, + queryCallback_t>(id)); } - -void -rpcserver_aggregator::registerHandlerCallback(const std::string &id, - const handlerCallback_t callback) +void rpcserver_aggregator::registerHandlerCallback(const std::string& id, + const handlerCallback_t callback) { - std::for_each(d_serverlist.begin(), d_serverlist.end(), - registerHandlerCallback_f<rpcmanager_base::rpcserver_booter_base_sptr, handlerCallback_t>(id, callback)); + std::for_each(d_serverlist.begin(), + d_serverlist.end(), + registerHandlerCallback_f<rpcmanager_base::rpcserver_booter_base_sptr, + handlerCallback_t>(id, callback)); } -void -rpcserver_aggregator::unregisterHandlerCallback(const std::string &id) +void rpcserver_aggregator::unregisterHandlerCallback(const std::string& id) { - std::for_each(d_serverlist.begin(), d_serverlist.end(), - unregisterHandlerCallback_f<rpcmanager_base::rpcserver_booter_base_sptr, handlerCallback_t>(id)); + std::for_each(d_serverlist.begin(), + d_serverlist.end(), + unregisterHandlerCallback_f<rpcmanager_base::rpcserver_booter_base_sptr, + handlerCallback_t>(id)); } - -void -rpcserver_aggregator::registerServer(rpcmanager_base::rpcserver_booter_base_sptr server) +void rpcserver_aggregator::registerServer( + rpcmanager_base::rpcserver_booter_base_sptr server) { - std::vector<std::string>::iterator it(std::find(d_registeredServers.begin(), - d_registeredServers.end(), - server->type())); - if(it != d_registeredServers.end()) { - d_serverlist.push_back(server); - d_registeredServers.push_back(server->type()); - } - else { - std::stringstream s; - s << "rpcserver_aggregator::registerServer: server of type " - << server->type() << " already registered" << std::endl; - throw std::runtime_error(s.str().c_str()); - } + std::vector<std::string>::iterator it(std::find( + d_registeredServers.begin(), d_registeredServers.end(), server->type())); + if (it != d_registeredServers.end()) { + d_serverlist.push_back(server); + d_registeredServers.push_back(server->type()); + } else { + std::stringstream s; + s << "rpcserver_aggregator::registerServer: server of type " << server->type() + << " already registered" << std::endl; + throw std::runtime_error(s.str().c_str()); + } } diff --git a/gnuradio-runtime/lib/controlport/rpcserver_booter_aggregator.cc b/gnuradio-runtime/lib/controlport/rpcserver_booter_aggregator.cc index a1983b4ac5..de83f7af7c 100644 --- a/gnuradio-runtime/lib/controlport/rpcserver_booter_aggregator.cc +++ b/gnuradio-runtime/lib/controlport/rpcserver_booter_aggregator.cc @@ -22,42 +22,28 @@ #include <gnuradio/rpcserver_booter_aggregator.h> -rpcserver_booter_aggregator::rpcserver_booter_aggregator() : - d_type(std::string("aggregator")), - server(new rpcserver_aggregator()) -{;} - -rpcserver_booter_aggregator::~rpcserver_booter_aggregator() -{;} - -rpcserver_base* -rpcserver_booter_aggregator::i() +rpcserver_booter_aggregator::rpcserver_booter_aggregator() + : d_type(std::string("aggregator")), server(new rpcserver_aggregator()) { - return &(*server); + ; } -const std::string& -rpcserver_booter_aggregator::type() -{ - return d_type; -} +rpcserver_booter_aggregator::~rpcserver_booter_aggregator() { ; } -const std::vector<std::string> -rpcserver_booter_aggregator::endpoints() -{ - std::vector<std::string> ep; - ep.push_back(std::string("TODO")); - return ep; -} +rpcserver_base* rpcserver_booter_aggregator::i() { return &(*server); } -const std::vector<std::string>& -rpcserver_booter_aggregator::registeredServers() +const std::string& rpcserver_booter_aggregator::type() { return d_type; } + +const std::vector<std::string> rpcserver_booter_aggregator::endpoints() { - return server->registeredServers(); + std::vector<std::string> ep; + ep.push_back(std::string("TODO")); + return ep; } -rpcserver_aggregator* -rpcserver_booter_aggregator::agg() +const std::vector<std::string>& rpcserver_booter_aggregator::registeredServers() { - return &(*server); + return server->registeredServers(); } + +rpcserver_aggregator* rpcserver_booter_aggregator::agg() { return &(*server); } diff --git a/gnuradio-runtime/lib/controlport/rpcserver_selector.cc b/gnuradio-runtime/lib/controlport/rpcserver_selector.cc index 2785513a46..7d2453fd36 100644 --- a/gnuradio-runtime/lib/controlport/rpcserver_selector.cc +++ b/gnuradio-runtime/lib/controlport/rpcserver_selector.cc @@ -35,7 +35,7 @@ rpcmanager manager_instance; #endif #ifdef GR_RPCSERVER_ICE - #error TODO ICE +#error TODO ICE #endif #ifdef GR_RPCSERVER_THRIFT @@ -44,9 +44,9 @@ rpcmanager::rpcserver_booter_register_helper<rpcserver_booter_thrift> boot_thrif #endif #ifdef GR_RPCSERVER_ERLANG - #error TODO ERLANG +#error TODO ERLANG #endif #ifdef GR_RPCSERVER_XMLRPC - #error TODO XMLRPC +#error TODO XMLRPC #endif diff --git a/gnuradio-runtime/lib/controlport/thrift/rpcpmtconverters_thrift.cc b/gnuradio-runtime/lib/controlport/thrift/rpcpmtconverters_thrift.cc index cc8804f79d..05bb936f5a 100644 --- a/gnuradio-runtime/lib/controlport/thrift/rpcpmtconverters_thrift.cc +++ b/gnuradio-runtime/lib/controlport/thrift/rpcpmtconverters_thrift.cc @@ -25,279 +25,249 @@ #include "thrift/gnuradio_types.h" #include <iostream> -GNURadio::Knob -rpcpmtconverter::from_pmt(const pmt::pmt_t& knob) +GNURadio::Knob rpcpmtconverter::from_pmt(const pmt::pmt_t& knob) { - if(pmt::is_real(knob)) { - GNURadio::Knob result; - result.type = GNURadio::BaseTypes::DOUBLE; - result.value.__set_a_double(pmt::to_double(knob)); - return result; - } - else if(pmt::is_symbol(knob)) { - std::string value = pmt::symbol_to_string(knob); - GNURadio::Knob result; - result.type = GNURadio::BaseTypes::STRING; - result.value.__set_a_string(value); - return result; - } - else if(pmt::is_integer(knob)) { - GNURadio::Knob result; - result.type = GNURadio::BaseTypes::LONG; - result.value.__set_a_long(pmt::to_long(knob)); - return result; - } - else if(pmt::is_bool(knob)) { - GNURadio::Knob result; - result.type = GNURadio::BaseTypes::BOOL; - result.value.__set_a_bool(pmt::to_bool(knob)); - return result; - } - else if(pmt::is_uint64(knob)) { - GNURadio::Knob result; - result.type = GNURadio::BaseTypes::LONG; - result.value.__set_a_long(pmt::to_uint64(knob)); - return result; - } - else if(pmt::is_complex(knob)) { - GNURadio::Knob result; - result.type = GNURadio::BaseTypes::COMPLEX; - std::complex<double> tmp = pmt::to_complex(knob); - GNURadio::complex cpx; - cpx.re = tmp.real(); - cpx.im = tmp.imag(); - result.value.__set_a_complex(cpx); - return result; - } - else if(pmt::is_f32vector(knob)) { - GNURadio::Knob result; - result.type = GNURadio::BaseTypes::F32VECTOR; - size_t size(pmt::length(knob)); - const float* start((const float*)pmt::f32vector_elements(knob,size)); - result.value.__set_a_f32vector(std::vector<double>(start,start+size)); - return result; - } - else if(pmt::is_f64vector(knob)) { - GNURadio::Knob result; - result.type = GNURadio::BaseTypes::F64VECTOR; - size_t size(pmt::length(knob)); - const double* start((const double*)pmt::f64vector_elements(knob,size)); - result.value.__set_a_f64vector(std::vector<double>(start,start+size)); - return result; - } - else if(pmt::is_s64vector(knob)) { - GNURadio::Knob result; - result.type = GNURadio::BaseTypes::S64VECTOR; - size_t size(pmt::length(knob)); - const int64_t* start((const int64_t*)pmt::s64vector_elements(knob,size)); - result.value.__set_a_s64vector(std::vector<int64_t>(start,start+size)); - return result; - } - else if(pmt::is_s32vector(knob)) { - GNURadio::Knob result; - result.type = GNURadio::BaseTypes::S32VECTOR; - size_t size(pmt::length(knob)); - const int32_t* start((const int32_t*)pmt::s32vector_elements(knob,size)); - result.value.__set_a_s32vector(std::vector<int32_t>(start,start+size)); - return result; - } - else if(pmt::is_s16vector(knob)) { - GNURadio::Knob result; - result.type = GNURadio::BaseTypes::S16VECTOR; - size_t size(pmt::length(knob)); - const int16_t* start((const int16_t*)pmt::s16vector_elements(knob,size)); - result.value.__set_a_s16vector(std::vector<int16_t>(start,start+size)); - return result; - } - else if(pmt::is_s8vector(knob)) { - GNURadio::Knob result; - result.type = GNURadio::BaseTypes::S8VECTOR; - size_t size(pmt::length(knob)); - const int8_t* start((const int8_t*)pmt::s8vector_elements(knob,size)); - result.value.__set_a_s8vector(std::basic_string<char>(start,start+size)); - return result; - } - else if(pmt::is_c32vector(knob)) { - std::vector< GNURadio::complex > z; + if (pmt::is_real(knob)) { + GNURadio::Knob result; + result.type = GNURadio::BaseTypes::DOUBLE; + result.value.__set_a_double(pmt::to_double(knob)); + return result; + } else if (pmt::is_symbol(knob)) { + std::string value = pmt::symbol_to_string(knob); + GNURadio::Knob result; + result.type = GNURadio::BaseTypes::STRING; + result.value.__set_a_string(value); + return result; + } else if (pmt::is_integer(knob)) { + GNURadio::Knob result; + result.type = GNURadio::BaseTypes::LONG; + result.value.__set_a_long(pmt::to_long(knob)); + return result; + } else if (pmt::is_bool(knob)) { + GNURadio::Knob result; + result.type = GNURadio::BaseTypes::BOOL; + result.value.__set_a_bool(pmt::to_bool(knob)); + return result; + } else if (pmt::is_uint64(knob)) { + GNURadio::Knob result; + result.type = GNURadio::BaseTypes::LONG; + result.value.__set_a_long(pmt::to_uint64(knob)); + return result; + } else if (pmt::is_complex(knob)) { + GNURadio::Knob result; + result.type = GNURadio::BaseTypes::COMPLEX; + std::complex<double> tmp = pmt::to_complex(knob); + GNURadio::complex cpx; + cpx.re = tmp.real(); + cpx.im = tmp.imag(); + result.value.__set_a_complex(cpx); + return result; + } else if (pmt::is_f32vector(knob)) { + GNURadio::Knob result; + result.type = GNURadio::BaseTypes::F32VECTOR; + size_t size(pmt::length(knob)); + const float* start((const float*)pmt::f32vector_elements(knob, size)); + result.value.__set_a_f32vector(std::vector<double>(start, start + size)); + return result; + } else if (pmt::is_f64vector(knob)) { + GNURadio::Knob result; + result.type = GNURadio::BaseTypes::F64VECTOR; + size_t size(pmt::length(knob)); + const double* start((const double*)pmt::f64vector_elements(knob, size)); + result.value.__set_a_f64vector(std::vector<double>(start, start + size)); + return result; + } else if (pmt::is_s64vector(knob)) { + GNURadio::Knob result; + result.type = GNURadio::BaseTypes::S64VECTOR; + size_t size(pmt::length(knob)); + const int64_t* start((const int64_t*)pmt::s64vector_elements(knob, size)); + result.value.__set_a_s64vector(std::vector<int64_t>(start, start + size)); + return result; + } else if (pmt::is_s32vector(knob)) { + GNURadio::Knob result; + result.type = GNURadio::BaseTypes::S32VECTOR; + size_t size(pmt::length(knob)); + const int32_t* start((const int32_t*)pmt::s32vector_elements(knob, size)); + result.value.__set_a_s32vector(std::vector<int32_t>(start, start + size)); + return result; + } else if (pmt::is_s16vector(knob)) { + GNURadio::Knob result; + result.type = GNURadio::BaseTypes::S16VECTOR; + size_t size(pmt::length(knob)); + const int16_t* start((const int16_t*)pmt::s16vector_elements(knob, size)); + result.value.__set_a_s16vector(std::vector<int16_t>(start, start + size)); + return result; + } else if (pmt::is_s8vector(knob)) { + GNURadio::Knob result; + result.type = GNURadio::BaseTypes::S8VECTOR; + size_t size(pmt::length(knob)); + const int8_t* start((const int8_t*)pmt::s8vector_elements(knob, size)); + result.value.__set_a_s8vector(std::basic_string<char>(start, start + size)); + return result; + } else if (pmt::is_c32vector(knob)) { + std::vector<GNURadio::complex> z; - GNURadio::Knob result; - result.type = GNURadio::BaseTypes::C32VECTOR; - size_t size(pmt::length(knob)); - const gr_complex* start((const gr_complex*)pmt::c32vector_elements(knob,size)); - for(size_t s = 0; s < size; s++) { - GNURadio::complex z0; - gr_complex z1 = gr_complex(*(start+s)); - z0.__set_re(z1.real()); - z0.__set_im(z1.imag()); - z.push_back(z0); + GNURadio::Knob result; + result.type = GNURadio::BaseTypes::C32VECTOR; + size_t size(pmt::length(knob)); + const gr_complex* start((const gr_complex*)pmt::c32vector_elements(knob, size)); + for (size_t s = 0; s < size; s++) { + GNURadio::complex z0; + gr_complex z1 = gr_complex(*(start + s)); + z0.__set_re(z1.real()); + z0.__set_im(z1.imag()); + z.push_back(z0); + } + result.value.__set_a_c32vector(z); + return result; + } else { + std::cerr << "Error: Don't know how to handle Knob Type (from): " << knob + << std::endl; + assert(0); } - result.value.__set_a_c32vector(z); - return result; - } - else { - std::cerr << "Error: Don't know how to handle Knob Type (from): " << knob << std::endl; - assert(0); - } - return GNURadio::Knob(); + return GNURadio::Knob(); } -pmt::pmt_t -rpcpmtconverter::to_pmt_byte_f::operator()(const GNURadio::Knob& knob) +pmt::pmt_t rpcpmtconverter::to_pmt_byte_f::operator()(const GNURadio::Knob& knob) { - return pmt::mp(knob.value.a_byte); + return pmt::mp(knob.value.a_byte); } -pmt::pmt_t -rpcpmtconverter::to_pmt_short_f::operator()(const GNURadio::Knob& knob) +pmt::pmt_t rpcpmtconverter::to_pmt_short_f::operator()(const GNURadio::Knob& knob) { - return pmt::mp(knob.value.a_short); + return pmt::mp(knob.value.a_short); } -pmt::pmt_t -rpcpmtconverter::to_pmt_int_f::operator()(const GNURadio::Knob& knob) +pmt::pmt_t rpcpmtconverter::to_pmt_int_f::operator()(const GNURadio::Knob& knob) { - return pmt::mp(knob.value.a_int); + return pmt::mp(knob.value.a_int); } -pmt::pmt_t -rpcpmtconverter::to_pmt_long_f::operator()(const GNURadio::Knob& knob) +pmt::pmt_t rpcpmtconverter::to_pmt_long_f::operator()(const GNURadio::Knob& knob) { - return pmt::from_long(knob.value.a_long); + return pmt::from_long(knob.value.a_long); } -pmt::pmt_t -rpcpmtconverter::to_pmt_double_f::operator()(const GNURadio::Knob& knob) +pmt::pmt_t rpcpmtconverter::to_pmt_double_f::operator()(const GNURadio::Knob& knob) { - return pmt::mp(knob.value.a_double); + return pmt::mp(knob.value.a_double); } -pmt::pmt_t -rpcpmtconverter::to_pmt_string_f::operator()(const GNURadio::Knob& knob) +pmt::pmt_t rpcpmtconverter::to_pmt_string_f::operator()(const GNURadio::Knob& knob) { - return pmt::string_to_symbol(knob.value.a_string); + return pmt::string_to_symbol(knob.value.a_string); } -pmt::pmt_t -rpcpmtconverter::to_pmt_bool_f::operator()(const GNURadio::Knob& knob) +pmt::pmt_t rpcpmtconverter::to_pmt_bool_f::operator()(const GNURadio::Knob& knob) { - if(knob.value.a_bool) - return pmt::PMT_T; - else - return pmt::PMT_F; + if (knob.value.a_bool) + return pmt::PMT_T; + else + return pmt::PMT_F; } -pmt::pmt_t -rpcpmtconverter::to_pmt_complex_f::operator()(const GNURadio::Knob& knob) +pmt::pmt_t rpcpmtconverter::to_pmt_complex_f::operator()(const GNURadio::Knob& knob) { - gr_complexd cpx(knob.value.a_complex.re, knob.value.a_complex.im); - return pmt::from_complex(cpx); + gr_complexd cpx(knob.value.a_complex.re, knob.value.a_complex.im); + return pmt::from_complex(cpx); } -pmt::pmt_t -rpcpmtconverter::to_pmt_f32vect_f::operator()(const GNURadio::Knob& knob) +pmt::pmt_t rpcpmtconverter::to_pmt_f32vect_f::operator()(const GNURadio::Knob& knob) { - std::vector<double> v_double = knob.value.a_f32vector; - std::vector<float> v(v_double.begin(), v_double.end()); - return pmt::init_f32vector(v.size(), v); + std::vector<double> v_double = knob.value.a_f32vector; + std::vector<float> v(v_double.begin(), v_double.end()); + return pmt::init_f32vector(v.size(), v); } -pmt::pmt_t -rpcpmtconverter::to_pmt_f64vect_f::operator()(const GNURadio::Knob& knob) +pmt::pmt_t rpcpmtconverter::to_pmt_f64vect_f::operator()(const GNURadio::Knob& knob) { - std::vector<double> v = knob.value.a_f64vector; - return pmt::init_f64vector(v.size(), v); + std::vector<double> v = knob.value.a_f64vector; + return pmt::init_f64vector(v.size(), v); } -pmt::pmt_t -rpcpmtconverter::to_pmt_s64vect_f::operator()(const GNURadio::Knob& knob) +pmt::pmt_t rpcpmtconverter::to_pmt_s64vect_f::operator()(const GNURadio::Knob& knob) { - std::vector<int64_t> v = knob.value.a_s64vector; - return pmt::init_s64vector(v.size(), v); + std::vector<int64_t> v = knob.value.a_s64vector; + return pmt::init_s64vector(v.size(), v); } -pmt::pmt_t -rpcpmtconverter::to_pmt_s32vect_f::operator()(const GNURadio::Knob& knob) +pmt::pmt_t rpcpmtconverter::to_pmt_s32vect_f::operator()(const GNURadio::Knob& knob) { - std::vector<int32_t> v = knob.value.a_s32vector; - return pmt::init_s32vector(v.size(), v); + std::vector<int32_t> v = knob.value.a_s32vector; + return pmt::init_s32vector(v.size(), v); } -pmt::pmt_t -rpcpmtconverter::to_pmt_s16vect_f::operator()(const GNURadio::Knob& knob) +pmt::pmt_t rpcpmtconverter::to_pmt_s16vect_f::operator()(const GNURadio::Knob& knob) { - std::vector<int16_t> v = knob.value.a_s16vector; - return pmt::init_s16vector(v.size(), v); + std::vector<int16_t> v = knob.value.a_s16vector; + return pmt::init_s16vector(v.size(), v); } -pmt::pmt_t -rpcpmtconverter::to_pmt_s8vect_f::operator()(const GNURadio::Knob& knob) +pmt::pmt_t rpcpmtconverter::to_pmt_s8vect_f::operator()(const GNURadio::Knob& knob) { - std::basic_string<char> v = knob.value.a_s8vector; - return pmt::init_s8vector(v.size(), reinterpret_cast<const int8_t*>(v.data())); + std::basic_string<char> v = knob.value.a_s8vector; + return pmt::init_s8vector(v.size(), reinterpret_cast<const int8_t*>(v.data())); } -pmt::pmt_t -rpcpmtconverter::to_pmt_c32vect_f::operator()(const GNURadio::Knob& knob) +pmt::pmt_t rpcpmtconverter::to_pmt_c32vect_f::operator()(const GNURadio::Knob& knob) { - std::vector<GNURadio::complex> v0 = knob.value.a_c32vector; - std::vector<GNURadio::complex>::iterator vitr; - std::vector<gr_complex> v; - for(vitr = v0.begin(); vitr != v0.end(); vitr++) { - v.push_back(gr_complex(vitr->re, vitr->im)); - } - return pmt::init_c32vector(v.size(), v); + std::vector<GNURadio::complex> v0 = knob.value.a_c32vector; + std::vector<GNURadio::complex>::iterator vitr; + std::vector<gr_complex> v; + for (vitr = v0.begin(); vitr != v0.end(); vitr++) { + v.push_back(gr_complex(vitr->re, vitr->im)); + } + return pmt::init_c32vector(v.size(), v); } rpcpmtconverter::To_PMT rpcpmtconverter::To_PMT::instance; -rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_bool_f> reg_bool(rpcpmtconverter::To_PMT::instance, - GNURadio::BaseTypes::BOOL); -rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_byte_f> reg_byte(rpcpmtconverter::To_PMT::instance, - GNURadio::BaseTypes::BYTE); -rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_short_f> reg_short(rpcpmtconverter::To_PMT::instance, - GNURadio::BaseTypes::SHORT); -rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_int_f> reg_int(rpcpmtconverter::To_PMT::instance, - GNURadio::BaseTypes::INT); -rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_long_f> reg_long(rpcpmtconverter::To_PMT::instance, - GNURadio::BaseTypes::LONG); -rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_double_f> reg_double(rpcpmtconverter::To_PMT::instance, - GNURadio::BaseTypes::DOUBLE); -rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_string_f> reg_string(rpcpmtconverter::To_PMT::instance, - GNURadio::BaseTypes::STRING); -rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_complex_f> reg_complex(rpcpmtconverter::To_PMT::instance, - GNURadio::BaseTypes::COMPLEX); -rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_f32vect_f> reg_f32v(rpcpmtconverter::To_PMT::instance, - GNURadio::BaseTypes::F32VECTOR); -rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_f64vect_f> reg_f64v(rpcpmtconverter::To_PMT::instance, - GNURadio::BaseTypes::F64VECTOR); -rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_s64vect_f> reg_s64v(rpcpmtconverter::To_PMT::instance, - GNURadio::BaseTypes::S64VECTOR); -rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_s32vect_f> reg_s32v(rpcpmtconverter::To_PMT::instance, - GNURadio::BaseTypes::S32VECTOR); -rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_s16vect_f> reg_s16v(rpcpmtconverter::To_PMT::instance, - GNURadio::BaseTypes::S16VECTOR); -rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_s8vect_f> reg_s8v(rpcpmtconverter::To_PMT::instance, - GNURadio::BaseTypes::S8VECTOR); -rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_c32vect_f> reg_c32v(rpcpmtconverter::To_PMT::instance, - GNURadio::BaseTypes::C32VECTOR); +rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_bool_f> + reg_bool(rpcpmtconverter::To_PMT::instance, GNURadio::BaseTypes::BOOL); +rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_byte_f> + reg_byte(rpcpmtconverter::To_PMT::instance, GNURadio::BaseTypes::BYTE); +rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_short_f> + reg_short(rpcpmtconverter::To_PMT::instance, GNURadio::BaseTypes::SHORT); +rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_int_f> + reg_int(rpcpmtconverter::To_PMT::instance, GNURadio::BaseTypes::INT); +rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_long_f> + reg_long(rpcpmtconverter::To_PMT::instance, GNURadio::BaseTypes::LONG); +rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_double_f> + reg_double(rpcpmtconverter::To_PMT::instance, GNURadio::BaseTypes::DOUBLE); +rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_string_f> + reg_string(rpcpmtconverter::To_PMT::instance, GNURadio::BaseTypes::STRING); +rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_complex_f> + reg_complex(rpcpmtconverter::To_PMT::instance, GNURadio::BaseTypes::COMPLEX); +rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_f32vect_f> + reg_f32v(rpcpmtconverter::To_PMT::instance, GNURadio::BaseTypes::F32VECTOR); +rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_f64vect_f> + reg_f64v(rpcpmtconverter::To_PMT::instance, GNURadio::BaseTypes::F64VECTOR); +rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_s64vect_f> + reg_s64v(rpcpmtconverter::To_PMT::instance, GNURadio::BaseTypes::S64VECTOR); +rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_s32vect_f> + reg_s32v(rpcpmtconverter::To_PMT::instance, GNURadio::BaseTypes::S32VECTOR); +rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_s16vect_f> + reg_s16v(rpcpmtconverter::To_PMT::instance, GNURadio::BaseTypes::S16VECTOR); +rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_s8vect_f> + reg_s8v(rpcpmtconverter::To_PMT::instance, GNURadio::BaseTypes::S8VECTOR); +rpcpmtconverter::to_pmt_reg<rpcpmtconverter::to_pmt_c32vect_f> + reg_c32v(rpcpmtconverter::To_PMT::instance, GNURadio::BaseTypes::C32VECTOR); -template<typename TO_PMT_F> +template <typename TO_PMT_F> rpcpmtconverter::to_pmt_reg<TO_PMT_F>::to_pmt_reg(To_PMT& instance, const GNURadio::BaseTypes::type type) { - boost::assign::ptr_map_insert<TO_PMT_F>(instance.to_pmt_map)(type); + boost::assign::ptr_map_insert<TO_PMT_F>(instance.to_pmt_map)(type); } -pmt::pmt_t -rpcpmtconverter::to_pmt_f::operator()(const GNURadio::Knob& knob) +pmt::pmt_t rpcpmtconverter::to_pmt_f::operator()(const GNURadio::Knob& knob) { - std::cerr << "Error: Don't know how to handle Knob Type: " << knob.type << std::endl; - assert(0); - return pmt::pmt_t(); + std::cerr << "Error: Don't know how to handle Knob Type: " << knob.type << std::endl; + assert(0); + return pmt::pmt_t(); } -pmt::pmt_t -rpcpmtconverter::To_PMT::operator()(const GNURadio::Knob& knob) +pmt::pmt_t rpcpmtconverter::To_PMT::operator()(const GNURadio::Knob& knob) { - return to_pmt_map[knob.type](knob); + return to_pmt_map[knob.type](knob); } diff --git a/gnuradio-runtime/lib/controlport/thrift/rpcserver_booter_thrift.cc b/gnuradio-runtime/lib/controlport/thrift/rpcserver_booter_thrift.cc index 1d6cafe0c0..a5017cd17a 100644 --- a/gnuradio-runtime/lib/controlport/thrift/rpcserver_booter_thrift.cc +++ b/gnuradio-runtime/lib/controlport/thrift/rpcserver_booter_thrift.cc @@ -26,108 +26,120 @@ #include <boost/asio/ip/host_name.hpp> namespace { - static const char* const CONTROL_PORT_CLASS("thrift"); - static const unsigned int ETHERNET_HEADER_SIZE(14); - static const unsigned int IP_HEADER_SIZE(20); - static const unsigned int TCP_HEADER_SIZE(32); - static const unsigned int ETHERNET_TYPICAL_MTU(1500); - static const unsigned int ALRIGHT_DEFAULT_BUFFER_SIZE( - ETHERNET_TYPICAL_MTU - ETHERNET_HEADER_SIZE - IP_HEADER_SIZE - TCP_HEADER_SIZE); -}; +static const char* const CONTROL_PORT_CLASS("thrift"); +static const unsigned int ETHERNET_HEADER_SIZE(14); +static const unsigned int IP_HEADER_SIZE(20); +static const unsigned int TCP_HEADER_SIZE(32); +static const unsigned int ETHERNET_TYPICAL_MTU(1500); +static const unsigned int ALRIGHT_DEFAULT_BUFFER_SIZE(ETHERNET_TYPICAL_MTU - + ETHERNET_HEADER_SIZE - + IP_HEADER_SIZE - TCP_HEADER_SIZE); +}; // namespace /*! * \brief A booter implementation for a Thrift application class. */ -rpcserver_booter_thrift::rpcserver_booter_thrift() : - thrift_server_template<rpcserver_base, - rpcserver_thrift, - rpcserver_booter_thrift>(this), - d_type(std::string(CONTROL_PORT_CLASS)) -{;} +rpcserver_booter_thrift::rpcserver_booter_thrift() + : thrift_server_template<rpcserver_base, rpcserver_thrift, rpcserver_booter_thrift>( + this), + d_type(std::string(CONTROL_PORT_CLASS)) +{ + ; +} -rpcserver_booter_thrift::~rpcserver_booter_thrift() -{;} +rpcserver_booter_thrift::~rpcserver_booter_thrift() { ; } -rpcserver_base* -rpcserver_booter_thrift::i() +rpcserver_base* rpcserver_booter_thrift::i() { - return thrift_server_template<rpcserver_base, rpcserver_thrift, - rpcserver_booter_thrift>::i(); + return thrift_server_template<rpcserver_base, + rpcserver_thrift, + rpcserver_booter_thrift>::i(); } /*! * \brief Returns the endpoint string for the application */ -const std::vector<std::string> -rpcserver_booter_thrift::endpoints() +const std::vector<std::string> rpcserver_booter_thrift::endpoints() { - return thrift_server_template<rpcserver_base, rpcserver_thrift, - rpcserver_booter_thrift>::endpoints(); + return thrift_server_template<rpcserver_base, + rpcserver_thrift, + rpcserver_booter_thrift>::endpoints(); } // Specialized thrift_application_base attributes and functions // for this rpcserver_booter instance. -template<class rpcserver_base, class rpcserver_booter_thrift> -const unsigned int thrift_application_base<rpcserver_base, rpcserver_booter_thrift>::d_default_max_init_attempts(100U); +template <class rpcserver_base, class rpcserver_booter_thrift> +const unsigned int + thrift_application_base<rpcserver_base, + rpcserver_booter_thrift>::d_default_max_init_attempts(100U); -template<class rpcserver_base, class rpcserver_booter_thrift> -const unsigned int thrift_application_base<rpcserver_base, rpcserver_booter_thrift>::d_default_thrift_port(0U); +template <class rpcserver_base, class rpcserver_booter_thrift> +const unsigned int + thrift_application_base<rpcserver_base, + rpcserver_booter_thrift>::d_default_thrift_port(0U); -template<class rpcserver_base, class rpcserver_booter_thrift> -const unsigned int thrift_application_base<rpcserver_base, rpcserver_booter_thrift>::d_default_num_thrift_threads(10U); +template <class rpcserver_base, class rpcserver_booter_thrift> +const unsigned int + thrift_application_base<rpcserver_base, + rpcserver_booter_thrift>::d_default_num_thrift_threads(10U); -template<class rpcserver_base, class rpcserver_booter_thrift> -const unsigned int thrift_application_base<rpcserver_base, rpcserver_booter_thrift>::d_default_thrift_buffer_size( - ALRIGHT_DEFAULT_BUFFER_SIZE); +template <class rpcserver_base, class rpcserver_booter_thrift> +const unsigned int thrift_application_base<rpcserver_base, rpcserver_booter_thrift>:: + d_default_thrift_buffer_size(ALRIGHT_DEFAULT_BUFFER_SIZE); -template<class rpcserver_base, class rpcserver_booter_thrift> +template <class rpcserver_base, class rpcserver_booter_thrift> boost::scoped_ptr<thrift_application_base_impl> - thrift_application_base<rpcserver_base, rpcserver_booter_thrift>::p_impl( - new thrift_application_base_impl()); + thrift_application_base<rpcserver_base, rpcserver_booter_thrift>::p_impl( + new thrift_application_base_impl()); -template<class rpcserver_base, class rpcserver_booter_thrift> -thrift_application_base<rpcserver_base, rpcserver_booter_thrift>::~thrift_application_base() +template <class rpcserver_base, class rpcserver_booter_thrift> +thrift_application_base<rpcserver_base, + rpcserver_booter_thrift>::~thrift_application_base() { - if(d_thirft_is_running) { - d_thriftserver->stop(); - d_thirft_is_running = false; - } + if (d_thirft_is_running) { + d_thriftserver->stop(); + d_thirft_is_running = false; + } } -template<class rpcserver_base, class rpcserver_booter_thrift> +template <class rpcserver_base, class rpcserver_booter_thrift> void thrift_application_base<rpcserver_base, rpcserver_booter_thrift>::start_thrift() { - d_thriftserver->serve(); + d_thriftserver->serve(); } -template<class rpcserver_base, typename rpcserver_booter_thrift> -bool thrift_application_base<rpcserver_base, rpcserver_booter_thrift>::application_started() +template <class rpcserver_base, typename rpcserver_booter_thrift> +bool thrift_application_base<rpcserver_base, + rpcserver_booter_thrift>::application_started() { - if (d_thirft_is_running) return true; + if (d_thirft_is_running) + return true; - bool result(false); - // Define the endpoint. - apache::thrift::transport::TServerTransport *thetransport = - d_thriftserver->getServerTransport().get(); + bool result(false); + // Define the endpoint. + apache::thrift::transport::TServerTransport* thetransport = + d_thriftserver->getServerTransport().get(); - // Determine the specified endpoint port number, or the port number selected by bind() if - int used_port = ((apache::thrift::transport::TServerSocket*)thetransport)->getPort(); + // Determine the specified endpoint port number, or the port number selected by bind() + // if + int used_port = ((apache::thrift::transport::TServerSocket*)thetransport)->getPort(); - if (used_port > 0) { - // Determine the hostname of this host - const std::string boost_hostname(boost::asio::ip::host_name()); + if (used_port > 0) { + // Determine the hostname of this host + const std::string boost_hostname(boost::asio::ip::host_name()); - std::string endpoint = boost::str(boost::format("-h %1% -p %2%") % boost_hostname % used_port); + std::string endpoint = + boost::str(boost::format("-h %1% -p %2%") % boost_hostname % used_port); - set_endpoint(endpoint); + set_endpoint(endpoint); - GR_LOG_INFO(d_logger, "Apache Thrift: " + endpoint); - d_thirft_is_running = true; - result = true; - } + GR_LOG_INFO(d_logger, "Apache Thrift: " + endpoint); + d_thirft_is_running = true; + result = true; + } - return result; + return result; } diff --git a/gnuradio-runtime/lib/controlport/thrift/rpcserver_thrift.cc b/gnuradio-runtime/lib/controlport/thrift/rpcserver_thrift.cc index 6b912bbfae..180bb85f3d 100644 --- a/gnuradio-runtime/lib/controlport/thrift/rpcserver_thrift.cc +++ b/gnuradio-runtime/lib/controlport/thrift/rpcserver_thrift.cc @@ -37,239 +37,239 @@ using namespace rpcpmtconverter; rpcserver_thrift::rpcserver_thrift() { - //std::cerr << "rpcserver_thrift::ctor" << std::endl; + // std::cerr << "rpcserver_thrift::ctor" << std::endl; } rpcserver_thrift::~rpcserver_thrift() { - //std::cerr << "rpcserver_thrift::dtor" << std::endl; + // std::cerr << "rpcserver_thrift::dtor" << std::endl; } -void -rpcserver_thrift::registerConfigureCallback(const std::string &id, - const configureCallback_t callback) +void rpcserver_thrift::registerConfigureCallback(const std::string& id, + const configureCallback_t callback) { - boost::mutex::scoped_lock lock(d_callback_map_lock); - { - ConfigureCallbackMap_t::const_iterator iter(d_setcallbackmap.find(id)); - if(iter != d_setcallbackmap.end()) { - std::stringstream s; - s << "rpcserver_thrift:: rpcserver_thrift ERROR registering set, already registered: " - << id << std::endl; - throw std::runtime_error(s.str().c_str()); + boost::mutex::scoped_lock lock(d_callback_map_lock); + { + ConfigureCallbackMap_t::const_iterator iter(d_setcallbackmap.find(id)); + if (iter != d_setcallbackmap.end()) { + std::stringstream s; + s << "rpcserver_thrift:: rpcserver_thrift ERROR registering set, already " + "registered: " + << id << std::endl; + throw std::runtime_error(s.str().c_str()); + } } - } - if(DEBUG) { - std::cerr << "rpcserver_thrift registering set: " << id << std::endl; - } - d_setcallbackmap.insert(ConfigureCallbackMap_t::value_type(id, callback)); + if (DEBUG) { + std::cerr << "rpcserver_thrift registering set: " << id << std::endl; + } + d_setcallbackmap.insert(ConfigureCallbackMap_t::value_type(id, callback)); } -void -rpcserver_thrift::unregisterConfigureCallback(const std::string &id) +void rpcserver_thrift::unregisterConfigureCallback(const std::string& id) { - boost::mutex::scoped_lock lock(d_callback_map_lock); - ConfigureCallbackMap_t::iterator iter(d_setcallbackmap.find(id)); - if(iter == d_setcallbackmap.end()) { - std::stringstream s; - s << "rpcserver_thrift:: rpcserver_thrift ERROR unregistering set, not registered: " - << id << std::endl; - throw std::runtime_error(s.str().c_str()); - } - - if(DEBUG) - std::cerr << "rpcserver_thrift unregistering set: " << id << std::endl; - - d_setcallbackmap.erase(iter); + boost::mutex::scoped_lock lock(d_callback_map_lock); + ConfigureCallbackMap_t::iterator iter(d_setcallbackmap.find(id)); + if (iter == d_setcallbackmap.end()) { + std::stringstream s; + s << "rpcserver_thrift:: rpcserver_thrift ERROR unregistering set, not " + "registered: " + << id << std::endl; + throw std::runtime_error(s.str().c_str()); + } + + if (DEBUG) + std::cerr << "rpcserver_thrift unregistering set: " << id << std::endl; + + d_setcallbackmap.erase(iter); } -void -rpcserver_thrift::registerQueryCallback(const std::string &id, - const queryCallback_t callback) +void rpcserver_thrift::registerQueryCallback(const std::string& id, + const queryCallback_t callback) { - boost::mutex::scoped_lock lock(d_callback_map_lock); - { - QueryCallbackMap_t::const_iterator iter(d_getcallbackmap.find(id)); - if(iter != d_getcallbackmap.end()) { - std::stringstream s; - s << "rpcserver_thrift:: rpcserver_thrift ERROR registering get, already registered: " - << id << std::endl; - throw std::runtime_error(s.str().c_str()); + boost::mutex::scoped_lock lock(d_callback_map_lock); + { + QueryCallbackMap_t::const_iterator iter(d_getcallbackmap.find(id)); + if (iter != d_getcallbackmap.end()) { + std::stringstream s; + s << "rpcserver_thrift:: rpcserver_thrift ERROR registering get, already " + "registered: " + << id << std::endl; + throw std::runtime_error(s.str().c_str()); + } } - } - if(DEBUG) { - std::cerr << "rpcserver_thrift registering get: " << id << std::endl; - } - d_getcallbackmap.insert(QueryCallbackMap_t::value_type(id, callback)); + if (DEBUG) { + std::cerr << "rpcserver_thrift registering get: " << id << std::endl; + } + d_getcallbackmap.insert(QueryCallbackMap_t::value_type(id, callback)); } -void -rpcserver_thrift::unregisterQueryCallback(const std::string &id) +void rpcserver_thrift::unregisterQueryCallback(const std::string& id) { - boost::mutex::scoped_lock lock(d_callback_map_lock); - QueryCallbackMap_t::iterator iter(d_getcallbackmap.find(id)); - if(iter == d_getcallbackmap.end()) { - std::stringstream s; - s << "rpcserver_thrift:: rpcserver_thrift ERROR unregistering get, registered: " - << id << std::endl; - throw std::runtime_error(s.str().c_str()); - } - - if(DEBUG) { - std::cerr << "rpcserver_thrift unregistering get: " << id << std::endl; - } - - d_getcallbackmap.erase(iter); -} + boost::mutex::scoped_lock lock(d_callback_map_lock); + QueryCallbackMap_t::iterator iter(d_getcallbackmap.find(id)); + if (iter == d_getcallbackmap.end()) { + std::stringstream s; + s << "rpcserver_thrift:: rpcserver_thrift ERROR unregistering get, registered: " + << id << std::endl; + throw std::runtime_error(s.str().c_str()); + } + + if (DEBUG) { + std::cerr << "rpcserver_thrift unregistering get: " << id << std::endl; + } + d_getcallbackmap.erase(iter); +} -void -rpcserver_thrift::registerHandlerCallback(const std::string &id, - const handlerCallback_t callback) +void rpcserver_thrift::registerHandlerCallback(const std::string& id, + const handlerCallback_t callback) { - boost::mutex::scoped_lock lock(d_callback_map_lock); - { - HandlerCallbackMap_t::const_iterator iter(d_handlercallbackmap.find(id)); - if(iter != d_handlercallbackmap.end()) { - std::stringstream s; - s << "rpcserver_thrift:: rpcserver_thrift ERROR registering handler, already registered: " - << id << std::endl; - throw std::runtime_error(s.str().c_str()); + boost::mutex::scoped_lock lock(d_callback_map_lock); + { + HandlerCallbackMap_t::const_iterator iter(d_handlercallbackmap.find(id)); + if (iter != d_handlercallbackmap.end()) { + std::stringstream s; + s << "rpcserver_thrift:: rpcserver_thrift ERROR registering handler, already " + "registered: " + << id << std::endl; + throw std::runtime_error(s.str().c_str()); + } } - } - if(DEBUG) { - std::cerr << "rpcserver_thrift registering handler: " << id << std::endl; - } - d_handlercallbackmap.insert(HandlerCallbackMap_t::value_type(id, callback)); + if (DEBUG) { + std::cerr << "rpcserver_thrift registering handler: " << id << std::endl; + } + d_handlercallbackmap.insert(HandlerCallbackMap_t::value_type(id, callback)); } -void -rpcserver_thrift::unregisterHandlerCallback(const std::string &id) +void rpcserver_thrift::unregisterHandlerCallback(const std::string& id) { - boost::mutex::scoped_lock lock(d_callback_map_lock); - HandlerCallbackMap_t::iterator iter(d_handlercallbackmap.find(id)); - if(iter == d_handlercallbackmap.end()) { - std::stringstream s; - s << "rpcserver_thrift:: rpcserver_thrift ERROR unregistering handler, registered: " - << id << std::endl; - throw std::runtime_error(s.str().c_str()); - } - - if(DEBUG) { - std::cerr << "rpcserver_thrift unregistering handler: " << id << std::endl; - } - - d_handlercallbackmap.erase(iter); -} + boost::mutex::scoped_lock lock(d_callback_map_lock); + HandlerCallbackMap_t::iterator iter(d_handlercallbackmap.find(id)); + if (iter == d_handlercallbackmap.end()) { + std::stringstream s; + s << "rpcserver_thrift:: rpcserver_thrift ERROR unregistering handler, " + "registered: " + << id << std::endl; + throw std::runtime_error(s.str().c_str()); + } + if (DEBUG) { + std::cerr << "rpcserver_thrift unregistering handler: " << id << std::endl; + } + d_handlercallbackmap.erase(iter); +} -void -rpcserver_thrift::setKnobs(const GNURadio::KnobMap& knobs) +void rpcserver_thrift::setKnobs(const GNURadio::KnobMap& knobs) { - boost::mutex::scoped_lock lock(d_callback_map_lock); - std::for_each(knobs.begin(), knobs.end(), - set_f<GNURadio::KnobMap::value_type,ConfigureCallbackMap_t> - (d_setcallbackmap, cur_priv)); + boost::mutex::scoped_lock lock(d_callback_map_lock); + std::for_each(knobs.begin(), + knobs.end(), + set_f<GNURadio::KnobMap::value_type, ConfigureCallbackMap_t>( + d_setcallbackmap, cur_priv)); } -void -rpcserver_thrift::getKnobs(GNURadio::KnobMap& _return, - const GNURadio::KnobIDList& knobs) +void rpcserver_thrift::getKnobs(GNURadio::KnobMap& _return, + const GNURadio::KnobIDList& knobs) { - boost::mutex::scoped_lock lock(d_callback_map_lock); - if(knobs.size() == 0) { - std::for_each(d_getcallbackmap.begin(), d_getcallbackmap.end(), - get_all_f<QueryCallbackMap_t::value_type, QueryCallbackMap_t, GNURadio::KnobMap> - (d_getcallbackmap, cur_priv, _return)); - } - else { - std::for_each(knobs.begin(), knobs.end(), - get_f<GNURadio::KnobIDList::value_type, QueryCallbackMap_t> - (d_getcallbackmap, cur_priv, _return)); - } + boost::mutex::scoped_lock lock(d_callback_map_lock); + if (knobs.size() == 0) { + std::for_each(d_getcallbackmap.begin(), + d_getcallbackmap.end(), + get_all_f<QueryCallbackMap_t::value_type, + QueryCallbackMap_t, + GNURadio::KnobMap>(d_getcallbackmap, cur_priv, _return)); + } else { + std::for_each(knobs.begin(), + knobs.end(), + get_f<GNURadio::KnobIDList::value_type, QueryCallbackMap_t>( + d_getcallbackmap, cur_priv, _return)); + } } -void -rpcserver_thrift::getRe(GNURadio::KnobMap& _return, const GNURadio::KnobIDList& knobs) +void rpcserver_thrift::getRe(GNURadio::KnobMap& _return, + const GNURadio::KnobIDList& knobs) { - boost::mutex::scoped_lock lock(d_callback_map_lock); - if(knobs.size() == 0) { - std::for_each(d_getcallbackmap.begin(), d_getcallbackmap.end(), - get_all_f<QueryCallbackMap_t::value_type, QueryCallbackMap_t, GNURadio::KnobMap> - (d_getcallbackmap, cur_priv, _return)); - } - else { - QueryCallbackMap_t::iterator it; - for(it = d_getcallbackmap.begin(); it != d_getcallbackmap.end(); it++){ - for(size_t j=0; j<knobs.size(); j++) { - const boost::xpressive::sregex re(boost::xpressive::sregex::compile(knobs[j])); - if(boost::xpressive::regex_match(it->first, re)) { - get_f<GNURadio::KnobIDList::value_type, QueryCallbackMap_t> - (d_getcallbackmap, cur_priv, _return)(it->first); - break; + boost::mutex::scoped_lock lock(d_callback_map_lock); + if (knobs.size() == 0) { + std::for_each(d_getcallbackmap.begin(), + d_getcallbackmap.end(), + get_all_f<QueryCallbackMap_t::value_type, + QueryCallbackMap_t, + GNURadio::KnobMap>(d_getcallbackmap, cur_priv, _return)); + } else { + QueryCallbackMap_t::iterator it; + for (it = d_getcallbackmap.begin(); it != d_getcallbackmap.end(); it++) { + for (size_t j = 0; j < knobs.size(); j++) { + const boost::xpressive::sregex re( + boost::xpressive::sregex::compile(knobs[j])); + if (boost::xpressive::regex_match(it->first, re)) { + get_f<GNURadio::KnobIDList::value_type, QueryCallbackMap_t>( + d_getcallbackmap, cur_priv, _return)(it->first); + break; + } + } } - } } - } } -void -rpcserver_thrift::properties(GNURadio::KnobPropMap& _return, - const GNURadio::KnobIDList& knobs) +void rpcserver_thrift::properties(GNURadio::KnobPropMap& _return, + const GNURadio::KnobIDList& knobs) { - boost::mutex::scoped_lock lock(d_callback_map_lock); - if(knobs.size() == 0) { - std::for_each(d_getcallbackmap.begin(), d_getcallbackmap.end(), - properties_all_f<QueryCallbackMap_t::value_type, - QueryCallbackMap_t, GNURadio::KnobPropMap>(d_getcallbackmap, - cur_priv, _return)); - } - else { - std::for_each(knobs.begin(), knobs.end(), - properties_f<GNURadio::KnobIDList::value_type, - QueryCallbackMap_t, GNURadio::KnobPropMap>(d_getcallbackmap, - cur_priv, _return)); - } + boost::mutex::scoped_lock lock(d_callback_map_lock); + if (knobs.size() == 0) { + std::for_each( + d_getcallbackmap.begin(), + d_getcallbackmap.end(), + properties_all_f<QueryCallbackMap_t::value_type, + QueryCallbackMap_t, + GNURadio::KnobPropMap>(d_getcallbackmap, cur_priv, _return)); + } else { + std::for_each( + knobs.begin(), + knobs.end(), + properties_f<GNURadio::KnobIDList::value_type, + QueryCallbackMap_t, + GNURadio::KnobPropMap>(d_getcallbackmap, cur_priv, _return)); + } } -void -rpcserver_thrift::postMessage(const std::string& alias, - const std::string& port, - const std::string& msg) +void rpcserver_thrift::postMessage(const std::string& alias, + const std::string& port, + const std::string& msg) { - // alias and port are received as serialized PMT strings and need to - // be deserialized into PMTs and then the actual info from there. - // The actual message (msg) is also received as a serialized PMT. We - // just need to get the PMT itself out of this to pass to the set_h - // function for handling the message post. - - boost::mutex::scoped_lock lock(d_callback_map_lock); - - pmt::pmt_t alias_pmt = pmt::deserialize_str(alias); - pmt::pmt_t port_pmt = pmt::deserialize_str(port); - pmt::pmt_t msg_pmt = pmt::deserialize_str(msg); - std::string alias_str = pmt::symbol_to_string(alias_pmt); - std::string port_str = pmt::symbol_to_string(port_pmt); - std::string iface = alias_str + "::" + port_str; - - HandlerCallbackMap_t::iterator itr = d_handlercallbackmap.begin(); - for(; itr != d_handlercallbackmap.end(); itr++) { - if(iface == (*itr).first) { - set_h((*itr).second, cur_priv, port_pmt, msg_pmt); + // alias and port are received as serialized PMT strings and need to + // be deserialized into PMTs and then the actual info from there. + // The actual message (msg) is also received as a serialized PMT. We + // just need to get the PMT itself out of this to pass to the set_h + // function for handling the message post. + + boost::mutex::scoped_lock lock(d_callback_map_lock); + + pmt::pmt_t alias_pmt = pmt::deserialize_str(alias); + pmt::pmt_t port_pmt = pmt::deserialize_str(port); + pmt::pmt_t msg_pmt = pmt::deserialize_str(msg); + std::string alias_str = pmt::symbol_to_string(alias_pmt); + std::string port_str = pmt::symbol_to_string(port_pmt); + std::string iface = alias_str + "::" + port_str; + + HandlerCallbackMap_t::iterator itr = d_handlercallbackmap.begin(); + for (; itr != d_handlercallbackmap.end(); itr++) { + if (iface == (*itr).first) { + set_h((*itr).second, cur_priv, port_pmt, msg_pmt); + } } - } } -void -rpcserver_thrift::shutdown() { - if (DEBUG) { - std::cerr << "Shutting down..." << std::endl; - } +void rpcserver_thrift::shutdown() +{ + if (DEBUG) { + std::cerr << "Shutting down..." << std::endl; + } } diff --git a/gnuradio-runtime/lib/feval.cc b/gnuradio-runtime/lib/feval.cc index 93976c8ac7..2da3ffc58b 100644 --- a/gnuradio-runtime/lib/feval.cc +++ b/gnuradio-runtime/lib/feval.cc @@ -28,109 +28,59 @@ namespace gr { - feval_dd::~feval_dd(){} +feval_dd::~feval_dd() {} - double - feval_dd::eval(double x) - { - return 0; - } +double feval_dd::eval(double x) { return 0; } - double - feval_dd::calleval(double x) - { - return eval(x); - } +double feval_dd::calleval(double x) { return eval(x); } - // ---------------------------------------------------------------- +// ---------------------------------------------------------------- - feval_cc::~feval_cc(){} +feval_cc::~feval_cc() {} - gr_complex - feval_cc::eval(gr_complex x) - { - return 0; - } +gr_complex feval_cc::eval(gr_complex x) { return 0; } - gr_complex - feval_cc::calleval(gr_complex x) - { - return eval(x); - } +gr_complex feval_cc::calleval(gr_complex x) { return eval(x); } - // ---------------------------------------------------------------- +// ---------------------------------------------------------------- - feval_ll::~feval_ll(){} +feval_ll::~feval_ll() {} - long - feval_ll::eval(long x) - { - return 0; - } +long feval_ll::eval(long x) { return 0; } - long - feval_ll::calleval(long x) - { - return eval(x); - } +long feval_ll::calleval(long x) { return eval(x); } - // ---------------------------------------------------------------- +// ---------------------------------------------------------------- - feval::~feval(){} +feval::~feval() {} - void - feval::eval(void) - { +void feval::eval(void) +{ // nop - } +} - void - feval::calleval(void) - { - eval(); - } +void feval::calleval(void) { eval(); } - // ---------------------------------------------------------------- +// ---------------------------------------------------------------- - feval_p::~feval_p(){} +feval_p::~feval_p() {} - void - feval_p::eval(pmt::pmt_t x) - { +void feval_p::eval(pmt::pmt_t x) +{ // nop - } - - void - feval_p::calleval(pmt::pmt_t x) - { - eval(x); - } - - /* - * Trivial examples showing C++ (transparently) calling Python - */ - double - feval_dd_example(feval_dd *f, double x) - { - return f->calleval(x); - } - - gr_complex - feval_cc_example(feval_cc *f, gr_complex x) - { - return f->calleval(x); - } - - long - feval_ll_example(feval_ll *f, long x) - { - return f->calleval(x); - } - - void - feval_example(feval *f) - { - f->calleval(); - } +} + +void feval_p::calleval(pmt::pmt_t x) { eval(x); } + +/* + * Trivial examples showing C++ (transparently) calling Python + */ +double feval_dd_example(feval_dd* f, double x) { return f->calleval(x); } + +gr_complex feval_cc_example(feval_cc* f, gr_complex x) { return f->calleval(x); } + +long feval_ll_example(feval_ll* f, long x) { return f->calleval(x); } + +void feval_example(feval* f) { f->calleval(); } } /* namespace gr */ diff --git a/gnuradio-runtime/lib/flat_flowgraph.cc b/gnuradio-runtime/lib/flat_flowgraph.cc index c83ab20769..b798e4812e 100644 --- a/gnuradio-runtime/lib/flat_flowgraph.cc +++ b/gnuradio-runtime/lib/flat_flowgraph.cc @@ -37,93 +37,93 @@ namespace gr { // 32Kbyte buffer size between blocks -#define GR_FIXED_BUFFER_SIZE (32*(1L<<10)) +#define GR_FIXED_BUFFER_SIZE (32 * (1L << 10)) - static const unsigned int s_fixed_buffer_size = GR_FIXED_BUFFER_SIZE; +static const unsigned int s_fixed_buffer_size = GR_FIXED_BUFFER_SIZE; - flat_flowgraph_sptr - make_flat_flowgraph() - { +flat_flowgraph_sptr make_flat_flowgraph() +{ return flat_flowgraph_sptr(new flat_flowgraph()); - } +} - flat_flowgraph::flat_flowgraph() - { +flat_flowgraph::flat_flowgraph() +{ configure_default_loggers(d_logger, d_debug_logger, "flat_flowgraph"); - } +} - flat_flowgraph::~flat_flowgraph() - { - } +flat_flowgraph::~flat_flowgraph() {} - void - flat_flowgraph::setup_connections() - { +void flat_flowgraph::setup_connections() +{ basic_block_vector_t blocks = calc_used_blocks(); // Assign block details to blocks - for(basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) - cast_to_block_sptr(*p)->set_detail(allocate_block_detail(*p)); + for (basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) + cast_to_block_sptr(*p)->set_detail(allocate_block_detail(*p)); // Connect inputs to outputs for each block - for(basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) { - connect_block_inputs(*p); + for (basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) { + connect_block_inputs(*p); - block_sptr block = cast_to_block_sptr(*p); - block->set_unaligned(0); - block->set_is_unaligned(false); + block_sptr block = cast_to_block_sptr(*p); + block->set_unaligned(0); + block->set_is_unaligned(false); } // Connect message ports connetions - for(msg_edge_viter_t i = d_msg_edges.begin(); i != d_msg_edges.end(); i++) { - GR_LOG_DEBUG(d_debug_logger, - boost::format("flat_fg connecting msg primitives: (%s, %s)->(%s, %s)\n") % - i->src().block() % i->src().port() % - i->dst().block() % i->dst().port() - ); - i->src().block()->message_port_sub(i->src().port(), pmt::cons(i->dst().block()->alias_pmt(), i->dst().port())); + for (msg_edge_viter_t i = d_msg_edges.begin(); i != d_msg_edges.end(); i++) { + GR_LOG_DEBUG( + d_debug_logger, + boost::format("flat_fg connecting msg primitives: (%s, %s)->(%s, %s)\n") % + i->src().block() % i->src().port() % i->dst().block() % i->dst().port()); + i->src().block()->message_port_sub( + i->src().port(), pmt::cons(i->dst().block()->alias_pmt(), i->dst().port())); } - } +} - block_detail_sptr - flat_flowgraph::allocate_block_detail(basic_block_sptr block) - { +block_detail_sptr flat_flowgraph::allocate_block_detail(basic_block_sptr block) +{ int ninputs = calc_used_ports(block, true).size(); int noutputs = calc_used_ports(block, false).size(); block_detail_sptr detail = make_block_detail(ninputs, noutputs); block_sptr grblock = cast_to_block_sptr(block); - if(!grblock) - throw std::runtime_error( - (boost::format("allocate_block_detail found non-gr::block (%s)")% - block->alias()).str()); + if (!grblock) + throw std::runtime_error( + (boost::format("allocate_block_detail found non-gr::block (%s)") % + block->alias()) + .str()); GR_LOG_DEBUG(d_debug_logger, "Creating block detail for " + block->identifier()); - for(int i = 0; i < noutputs; i++) { - grblock->expand_minmax_buffer(i); - - buffer_sptr buffer = allocate_buffer(block, i); - GR_LOG_DEBUG(d_debug_logger, "Allocated buffer for output " + block->identifier() + " " + std::to_string(i)); - detail->set_output(i, buffer); + for (int i = 0; i < noutputs; i++) { + grblock->expand_minmax_buffer(i); - // Update the block's max_output_buffer based on what was actually allocated. - if((grblock->max_output_buffer(i) != buffer->bufsize()) && (grblock->max_output_buffer(i) != -1)) - GR_LOG_WARN(d_logger, boost::format("Block (%1%) max output buffer set to %2%" - " instead of requested %3%") \ - % grblock->alias() % buffer->bufsize() % grblock->max_output_buffer(i)); - grblock->set_max_output_buffer(i, buffer->bufsize()); + buffer_sptr buffer = allocate_buffer(block, i); + GR_LOG_DEBUG(d_debug_logger, + "Allocated buffer for output " + block->identifier() + " " + + std::to_string(i)); + detail->set_output(i, buffer); + + // Update the block's max_output_buffer based on what was actually allocated. + if ((grblock->max_output_buffer(i) != buffer->bufsize()) && + (grblock->max_output_buffer(i) != -1)) + GR_LOG_WARN(d_logger, + boost::format("Block (%1%) max output buffer set to %2%" + " instead of requested %3%") % + grblock->alias() % buffer->bufsize() % + grblock->max_output_buffer(i)); + grblock->set_max_output_buffer(i, buffer->bufsize()); } return detail; - } +} - buffer_sptr - flat_flowgraph::allocate_buffer(basic_block_sptr block, int port) - { +buffer_sptr flat_flowgraph::allocate_buffer(basic_block_sptr block, int port) +{ block_sptr grblock = cast_to_block_sptr(block); - if(!grblock) - throw std::runtime_error("allocate_buffer found non-gr::block"); + if (!grblock) + throw std::runtime_error("allocate_buffer found non-gr::block"); int item_size = block->output_signature()->sizeof_stream_item(port); // *2 because we're now only filling them 1/2 way in order to @@ -132,112 +132,120 @@ namespace gr { int nitems = s_fixed_buffer_size * 2 / item_size; // Make sure there are at least twice the output_multiple no. of items - if(nitems < 2*grblock->output_multiple()) // Note: this means output_multiple() - nitems = 2*grblock->output_multiple(); // can't be changed by block dynamically + if (nitems < 2 * grblock->output_multiple()) // Note: this means output_multiple() + nitems = 2 * grblock->output_multiple(); // can't be changed by block dynamically // If any downstream blocks are decimators and/or have a large output_multiple, // ensure we have a buffer at least twice their decimation factor*output_multiple basic_block_vector_t blocks = calc_downstream_blocks(block, port); // limit buffer size if indicated - if(grblock->max_output_buffer(port) > 0) { - //std::cout << "constraining output items to " << block->max_output_buffer(port) << "\n"; - nitems = std::min((long)nitems, (long)grblock->max_output_buffer(port)); - nitems -= nitems%grblock->output_multiple(); - if(nitems < 1) - throw std::runtime_error("problems allocating a buffer with the given max output buffer constraint!"); - } - else if(grblock->min_output_buffer(port) > 0) { - nitems = std::max((long)nitems, (long)grblock->min_output_buffer(port)); - nitems -= nitems%grblock->output_multiple(); - if(nitems < 1) - throw std::runtime_error("problems allocating a buffer with the given min output buffer constraint!"); + if (grblock->max_output_buffer(port) > 0) { + // std::cout << "constraining output items to " << block->max_output_buffer(port) + // << "\n"; + nitems = std::min((long)nitems, (long)grblock->max_output_buffer(port)); + nitems -= nitems % grblock->output_multiple(); + if (nitems < 1) + throw std::runtime_error("problems allocating a buffer with the given max " + "output buffer constraint!"); + } else if (grblock->min_output_buffer(port) > 0) { + nitems = std::max((long)nitems, (long)grblock->min_output_buffer(port)); + nitems -= nitems % grblock->output_multiple(); + if (nitems < 1) + throw std::runtime_error("problems allocating a buffer with the given min " + "output buffer constraint!"); } - for(basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) { - block_sptr dgrblock = cast_to_block_sptr(*p); - if(!dgrblock) - throw std::runtime_error("allocate_buffer found non-gr::block"); + for (basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) { + block_sptr dgrblock = cast_to_block_sptr(*p); + if (!dgrblock) + throw std::runtime_error("allocate_buffer found non-gr::block"); - double decimation = (1.0/dgrblock->relative_rate()); - int multiple = dgrblock->output_multiple(); - int history = dgrblock->history(); - nitems = std::max(nitems, static_cast<int>(2*(decimation*multiple+history))); + double decimation = (1.0 / dgrblock->relative_rate()); + int multiple = dgrblock->output_multiple(); + int history = dgrblock->history(); + nitems = + std::max(nitems, static_cast<int>(2 * (decimation * multiple + history))); } - // std::cout << "make_buffer(" << nitems << ", " << item_size << ", " << grblock << "\n"; + // std::cout << "make_buffer(" << nitems << ", " << item_size << ", " << grblock << + // "\n"; // We're going to let this fail once and retry. If that fails, // throw and exit. buffer_sptr b; try { - b = make_buffer(nitems, item_size, grblock); - } - catch(std::bad_alloc&) { - b = make_buffer(nitems, item_size, grblock); + b = make_buffer(nitems, item_size, grblock); + } catch (std::bad_alloc&) { + b = make_buffer(nitems, item_size, grblock); } // Set the max noutput items size here to make sure it's always // set in the block and available in the start() method. // But don't overwrite if the user has set this externally. - if(!grblock->is_set_max_noutput_items()) - grblock->set_max_noutput_items(nitems); + if (!grblock->is_set_max_noutput_items()) + grblock->set_max_noutput_items(nitems); return b; - } +} - void - flat_flowgraph::connect_block_inputs(basic_block_sptr block) - { +void flat_flowgraph::connect_block_inputs(basic_block_sptr block) +{ block_sptr grblock = cast_to_block_sptr(block); if (!grblock) - throw std::runtime_error("connect_block_inputs found non-gr::block"); + throw std::runtime_error("connect_block_inputs found non-gr::block"); // Get its detail and edges that feed into it block_detail_sptr detail = grblock->detail(); edge_vector_t in_edges = calc_upstream_edges(block); // For each edge that feeds into it - for(edge_viter_t e = in_edges.begin(); e != in_edges.end(); e++) { - // Set the buffer reader on the destination port to the output - // buffer on the source port - int dst_port = e->dst().port(); - int src_port = e->src().port(); - basic_block_sptr src_block = e->src().block(); - block_sptr src_grblock = cast_to_block_sptr(src_block); - if(!src_grblock) - throw std::runtime_error("connect_block_inputs found non-gr::block"); - buffer_sptr src_buffer = src_grblock->detail()->output(src_port); - + for (edge_viter_t e = in_edges.begin(); e != in_edges.end(); e++) { + // Set the buffer reader on the destination port to the output + // buffer on the source port + int dst_port = e->dst().port(); + int src_port = e->src().port(); + basic_block_sptr src_block = e->src().block(); + block_sptr src_grblock = cast_to_block_sptr(src_block); + if (!src_grblock) + throw std::runtime_error("connect_block_inputs found non-gr::block"); + buffer_sptr src_buffer = src_grblock->detail()->output(src_port); - GR_LOG_DEBUG(d_debug_logger, "Setting input " + std::to_string(dst_port) + " from edge " + (*e).identifier()); - detail->set_input(dst_port, buffer_add_reader(src_buffer, grblock->history()-1, grblock, - grblock->sample_delay(src_port))); + GR_LOG_DEBUG(d_debug_logger, + "Setting input " + std::to_string(dst_port) + " from edge " + + (*e).identifier()); + + detail->set_input(dst_port, + buffer_add_reader(src_buffer, + grblock->history() - 1, + grblock, + grblock->sample_delay(src_port))); } - } +} - void - flat_flowgraph::merge_connections(flat_flowgraph_sptr old_ffg) - { +void flat_flowgraph::merge_connections(flat_flowgraph_sptr old_ffg) +{ // Allocate block details if needed. Only new blocks that aren't pruned out // by flattening will need one; existing blocks still in the new flowgraph will // already have one. - for(basic_block_viter_t p = d_blocks.begin(); p != d_blocks.end(); p++) { - block_sptr block = cast_to_block_sptr(*p); - - if (!block->detail()) { - GR_LOG_DEBUG(d_debug_logger, - "merge: allocating new detail for block " + block->identifier()); - block->set_detail(allocate_block_detail(block)); - } else { - GR_LOG_DEBUG(d_debug_logger, - "merge: reusing original detail for block " + block->identifier()); - } + for (basic_block_viter_t p = d_blocks.begin(); p != d_blocks.end(); p++) { + block_sptr block = cast_to_block_sptr(*p); + + if (!block->detail()) { + GR_LOG_DEBUG(d_debug_logger, + "merge: allocating new detail for block " + block->identifier()); + block->set_detail(allocate_block_detail(block)); + } else { + GR_LOG_DEBUG(d_debug_logger, + "merge: reusing original detail for block " + + block->identifier()); + } } // Calculate the old edges that will be going away, and clear the // buffer readers on the RHS. - for (edge_viter_t old_edge = old_ffg->d_edges.begin(); old_edge != old_ffg->d_edges.end(); + for (edge_viter_t old_edge = old_ffg->d_edges.begin(); + old_edge != old_ffg->d_edges.end(); old_edge++) { GR_LOG_DEBUG(d_debug_logger, "merge: testing old edge " + old_edge->identifier() + "..."); @@ -259,234 +267,230 @@ namespace gr { } // Now connect inputs to outputs, reusing old buffer readers if they exist - for(basic_block_viter_t p = d_blocks.begin(); p != d_blocks.end(); p++) { - block_sptr block = cast_to_block_sptr(*p); - - GR_LOG_DEBUG(d_debug_logger, - "merge: merging " + block->identifier() + "..."); - - if (old_ffg->has_block_p(*p)) { - // Block exists in old flow graph - GR_LOG_DEBUG(d_debug_logger, "used in old flow graph") - block_detail_sptr detail = block->detail(); - - // Iterate through the inputs and see what needs to be done - int ninputs = calc_used_ports(block, true).size(); // Might be different now - for (int i = 0; i < ninputs; i++) { - GR_LOG_DEBUG(d_debug_logger, - "Checking input " + block->identifier() + ":" + std::to_string(i) + - "..."); - edge edge = calc_upstream_edge(*p, i); - - // Fish out old buffer reader and see if it matches correct buffer from edge list - block_sptr src_block = cast_to_block_sptr(edge.src().block()); - block_detail_sptr src_detail = src_block->detail(); - buffer_sptr src_buffer = src_detail->output(edge.src().port()); - buffer_reader_sptr old_reader; - if (i < detail->ninputs()) // Don't exceed what the original detail has - old_reader = detail->input(i); - - // If there's a match, use it - if (old_reader && (src_buffer == old_reader->buffer())) { - GR_LOG_DEBUG(d_debug_logger, "matched, reusing"); - } else { - GR_LOG_DEBUG(d_debug_logger, "needs a new reader"); - - // Create new buffer reader and assign - detail->set_input(i, buffer_add_reader(src_buffer, block->history() - 1, block)); - } - } - } - else { - // Block is new, it just needs buffer readers at this point - GR_LOG_DEBUG(d_debug_logger, "new block"); - connect_block_inputs(block); - - // Make sure all buffers are aligned - setup_buffer_alignment(block); - } - - // Connect message ports connetions - for (msg_edge_viter_t i = d_msg_edges.begin(); i != d_msg_edges.end(); i++) { - GR_LOG_DEBUG(d_debug_logger, - boost::format("flat_fg connecting msg primitives: (%s, %s)->(%s, %s)\n") % - i->src().block() % i->src().port() % i->dst().block() % i->dst().port()); - i->src().block()->message_port_sub( - i->src().port(), pmt::cons(i->dst().block()->alias_pmt(), i->dst().port())); - } - - // Now deal with the fact that the block details might have - // changed numbers of inputs and outputs vs. in the old - // flowgraph. - - block->detail()->reset_nitem_counters(); - block->detail()->clear_tags(); + for (basic_block_viter_t p = d_blocks.begin(); p != d_blocks.end(); p++) { + block_sptr block = cast_to_block_sptr(*p); + + GR_LOG_DEBUG(d_debug_logger, "merge: merging " + block->identifier() + "..."); + + if (old_ffg->has_block_p(*p)) { + // Block exists in old flow graph + GR_LOG_DEBUG(d_debug_logger, "used in old flow graph") + block_detail_sptr detail = block->detail(); + + // Iterate through the inputs and see what needs to be done + int ninputs = calc_used_ports(block, true).size(); // Might be different now + for (int i = 0; i < ninputs; i++) { + GR_LOG_DEBUG(d_debug_logger, + "Checking input " + block->identifier() + ":" + + std::to_string(i) + "..."); + edge edge = calc_upstream_edge(*p, i); + + // Fish out old buffer reader and see if it matches correct buffer from + // edge list + block_sptr src_block = cast_to_block_sptr(edge.src().block()); + block_detail_sptr src_detail = src_block->detail(); + buffer_sptr src_buffer = src_detail->output(edge.src().port()); + buffer_reader_sptr old_reader; + if (i < detail->ninputs()) // Don't exceed what the original detail has + old_reader = detail->input(i); + + // If there's a match, use it + if (old_reader && (src_buffer == old_reader->buffer())) { + GR_LOG_DEBUG(d_debug_logger, "matched, reusing"); + } else { + GR_LOG_DEBUG(d_debug_logger, "needs a new reader"); + + // Create new buffer reader and assign + detail->set_input( + i, buffer_add_reader(src_buffer, block->history() - 1, block)); + } + } + } else { + // Block is new, it just needs buffer readers at this point + GR_LOG_DEBUG(d_debug_logger, "new block"); + connect_block_inputs(block); + + // Make sure all buffers are aligned + setup_buffer_alignment(block); + } + + // Connect message ports connetions + for (msg_edge_viter_t i = d_msg_edges.begin(); i != d_msg_edges.end(); i++) { + GR_LOG_DEBUG( + d_debug_logger, + boost::format("flat_fg connecting msg primitives: (%s, %s)->(%s, %s)\n") % + i->src().block() % i->src().port() % i->dst().block() % + i->dst().port()); + i->src().block()->message_port_sub( + i->src().port(), + pmt::cons(i->dst().block()->alias_pmt(), i->dst().port())); + } + + // Now deal with the fact that the block details might have + // changed numbers of inputs and outputs vs. in the old + // flowgraph. + + block->detail()->reset_nitem_counters(); + block->detail()->clear_tags(); } - } +} - void - flat_flowgraph::setup_buffer_alignment(block_sptr block) - { +void flat_flowgraph::setup_buffer_alignment(block_sptr block) +{ const int alignment = volk_get_alignment(); - for(int i = 0; i < block->detail()->ninputs(); i++) { - void *r = (void*)block->detail()->input(i)->read_pointer(); - uintptr_t ri = (uintptr_t)r % alignment; - //std::cerr << "reader: " << r << " alignment: " << ri << std::endl; - if(ri != 0) { - size_t itemsize = block->detail()->input(i)->get_sizeof_item(); - block->detail()->input(i)->update_read_pointer((alignment-ri)/itemsize); - } - block->set_unaligned(0); - block->set_is_unaligned(false); + for (int i = 0; i < block->detail()->ninputs(); i++) { + void* r = (void*)block->detail()->input(i)->read_pointer(); + uintptr_t ri = (uintptr_t)r % alignment; + // std::cerr << "reader: " << r << " alignment: " << ri << std::endl; + if (ri != 0) { + size_t itemsize = block->detail()->input(i)->get_sizeof_item(); + block->detail()->input(i)->update_read_pointer((alignment - ri) / itemsize); + } + block->set_unaligned(0); + block->set_is_unaligned(false); } - for(int i = 0; i < block->detail()->noutputs(); i++) { - void *w = (void*)block->detail()->output(i)->write_pointer(); - uintptr_t wi = (uintptr_t)w % alignment; - //std::cerr << "writer: " << w << " alignment: " << wi << std::endl; - if(wi != 0) { - size_t itemsize = block->detail()->output(i)->get_sizeof_item(); - block->detail()->output(i)->update_write_pointer((alignment-wi)/itemsize); - } - block->set_unaligned(0); - block->set_is_unaligned(false); + for (int i = 0; i < block->detail()->noutputs(); i++) { + void* w = (void*)block->detail()->output(i)->write_pointer(); + uintptr_t wi = (uintptr_t)w % alignment; + // std::cerr << "writer: " << w << " alignment: " << wi << std::endl; + if (wi != 0) { + size_t itemsize = block->detail()->output(i)->get_sizeof_item(); + block->detail()->output(i)->update_write_pointer((alignment - wi) / itemsize); + } + block->set_unaligned(0); + block->set_is_unaligned(false); } - } +} - std::string - flat_flowgraph::edge_list() - { +std::string flat_flowgraph::edge_list() +{ std::stringstream s; - for(edge_viter_t e = d_edges.begin(); e != d_edges.end(); e++) - s << (*e) << std::endl; + for (edge_viter_t e = d_edges.begin(); e != d_edges.end(); e++) + s << (*e) << std::endl; return s.str(); - } +} - std::string - flat_flowgraph::msg_edge_list() - { +std::string flat_flowgraph::msg_edge_list() +{ std::stringstream s; - for(msg_edge_viter_t e = d_msg_edges.begin(); e != d_msg_edges.end(); e++) - s << (*e) << std::endl; + for (msg_edge_viter_t e = d_msg_edges.begin(); e != d_msg_edges.end(); e++) + s << (*e) << std::endl; return s.str(); - } - - void flat_flowgraph::dump() - { - for(edge_viter_t e = d_edges.begin(); e != d_edges.end(); e++) - std::cout << " edge: " << (*e) << std::endl; - - for(basic_block_viter_t p = d_blocks.begin(); p != d_blocks.end(); p++) { - std::cout << " block: " << (*p) << std::endl; - block_detail_sptr detail = cast_to_block_sptr(*p)->detail(); - std::cout << " detail @" << detail << ":" << std::endl; - - int ni = detail->ninputs(); - int no = detail->noutputs(); - for(int i = 0; i < no; i++) { - buffer_sptr buffer = detail->output(i); - std::cout << " output " << i << ": " << buffer << std::endl; - } - - for(int i = 0; i < ni; i++) { - buffer_reader_sptr reader = detail->input(i); - std::cout << " reader " << i << ": " << reader - << " reading from buffer=" << reader->buffer() << std::endl; - } +} + +void flat_flowgraph::dump() +{ + for (edge_viter_t e = d_edges.begin(); e != d_edges.end(); e++) + std::cout << " edge: " << (*e) << std::endl; + + for (basic_block_viter_t p = d_blocks.begin(); p != d_blocks.end(); p++) { + std::cout << " block: " << (*p) << std::endl; + block_detail_sptr detail = cast_to_block_sptr(*p)->detail(); + std::cout << " detail @" << detail << ":" << std::endl; + + int ni = detail->ninputs(); + int no = detail->noutputs(); + for (int i = 0; i < no; i++) { + buffer_sptr buffer = detail->output(i); + std::cout << " output " << i << ": " << buffer << std::endl; + } + + for (int i = 0; i < ni; i++) { + buffer_reader_sptr reader = detail->input(i); + std::cout << " reader " << i << ": " << reader + << " reading from buffer=" << reader->buffer() << std::endl; + } } - } +} - block_vector_t - flat_flowgraph::make_block_vector(basic_block_vector_t &blocks) - { +block_vector_t flat_flowgraph::make_block_vector(basic_block_vector_t& blocks) +{ block_vector_t result; - for(basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) { - result.push_back(cast_to_block_sptr(*p)); + for (basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) { + result.push_back(cast_to_block_sptr(*p)); } return result; - } - - void - flat_flowgraph::clear_endpoint(const msg_endpoint &e, bool is_src) - { - for(size_t i=0; i<d_msg_edges.size(); i++) { - if(is_src) { - if(d_msg_edges[i].src() == e) { - d_msg_edges.erase(d_msg_edges.begin() + i); - i--; - } - } - else { - if(d_msg_edges[i].dst() == e) { - d_msg_edges.erase(d_msg_edges.begin() + i); - i--; +} + +void flat_flowgraph::clear_endpoint(const msg_endpoint& e, bool is_src) +{ + for (size_t i = 0; i < d_msg_edges.size(); i++) { + if (is_src) { + if (d_msg_edges[i].src() == e) { + d_msg_edges.erase(d_msg_edges.begin() + i); + i--; + } + } else { + if (d_msg_edges[i].dst() == e) { + d_msg_edges.erase(d_msg_edges.begin() + i); + i--; + } } - } } - } - - void - flat_flowgraph::clear_hier() - { - GR_LOG_DEBUG(d_debug_logger, "Clear_hier()"); - for (size_t i = 0; i < d_msg_edges.size(); i++) { - GR_LOG_DEBUG(d_debug_logger, - "edge: " + d_msg_edges[i].src().identifier() + "-->" + - d_msg_edges[i].dst().identifier()); - if (d_msg_edges[i].src().is_hier() || d_msg_edges[i].dst().is_hier()) { +} + +void flat_flowgraph::clear_hier() +{ + GR_LOG_DEBUG(d_debug_logger, "Clear_hier()"); + for (size_t i = 0; i < d_msg_edges.size(); i++) { + GR_LOG_DEBUG(d_debug_logger, + "edge: " + d_msg_edges[i].src().identifier() + "-->" + + d_msg_edges[i].dst().identifier()); + if (d_msg_edges[i].src().is_hier() || d_msg_edges[i].dst().is_hier()) { GR_LOG_DEBUG(d_debug_logger, "is hier"); d_msg_edges.erase(d_msg_edges.begin() + i); i--; - } + } } - } - - void - flat_flowgraph::replace_endpoint(const msg_endpoint &e, const msg_endpoint &r, bool is_src) - { - size_t n_replr(0); - GR_LOG_DEBUG(d_debug_logger, - boost::format("flat_flowgraph::replace_endpoint( %s, %s, %d )\n") % e.block() % - r.block() % is_src); - for (size_t i = 0; i < d_msg_edges.size(); i++) { - if (is_src) { - if (d_msg_edges[i].src() == e) { - GR_LOG_DEBUG( - d_debug_logger, - boost::format( - "flat_flowgraph::replace_endpoint() flattening to ( %s, %s )\n") % - r % d_msg_edges[i].dst()) - d_msg_edges.push_back(msg_edge(r, d_msg_edges[i].dst())); - n_replr++; - } - } else { - if (d_msg_edges[i].dst() == e) { - GR_LOG_DEBUG( - d_debug_logger, - boost::format( - "flat_flowgraph::replace_endpoint() flattening to ( %s, %s )\n") % - r % d_msg_edges[i].src()); - d_msg_edges.push_back(msg_edge(d_msg_edges[i].src(), r)); - n_replr++; - } - } +} + +void flat_flowgraph::replace_endpoint(const msg_endpoint& e, + const msg_endpoint& r, + bool is_src) +{ + size_t n_replr(0); + GR_LOG_DEBUG(d_debug_logger, + boost::format("flat_flowgraph::replace_endpoint( %s, %s, %d )\n") % + e.block() % r.block() % is_src); + for (size_t i = 0; i < d_msg_edges.size(); i++) { + if (is_src) { + if (d_msg_edges[i].src() == e) { + GR_LOG_DEBUG( + d_debug_logger, + boost::format( + "flat_flowgraph::replace_endpoint() flattening to ( %s, %s )\n") % + r % d_msg_edges[i].dst()) + d_msg_edges.push_back(msg_edge(r, d_msg_edges[i].dst())); + n_replr++; + } + } else { + if (d_msg_edges[i].dst() == e) { + GR_LOG_DEBUG( + d_debug_logger, + boost::format( + "flat_flowgraph::replace_endpoint() flattening to ( %s, %s )\n") % + r % d_msg_edges[i].src()); + d_msg_edges.push_back(msg_edge(d_msg_edges[i].src(), r)); + n_replr++; + } + } } - } +} - void - flat_flowgraph::enable_pc_rpc() - { +void flat_flowgraph::enable_pc_rpc() +{ #ifdef GR_PERFORMANCE_COUNTERS - if(prefs::singleton()->get_bool("PerfCounters", "on", false)) { - basic_block_viter_t p; - for(p = d_blocks.begin(); p != d_blocks.end(); p++) { - block_sptr block = cast_to_block_sptr(*p); - if(!block->is_pc_rpc_set()) - block->setup_pc_rpc(); - } + if (prefs::singleton()->get_bool("PerfCounters", "on", false)) { + basic_block_viter_t p; + for (p = d_blocks.begin(); p != d_blocks.end(); p++) { + block_sptr block = cast_to_block_sptr(*p); + if (!block->is_pc_rpc_set()) + block->setup_pc_rpc(); + } } #endif /* GR_PERFORMANCE_COUNTERS */ - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/flat_flowgraph.h b/gnuradio-runtime/lib/flat_flowgraph.h index 5db38b9dae..3630a2a5c8 100644 --- a/gnuradio-runtime/lib/flat_flowgraph.h +++ b/gnuradio-runtime/lib/flat_flowgraph.h @@ -30,18 +30,18 @@ namespace gr { - // Create a shared pointer to a heap allocated gr::flat_flowgraph - // (types defined in gr_runtime_types.h) - GR_RUNTIME_API flat_flowgraph_sptr make_flat_flowgraph(); - - /*! - *\brief Class specializing gr_flat_flowgraph that has all nodes - * as blocks, with no hierarchy - * \ingroup internal - */ - class GR_RUNTIME_API flat_flowgraph : public flowgraph - { - public: +// Create a shared pointer to a heap allocated gr::flat_flowgraph +// (types defined in gr_runtime_types.h) +GR_RUNTIME_API flat_flowgraph_sptr make_flat_flowgraph(); + +/*! + *\brief Class specializing gr_flat_flowgraph that has all nodes + * as blocks, with no hierarchy + * \ingroup internal + */ +class GR_RUNTIME_API flat_flowgraph : public flowgraph +{ +public: friend GR_RUNTIME_API flat_flowgraph_sptr make_flat_flowgraph(); // Destruct an arbitrary gr::flat_flowgraph @@ -64,17 +64,17 @@ namespace gr { /*! * Make a vector of gr::block from a vector of gr::basic_block */ - static block_vector_t make_block_vector(basic_block_vector_t &blocks); + static block_vector_t make_block_vector(basic_block_vector_t& blocks); /*! * replace hierarchical message connections with internal primitive ones */ - void replace_endpoint(const msg_endpoint &e, const msg_endpoint &r, bool is_src); + void replace_endpoint(const msg_endpoint& e, const msg_endpoint& r, bool is_src); /*! * remove a specific hier message connection after replacement */ - void clear_endpoint(const msg_endpoint &e, bool is_src); + void clear_endpoint(const msg_endpoint& e, bool is_src); /*! * remove remainin hier message connections (non primitive) @@ -87,7 +87,7 @@ namespace gr { */ void enable_pc_rpc(); - private: +private: flat_flowgraph(); block_detail_sptr allocate_block_detail(basic_block_sptr block); @@ -105,7 +105,7 @@ namespace gr { gr::logger_ptr d_logger; gr::logger_ptr d_debug_logger; - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/lib/flowgraph.cc b/gnuradio-runtime/lib/flowgraph.cc index b9902363c7..acc1429ae2 100644 --- a/gnuradio-runtime/lib/flowgraph.cc +++ b/gnuradio-runtime/lib/flowgraph.cc @@ -33,499 +33,462 @@ namespace gr { #define FLOWGRAPH_DEBUG 0 - edge::~edge() - { - } - - flowgraph_sptr make_flowgraph() - { - return flowgraph_sptr(new flowgraph()); - } - - flowgraph::flowgraph() - { - } - - flowgraph::~flowgraph() - { - } - - template<class T> - static - std::vector<T> - unique_vector(std::vector<T> v) - { +edge::~edge() {} + +flowgraph_sptr make_flowgraph() { return flowgraph_sptr(new flowgraph()); } + +flowgraph::flowgraph() {} + +flowgraph::~flowgraph() {} + +template <class T> +static std::vector<T> unique_vector(std::vector<T> v) +{ std::vector<T> result; - std::insert_iterator<std::vector<T> > inserter(result, result.begin()); + std::insert_iterator<std::vector<T>> inserter(result, result.begin()); sort(v.begin(), v.end()); unique_copy(v.begin(), v.end(), inserter); return result; - } +} - void - flowgraph::connect(const endpoint &src, const endpoint &dst) - { +void flowgraph::connect(const endpoint& src, const endpoint& dst) +{ check_valid_port(src.block()->output_signature(), src.port()); check_valid_port(dst.block()->input_signature(), dst.port()); check_dst_not_used(dst); check_type_match(src, dst); // Alles klar, Herr Kommissar - d_edges.push_back(edge(src,dst)); - } - - void - flowgraph::disconnect(const endpoint &src, const endpoint &dst) - { - for(edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) { - if(src == p->src() && dst == p->dst()) { - d_edges.erase(p); - return; - } + d_edges.push_back(edge(src, dst)); +} + +void flowgraph::disconnect(const endpoint& src, const endpoint& dst) +{ + for (edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) { + if (src == p->src() && dst == p->dst()) { + d_edges.erase(p); + return; + } } std::stringstream msg; msg << "cannot disconnect edge " << edge(src, dst) << ", not found"; throw std::invalid_argument(msg.str()); - } +} - void - flowgraph::validate() - { +void flowgraph::validate() +{ d_blocks = calc_used_blocks(); - for(basic_block_viter_t p = d_blocks.begin(); p != d_blocks.end(); p++) { - std::vector<int> used_ports; - int ninputs, noutputs; + for (basic_block_viter_t p = d_blocks.begin(); p != d_blocks.end(); p++) { + std::vector<int> used_ports; + int ninputs, noutputs; - if(FLOWGRAPH_DEBUG) - std::cout << "Validating block: " << (*p) << std::endl; + if (FLOWGRAPH_DEBUG) + std::cout << "Validating block: " << (*p) << std::endl; - used_ports = calc_used_ports(*p, true); // inputs - ninputs = used_ports.size(); - check_contiguity(*p, used_ports, true); // inputs + used_ports = calc_used_ports(*p, true); // inputs + ninputs = used_ports.size(); + check_contiguity(*p, used_ports, true); // inputs - used_ports = calc_used_ports(*p, false); // outputs - noutputs = used_ports.size(); - check_contiguity(*p, used_ports, false); // outputs + used_ports = calc_used_ports(*p, false); // outputs + noutputs = used_ports.size(); + check_contiguity(*p, used_ports, false); // outputs - if(!((*p)->check_topology(ninputs, noutputs))) { - std::stringstream msg; - msg << "check topology failed on " << (*p) - << " using ninputs=" << ninputs - << ", noutputs=" << noutputs; - throw std::runtime_error(msg.str()); - } + if (!((*p)->check_topology(ninputs, noutputs))) { + std::stringstream msg; + msg << "check topology failed on " << (*p) << " using ninputs=" << ninputs + << ", noutputs=" << noutputs; + throw std::runtime_error(msg.str()); + } } - } +} - void - flowgraph::clear() - { +void flowgraph::clear() +{ // Boost shared pointers will deallocate as needed d_blocks.clear(); d_edges.clear(); - } +} - void - flowgraph::check_valid_port(gr::io_signature::sptr sig, int port) - { +void flowgraph::check_valid_port(gr::io_signature::sptr sig, int port) +{ std::stringstream msg; - if(port < 0) { - msg << "negative port number " << port << " is invalid"; - throw std::invalid_argument(msg.str()); + if (port < 0) { + msg << "negative port number " << port << " is invalid"; + throw std::invalid_argument(msg.str()); } int max = sig->max_streams(); - if(max != io_signature::IO_INFINITE && port >= max) { - msg << "port number " << port << " exceeds max of "; - if(max == 0) - msg << "(none)"; - else - msg << max-1; - throw std::invalid_argument(msg.str()); + if (max != io_signature::IO_INFINITE && port >= max) { + msg << "port number " << port << " exceeds max of "; + if (max == 0) + msg << "(none)"; + else + msg << max - 1; + throw std::invalid_argument(msg.str()); } - } - - void - flowgraph::check_valid_port(const msg_endpoint &e) - { - if(FLOWGRAPH_DEBUG) - std::cout << "check_valid_port( " << e.block() << ", " << e.port() << ")\n"; - - if(!e.block()->has_msg_port(e.port())) { - const gr::basic_block::msg_queue_map_t& msg_map = e.block()->get_msg_map(); - std::cout << "Could not find port: " << e.port() << " in:" << std::endl; - for (gr::basic_block::msg_queue_map_t::const_iterator it = msg_map.begin(); it != msg_map.end(); ++it) - std::cout << it->first << std::endl; - std::cout << std::endl; - throw std::invalid_argument("invalid msg port in connect() or disconnect()"); +} + +void flowgraph::check_valid_port(const msg_endpoint& e) +{ + if (FLOWGRAPH_DEBUG) + std::cout << "check_valid_port( " << e.block() << ", " << e.port() << ")\n"; + + if (!e.block()->has_msg_port(e.port())) { + const gr::basic_block::msg_queue_map_t& msg_map = e.block()->get_msg_map(); + std::cout << "Could not find port: " << e.port() << " in:" << std::endl; + for (gr::basic_block::msg_queue_map_t::const_iterator it = msg_map.begin(); + it != msg_map.end(); + ++it) + std::cout << it->first << std::endl; + std::cout << std::endl; + throw std::invalid_argument("invalid msg port in connect() or disconnect()"); } - } +} - void - flowgraph::check_dst_not_used(const endpoint &dst) - { +void flowgraph::check_dst_not_used(const endpoint& dst) +{ // A destination is in use if it is already on the edge list - for(edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) - if(p->dst() == dst) { - std::stringstream msg; - msg << "destination already in use by edge " << (*p); - throw std::invalid_argument(msg.str()); - } - } + for (edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) + if (p->dst() == dst) { + std::stringstream msg; + msg << "destination already in use by edge " << (*p); + throw std::invalid_argument(msg.str()); + } +} - void - flowgraph::check_type_match(const endpoint &src, const endpoint &dst) - { +void flowgraph::check_type_match(const endpoint& src, const endpoint& dst) +{ int src_size = src.block()->output_signature()->sizeof_stream_item(src.port()); int dst_size = dst.block()->input_signature()->sizeof_stream_item(dst.port()); - if(src_size != dst_size) { - std::stringstream msg; - msg << "itemsize mismatch: " << src << " using " << src_size - << ", " << dst << " using " << dst_size; - throw std::invalid_argument(msg.str()); + if (src_size != dst_size) { + std::stringstream msg; + msg << "itemsize mismatch: " << src << " using " << src_size << ", " << dst + << " using " << dst_size; + throw std::invalid_argument(msg.str()); } - } +} - basic_block_vector_t - flowgraph::calc_used_blocks() - { +basic_block_vector_t flowgraph::calc_used_blocks() +{ basic_block_vector_t tmp; // make sure free standing message blocks are included - for(msg_edge_viter_t p = d_msg_edges.begin(); p != d_msg_edges.end(); p++) { - // all msg blocks need a thread context - otherwise start() will never be called! - // even if it is a sender that never does anything - tmp.push_back(p->src().block()); - tmp.push_back(p->dst().block()); + for (msg_edge_viter_t p = d_msg_edges.begin(); p != d_msg_edges.end(); p++) { + // all msg blocks need a thread context - otherwise start() will never be called! + // even if it is a sender that never does anything + tmp.push_back(p->src().block()); + tmp.push_back(p->dst().block()); } // Collect all blocks in the edge list - for(edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) { - tmp.push_back(p->src().block()); - tmp.push_back(p->dst().block()); + for (edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) { + tmp.push_back(p->src().block()); + tmp.push_back(p->dst().block()); } return unique_vector<basic_block_sptr>(tmp); - } +} - std::vector<int> - flowgraph::calc_used_ports(basic_block_sptr block, bool check_inputs) - { +std::vector<int> flowgraph::calc_used_ports(basic_block_sptr block, bool check_inputs) +{ std::vector<int> tmp; // Collect all seen ports edge_vector_t edges = calc_connections(block, check_inputs); - for(edge_viter_t p = edges.begin(); p != edges.end(); p++) { - if(check_inputs == true) - tmp.push_back(p->dst().port()); - else - tmp.push_back(p->src().port()); + for (edge_viter_t p = edges.begin(); p != edges.end(); p++) { + if (check_inputs == true) + tmp.push_back(p->dst().port()); + else + tmp.push_back(p->src().port()); } return unique_vector<int>(tmp); - } +} - edge_vector_t - flowgraph::calc_connections(basic_block_sptr block, bool check_inputs) - { +edge_vector_t flowgraph::calc_connections(basic_block_sptr block, bool check_inputs) +{ edge_vector_t result; - for(edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) { - if(check_inputs) { - if(p->dst().block() == block) - result.push_back(*p); - } - else { - if(p->src().block() == block) - result.push_back(*p); - } + for (edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) { + if (check_inputs) { + if (p->dst().block() == block) + result.push_back(*p); + } else { + if (p->src().block() == block) + result.push_back(*p); + } } return result; // assumes no duplicates - } +} - void - flowgraph::check_contiguity(basic_block_sptr block, - const std::vector<int> &used_ports, - bool check_inputs) - { +void flowgraph::check_contiguity(basic_block_sptr block, + const std::vector<int>& used_ports, + bool check_inputs) +{ std::stringstream msg; gr::io_signature::sptr sig = - check_inputs ? block->input_signature() : block->output_signature(); + check_inputs ? block->input_signature() : block->output_signature(); int nports = used_ports.size(); int min_ports = sig->min_streams(); int max_ports = sig->max_streams(); - if(nports == 0 && min_ports == 0) - return; + if (nports == 0 && min_ports == 0) + return; - if(nports < min_ports) { - msg << block << ": insufficient connected " - << (check_inputs ? "input ports " : "output ports ") - << "(" << min_ports << " needed, " << nports << " connected)"; - throw std::runtime_error(msg.str()); + if (nports < min_ports) { + msg << block << ": insufficient connected " + << (check_inputs ? "input ports " : "output ports ") << "(" << min_ports + << " needed, " << nports << " connected)"; + throw std::runtime_error(msg.str()); } - if(nports > max_ports && max_ports != io_signature::IO_INFINITE) { - msg << block << ": too many connected " - << (check_inputs ? "input ports " : "output ports ") - << "(" << max_ports << " allowed, " << nports << " connected)"; - throw std::runtime_error(msg.str()); + if (nports > max_ports && max_ports != io_signature::IO_INFINITE) { + msg << block << ": too many connected " + << (check_inputs ? "input ports " : "output ports ") << "(" << max_ports + << " allowed, " << nports << " connected)"; + throw std::runtime_error(msg.str()); } - if(used_ports[nports-1]+1 != nports) { - for(int i = 0; i < nports; i++) { - if(used_ports[i] != i) { - msg << block << ": missing connection " - << (check_inputs ? "to input port " : "from output port ") - << i; - throw std::runtime_error(msg.str()); + if (used_ports[nports - 1] + 1 != nports) { + for (int i = 0; i < nports; i++) { + if (used_ports[i] != i) { + msg << block << ": missing connection " + << (check_inputs ? "to input port " : "from output port ") << i; + throw std::runtime_error(msg.str()); + } } - } } - } +} - basic_block_vector_t - flowgraph::calc_downstream_blocks(basic_block_sptr block, int port) - { +basic_block_vector_t flowgraph::calc_downstream_blocks(basic_block_sptr block, int port) +{ basic_block_vector_t tmp; - for(edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) - if(p->src() == endpoint(block, port)) - tmp.push_back(p->dst().block()); + for (edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) + if (p->src() == endpoint(block, port)) + tmp.push_back(p->dst().block()); return unique_vector<basic_block_sptr>(tmp); - } +} - basic_block_vector_t - flowgraph::calc_downstream_blocks(basic_block_sptr block) - { +basic_block_vector_t flowgraph::calc_downstream_blocks(basic_block_sptr block) +{ basic_block_vector_t tmp; - for(edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) - if(p->src().block() == block) - tmp.push_back(p->dst().block()); + for (edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) + if (p->src().block() == block) + tmp.push_back(p->dst().block()); return unique_vector<basic_block_sptr>(tmp); - } +} - edge_vector_t - flowgraph::calc_upstream_edges(basic_block_sptr block) - { +edge_vector_t flowgraph::calc_upstream_edges(basic_block_sptr block) +{ edge_vector_t result; - for(edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) - if(p->dst().block() == block) - result.push_back(*p); + for (edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) + if (p->dst().block() == block) + result.push_back(*p); return result; // Assume no duplicates - } +} - bool - flowgraph::has_block_p(basic_block_sptr block) - { +bool flowgraph::has_block_p(basic_block_sptr block) +{ basic_block_viter_t result; result = std::find(d_blocks.begin(), d_blocks.end(), block); return (result != d_blocks.end()); - } +} - edge - flowgraph::calc_upstream_edge(basic_block_sptr block, int port) - { +edge flowgraph::calc_upstream_edge(basic_block_sptr block, int port) +{ edge result; - for(edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) { - if(p->dst() == endpoint(block, port)) { - result = (*p); - break; - } + for (edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) { + if (p->dst() == endpoint(block, port)) { + result = (*p); + break; + } } return result; - } +} - std::vector<basic_block_vector_t> - flowgraph::partition() - { +std::vector<basic_block_vector_t> flowgraph::partition() +{ std::vector<basic_block_vector_t> result; basic_block_vector_t blocks = calc_used_blocks(); basic_block_vector_t graph; - while(blocks.size() > 0) { - graph = calc_reachable_blocks(blocks[0], blocks); - assert(graph.size()); - result.push_back(topological_sort(graph)); + while (blocks.size() > 0) { + graph = calc_reachable_blocks(blocks[0], blocks); + assert(graph.size()); + result.push_back(topological_sort(graph)); - for(basic_block_viter_t p = graph.begin(); p != graph.end(); p++) - blocks.erase(find(blocks.begin(), blocks.end(), *p)); + for (basic_block_viter_t p = graph.begin(); p != graph.end(); p++) + blocks.erase(find(blocks.begin(), blocks.end(), *p)); } return result; - } +} - basic_block_vector_t - flowgraph::calc_reachable_blocks(basic_block_sptr block, basic_block_vector_t &blocks) - { +basic_block_vector_t flowgraph::calc_reachable_blocks(basic_block_sptr block, + basic_block_vector_t& blocks) +{ basic_block_vector_t result; // Mark all blocks as unvisited - for(basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) - (*p)->set_color(basic_block::WHITE); + for (basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) + (*p)->set_color(basic_block::WHITE); // Recursively mark all reachable blocks reachable_dfs_visit(block, blocks); // Collect all the blocks that have been visited - for(basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) - if((*p)->color() == basic_block::BLACK) - result.push_back(*p); + for (basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) + if ((*p)->color() == basic_block::BLACK) + result.push_back(*p); return result; - } +} - // Recursively mark all reachable blocks from given block and block list - void - flowgraph::reachable_dfs_visit(basic_block_sptr block, basic_block_vector_t &blocks) - { +// Recursively mark all reachable blocks from given block and block list +void flowgraph::reachable_dfs_visit(basic_block_sptr block, basic_block_vector_t& blocks) +{ // Mark the current one as visited block->set_color(basic_block::BLACK); // Recurse into adjacent vertices basic_block_vector_t adjacent = calc_adjacent_blocks(block, blocks); - for(basic_block_viter_t p = adjacent.begin(); p != adjacent.end(); p++) - if((*p)->color() == basic_block::WHITE) - reachable_dfs_visit(*p, blocks); - } + for (basic_block_viter_t p = adjacent.begin(); p != adjacent.end(); p++) + if ((*p)->color() == basic_block::WHITE) + reachable_dfs_visit(*p, blocks); +} - // Return a list of block adjacent to a given block along any edge - basic_block_vector_t - flowgraph::calc_adjacent_blocks(basic_block_sptr block, basic_block_vector_t &blocks) - { +// Return a list of block adjacent to a given block along any edge +basic_block_vector_t flowgraph::calc_adjacent_blocks(basic_block_sptr block, + basic_block_vector_t& blocks) +{ basic_block_vector_t tmp; // Find any blocks that are inputs or outputs - for(edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) { - if(p->src().block() == block) - tmp.push_back(p->dst().block()); - if(p->dst().block() == block) - tmp.push_back(p->src().block()); + for (edge_viter_t p = d_edges.begin(); p != d_edges.end(); p++) { + if (p->src().block() == block) + tmp.push_back(p->dst().block()); + if (p->dst().block() == block) + tmp.push_back(p->src().block()); } return unique_vector<basic_block_sptr>(tmp); - } +} - basic_block_vector_t - flowgraph::topological_sort(basic_block_vector_t &blocks) - { +basic_block_vector_t flowgraph::topological_sort(basic_block_vector_t& blocks) +{ basic_block_vector_t tmp; basic_block_vector_t result; tmp = sort_sources_first(blocks); // Start 'em all white - for(basic_block_viter_t p = tmp.begin(); p != tmp.end(); p++) - (*p)->set_color(basic_block::WHITE); + for (basic_block_viter_t p = tmp.begin(); p != tmp.end(); p++) + (*p)->set_color(basic_block::WHITE); - for(basic_block_viter_t p = tmp.begin(); p != tmp.end(); p++) { - if((*p)->color() == basic_block::WHITE) - topological_dfs_visit(*p, result); + for (basic_block_viter_t p = tmp.begin(); p != tmp.end(); p++) { + if ((*p)->color() == basic_block::WHITE) + topological_dfs_visit(*p, result); } reverse(result.begin(), result.end()); return result; - } +} - basic_block_vector_t - flowgraph::sort_sources_first(basic_block_vector_t &blocks) - { +basic_block_vector_t flowgraph::sort_sources_first(basic_block_vector_t& blocks) +{ basic_block_vector_t sources, nonsources, result; - for(basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) { - if(source_p(*p)) - sources.push_back(*p); - else - nonsources.push_back(*p); + for (basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) { + if (source_p(*p)) + sources.push_back(*p); + else + nonsources.push_back(*p); } - for(basic_block_viter_t p = sources.begin(); p != sources.end(); p++) - result.push_back(*p); + for (basic_block_viter_t p = sources.begin(); p != sources.end(); p++) + result.push_back(*p); - for(basic_block_viter_t p = nonsources.begin(); p != nonsources.end(); p++) - result.push_back(*p); + for (basic_block_viter_t p = nonsources.begin(); p != nonsources.end(); p++) + result.push_back(*p); return result; - } +} - bool - flowgraph::source_p(basic_block_sptr block) - { +bool flowgraph::source_p(basic_block_sptr block) +{ return (calc_upstream_edges(block).size() == 0); - } +} - void - flowgraph::topological_dfs_visit(basic_block_sptr block, basic_block_vector_t &output) - { +void flowgraph::topological_dfs_visit(basic_block_sptr block, + basic_block_vector_t& output) +{ block->set_color(basic_block::GREY); basic_block_vector_t blocks(calc_downstream_blocks(block)); - for(basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) { - switch((*p)->color()) { - case basic_block::WHITE: - topological_dfs_visit(*p, output); - break; + for (basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) { + switch ((*p)->color()) { + case basic_block::WHITE: + topological_dfs_visit(*p, output); + break; - case basic_block::GREY: - throw std::runtime_error("flow graph has loops!"); + case basic_block::GREY: + throw std::runtime_error("flow graph has loops!"); - case basic_block::BLACK: - continue; + case basic_block::BLACK: + continue; - default: - throw std::runtime_error("invalid color on block!"); - } + default: + throw std::runtime_error("invalid color on block!"); + } } block->set_color(basic_block::BLACK); output.push_back(block); - } +} - void - flowgraph::connect(const msg_endpoint &src, const msg_endpoint &dst) - { +void flowgraph::connect(const msg_endpoint& src, const msg_endpoint& dst) +{ check_valid_port(src); check_valid_port(dst); - for(msg_edge_viter_t p = d_msg_edges.begin(); p != d_msg_edges.end(); p++) { - if(p->src() == src && p->dst() == dst){ - throw std::runtime_error("connect called on already connected edge!"); - } + for (msg_edge_viter_t p = d_msg_edges.begin(); p != d_msg_edges.end(); p++) { + if (p->src() == src && p->dst() == dst) { + throw std::runtime_error("connect called on already connected edge!"); + } } - d_msg_edges.push_back(msg_edge(src,dst)); - } + d_msg_edges.push_back(msg_edge(src, dst)); +} - void - flowgraph::disconnect(const msg_endpoint &src, const msg_endpoint &dst) - { +void flowgraph::disconnect(const msg_endpoint& src, const msg_endpoint& dst) +{ check_valid_port(src); check_valid_port(dst); - for(msg_edge_viter_t p = d_msg_edges.begin(); p != d_msg_edges.end(); p++) { - if(p->src() == src && p->dst() == dst){ - d_msg_edges.erase(p); - return; - } + for (msg_edge_viter_t p = d_msg_edges.begin(); p != d_msg_edges.end(); p++) { + if (p->src() == src && p->dst() == dst) { + d_msg_edges.erase(p); + return; + } } throw std::runtime_error("disconnect called on non-connected edge!"); - } +} - std::string - dot_graph_fg(flowgraph_sptr fg) - { +std::string dot_graph_fg(flowgraph_sptr fg) +{ basic_block_vector_t blocks = fg->calc_used_blocks(); edge_vector_t edges = fg->edges(); @@ -534,22 +497,20 @@ namespace gr { out << "digraph flowgraph {" << std::endl; // Define nodes and set labels - for(basic_block_viter_t block = blocks.begin(); block != blocks.end(); ++block) { - out << (*block)->unique_id() - << " [ label=\"" << (*block)->name() << "\" ]" - << std::endl; + for (basic_block_viter_t block = blocks.begin(); block != blocks.end(); ++block) { + out << (*block)->unique_id() << " [ label=\"" << (*block)->name() << "\" ]" + << std::endl; } // Define edges - for(edge_viter_t edge = edges.begin(); edge != edges.end(); ++edge) { - out << edge->src().block()->unique_id() - << " -> " - << edge->dst().block()->unique_id() << std::endl; + for (edge_viter_t edge = edges.begin(); edge != edges.end(); ++edge) { + out << edge->src().block()->unique_id() << " -> " + << edge->dst().block()->unique_id() << std::endl; } out << "}" << std::endl; return out.str(); - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/hier_block2.cc b/gnuradio-runtime/lib/hier_block2.cc index 8ebbbda587..4c6414c465 100644 --- a/gnuradio-runtime/lib/hier_block2.cc +++ b/gnuradio-runtime/lib/hier_block2.cc @@ -34,251 +34,211 @@ namespace gr { #define GR_HIER_BLOCK2_DEBUG 0 - hier_block2_sptr - make_hier_block2(const std::string &name, - gr::io_signature::sptr input_signature, - gr::io_signature::sptr output_signature) - { - return gnuradio::get_initial_sptr - (new hier_block2(name, input_signature, output_signature)); - } - - hier_block2::hier_block2(const std::string &name, - gr::io_signature::sptr input_signature, - gr::io_signature::sptr output_signature) +hier_block2_sptr make_hier_block2(const std::string& name, + gr::io_signature::sptr input_signature, + gr::io_signature::sptr output_signature) +{ + return gnuradio::get_initial_sptr( + new hier_block2(name, input_signature, output_signature)); +} + +hier_block2::hier_block2(const std::string& name, + gr::io_signature::sptr input_signature, + gr::io_signature::sptr output_signature) : basic_block(name, input_signature, output_signature), d_detail(new hier_block2_detail(this)), hier_message_ports_in(pmt::PMT_NIL), hier_message_ports_out(pmt::PMT_NIL) - { +{ // This bit of magic ensures that self() works in the constructors of derived classes. gnuradio::detail::sptr_magic::create_and_stash_initial_sptr(this); - } +} - hier_block2::~hier_block2() - { +hier_block2::~hier_block2() +{ disconnect_all(); gnuradio::detail::sptr_magic::cancel_initial_sptr(this); delete d_detail; - } +} - hier_block2::opaque_self - hier_block2::self() - { - return shared_from_this(); - } +hier_block2::opaque_self hier_block2::self() { return shared_from_this(); } - hier_block2_sptr - hier_block2::to_hier_block2() - { +hier_block2_sptr hier_block2::to_hier_block2() +{ return cast_to_hier_block2_sptr(shared_from_this()); - } - - void - hier_block2::connect(basic_block_sptr block) - { - d_detail->connect(block); - } - - void - hier_block2::connect(basic_block_sptr src, int src_port, - basic_block_sptr dst, int dst_port) - { +} + +void hier_block2::connect(basic_block_sptr block) { d_detail->connect(block); } + +void hier_block2::connect(basic_block_sptr src, + int src_port, + basic_block_sptr dst, + int dst_port) +{ d_detail->connect(src, src_port, dst, dst_port); - } - - void - hier_block2::msg_connect(basic_block_sptr src, pmt::pmt_t srcport, - basic_block_sptr dst, pmt::pmt_t dstport) - { - if(!pmt::is_symbol(srcport)) { - throw std::runtime_error("bad port id"); +} + +void hier_block2::msg_connect(basic_block_sptr src, + pmt::pmt_t srcport, + basic_block_sptr dst, + pmt::pmt_t dstport) +{ + if (!pmt::is_symbol(srcport)) { + throw std::runtime_error("bad port id"); } d_detail->msg_connect(src, srcport, dst, dstport); - } +} - void - hier_block2::msg_connect(basic_block_sptr src, std::string srcport, - basic_block_sptr dst, std::string dstport) - { +void hier_block2::msg_connect(basic_block_sptr src, + std::string srcport, + basic_block_sptr dst, + std::string dstport) +{ d_detail->msg_connect(src, pmt::mp(srcport), dst, pmt::mp(dstport)); - } - - void - hier_block2::msg_disconnect(basic_block_sptr src, pmt::pmt_t srcport, - basic_block_sptr dst, pmt::pmt_t dstport) - { - if(!pmt::is_symbol(srcport)) { - throw std::runtime_error("bad port id"); +} + +void hier_block2::msg_disconnect(basic_block_sptr src, + pmt::pmt_t srcport, + basic_block_sptr dst, + pmt::pmt_t dstport) +{ + if (!pmt::is_symbol(srcport)) { + throw std::runtime_error("bad port id"); } d_detail->msg_disconnect(src, srcport, dst, dstport); - } +} - void - hier_block2::msg_disconnect(basic_block_sptr src, std::string srcport, - basic_block_sptr dst, std::string dstport) - { +void hier_block2::msg_disconnect(basic_block_sptr src, + std::string srcport, + basic_block_sptr dst, + std::string dstport) +{ d_detail->msg_disconnect(src, pmt::mp(srcport), dst, pmt::mp(dstport)); - } - - void - hier_block2::disconnect(basic_block_sptr block) - { - d_detail->disconnect(block); - } - - void - hier_block2::disconnect(basic_block_sptr src, int src_port, - basic_block_sptr dst, int dst_port) - { +} + +void hier_block2::disconnect(basic_block_sptr block) { d_detail->disconnect(block); } + +void hier_block2::disconnect(basic_block_sptr src, + int src_port, + basic_block_sptr dst, + int dst_port) +{ d_detail->disconnect(src, src_port, dst, dst_port); - } - - void - hier_block2::disconnect_all() - { - d_detail->disconnect_all(); - } - - void - hier_block2::lock() - { - d_detail->lock(); - } - - void - hier_block2::unlock() - { - d_detail->unlock(); - } - - flat_flowgraph_sptr - hier_block2::flatten() const - { +} + +void hier_block2::disconnect_all() { d_detail->disconnect_all(); } + +void hier_block2::lock() { d_detail->lock(); } + +void hier_block2::unlock() { d_detail->unlock(); } + +flat_flowgraph_sptr hier_block2::flatten() const +{ flat_flowgraph_sptr new_ffg = make_flat_flowgraph(); d_detail->flatten_aux(new_ffg); return new_ffg; - } +} - void - hier_block2::set_processor_affinity(const std::vector<int> &mask) - { +void hier_block2::set_processor_affinity(const std::vector<int>& mask) +{ d_detail->set_processor_affinity(mask); - } +} - void - hier_block2::unset_processor_affinity() - { - d_detail->unset_processor_affinity(); - } +void hier_block2::unset_processor_affinity() { d_detail->unset_processor_affinity(); } - std::vector<int> - hier_block2::processor_affinity() - { +std::vector<int> hier_block2::processor_affinity() +{ return d_detail->processor_affinity(); - } - - void - hier_block2::set_log_level(std::string level) - { - d_detail->set_log_level(level); - } - - std::string - hier_block2::log_level() - { - return d_detail->log_level(); - } - - std::string - dot_graph(hier_block2_sptr hierblock2) - { +} + +void hier_block2::set_log_level(std::string level) { d_detail->set_log_level(level); } + +std::string hier_block2::log_level() { return d_detail->log_level(); } + +std::string dot_graph(hier_block2_sptr hierblock2) +{ return dot_graph_fg(hierblock2->flatten()); - } +} - int - hier_block2::max_output_buffer(size_t port) - { - if(port >= d_detail->d_max_output_buffer.size()) - throw std::invalid_argument("hier_block2::max_output_buffer(int): port out of range."); +int hier_block2::max_output_buffer(size_t port) +{ + if (port >= d_detail->d_max_output_buffer.size()) + throw std::invalid_argument( + "hier_block2::max_output_buffer(int): port out of range."); return d_detail->d_max_output_buffer[port]; - } - - void - hier_block2::set_max_output_buffer(int max_output_buffer) - { - if(output_signature()->max_streams()>0) - { - if(d_detail->d_max_output_buffer.size() == 0) - throw std::length_error("hier_block2::set_max_output_buffer(int): out_sig greater than zero, buff_vect isn't"); - for(int idx = 0; idx < output_signature()->max_streams(); idx++){ - d_detail->d_max_output_buffer[idx] = max_output_buffer; - } +} + +void hier_block2::set_max_output_buffer(int max_output_buffer) +{ + if (output_signature()->max_streams() > 0) { + if (d_detail->d_max_output_buffer.size() == 0) + throw std::length_error("hier_block2::set_max_output_buffer(int): out_sig " + "greater than zero, buff_vect isn't"); + for (int idx = 0; idx < output_signature()->max_streams(); idx++) { + d_detail->d_max_output_buffer[idx] = max_output_buffer; + } } - } - - void - hier_block2::set_max_output_buffer(size_t port, int max_output_buffer) - { - if(port >= d_detail->d_max_output_buffer.size()) - throw std::invalid_argument("hier_block2::set_max_output_buffer(size_t,int): port out of range."); - else{ - d_detail->d_max_output_buffer[port] = max_output_buffer; +} + +void hier_block2::set_max_output_buffer(size_t port, int max_output_buffer) +{ + if (port >= d_detail->d_max_output_buffer.size()) + throw std::invalid_argument( + "hier_block2::set_max_output_buffer(size_t,int): port out of range."); + else { + d_detail->d_max_output_buffer[port] = max_output_buffer; } - } +} - int - hier_block2::min_output_buffer(size_t port) - { - if(port >= d_detail->d_min_output_buffer.size()) - throw std::invalid_argument("hier_block2::min_output_buffer(size_t): port out of range."); +int hier_block2::min_output_buffer(size_t port) +{ + if (port >= d_detail->d_min_output_buffer.size()) + throw std::invalid_argument( + "hier_block2::min_output_buffer(size_t): port out of range."); return d_detail->d_min_output_buffer[port]; - } - - void - hier_block2::set_min_output_buffer(int min_output_buffer) - { - if(output_signature()->max_streams()>0) - { - if(d_detail->d_min_output_buffer.size() == 0) - throw std::length_error("hier_block2::set_min_output_buffer(int): out_sig greater than zero, buff_vect isn't"); - for(int idx = 0; idx < output_signature()->max_streams(); idx++){ - d_detail->d_min_output_buffer[idx] = min_output_buffer; - } +} + +void hier_block2::set_min_output_buffer(int min_output_buffer) +{ + if (output_signature()->max_streams() > 0) { + if (d_detail->d_min_output_buffer.size() == 0) + throw std::length_error("hier_block2::set_min_output_buffer(int): out_sig " + "greater than zero, buff_vect isn't"); + for (int idx = 0; idx < output_signature()->max_streams(); idx++) { + d_detail->d_min_output_buffer[idx] = min_output_buffer; + } } - } - - void - hier_block2::set_min_output_buffer(size_t port, int min_output_buffer) - { - if(port >= d_detail->d_min_output_buffer.size()) - throw std::invalid_argument("hier_block2::set_min_output_buffer(size_t,int): port out of range."); - else{ - d_detail->d_min_output_buffer[port] = min_output_buffer; +} + +void hier_block2::set_min_output_buffer(size_t port, int min_output_buffer) +{ + if (port >= d_detail->d_min_output_buffer.size()) + throw std::invalid_argument( + "hier_block2::set_min_output_buffer(size_t,int): port out of range."); + else { + d_detail->d_min_output_buffer[port] = min_output_buffer; } - } - - bool - hier_block2::all_min_output_buffer_p(void) - { - if(!d_detail->d_min_output_buffer.size()) - return false; - for(size_t idx = 1; idx < d_detail->d_min_output_buffer.size(); idx++){ - if(d_detail->d_min_output_buffer[0] != d_detail->d_min_output_buffer[idx]) +} + +bool hier_block2::all_min_output_buffer_p(void) +{ + if (!d_detail->d_min_output_buffer.size()) return false; + for (size_t idx = 1; idx < d_detail->d_min_output_buffer.size(); idx++) { + if (d_detail->d_min_output_buffer[0] != d_detail->d_min_output_buffer[idx]) + return false; } return true; - } - bool - hier_block2::all_max_output_buffer_p(void) - { - if(!d_detail->d_max_output_buffer.size()) - return false; - for(size_t idx = 1; idx < d_detail->d_max_output_buffer.size(); idx++){ - if(d_detail->d_max_output_buffer[0] != d_detail->d_max_output_buffer[idx]) +} +bool hier_block2::all_max_output_buffer_p(void) +{ + if (!d_detail->d_max_output_buffer.size()) return false; + for (size_t idx = 1; idx < d_detail->d_max_output_buffer.size(); idx++) { + if (d_detail->d_max_output_buffer[0] != d_detail->d_max_output_buffer[idx]) + return false; } return true; - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/hier_block2_detail.cc b/gnuradio-runtime/lib/hier_block2_detail.cc index dbf519b6ef..38925330cb 100644 --- a/gnuradio-runtime/lib/hier_block2_detail.cc +++ b/gnuradio-runtime/lib/hier_block2_detail.cc @@ -35,141 +35,145 @@ namespace gr { #define HIER_BLOCK2_DETAIL_DEBUG 0 - hier_block2_detail::hier_block2_detail(hier_block2 *owner) - : d_owner(owner), - d_parent_detail(0), - d_fg(make_flowgraph()) - { +hier_block2_detail::hier_block2_detail(hier_block2* owner) + : d_owner(owner), d_parent_detail(0), d_fg(make_flowgraph()) +{ int min_inputs = owner->input_signature()->min_streams(); int max_inputs = owner->input_signature()->max_streams(); int min_outputs = owner->output_signature()->min_streams(); int max_outputs = owner->output_signature()->max_streams(); - if(max_inputs == io_signature::IO_INFINITE || - max_outputs == io_signature::IO_INFINITE || - (min_inputs != max_inputs) ||(min_outputs != max_outputs) ) { - std::stringstream msg; - msg << "Hierarchical blocks do not yet support arbitrary or" - << " variable numbers of inputs or outputs (" << d_owner->name() << ")"; - throw std::runtime_error(msg.str()); + if (max_inputs == io_signature::IO_INFINITE || + max_outputs == io_signature::IO_INFINITE || (min_inputs != max_inputs) || + (min_outputs != max_outputs)) { + std::stringstream msg; + msg << "Hierarchical blocks do not yet support arbitrary or" + << " variable numbers of inputs or outputs (" << d_owner->name() << ")"; + throw std::runtime_error(msg.str()); } d_inputs = std::vector<endpoint_vector_t>(max_inputs); d_outputs = endpoint_vector_t(max_outputs); - d_max_output_buffer = std::vector<size_t>(std::max(max_outputs,1), 0); - d_min_output_buffer = std::vector<size_t>(std::max(max_outputs,1), 0); - } + d_max_output_buffer = std::vector<size_t>(std::max(max_outputs, 1), 0); + d_min_output_buffer = std::vector<size_t>(std::max(max_outputs, 1), 0); +} - hier_block2_detail::~hier_block2_detail() - { +hier_block2_detail::~hier_block2_detail() +{ d_owner = 0; // Don't use delete, we didn't allocate - } +} - void - hier_block2_detail::connect(basic_block_sptr block) - { +void hier_block2_detail::connect(basic_block_sptr block) +{ std::stringstream msg; // Check if duplicate - if(std::find(d_blocks.begin(), d_blocks.end(), block) != d_blocks.end()) { - msg << "Block " << block << " already connected."; - throw std::invalid_argument(msg.str()); + if (std::find(d_blocks.begin(), d_blocks.end(), block) != d_blocks.end()) { + msg << "Block " << block << " already connected."; + throw std::invalid_argument(msg.str()); } // Check if has inputs or outputs - if(block->input_signature()->max_streams() != 0 || - block->output_signature()->max_streams() != 0) { - msg << "Block " << block << " must not have any input or output ports"; - throw std::invalid_argument(msg.str()); + if (block->input_signature()->max_streams() != 0 || + block->output_signature()->max_streams() != 0) { + msg << "Block " << block << " must not have any input or output ports"; + throw std::invalid_argument(msg.str()); } hier_block2_sptr hblock(cast_to_hier_block2_sptr(block)); - if(hblock && hblock.get() != d_owner) { - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "connect: block is hierarchical, setting parent to " << this << std::endl; - hblock->d_detail->d_parent_detail = this; + if (hblock && hblock.get() != d_owner) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "connect: block is hierarchical, setting parent to " << this + << std::endl; + hblock->d_detail->d_parent_detail = this; } d_blocks.push_back(block); - } +} - void - hier_block2_detail::connect(basic_block_sptr src, int src_port, - basic_block_sptr dst, int dst_port) - { +void hier_block2_detail::connect(basic_block_sptr src, + int src_port, + basic_block_sptr dst, + int dst_port) +{ std::stringstream msg; - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "connecting: " << endpoint(src, src_port) - << " -> " << endpoint(dst, dst_port) << std::endl; + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "connecting: " << endpoint(src, src_port) << " -> " + << endpoint(dst, dst_port) << std::endl; - if(src.get() == dst.get()) - throw std::invalid_argument("connect: src and destination blocks cannot be the same"); + if (src.get() == dst.get()) + throw std::invalid_argument( + "connect: src and destination blocks cannot be the same"); hier_block2_sptr src_block(cast_to_hier_block2_sptr(src)); hier_block2_sptr dst_block(cast_to_hier_block2_sptr(dst)); - if(src_block && src.get() != d_owner) { - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "connect: src is hierarchical, setting parent to " << this << std::endl; - src_block->d_detail->d_parent_detail = this; + if (src_block && src.get() != d_owner) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "connect: src is hierarchical, setting parent to " << this + << std::endl; + src_block->d_detail->d_parent_detail = this; } - if(dst_block && dst.get() != d_owner) { - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "connect: dst is hierarchical, setting parent to " << this << std::endl; - dst_block->d_detail->d_parent_detail = this; + if (dst_block && dst.get() != d_owner) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "connect: dst is hierarchical, setting parent to " << this + << std::endl; + dst_block->d_detail->d_parent_detail = this; } // Connections to block inputs or outputs int max_port; - if(src.get() == d_owner) { - max_port = src->input_signature()->max_streams(); - if((max_port != -1 && (src_port >= max_port)) || src_port < 0) { - msg << "source port " << src_port << " out of range for " << src; - throw std::invalid_argument(msg.str()); - } + if (src.get() == d_owner) { + max_port = src->input_signature()->max_streams(); + if ((max_port != -1 && (src_port >= max_port)) || src_port < 0) { + msg << "source port " << src_port << " out of range for " << src; + throw std::invalid_argument(msg.str()); + } - return connect_input(src_port, dst_port, dst); + return connect_input(src_port, dst_port, dst); } - if(dst.get() == d_owner) { - max_port = dst->output_signature()->max_streams(); - if((max_port != -1 && (dst_port >= max_port)) || dst_port < 0) { - msg << "destination port " << dst_port << " out of range for " << dst; - throw std::invalid_argument(msg.str()); - } + if (dst.get() == d_owner) { + max_port = dst->output_signature()->max_streams(); + if ((max_port != -1 && (dst_port >= max_port)) || dst_port < 0) { + msg << "destination port " << dst_port << " out of range for " << dst; + throw std::invalid_argument(msg.str()); + } - return connect_output(dst_port, src_port, src); + return connect_output(dst_port, src_port, src); } // Internal connections d_fg->connect(src, src_port, dst, dst_port); // TODO: connects to NC - } +} - void - hier_block2_detail::msg_connect(basic_block_sptr src, pmt::pmt_t srcport, - basic_block_sptr dst, pmt::pmt_t dstport) - { - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "connecting message port..." << std::endl; +void hier_block2_detail::msg_connect(basic_block_sptr src, + pmt::pmt_t srcport, + basic_block_sptr dst, + pmt::pmt_t dstport) +{ + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "connecting message port..." << std::endl; // add block uniquely to list to internal blocks - if(std::find(d_blocks.begin(), d_blocks.end(), dst) == d_blocks.end()){ - d_blocks.push_back(src); - d_blocks.push_back(dst); + if (std::find(d_blocks.begin(), d_blocks.end(), dst) == d_blocks.end()) { + d_blocks.push_back(src); + d_blocks.push_back(dst); } - bool hier_in=false, hier_out=false; - if(d_owner == src.get()){ + bool hier_in = false, hier_out = false; + if (d_owner == src.get()) { hier_out = src->message_port_is_hier_in(srcport); - } else if (d_owner == dst.get()){ - hier_in = dst->message_port_is_hier_out(dstport);; + } else if (d_owner == dst.get()) { + hier_in = dst->message_port_is_hier_out(dstport); + ; } else { hier_out = src->message_port_is_hier_out(srcport); hier_in = dst->message_port_is_hier_in(dstport); @@ -178,45 +182,50 @@ namespace gr { hier_block2_sptr src_block(cast_to_hier_block2_sptr(src)); hier_block2_sptr dst_block(cast_to_hier_block2_sptr(dst)); - if(src_block && src.get() != d_owner) { - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "msg_connect: src is hierarchical, setting parent to " << this << std::endl; - src_block->d_detail->d_parent_detail = this; + if (src_block && src.get() != d_owner) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "msg_connect: src is hierarchical, setting parent to " << this + << std::endl; + src_block->d_detail->d_parent_detail = this; } - if(dst_block && dst.get() != d_owner) { - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "msg_connect: dst is hierarchical, setting parent to " << this << std::endl; - dst_block->d_detail->d_parent_detail = this; + if (dst_block && dst.get() != d_owner) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "msg_connect: dst is hierarchical, setting parent to " << this + << std::endl; + dst_block->d_detail->d_parent_detail = this; } // add edge for this message connection - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << boost::format("msg_connect( (%s, %s, %d), (%s, %s, %d) )\n") % \ - src % srcport % hier_out % - dst % dstport % hier_in; - d_fg->connect(msg_endpoint(src, srcport, hier_out), msg_endpoint(dst, dstport, hier_in)); - } - - void - hier_block2_detail::msg_disconnect(basic_block_sptr src, pmt::pmt_t srcport, - basic_block_sptr dst, pmt::pmt_t dstport) - { - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "disconnecting message port..." << std::endl; + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << boost::format("msg_connect( (%s, %s, %d), (%s, %s, %d) )\n") % src % + srcport % hier_out % dst % dstport % hier_in; + d_fg->connect(msg_endpoint(src, srcport, hier_out), + msg_endpoint(dst, dstport, hier_in)); +} + +void hier_block2_detail::msg_disconnect(basic_block_sptr src, + pmt::pmt_t srcport, + basic_block_sptr dst, + pmt::pmt_t dstport) +{ + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "disconnecting message port..." << std::endl; // remove edge for this message connection - bool hier_in=false, hier_out=false; - if(d_owner == src.get()){ + bool hier_in = false, hier_out = false; + if (d_owner == src.get()) { hier_out = src->message_port_is_hier_in(srcport); - } else if (d_owner == dst.get()){ - hier_in = dst->message_port_is_hier_out(dstport);; + } else if (d_owner == dst.get()) { + hier_in = dst->message_port_is_hier_out(dstport); + ; } else { hier_out = src->message_port_is_hier_out(srcport); hier_in = dst->message_port_is_hier_in(dstport); } - d_fg->disconnect(msg_endpoint(src, srcport, hier_out), msg_endpoint(dst, dstport, hier_in)); + d_fg->disconnect(msg_endpoint(src, srcport, hier_out), + msg_endpoint(dst, dstport, hier_in)); hier_block2_sptr src_block(cast_to_hier_block2_sptr(src)); hier_block2_sptr dst_block(cast_to_hier_block2_sptr(dst)); @@ -233,7 +242,8 @@ namespace gr { } if (dst_block && dst.get() != d_owner) { - // if the destination is hier, we need to resolve the endpoint before calling unsub + // if the destination is hier, we need to resolve the endpoint before calling + // unsub msg_edge_vector_t edges = dst_block->d_detail->d_fg->msg_edges(); for (msg_edge_viter_t it = edges.begin(); it != edges.end(); ++it) { if ((*it).src().block() == dst) { @@ -245,276 +255,262 @@ namespace gr { // unregister the subscription - if already subscribed src->message_port_unsub(srcport, pmt::cons(dst->alias_pmt(), dstport)); +} - } - - void - hier_block2_detail::disconnect(basic_block_sptr block) - { +void hier_block2_detail::disconnect(basic_block_sptr block) +{ // Check on singleton list - for(basic_block_viter_t p = d_blocks.begin(); p != d_blocks.end(); p++) { - if(*p == block) { - d_blocks.erase(p); - - hier_block2_sptr hblock(cast_to_hier_block2_sptr(block)); - if(block && block.get() != d_owner) { - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "disconnect: block is hierarchical, clearing parent" << std::endl; - hblock->d_detail->d_parent_detail = 0; - } + for (basic_block_viter_t p = d_blocks.begin(); p != d_blocks.end(); p++) { + if (*p == block) { + d_blocks.erase(p); + + hier_block2_sptr hblock(cast_to_hier_block2_sptr(block)); + if (block && block.get() != d_owner) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "disconnect: block is hierarchical, clearing parent" + << std::endl; + hblock->d_detail->d_parent_detail = 0; + } - return; - } + return; + } } // Otherwise find all edges containing block edge_vector_t edges, tmp = d_fg->edges(); edge_vector_t::iterator p; - for(p = tmp.begin(); p != tmp.end(); p++) { - if((*p).src().block() == block || (*p).dst().block() == block) { - edges.push_back(*p); + for (p = tmp.begin(); p != tmp.end(); p++) { + if ((*p).src().block() == block || (*p).dst().block() == block) { + edges.push_back(*p); - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "disconnect: block found in edge " << (*p) << std::endl; - } + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "disconnect: block found in edge " << (*p) << std::endl; + } } - if(edges.size() == 0) { - std::stringstream msg; - msg << "cannot disconnect block " << block << ", not found"; - throw std::invalid_argument(msg.str()); + if (edges.size() == 0) { + std::stringstream msg; + msg << "cannot disconnect block " << block << ", not found"; + throw std::invalid_argument(msg.str()); } - for(p = edges.begin(); p != edges.end(); p++) { - disconnect((*p).src().block(), (*p).src().port(), - (*p).dst().block(), (*p).dst().port()); + for (p = edges.begin(); p != edges.end(); p++) { + disconnect( + (*p).src().block(), (*p).src().port(), (*p).dst().block(), (*p).dst().port()); } - } +} - void - hier_block2_detail::disconnect(basic_block_sptr src, int src_port, - basic_block_sptr dst, int dst_port) - { - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "disconnecting: " << endpoint(src, src_port) - << " -> " << endpoint(dst, dst_port) << std::endl; +void hier_block2_detail::disconnect(basic_block_sptr src, + int src_port, + basic_block_sptr dst, + int dst_port) +{ + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "disconnecting: " << endpoint(src, src_port) << " -> " + << endpoint(dst, dst_port) << std::endl; - if(src.get() == dst.get()) - throw std::invalid_argument("disconnect: source and destination blocks cannot be the same"); + if (src.get() == dst.get()) + throw std::invalid_argument( + "disconnect: source and destination blocks cannot be the same"); hier_block2_sptr src_block(cast_to_hier_block2_sptr(src)); hier_block2_sptr dst_block(cast_to_hier_block2_sptr(dst)); - if(src_block && src.get() != d_owner) { - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "disconnect: src is hierarchical, clearing parent" << std::endl; - src_block->d_detail->d_parent_detail = 0; + if (src_block && src.get() != d_owner) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "disconnect: src is hierarchical, clearing parent" << std::endl; + src_block->d_detail->d_parent_detail = 0; } - if(dst_block && dst.get() != d_owner) { - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "disconnect: dst is hierarchical, clearing parent" << std::endl; - dst_block->d_detail->d_parent_detail = 0; + if (dst_block && dst.get() != d_owner) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "disconnect: dst is hierarchical, clearing parent" << std::endl; + dst_block->d_detail->d_parent_detail = 0; } - if(src.get() == d_owner) - return disconnect_input(src_port, dst_port, dst); + if (src.get() == d_owner) + return disconnect_input(src_port, dst_port, dst); - if(dst.get() == d_owner) - return disconnect_output(dst_port, src_port, src); + if (dst.get() == d_owner) + return disconnect_output(dst_port, src_port, src); // Internal connections d_fg->disconnect(src, src_port, dst, dst_port); - } +} - void - hier_block2_detail::refresh_io_signature() - { - int min_inputs = d_owner->input_signature()->min_streams(); - int max_inputs = d_owner->input_signature()->max_streams(); +void hier_block2_detail::refresh_io_signature() +{ + int min_inputs = d_owner->input_signature()->min_streams(); + int max_inputs = d_owner->input_signature()->max_streams(); int min_outputs = d_owner->output_signature()->min_streams(); int max_outputs = d_owner->output_signature()->max_streams(); - if(max_inputs == io_signature::IO_INFINITE || - max_outputs == io_signature::IO_INFINITE || - (min_inputs != max_inputs) ||(min_outputs != max_outputs) ) { - std::stringstream msg; - msg << "Hierarchical blocks do not yet support arbitrary or" - << " variable numbers of inputs or outputs (" << d_owner->name() << ")"; - throw std::runtime_error(msg.str()); + if (max_inputs == io_signature::IO_INFINITE || + max_outputs == io_signature::IO_INFINITE || (min_inputs != max_inputs) || + (min_outputs != max_outputs)) { + std::stringstream msg; + msg << "Hierarchical blocks do not yet support arbitrary or" + << " variable numbers of inputs or outputs (" << d_owner->name() << ")"; + throw std::runtime_error(msg.str()); } // Check for # input change - if ((signed)d_inputs.size() != max_inputs) - { - d_inputs.resize(max_inputs); + if ((signed)d_inputs.size() != max_inputs) { + d_inputs.resize(max_inputs); } // Check for # output change - if ((signed)d_outputs.size() != max_outputs) - { - d_outputs.resize(max_outputs); - d_min_output_buffer.resize(max_outputs, 0); - d_max_output_buffer.resize(max_outputs, 0); - } - } - - void - hier_block2_detail::connect_input(int my_port, int port, - basic_block_sptr block) - { + if ((signed)d_outputs.size() != max_outputs) { + d_outputs.resize(max_outputs); + d_min_output_buffer.resize(max_outputs, 0); + d_max_output_buffer.resize(max_outputs, 0); + } +} + +void hier_block2_detail::connect_input(int my_port, int port, basic_block_sptr block) +{ std::stringstream msg; refresh_io_signature(); - if(my_port < 0 || my_port >= (signed)d_inputs.size()) { - msg << "input port " << my_port << " out of range for " << block; - throw std::invalid_argument(msg.str()); + if (my_port < 0 || my_port >= (signed)d_inputs.size()) { + msg << "input port " << my_port << " out of range for " << block; + throw std::invalid_argument(msg.str()); } - endpoint_vector_t &endps = d_inputs[my_port]; + endpoint_vector_t& endps = d_inputs[my_port]; endpoint endp(block, port); endpoint_viter_t p = std::find(endps.begin(), endps.end(), endp); - if(p != endps.end()) { - msg << "external input port " << my_port << " already wired to " << endp; - throw std::invalid_argument(msg.str()); + if (p != endps.end()) { + msg << "external input port " << my_port << " already wired to " << endp; + throw std::invalid_argument(msg.str()); } endps.push_back(endp); - } +} - void - hier_block2_detail::connect_output(int my_port, int port, - basic_block_sptr block) - { +void hier_block2_detail::connect_output(int my_port, int port, basic_block_sptr block) +{ std::stringstream msg; refresh_io_signature(); - if(my_port < 0 || my_port >= (signed)d_outputs.size()) { - msg << "output port " << my_port << " out of range for " << block; - throw std::invalid_argument(msg.str()); + if (my_port < 0 || my_port >= (signed)d_outputs.size()) { + msg << "output port " << my_port << " out of range for " << block; + throw std::invalid_argument(msg.str()); } - if(d_outputs[my_port].block()) { - msg << "external output port " << my_port << " already connected from " - << d_outputs[my_port]; - throw std::invalid_argument(msg.str()); + if (d_outputs[my_port].block()) { + msg << "external output port " << my_port << " already connected from " + << d_outputs[my_port]; + throw std::invalid_argument(msg.str()); } d_outputs[my_port] = endpoint(block, port); - } +} - void - hier_block2_detail::disconnect_input(int my_port, int port, - basic_block_sptr block) - { +void hier_block2_detail::disconnect_input(int my_port, int port, basic_block_sptr block) +{ std::stringstream msg; refresh_io_signature(); - if(my_port < 0 || my_port >= (signed)d_inputs.size()) { - msg << "input port number " << my_port << " out of range for " << block; - throw std::invalid_argument(msg.str()); + if (my_port < 0 || my_port >= (signed)d_inputs.size()) { + msg << "input port number " << my_port << " out of range for " << block; + throw std::invalid_argument(msg.str()); } - endpoint_vector_t &endps = d_inputs[my_port]; + endpoint_vector_t& endps = d_inputs[my_port]; endpoint endp(block, port); endpoint_viter_t p = std::find(endps.begin(), endps.end(), endp); - if(p == endps.end()) { - msg << "external input port " << my_port << " not connected to " << endp; - throw std::invalid_argument(msg.str()); + if (p == endps.end()) { + msg << "external input port " << my_port << " not connected to " << endp; + throw std::invalid_argument(msg.str()); } endps.erase(p); - } +} - void - hier_block2_detail::disconnect_output(int my_port, int port, - basic_block_sptr block) - { +void hier_block2_detail::disconnect_output(int my_port, int port, basic_block_sptr block) +{ std::stringstream msg; refresh_io_signature(); - if(my_port < 0 || my_port >= (signed)d_outputs.size()) { - msg << "output port number " << my_port << " out of range for " << block; - throw std::invalid_argument(msg.str()); + if (my_port < 0 || my_port >= (signed)d_outputs.size()) { + msg << "output port number " << my_port << " out of range for " << block; + throw std::invalid_argument(msg.str()); } - if(d_outputs[my_port].block() != block) { - msg << "block " << block << " not assigned to output " - << my_port << ", can't disconnect"; - throw std::invalid_argument(msg.str()); + if (d_outputs[my_port].block() != block) { + msg << "block " << block << " not assigned to output " << my_port + << ", can't disconnect"; + throw std::invalid_argument(msg.str()); } d_outputs[my_port] = endpoint(); - } +} - endpoint_vector_t - hier_block2_detail::resolve_port(int port, bool is_input) - { +endpoint_vector_t hier_block2_detail::resolve_port(int port, bool is_input) +{ std::stringstream msg; - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "Resolving port " << port << " as an " - << (is_input ? "input" : "output") - << " of " << d_owner->name() << std::endl; + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "Resolving port " << port << " as an " + << (is_input ? "input" : "output") << " of " << d_owner->name() + << std::endl; endpoint_vector_t result; - if(is_input) { - if(port < 0 || port >= (signed)d_inputs.size()) { - msg << "resolve_port: hierarchical block '" << d_owner->name() - << "': input " << port << " is out of range"; - throw std::runtime_error(msg.str()); - } + if (is_input) { + if (port < 0 || port >= (signed)d_inputs.size()) { + msg << "resolve_port: hierarchical block '" << d_owner->name() << "': input " + << port << " is out of range"; + throw std::runtime_error(msg.str()); + } - if(d_inputs[port].empty()) { - msg << "resolve_port: hierarchical block '" << d_owner->name() - << "': input " << port << " is not connected internally"; - throw std::runtime_error(msg.str()); - } + if (d_inputs[port].empty()) { + msg << "resolve_port: hierarchical block '" << d_owner->name() << "': input " + << port << " is not connected internally"; + throw std::runtime_error(msg.str()); + } - endpoint_vector_t &endps = d_inputs[port]; - endpoint_viter_t p; - for(p = endps.begin(); p != endps.end(); p++) { - endpoint_vector_t tmp = resolve_endpoint(*p, true); - std::copy(tmp.begin(), tmp.end(), back_inserter(result)); - } - } - else { - if(port < 0 || port >= (signed)d_outputs.size()) { - msg << "resolve_port: hierarchical block '" << d_owner->name() - << "': output " << port << " is out of range"; - throw std::runtime_error(msg.str()); - } + endpoint_vector_t& endps = d_inputs[port]; + endpoint_viter_t p; + for (p = endps.begin(); p != endps.end(); p++) { + endpoint_vector_t tmp = resolve_endpoint(*p, true); + std::copy(tmp.begin(), tmp.end(), back_inserter(result)); + } + } else { + if (port < 0 || port >= (signed)d_outputs.size()) { + msg << "resolve_port: hierarchical block '" << d_owner->name() << "': output " + << port << " is out of range"; + throw std::runtime_error(msg.str()); + } - if(d_outputs[port] == endpoint()) { - msg << "resolve_port: hierarchical block '" << d_owner->name() - << "': output " << port << " is not connected internally"; - throw std::runtime_error(msg.str()); - } + if (d_outputs[port] == endpoint()) { + msg << "resolve_port: hierarchical block '" << d_owner->name() << "': output " + << port << " is not connected internally"; + throw std::runtime_error(msg.str()); + } - result = resolve_endpoint(d_outputs[port], false); + result = resolve_endpoint(d_outputs[port], false); } - if(result.empty()) { - msg << "resolve_port: hierarchical block '" << d_owner->name() - << "': unable to resolve " - << (is_input ? "input port " : "output port ") - << port; - throw std::runtime_error(msg.str()); + if (result.empty()) { + msg << "resolve_port: hierarchical block '" << d_owner->name() + << "': unable to resolve " << (is_input ? "input port " : "output port ") + << port; + throw std::runtime_error(msg.str()); } return result; - } +} - void - hier_block2_detail::disconnect_all() - { +void hier_block2_detail::disconnect_all() +{ d_fg->clear(); d_blocks.clear(); @@ -522,49 +518,49 @@ namespace gr { int max_outputs = d_owner->output_signature()->max_streams(); d_inputs = std::vector<endpoint_vector_t>(max_inputs); d_outputs = endpoint_vector_t(max_outputs); - } +} - endpoint_vector_t - hier_block2_detail::resolve_endpoint(const endpoint &endp, bool is_input) const - { +endpoint_vector_t hier_block2_detail::resolve_endpoint(const endpoint& endp, + bool is_input) const +{ std::stringstream msg; endpoint_vector_t result; // Check if endpoint is a leaf node - if(cast_to_block_sptr(endp.block())) { - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "Block " << endp.block() << " is a leaf node, returning." << std::endl; - result.push_back(endp); - return result; + if (cast_to_block_sptr(endp.block())) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "Block " << endp.block() << " is a leaf node, returning." + << std::endl; + result.push_back(endp); + return result; } // Check if endpoint is a hierarchical block hier_block2_sptr hier_block2(cast_to_hier_block2_sptr(endp.block())); - if(hier_block2) { - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "Resolving endpoint " << endp << " as an " - << (is_input ? "input" : "output") - << ", recursing" << std::endl; - return hier_block2->d_detail->resolve_port(endp.port(), is_input); + if (hier_block2) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "Resolving endpoint " << endp << " as an " + << (is_input ? "input" : "output") << ", recursing" << std::endl; + return hier_block2->d_detail->resolve_port(endp.port(), is_input); } - msg << "unable to resolve" << (is_input ? " input " : " output ") - << "endpoint " << endp; + msg << "unable to resolve" << (is_input ? " input " : " output ") << "endpoint " + << endp; throw std::runtime_error(msg.str()); - } +} - void - hier_block2_detail::flatten_aux(flat_flowgraph_sptr sfg) const - { - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << " ** Flattening " << d_owner->name() << " parent: " << d_parent_detail << std::endl; +void hier_block2_detail::flatten_aux(flat_flowgraph_sptr sfg) const +{ + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << " ** Flattening " << d_owner->name() + << " parent: " << d_parent_detail << std::endl; bool is_top_block = (d_parent_detail == NULL); // Add my edges to the flow graph, resolving references to actual endpoints edge_vector_t edges = d_fg->edges(); msg_edge_vector_t msg_edges = d_fg->msg_edges(); edge_viter_t p; - msg_edge_viter_t q,u; + msg_edge_viter_t q, u; // Only run setup_rpc if ControlPort config param is enabled. bool ctrlport_on = prefs::singleton()->get_bool("ControlPort", "on", false); @@ -575,195 +571,191 @@ namespace gr { bool set_all_min_buff = d_owner->all_min_output_buffer_p(); bool set_all_max_buff = d_owner->all_max_output_buffer_p(); // Get the min and max buffer length - if(set_all_min_buff){ - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "Getting (" << (d_owner->alias()).c_str() - << ") min buffer" << std::endl; - min_buff = d_owner->min_output_buffer(); + if (set_all_min_buff) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "Getting (" << (d_owner->alias()).c_str() << ") min buffer" + << std::endl; + min_buff = d_owner->min_output_buffer(); } - if(set_all_max_buff){ - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "Getting (" << (d_owner->alias()).c_str() - << ") max buffer" << std::endl; - max_buff = d_owner->max_output_buffer(); + if (set_all_max_buff) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "Getting (" << (d_owner->alias()).c_str() << ") max buffer" + << std::endl; + max_buff = d_owner->max_output_buffer(); } // For every block (gr::block and gr::hier_block2), set up the RPC // interface. - for(p = edges.begin(); p != edges.end(); p++) { - basic_block_sptr b; - b = p->src().block(); - - if(set_all_min_buff){ - //sets the min buff for every block within hier_block2 - if(min_buff != 0){ - block_sptr bb = boost::dynamic_pointer_cast<block>(b); - if(bb != 0){ - if(bb->min_output_buffer(0) != min_buff){ - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "Block (" << (bb->alias()).c_str() - << ") min_buff (" << min_buff - << ")" << std::endl; - bb->set_min_output_buffer(min_buff); - } - } - else{ - hier_block2_sptr hh = boost::dynamic_pointer_cast<hier_block2>(b); - if(hh != 0){ - if(hh->min_output_buffer(0) != min_buff){ - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "HBlock (" << (hh->alias()).c_str() - << ") min_buff (" << min_buff - << ")" << std::endl; - hh->set_min_output_buffer(min_buff); - } + for (p = edges.begin(); p != edges.end(); p++) { + basic_block_sptr b; + b = p->src().block(); + + if (set_all_min_buff) { + // sets the min buff for every block within hier_block2 + if (min_buff != 0) { + block_sptr bb = boost::dynamic_pointer_cast<block>(b); + if (bb != 0) { + if (bb->min_output_buffer(0) != min_buff) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "Block (" << (bb->alias()).c_str() + << ") min_buff (" << min_buff << ")" << std::endl; + bb->set_min_output_buffer(min_buff); + } + } else { + hier_block2_sptr hh = boost::dynamic_pointer_cast<hier_block2>(b); + if (hh != 0) { + if (hh->min_output_buffer(0) != min_buff) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "HBlock (" << (hh->alias()).c_str() + << ") min_buff (" << min_buff << ")" + << std::endl; + hh->set_min_output_buffer(min_buff); + } + } + } } - } } - } - if(set_all_max_buff){ - //sets the max buff for every block within hier_block2 - if(max_buff != 0){ - block_sptr bb = boost::dynamic_pointer_cast<block>(b); - if(bb != 0){ - if(bb->max_output_buffer(0) != max_buff){ - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "Block (" << (bb->alias()).c_str() - << ") max_buff (" << max_buff - << ")" << std::endl; - bb->set_max_output_buffer(max_buff); - } - } - else{ - hier_block2_sptr hh = boost::dynamic_pointer_cast<hier_block2>(b); - if(hh != 0){ - if(hh->max_output_buffer(0) != max_buff){ - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "HBlock (" << (hh->alias()).c_str() - << ") max_buff (" << max_buff - << ")" << std::endl; - hh->set_max_output_buffer(max_buff); - } + if (set_all_max_buff) { + // sets the max buff for every block within hier_block2 + if (max_buff != 0) { + block_sptr bb = boost::dynamic_pointer_cast<block>(b); + if (bb != 0) { + if (bb->max_output_buffer(0) != max_buff) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "Block (" << (bb->alias()).c_str() + << ") max_buff (" << max_buff << ")" << std::endl; + bb->set_max_output_buffer(max_buff); + } + } else { + hier_block2_sptr hh = boost::dynamic_pointer_cast<hier_block2>(b); + if (hh != 0) { + if (hh->max_output_buffer(0) != max_buff) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "HBlock (" << (hh->alias()).c_str() + << ") max_buff (" << max_buff << ")" + << std::endl; + hh->set_max_output_buffer(max_buff); + } + } + } } - } } - } - b = p->dst().block(); - if(set_all_min_buff){ - //sets the min buff for every block within hier_block2 - if(min_buff != 0){ - block_sptr bb = boost::dynamic_pointer_cast<block>(b); - if(bb != 0){ - if(bb->min_output_buffer(0) != min_buff){ - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "Block (" << (bb->alias()).c_str() - << ") min_buff (" << min_buff - << ")" << std::endl; - bb->set_min_output_buffer(min_buff); + b = p->dst().block(); + if (set_all_min_buff) { + // sets the min buff for every block within hier_block2 + if (min_buff != 0) { + block_sptr bb = boost::dynamic_pointer_cast<block>(b); + if (bb != 0) { + if (bb->min_output_buffer(0) != min_buff) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "Block (" << (bb->alias()).c_str() + << ") min_buff (" << min_buff << ")" << std::endl; + bb->set_min_output_buffer(min_buff); + } + } else { + hier_block2_sptr hh = boost::dynamic_pointer_cast<hier_block2>(b); + if (hh != 0) { + if (hh->min_output_buffer(0) != min_buff) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "HBlock (" << (hh->alias()).c_str() + << ") min_buff (" << min_buff << ")" + << std::endl; + hh->set_min_output_buffer(min_buff); + } + } + } } - } - else{ - hier_block2_sptr hh = boost::dynamic_pointer_cast<hier_block2>(b); - if(hh != 0){ - if(hh->min_output_buffer(0) != min_buff){ - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "HBlock (" << (hh->alias()).c_str() - << ") min_buff (" << min_buff - << ")" << std::endl; - hh->set_min_output_buffer(min_buff); - } - } - } } - } - if(set_all_max_buff){ - //sets the max buff for every block within hier_block2 - if(max_buff != 0){ - block_sptr bb = boost::dynamic_pointer_cast<block>(b); - if(bb != 0){ - if(bb->max_output_buffer(0) != max_buff){ - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "Block (" << (bb->alias()).c_str() - << ") max_buff (" << max_buff - << ")" << std::endl; - bb->set_max_output_buffer(max_buff); + if (set_all_max_buff) { + // sets the max buff for every block within hier_block2 + if (max_buff != 0) { + block_sptr bb = boost::dynamic_pointer_cast<block>(b); + if (bb != 0) { + if (bb->max_output_buffer(0) != max_buff) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "Block (" << (bb->alias()).c_str() + << ") max_buff (" << max_buff << ")" << std::endl; + bb->set_max_output_buffer(max_buff); + } + } else { + hier_block2_sptr hh = boost::dynamic_pointer_cast<hier_block2>(b); + if (hh != 0) { + if (hh->max_output_buffer(0) != max_buff) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "HBlock (" << (hh->alias()).c_str() + << ") max_buff (" << max_buff << ")" + << std::endl; + hh->set_max_output_buffer(max_buff); + } + } + } } - } - else{ - hier_block2_sptr hh = boost::dynamic_pointer_cast<hier_block2>(b); - if(hh != 0){ - if(hh->max_output_buffer(0) != max_buff){ - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "HBlock (" << (hh->alias()).c_str() - << ") max_buff (" << max_buff - << ")" << std::endl; - hh->set_max_output_buffer(max_buff); - } - } - } } - } } - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "Flattening stream connections: " << std::endl; + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "Flattening stream connections: " << std::endl; - for(p = edges.begin(); p != edges.end(); p++) { - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "Flattening edge " << (*p) << std::endl; + for (p = edges.begin(); p != edges.end(); p++) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "Flattening edge " << (*p) << std::endl; - endpoint_vector_t src_endps = resolve_endpoint(p->src(), false); - endpoint_vector_t dst_endps = resolve_endpoint(p->dst(), true); + endpoint_vector_t src_endps = resolve_endpoint(p->src(), false); + endpoint_vector_t dst_endps = resolve_endpoint(p->dst(), true); - endpoint_viter_t s, d; - for(s = src_endps.begin(); s != src_endps.end(); s++) { - for(d = dst_endps.begin(); d != dst_endps.end(); d++) { - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << (*s) << "->" << (*d) << std::endl; - sfg->connect(*s, *d); + endpoint_viter_t s, d; + for (s = src_endps.begin(); s != src_endps.end(); s++) { + for (d = dst_endps.begin(); d != dst_endps.end(); d++) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << (*s) << "->" << (*d) << std::endl; + sfg->connect(*s, *d); + } } - } } // loop through flattening hierarchical connections - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "Flattening msg connections: " << std::endl; - - std::vector<std::pair<msg_endpoint, bool> > resolved_endpoints; - for(q = msg_edges.begin(); q != msg_edges.end(); q++) { - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << boost::format(" flattening edge ( %s, %s, %d) -> ( %s, %s, %d)\n") % \ - q->src().block() % q->src().port() % q->src().is_hier() % q->dst().block() % \ - q->dst().port() % q->dst().is_hier(); - - - if(q->src().is_hier() && q->src().block().get() == d_owner){ - // connection into this block .. - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "hier incoming port: " << q->src() << std::endl; - sfg->replace_endpoint(q->src(), q->dst(), false); - resolved_endpoints.push_back( std::pair<msg_endpoint,bool>( q->src(), false)); - } else - if(q->dst().is_hier() && q->dst().block().get() == d_owner){ - // connection out of this block - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "hier outgoing port: " << q->dst() << std::endl; - sfg->replace_endpoint(q->dst(), q->src(), true); - resolved_endpoints.push_back( std::pair<msg_endpoint,bool>(q->dst(), true)); - } else { - // internal connection only - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "internal msg connection: " << q->src() << "-->" << q->dst() << std::endl; - sfg->connect( q->src(), q->dst() ); - } + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "Flattening msg connections: " << std::endl; + + std::vector<std::pair<msg_endpoint, bool>> resolved_endpoints; + for (q = msg_edges.begin(); q != msg_edges.end(); q++) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << boost::format( + " flattening edge ( %s, %s, %d) -> ( %s, %s, %d)\n") % + q->src().block() % q->src().port() % q->src().is_hier() % + q->dst().block() % q->dst().port() % q->dst().is_hier(); + + + if (q->src().is_hier() && q->src().block().get() == d_owner) { + // connection into this block .. + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "hier incoming port: " << q->src() << std::endl; + sfg->replace_endpoint(q->src(), q->dst(), false); + resolved_endpoints.push_back(std::pair<msg_endpoint, bool>(q->src(), false)); + } else if (q->dst().is_hier() && q->dst().block().get() == d_owner) { + // connection out of this block + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "hier outgoing port: " << q->dst() << std::endl; + sfg->replace_endpoint(q->dst(), q->src(), true); + resolved_endpoints.push_back(std::pair<msg_endpoint, bool>(q->dst(), true)); + } else { + // internal connection only + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "internal msg connection: " << q->src() << "-->" << q->dst() + << std::endl; + sfg->connect(q->src(), q->dst()); + } } - for(std::vector<std::pair<msg_endpoint, bool> >::iterator it = resolved_endpoints.begin(); - it != resolved_endpoints.end(); it++) { - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "sfg->clear_endpoint(" << (*it).first << ", " << (*it).second << ") " << std::endl; - sfg->clear_endpoint((*it).first, (*it).second); + for (std::vector<std::pair<msg_endpoint, bool>>::iterator it = + resolved_endpoints.begin(); + it != resolved_endpoints.end(); + it++) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "sfg->clear_endpoint(" << (*it).first << ", " << (*it).second + << ") " << std::endl; + sfg->clear_endpoint((*it).first, (*it).second); } /* @@ -784,87 +776,81 @@ namespace gr { basic_block_vector_t tmp = d_fg->calc_used_blocks(); // First add the list of singleton blocks - std::vector<basic_block_sptr>::const_iterator b; // Because flatten_aux is const - for(b = d_blocks.begin(); b != d_blocks.end(); b++) { - tmp.push_back(*b); + std::vector<basic_block_sptr>::const_iterator b; // Because flatten_aux is const + for (b = d_blocks.begin(); b != d_blocks.end(); b++) { + tmp.push_back(*b); } // Now add the list of connected input blocks std::stringstream msg; - for(unsigned int i = 0; i < d_inputs.size(); i++) { - if(d_inputs[i].size() == 0) { - msg << "In hierarchical block " << d_owner->name() << ", input " << i - << " is not connected internally"; - throw std::runtime_error(msg.str()); - } + for (unsigned int i = 0; i < d_inputs.size(); i++) { + if (d_inputs[i].size() == 0) { + msg << "In hierarchical block " << d_owner->name() << ", input " << i + << " is not connected internally"; + throw std::runtime_error(msg.str()); + } - for(unsigned int j = 0; j < d_inputs[i].size(); j++) - tmp.push_back(d_inputs[i][j].block()); + for (unsigned int j = 0; j < d_inputs[i].size(); j++) + tmp.push_back(d_inputs[i][j].block()); } - for(unsigned int i = 0; i < d_outputs.size(); i++) { - basic_block_sptr blk = d_outputs[i].block(); - if(!blk) { - msg << "In hierarchical block " << d_owner->name() << ", output " << i - << " is not connected internally"; - throw std::runtime_error(msg.str()); - } - // Set the buffers of only the blocks connected to the hier output - if(!set_all_min_buff){ - min_buff = d_owner->min_output_buffer(i); - if(min_buff != 0){ - block_sptr bb = boost::dynamic_pointer_cast<block>(blk); - if(bb != 0){ - int bb_src_port = d_outputs[i].port(); - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "Block (" << (bb->alias()).c_str() - << ") Port (" << bb_src_port - << ") min_buff (" << min_buff - << ")" << std::endl; - bb->set_min_output_buffer(bb_src_port, min_buff); - } - else{ - hier_block2_sptr hh = boost::dynamic_pointer_cast<hier_block2>(blk); - if(hh != 0){ - int hh_src_port = d_outputs[i].port(); - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "HBlock (" << (hh->alias()).c_str() - << ") Port (" << hh_src_port - << ") min_buff ("<< min_buff - << ")" << std::endl; - hh->set_min_output_buffer(hh_src_port, min_buff); + for (unsigned int i = 0; i < d_outputs.size(); i++) { + basic_block_sptr blk = d_outputs[i].block(); + if (!blk) { + msg << "In hierarchical block " << d_owner->name() << ", output " << i + << " is not connected internally"; + throw std::runtime_error(msg.str()); + } + // Set the buffers of only the blocks connected to the hier output + if (!set_all_min_buff) { + min_buff = d_owner->min_output_buffer(i); + if (min_buff != 0) { + block_sptr bb = boost::dynamic_pointer_cast<block>(blk); + if (bb != 0) { + int bb_src_port = d_outputs[i].port(); + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "Block (" << (bb->alias()).c_str() << ") Port (" + << bb_src_port << ") min_buff (" << min_buff << ")" + << std::endl; + bb->set_min_output_buffer(bb_src_port, min_buff); + } else { + hier_block2_sptr hh = boost::dynamic_pointer_cast<hier_block2>(blk); + if (hh != 0) { + int hh_src_port = d_outputs[i].port(); + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "HBlock (" << (hh->alias()).c_str() << ") Port (" + << hh_src_port << ") min_buff (" << min_buff << ")" + << std::endl; + hh->set_min_output_buffer(hh_src_port, min_buff); + } + } } - } } - } - if(!set_all_max_buff){ - max_buff = d_owner->max_output_buffer(i); - if(max_buff != 0){ - block_sptr bb = boost::dynamic_pointer_cast<block>(blk); - if(bb != 0){ - int bb_src_port = d_outputs[i].port(); - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "Block (" << (bb->alias()).c_str() - << ") Port (" << bb_src_port - << ") max_buff (" << max_buff - << ")" << std::endl; - bb->set_max_output_buffer(bb_src_port, max_buff); - } - else{ - hier_block2_sptr hh = boost::dynamic_pointer_cast<hier_block2>(blk); - if(hh != 0){ - int hh_src_port = d_outputs[i].port(); - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "HBlock (" << (hh->alias()).c_str() - << ") Port (" << hh_src_port - << ") max_buff (" << max_buff - << ")" << std::endl; - hh->set_max_output_buffer(hh_src_port, max_buff); + if (!set_all_max_buff) { + max_buff = d_owner->max_output_buffer(i); + if (max_buff != 0) { + block_sptr bb = boost::dynamic_pointer_cast<block>(blk); + if (bb != 0) { + int bb_src_port = d_outputs[i].port(); + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "Block (" << (bb->alias()).c_str() << ") Port (" + << bb_src_port << ") max_buff (" << max_buff << ")" + << std::endl; + bb->set_max_output_buffer(bb_src_port, max_buff); + } else { + hier_block2_sptr hh = boost::dynamic_pointer_cast<hier_block2>(blk); + if (hh != 0) { + int hh_src_port = d_outputs[i].port(); + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "HBlock (" << (hh->alias()).c_str() << ") Port (" + << hh_src_port << ") max_buff (" << max_buff << ")" + << std::endl; + hh->set_max_output_buffer(hh_src_port, max_buff); + } + } } - } } - } - tmp.push_back(blk); + tmp.push_back(blk); } sort(tmp.begin(), tmp.end()); @@ -872,105 +858,98 @@ namespace gr { unique_copy(tmp.begin(), tmp.end(), inserter); // Recurse hierarchical children - for(basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) { - hier_block2_sptr hier_block2(cast_to_hier_block2_sptr(*p)); - if(hier_block2 && (hier_block2.get() != d_owner)) { - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "flatten_aux: recursing into hierarchical block " - << hier_block2->alias() << std::endl; - hier_block2->d_detail->flatten_aux(sfg); - } + for (basic_block_viter_t p = blocks.begin(); p != blocks.end(); p++) { + hier_block2_sptr hier_block2(cast_to_hier_block2_sptr(*p)); + if (hier_block2 && (hier_block2.get() != d_owner)) { + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "flatten_aux: recursing into hierarchical block " + << hier_block2->alias() << std::endl; + hier_block2->d_detail->flatten_aux(sfg); + } } // prune any remaining hier connections // if they were not replaced with hier internal connections while in sub-calls // they must remain unconnected and can be deleted... - if(is_top_block){ - sfg->clear_hier(); + if (is_top_block) { + sfg->clear_hier(); } // print all primitive connections at exit - if(HIER_BLOCK2_DETAIL_DEBUG && is_top_block){ - std::cout << "flatten_aux finished in top_block" << std::endl; - sfg->dump(); + if (HIER_BLOCK2_DETAIL_DEBUG && is_top_block) { + std::cout << "flatten_aux finished in top_block" << std::endl; + sfg->dump(); } // if ctrlport is enabled, call setup RPC for all blocks in the flowgraph - if(ctrlport_on) { - for(b = blocks.begin(); b != blocks.end(); b++) { - if(!(*b)->is_rpc_set()) { - (*b)->setup_rpc(); - (*b)->rpc_set(); + if (ctrlport_on) { + for (b = blocks.begin(); b != blocks.end(); b++) { + if (!(*b)->is_rpc_set()) { + (*b)->setup_rpc(); + (*b)->rpc_set(); + } } - } } - } +} - void - hier_block2_detail::lock() - { - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "lock: entered in " << this << std::endl; +void hier_block2_detail::lock() +{ + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "lock: entered in " << this << std::endl; - if(d_parent_detail) - d_parent_detail->lock(); + if (d_parent_detail) + d_parent_detail->lock(); else - d_owner->lock(); - } + d_owner->lock(); +} - void - hier_block2_detail::unlock() - { - if(HIER_BLOCK2_DETAIL_DEBUG) - std::cout << "unlock: entered in " << this << std::endl; +void hier_block2_detail::unlock() +{ + if (HIER_BLOCK2_DETAIL_DEBUG) + std::cout << "unlock: entered in " << this << std::endl; - if(d_parent_detail) - d_parent_detail->unlock(); + if (d_parent_detail) + d_parent_detail->unlock(); else - d_owner->unlock(); - } + d_owner->unlock(); +} - void - hier_block2_detail::set_processor_affinity(const std::vector<int> &mask) - { +void hier_block2_detail::set_processor_affinity(const std::vector<int>& mask) +{ basic_block_vector_t tmp = d_fg->calc_used_blocks(); - for(basic_block_viter_t p = tmp.begin(); p != tmp.end(); p++) { - (*p)->set_processor_affinity(mask); + for (basic_block_viter_t p = tmp.begin(); p != tmp.end(); p++) { + (*p)->set_processor_affinity(mask); } - } +} - void - hier_block2_detail::unset_processor_affinity() - { +void hier_block2_detail::unset_processor_affinity() +{ basic_block_vector_t tmp = d_fg->calc_used_blocks(); - for(basic_block_viter_t p = tmp.begin(); p != tmp.end(); p++) { - (*p)->unset_processor_affinity(); + for (basic_block_viter_t p = tmp.begin(); p != tmp.end(); p++) { + (*p)->unset_processor_affinity(); } - } +} - std::vector<int> - hier_block2_detail::processor_affinity() - { +std::vector<int> hier_block2_detail::processor_affinity() +{ basic_block_vector_t tmp = d_fg->calc_used_blocks(); return tmp[0]->processor_affinity(); - } +} - void - hier_block2_detail::set_log_level(std::string level) - { +void hier_block2_detail::set_log_level(std::string level) +{ basic_block_vector_t tmp = d_fg->calc_used_blocks(); - for(basic_block_viter_t p = tmp.begin(); p != tmp.end(); p++) { - (*p)->set_log_level(level); + for (basic_block_viter_t p = tmp.begin(); p != tmp.end(); p++) { + (*p)->set_log_level(level); } - } +} - std::string - hier_block2_detail::log_level() - { +std::string hier_block2_detail::log_level() +{ // Assume that log_level was set for all hier_block2 blocks basic_block_vector_t tmp = d_fg->calc_used_blocks(); return tmp[0]->log_level(); - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/hier_block2_detail.h b/gnuradio-runtime/lib/hier_block2_detail.h index aa419c49bd..4d16c1dae9 100644 --- a/gnuradio-runtime/lib/hier_block2_detail.h +++ b/gnuradio-runtime/lib/hier_block2_detail.h @@ -30,48 +30,51 @@ namespace gr { - /*! - * \ingroup internal - */ - class GR_RUNTIME_API hier_block2_detail : boost::noncopyable - { - public: - hier_block2_detail(hier_block2 *owner); +/*! + * \ingroup internal + */ +class GR_RUNTIME_API hier_block2_detail : boost::noncopyable +{ +public: + hier_block2_detail(hier_block2* owner); ~hier_block2_detail(); void connect(basic_block_sptr block); - void connect(basic_block_sptr src, int src_port, - basic_block_sptr dst, int dst_port); - void msg_connect(basic_block_sptr src, pmt::pmt_t srcport, - basic_block_sptr dst, pmt::pmt_t dstport); - void msg_disconnect(basic_block_sptr src, pmt::pmt_t srcport, - basic_block_sptr dst, pmt::pmt_t dstport); + void connect(basic_block_sptr src, int src_port, basic_block_sptr dst, int dst_port); + void msg_connect(basic_block_sptr src, + pmt::pmt_t srcport, + basic_block_sptr dst, + pmt::pmt_t dstport); + void msg_disconnect(basic_block_sptr src, + pmt::pmt_t srcport, + basic_block_sptr dst, + pmt::pmt_t dstport); void disconnect(basic_block_sptr block); - void disconnect(basic_block_sptr, int src_port, - basic_block_sptr, int dst_port); + void disconnect(basic_block_sptr, int src_port, basic_block_sptr, int dst_port); void disconnect_all(); void lock(); void unlock(); void flatten_aux(flat_flowgraph_sptr sfg) const; - void set_processor_affinity(const std::vector<int> &mask); + void set_processor_affinity(const std::vector<int>& mask); void unset_processor_affinity(); std::vector<int> processor_affinity(); void set_log_level(std::string level); std::string log_level(); - + // Track output buffer min/max settings std::vector<size_t> d_max_output_buffer; std::vector<size_t> d_min_output_buffer; - private: +private: // Private implementation data - hier_block2 *d_owner; - hier_block2_detail *d_parent_detail; + hier_block2* d_owner; + hier_block2_detail* d_parent_detail; flowgraph_sptr d_fg; - std::vector<endpoint_vector_t> d_inputs; // Multiple internal endpoints per external input - endpoint_vector_t d_outputs; // Single internal endpoint per external output + std::vector<endpoint_vector_t> + d_inputs; // Multiple internal endpoints per external input + endpoint_vector_t d_outputs; // Single internal endpoint per external output basic_block_vector_t d_blocks; void refresh_io_signature(); @@ -81,8 +84,8 @@ namespace gr { void disconnect_output(int my_port, int port, basic_block_sptr block); endpoint_vector_t resolve_port(int port, bool is_input); - endpoint_vector_t resolve_endpoint(const endpoint &endp, bool is_input) const; - }; + endpoint_vector_t resolve_endpoint(const endpoint& endp, bool is_input) const; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/lib/high_res_timer.cc b/gnuradio-runtime/lib/high_res_timer.cc index 37e7e322a8..bf871ce65e 100644 --- a/gnuradio-runtime/lib/high_res_timer.cc +++ b/gnuradio-runtime/lib/high_res_timer.cc @@ -3,6 +3,3 @@ #ifdef GNURADIO_HRT_USE_CLOCK_GETTIME clockid_t gr::high_res_timer_source = CLOCK_THREAD_CPUTIME_ID; #endif - - - diff --git a/gnuradio-runtime/lib/io_signature.cc b/gnuradio-runtime/lib/io_signature.cc index ccfdf3c06b..7e9aefc2a7 100644 --- a/gnuradio-runtime/lib/io_signature.cc +++ b/gnuradio-runtime/lib/io_signature.cc @@ -30,88 +30,82 @@ namespace gr { - gr::io_signature::sptr - io_signature::makev(int min_streams, int max_streams, - const std::vector<int> &sizeof_stream_items) - { - return gr::io_signature::sptr - (new io_signature(min_streams, max_streams, - sizeof_stream_items)); - } - - gr::io_signature::sptr - io_signature::make(int min_streams, int max_streams, - int sizeof_stream_item) - { +gr::io_signature::sptr io_signature::makev(int min_streams, + int max_streams, + const std::vector<int>& sizeof_stream_items) +{ + return gr::io_signature::sptr( + new io_signature(min_streams, max_streams, sizeof_stream_items)); +} + +gr::io_signature::sptr +io_signature::make(int min_streams, int max_streams, int sizeof_stream_item) +{ std::vector<int> sizeof_items(1); sizeof_items[0] = sizeof_stream_item; return io_signature::makev(min_streams, max_streams, sizeof_items); - } +} - gr::io_signature::sptr - io_signature::make2(int min_streams, int max_streams, - int sizeof_stream_item1, - int sizeof_stream_item2) - { +gr::io_signature::sptr io_signature::make2(int min_streams, + int max_streams, + int sizeof_stream_item1, + int sizeof_stream_item2) +{ std::vector<int> sizeof_items(2); sizeof_items[0] = sizeof_stream_item1; sizeof_items[1] = sizeof_stream_item2; return io_signature::makev(min_streams, max_streams, sizeof_items); - } - - gr::io_signature::sptr - io_signature::make3(int min_streams, int max_streams, - int sizeof_stream_item1, - int sizeof_stream_item2, - int sizeof_stream_item3) - { +} + +gr::io_signature::sptr io_signature::make3(int min_streams, + int max_streams, + int sizeof_stream_item1, + int sizeof_stream_item2, + int sizeof_stream_item3) +{ std::vector<int> sizeof_items(3); sizeof_items[0] = sizeof_stream_item1; sizeof_items[1] = sizeof_stream_item2; sizeof_items[2] = sizeof_stream_item3; return io_signature::makev(min_streams, max_streams, sizeof_items); - } +} - // ------------------------------------------------------------------------ +// ------------------------------------------------------------------------ - io_signature::io_signature(int min_streams, int max_streams, - const std::vector<int> &sizeof_stream_items) - { - if(min_streams < 0 - || (max_streams != IO_INFINITE && max_streams < min_streams)) - throw std::invalid_argument ("gr::io_signature(1)"); +io_signature::io_signature(int min_streams, + int max_streams, + const std::vector<int>& sizeof_stream_items) +{ + if (min_streams < 0 || (max_streams != IO_INFINITE && max_streams < min_streams)) + throw std::invalid_argument("gr::io_signature(1)"); - if(sizeof_stream_items.size() < 1) - throw std::invalid_argument("gr::io_signature(2)"); + if (sizeof_stream_items.size() < 1) + throw std::invalid_argument("gr::io_signature(2)"); - for(size_t i = 0; i < sizeof_stream_items.size(); i++) { - if(max_streams != 0 && sizeof_stream_items[i] < 1) - throw std::invalid_argument("gr::io_signature(3)"); + for (size_t i = 0; i < sizeof_stream_items.size(); i++) { + if (max_streams != 0 && sizeof_stream_items[i] < 1) + throw std::invalid_argument("gr::io_signature(3)"); } d_min_streams = min_streams; d_max_streams = max_streams; d_sizeof_stream_item = sizeof_stream_items; - } +} - io_signature::~io_signature() - { - } +io_signature::~io_signature() {} - int - io_signature::sizeof_stream_item(int _index) const - { - if(_index < 0) - throw std::invalid_argument("gr::io_signature::sizeof_stream_item"); +int io_signature::sizeof_stream_item(int _index) const +{ + if (_index < 0) + throw std::invalid_argument("gr::io_signature::sizeof_stream_item"); size_t index = _index; return d_sizeof_stream_item[std::min(index, d_sizeof_stream_item.size() - 1)]; - } +} - std::vector<int> - io_signature::sizeof_stream_items() const - { +std::vector<int> io_signature::sizeof_stream_items() const +{ return d_sizeof_stream_item; - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/local_sighandler.cc b/gnuradio-runtime/lib/local_sighandler.cc index ebd9bb1362..4f3083b3ed 100644 --- a/gnuradio-runtime/lib/local_sighandler.cc +++ b/gnuradio-runtime/lib/local_sighandler.cc @@ -31,10 +31,9 @@ namespace gr { - local_sighandler::local_sighandler(int signum, - void (*new_handler)(int)) +local_sighandler::local_sighandler(int signum, void (*new_handler)(int)) : d_signum(signum) - { +{ #ifdef HAVE_SIGACTION struct sigaction new_action; memset(&new_action, 0, sizeof(new_action)); @@ -43,147 +42,144 @@ namespace gr { sigemptyset(&new_action.sa_mask); new_action.sa_flags = 0; - if(sigaction (d_signum, &new_action, &d_old_action) < 0) { - perror("sigaction (install new)"); - throw std::runtime_error("sigaction"); + if (sigaction(d_signum, &new_action, &d_old_action) < 0) { + perror("sigaction (install new)"); + throw std::runtime_error("sigaction"); } #endif - } +} - local_sighandler::~local_sighandler() - { +local_sighandler::~local_sighandler() +{ #ifdef HAVE_SIGACTION - if(sigaction (d_signum, &d_old_action, 0) < 0) { - perror("sigaction (restore old)"); - throw std::runtime_error("sigaction"); + if (sigaction(d_signum, &d_old_action, 0) < 0) { + perror("sigaction (restore old)"); + throw std::runtime_error("sigaction"); } #endif - } +} - void - local_sighandler::throw_signal(int signum) - { - throw signal(signum); - } +void local_sighandler::throw_signal(int signum) { throw signal(signum); } - /* - * Semi-hideous way to may a signal number into a signal name - */ - #define SIGNAME(x) case x: return #x +/* + * Semi-hideous way to may a signal number into a signal name + */ +#define SIGNAME(x) \ + case x: \ + return #x - std::string - signal::name() const - { +std::string signal::name() const +{ char tmp[128]; - switch(signum()) { + switch (signum()) { #ifdef SIGHUP - SIGNAME(SIGHUP); + SIGNAME(SIGHUP); #endif #ifdef SIGINT - SIGNAME(SIGINT); + SIGNAME(SIGINT); #endif #ifdef SIGQUIT - SIGNAME(SIGQUIT); + SIGNAME(SIGQUIT); #endif #ifdef SIGILL - SIGNAME(SIGILL); + SIGNAME(SIGILL); #endif #ifdef SIGTRAP - SIGNAME(SIGTRAP); + SIGNAME(SIGTRAP); #endif #ifdef SIGABRT - SIGNAME(SIGABRT); + SIGNAME(SIGABRT); #endif #ifdef SIGBUS - SIGNAME(SIGBUS); + SIGNAME(SIGBUS); #endif #ifdef SIGFPE - SIGNAME(SIGFPE); + SIGNAME(SIGFPE); #endif #ifdef SIGKILL - SIGNAME(SIGKILL); + SIGNAME(SIGKILL); #endif #ifdef SIGUSR1 - SIGNAME(SIGUSR1); + SIGNAME(SIGUSR1); #endif #ifdef SIGSEGV - SIGNAME(SIGSEGV); + SIGNAME(SIGSEGV); #endif #ifdef SIGUSR2 - SIGNAME(SIGUSR2); + SIGNAME(SIGUSR2); #endif #ifdef SIGPIPE - SIGNAME(SIGPIPE); + SIGNAME(SIGPIPE); #endif #ifdef SIGALRM - SIGNAME(SIGALRM); + SIGNAME(SIGALRM); #endif #ifdef SIGTERM - SIGNAME(SIGTERM); + SIGNAME(SIGTERM); #endif #ifdef SIGSTKFLT - SIGNAME(SIGSTKFLT); + SIGNAME(SIGSTKFLT); #endif #ifdef SIGCHLD - SIGNAME(SIGCHLD); + SIGNAME(SIGCHLD); #endif #ifdef SIGCONT - SIGNAME(SIGCONT); + SIGNAME(SIGCONT); #endif #ifdef SIGSTOP - SIGNAME(SIGSTOP); + SIGNAME(SIGSTOP); #endif #ifdef SIGTSTP - SIGNAME(SIGTSTP); + SIGNAME(SIGTSTP); #endif #ifdef SIGTTIN - SIGNAME(SIGTTIN); + SIGNAME(SIGTTIN); #endif #ifdef SIGTTOU - SIGNAME(SIGTTOU); + SIGNAME(SIGTTOU); #endif #ifdef SIGURG - SIGNAME(SIGURG); + SIGNAME(SIGURG); #endif #ifdef SIGXCPU - SIGNAME(SIGXCPU); + SIGNAME(SIGXCPU); #endif #ifdef SIGXFSZ - SIGNAME(SIGXFSZ); + SIGNAME(SIGXFSZ); #endif #ifdef SIGVTALRM - SIGNAME(SIGVTALRM); + SIGNAME(SIGVTALRM); #endif #ifdef SIGPROF - SIGNAME(SIGPROF); + SIGNAME(SIGPROF); #endif #ifdef SIGWINCH - SIGNAME(SIGWINCH); + SIGNAME(SIGWINCH); #endif #ifdef SIGIO - SIGNAME(SIGIO); + SIGNAME(SIGIO); #endif #ifdef SIGPWR - SIGNAME(SIGPWR); + SIGNAME(SIGPWR); #endif #ifdef SIGSYS - SIGNAME(SIGSYS); + SIGNAME(SIGSYS); #endif default: -#if defined (HAVE_SNPRINTF) -#if defined (SIGRTMIN) && defined (SIGRTMAX) - if(signum() >= SIGRTMIN && signum() <= SIGRTMAX) { - snprintf(tmp, sizeof(tmp), "SIGRTMIN + %d", signum()); +#if defined(HAVE_SNPRINTF) +#if defined(SIGRTMIN) && defined(SIGRTMAX) + if (signum() >= SIGRTMIN && signum() <= SIGRTMAX) { + snprintf(tmp, sizeof(tmp), "SIGRTMIN + %d", signum()); + return tmp; + } +#endif + snprintf(tmp, sizeof(tmp), "SIGNAL %d", signum()); return tmp; - } -#endif - snprintf(tmp, sizeof(tmp), "SIGNAL %d", signum()); - return tmp; #else - return "Unknown signal"; + return "Unknown signal"; #endif } - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/local_sighandler.h b/gnuradio-runtime/lib/local_sighandler.h index bd322e5b00..688d43c287 100644 --- a/gnuradio-runtime/lib/local_sighandler.h +++ b/gnuradio-runtime/lib/local_sighandler.h @@ -32,42 +32,42 @@ namespace gr { - /*! - * \brief Get and set signal handler. - * - * \ingroup internal - * Constructor installs new handler, destructor reinstalls - * original value. - */ - class GR_RUNTIME_API local_sighandler - { - private: +/*! + * \brief Get and set signal handler. + * + * \ingroup internal + * Constructor installs new handler, destructor reinstalls + * original value. + */ +class GR_RUNTIME_API local_sighandler +{ +private: int d_signum; #ifdef HAVE_SIGACTION struct sigaction d_old_action; #endif - public: +public: local_sighandler(int signum, void (*new_handler)(int)); ~local_sighandler(); /* throw gr_signal (signum) */ static void throw_signal(int signum); - }; +}; - /*! - * \brief Representation of signal. - */ - class GR_RUNTIME_API signal - { - private: +/*! + * \brief Representation of signal. + */ +class GR_RUNTIME_API signal +{ +private: int d_signum; - public: +public: signal(int signum) : d_signum(signum) {} int signum() const { return d_signum; } std::string name() const; - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/lib/logger.cc b/gnuradio-runtime/lib/logger.cc index d4f1e27083..f3fa86b30a 100644 --- a/gnuradio-runtime/lib/logger.cc +++ b/gnuradio-runtime/lib/logger.cc @@ -21,10 +21,10 @@ */ /******************************************************************************* -* Author: Mark Plett -* Description: -* The gr_log module wraps the log4cpp library for logging in gnuradio. -*******************************************************************************/ + * Author: Mark Plett + * Description: + * The gr_log module wraps the log4cpp library for logging in gnuradio. + *******************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" @@ -37,306 +37,301 @@ namespace gr { - bool logger_config::logger_configured(false); +bool logger_config::logger_configured(false); - /************************ BEGIN LOG4CPP HELPERS ***********************/ - /* Logger config class. This is a singleton that controls how - * log4cpp is configured If watch_period>0 a thread is started to - * watch the config file for changes. - */ +/************************ BEGIN LOG4CPP HELPERS ***********************/ +/* Logger config class. This is a singleton that controls how + * log4cpp is configured If watch_period>0 a thread is started to + * watch the config file for changes. + */ - // Getters of logger_config - logger_config& - logger_config::get_instance(void) - { +// Getters of logger_config +logger_config& logger_config::get_instance(void) +{ static logger_config instance; return instance; - } +} - std::string - logger_config::get_filename() - { - logger_config& in=get_instance(); +std::string logger_config::get_filename() +{ + logger_config& in = get_instance(); return in.filename; - } +} - unsigned int - logger_config::get_watch_period() - { - logger_config& in=get_instance(); +unsigned int logger_config::get_watch_period() +{ + logger_config& in = get_instance(); return in.watch_period; - } +} - // Method to watch config file for changes - void - logger_config::watch_file(std::string filename, unsigned int watch_period) - { +// Method to watch config file for changes +void logger_config::watch_file(std::string filename, unsigned int watch_period) +{ std::time_t last_write(boost::filesystem::last_write_time(filename)); std::time_t current_time(0); - while(true) { - try { - current_time = boost::filesystem::last_write_time(filename); - if(current_time>last_write) { - //std::cout<<"GNURadio Reloading logger configuration:"<<filename<<std::endl; - last_write = current_time; - // Should we wipe out all old configuration or just add the - // new? Just adding... logger_reset_config(); - logger_configured = logger_load_config(filename); + while (true) { + try { + current_time = boost::filesystem::last_write_time(filename); + if (current_time > last_write) { + // std::cout<<"GNURadio Reloading logger + // configuration:"<<filename<<std::endl; + last_write = current_time; + // Should we wipe out all old configuration or just add the + // new? Just adding... logger_reset_config(); + logger_configured = logger_load_config(filename); + } + boost::this_thread::sleep( + boost::posix_time::time_duration(0, 0, watch_period, 0)); + } catch (const boost::thread_interrupted&) { + std::cout << "GNURadio leaving logger config file watch." << std::endl; + break; } - boost::this_thread::sleep(boost::posix_time::time_duration(0,0,watch_period,0)); - } - catch(const boost::thread_interrupted&) { - std::cout<<"GNURadio leaving logger config file watch."<<std::endl; - break; - } } - } +} - // Method to load the configuration. It only loads if the filename - // or watch has changed - void - logger_config::load_config(std::string filename,unsigned int watch_period) - { +// Method to load the configuration. It only loads if the filename +// or watch has changed +void logger_config::load_config(std::string filename, unsigned int watch_period) +{ logger_config& instance = get_instance(); // Only reconfigure if filename or watch has changed - if(!logger_configured) { - instance.filename = filename; - instance.watch_period = watch_period; - // Stop any file watching thread - if(instance.watch_thread!=NULL) - stop_watch(); - // Load configuration - //std::cout<<"GNURadio Loading logger configuration:"<<instance.filename<<std::endl; - logger_configured = logger_load_config(instance.filename); - // Start watch if required - if(instance.watch_period>0) { - instance.watch_thread = new boost::thread(watch_file, instance.filename, - instance.watch_period); - } + if (!logger_configured) { + instance.filename = filename; + instance.watch_period = watch_period; + // Stop any file watching thread + if (instance.watch_thread != NULL) + stop_watch(); + // Load configuration + // std::cout<<"GNURadio Loading logger + // configuration:"<<instance.filename<<std::endl; + logger_configured = logger_load_config(instance.filename); + // Start watch if required + if (instance.watch_period > 0) { + instance.watch_thread = + new boost::thread(watch_file, instance.filename, instance.watch_period); + } } - } +} - // Method to stop the watcher thread - void - logger_config::stop_watch() - { +// Method to stop the watcher thread +void logger_config::stop_watch() +{ logger_config& instance = get_instance(); - if(instance.watch_thread) { - instance.watch_thread->interrupt(); - instance.watch_thread->join(); - delete(instance.watch_thread); - instance.watch_thread=NULL; + if (instance.watch_thread) { + instance.watch_thread->interrupt(); + instance.watch_thread->join(); + delete (instance.watch_thread); + instance.watch_thread = NULL; } - } +} - // Method to reset logger configuration - void - logger_config::reset_config(void) - { +// Method to reset logger configuration +void logger_config::reset_config(void) +{ logger_config& instance = get_instance(); stop_watch(); - std::vector<log4cpp::Category*> *loggers = log4cpp::Category::getCurrentCategories(); + std::vector<log4cpp::Category*>* loggers = log4cpp::Category::getCurrentCategories(); std::vector<log4cpp::Category*>::iterator logger = loggers->begin(); // We can't destroy categories but we can neuter them by removing all appenders. - for(;logger!=loggers->end();logger++) { - (*logger)->removeAllAppenders(); + for (; logger != loggers->end(); logger++) { + (*logger)->removeAllAppenders(); } instance.filename = std::string(""); instance.watch_period = 0; logger_configured = false; - } +} - /***************** Functions to call log4cpp methods *************************/ +/***************** Functions to call log4cpp methods *************************/ - logger_ptr - logger_get_logger(std::string name) - { - if(log4cpp::Category::exists(name)) { - logger_ptr logger = &log4cpp::Category::getInstance(name); - return logger; - } - else { - logger_ptr logger = &log4cpp::Category::getInstance(name); - logger->setPriority(log4cpp::Priority::NOTSET); - return logger; +logger_ptr logger_get_logger(std::string name) +{ + if (log4cpp::Category::exists(name)) { + logger_ptr logger = &log4cpp::Category::getInstance(name); + return logger; + } else { + logger_ptr logger = &log4cpp::Category::getInstance(name); + logger->setPriority(log4cpp::Priority::NOTSET); + return logger; } - } - - bool - logger_load_config(const std::string &config_filename) - { - if(config_filename.size() != 0) { - try { - log4cpp::PropertyConfigurator::configure(config_filename); - return true; - } - catch(log4cpp::ConfigureFailure &e) { - std::cerr << "Logger config failed :" << e.what() << std::endl; - } +} + +bool logger_load_config(const std::string& config_filename) +{ + if (config_filename.size() != 0) { + try { + log4cpp::PropertyConfigurator::configure(config_filename); + return true; + } catch (log4cpp::ConfigureFailure& e) { + std::cerr << "Logger config failed :" << e.what() << std::endl; + } } return false; - } +} - void - logger_set_level(logger_ptr logger, const std::string &level) - { +void logger_set_level(logger_ptr logger, const std::string& level) +{ std::string nocase = level; std::transform(level.begin(), level.end(), nocase.begin(), ::tolower); - if(nocase == "off" || nocase == "notset") - logger_set_level(logger, log4cpp::Priority::NOTSET); - else if(nocase == "all" || nocase == "debug") - logger_set_level(logger, log4cpp::Priority::DEBUG); - else if(nocase == "info") - logger_set_level(logger, log4cpp::Priority::INFO); - else if(nocase == "notice") - logger_set_level(logger, log4cpp::Priority::NOTICE); - else if(nocase == "warn") - logger_set_level(logger, log4cpp::Priority::WARN); - else if(nocase == "error") - logger_set_level(logger, log4cpp::Priority::ERROR); - else if(nocase == "crit") - logger_set_level(logger, log4cpp::Priority::CRIT); - else if(nocase == "alert") - logger_set_level(logger, log4cpp::Priority::ALERT); - else if(nocase=="fatal") - logger_set_level(logger, log4cpp::Priority::FATAL); - else if(nocase == "emerg") - logger_set_level(logger, log4cpp::Priority::EMERG); + if (nocase == "off" || nocase == "notset") + logger_set_level(logger, log4cpp::Priority::NOTSET); + else if (nocase == "all" || nocase == "debug") + logger_set_level(logger, log4cpp::Priority::DEBUG); + else if (nocase == "info") + logger_set_level(logger, log4cpp::Priority::INFO); + else if (nocase == "notice") + logger_set_level(logger, log4cpp::Priority::NOTICE); + else if (nocase == "warn") + logger_set_level(logger, log4cpp::Priority::WARN); + else if (nocase == "error") + logger_set_level(logger, log4cpp::Priority::ERROR); + else if (nocase == "crit") + logger_set_level(logger, log4cpp::Priority::CRIT); + else if (nocase == "alert") + logger_set_level(logger, log4cpp::Priority::ALERT); + else if (nocase == "fatal") + logger_set_level(logger, log4cpp::Priority::FATAL); + else if (nocase == "emerg") + logger_set_level(logger, log4cpp::Priority::EMERG); else - throw std::runtime_error("logger_set_level: Bad level type.\n"); - } + throw std::runtime_error("logger_set_level: Bad level type.\n"); +} - void - logger_set_level(logger_ptr logger, log4cpp::Priority::Value level) - { +void logger_set_level(logger_ptr logger, log4cpp::Priority::Value level) +{ logger->setPriority(level); - } +} - void - logger_get_level(logger_ptr logger, std::string &level) - { +void logger_get_level(logger_ptr logger, std::string& level) +{ log4cpp::Priority::Value levelPtr = logger->getPriority(); - if(levelPtr == log4cpp::Priority::NOTSET) level = "notset"; - if(levelPtr == log4cpp::Priority::DEBUG) level = "debug"; - if(levelPtr == log4cpp::Priority::INFO) level = "info"; - if(levelPtr == log4cpp::Priority::NOTICE) level = "notice"; - if(levelPtr == log4cpp::Priority::WARN) level = "warn"; - if(levelPtr == log4cpp::Priority::ERROR) level = "error"; - if(levelPtr == log4cpp::Priority::CRIT) level = "crit"; - if(levelPtr == log4cpp::Priority::ALERT) level = "alert"; - if(levelPtr == log4cpp::Priority::FATAL) level = "fatal"; - if(levelPtr == log4cpp::Priority::EMERG) level = "emerg"; - } - - void - logger_get_level(logger_ptr logger,log4cpp::Priority::Value level) - { + if (levelPtr == log4cpp::Priority::NOTSET) + level = "notset"; + if (levelPtr == log4cpp::Priority::DEBUG) + level = "debug"; + if (levelPtr == log4cpp::Priority::INFO) + level = "info"; + if (levelPtr == log4cpp::Priority::NOTICE) + level = "notice"; + if (levelPtr == log4cpp::Priority::WARN) + level = "warn"; + if (levelPtr == log4cpp::Priority::ERROR) + level = "error"; + if (levelPtr == log4cpp::Priority::CRIT) + level = "crit"; + if (levelPtr == log4cpp::Priority::ALERT) + level = "alert"; + if (levelPtr == log4cpp::Priority::FATAL) + level = "fatal"; + if (levelPtr == log4cpp::Priority::EMERG) + level = "emerg"; +} + +void logger_get_level(logger_ptr logger, log4cpp::Priority::Value level) +{ level = logger->getPriority(); - } +} - void - logger_add_console_appender(logger_ptr logger, std::string target, std::string pattern) - { +void logger_add_console_appender(logger_ptr logger, + std::string target, + std::string pattern) +{ log4cpp::PatternLayout* layout = new log4cpp::PatternLayout(); log4cpp::Appender* app; - if(target=="stdout") - app = new log4cpp::OstreamAppender("ConsoleAppender::",&std::cout); + if (target == "stdout") + app = new log4cpp::OstreamAppender("ConsoleAppender::", &std::cout); else - app = new log4cpp::OstreamAppender("ConsoleAppender::",&std::cerr); + app = new log4cpp::OstreamAppender("ConsoleAppender::", &std::cerr); layout->setConversionPattern(pattern); app->setLayout(layout); logger->setAppender(app); - } +} - void - logger_set_console_appender(logger_ptr logger, std::string target, std::string pattern) - { +void logger_set_console_appender(logger_ptr logger, + std::string target, + std::string pattern) +{ logger->removeAllAppenders(); logger_add_console_appender(logger, target, pattern); - } +} - void - logger_add_file_appender(logger_ptr logger, std::string filename, - bool append, std::string pattern) - { +void logger_add_file_appender(logger_ptr logger, + std::string filename, + bool append, + std::string pattern) +{ log4cpp::PatternLayout* layout = new log4cpp::PatternLayout(); - log4cpp::Appender* app = new - log4cpp::FileAppender("FileAppender::"+filename, - filename); + log4cpp::Appender* app = + new log4cpp::FileAppender("FileAppender::" + filename, filename); layout->setConversionPattern(pattern); app->setLayout(layout); logger->setAppender(app); - } +} - void - logger_set_file_appender(logger_ptr logger, std::string filename, - bool append, std::string pattern) - { +void logger_set_file_appender(logger_ptr logger, + std::string filename, + bool append, + std::string pattern) +{ logger->removeAllAppenders(); logger_add_file_appender(logger, filename, append, pattern); - } +} - void - logger_add_rollingfile_appender(logger_ptr logger, std::string filename, - size_t filesize, int bkup_index, bool append, - mode_t mode, std::string pattern) - { +void logger_add_rollingfile_appender(logger_ptr logger, + std::string filename, + size_t filesize, + int bkup_index, + bool append, + mode_t mode, + std::string pattern) +{ log4cpp::PatternLayout* layout = new log4cpp::PatternLayout(); - log4cpp::Appender* app = new - log4cpp::RollingFileAppender("RollFileAppender::" + filename, filename, - filesize, bkup_index, append, mode); + log4cpp::Appender* app = new log4cpp::RollingFileAppender( + "RollFileAppender::" + filename, filename, filesize, bkup_index, append, mode); layout->setConversionPattern(pattern); app->setLayout(layout); logger->setAppender(app); - } +} - std::vector<std::string> - logger_get_logger_names(void) - { +std::vector<std::string> logger_get_logger_names(void) +{ std::vector<std::string> names; - std::vector<log4cpp::Category*> *loggers = log4cpp::Category::getCurrentCategories(); + std::vector<log4cpp::Category*>* loggers = log4cpp::Category::getCurrentCategories(); std::vector<log4cpp::Category*>::iterator logger = loggers->begin(); - for(;logger!=loggers->end();logger++) { - names.push_back((*logger)->getName()); + for (; logger != loggers->end(); logger++) { + names.push_back((*logger)->getName()); } return names; - } +} } /* namespace gr */ /****** Start Methods to provide Python the capabilities of the macros ********/ -void -gr_logger_config(const std::string config_filename, unsigned int watch_period) +void gr_logger_config(const std::string config_filename, unsigned int watch_period) { - GR_CONFIG_AND_WATCH_LOGGER(config_filename, watch_period); + GR_CONFIG_AND_WATCH_LOGGER(config_filename, watch_period); } -std::vector<std::string> -gr_logger_get_logger_names(void) +std::vector<std::string> gr_logger_get_logger_names(void) { - std::vector<std::string> names; - GR_GET_LOGGER_NAMES(names); - return names; + std::vector<std::string> names; + GR_GET_LOGGER_NAMES(names); + return names; } -void -gr_logger_reset_config(void) -{ - GR_RESET_CONFIGURATION(); -} +void gr_logger_reset_config(void) { GR_RESET_CONFIGURATION(); } // Remaining capability provided by gr::logger class in gnuradio/logger.h namespace gr { - bool - configure_default_loggers(gr::logger_ptr &l, gr::logger_ptr &d, - const std::string name) - { - prefs *p = prefs::singleton(); +bool configure_default_loggers(gr::logger_ptr& l, + gr::logger_ptr& d, + const std::string name) +{ + prefs* p = prefs::singleton(); std::string config_file = p->get_string("LOG", "log_config", ""); std::string log_level = p->get_string("LOG", "log_level", "off"); std::string log_file = p->get_string("LOG", "log_file", ""); @@ -348,59 +343,52 @@ namespace gr { GR_LOG_GETLOGGER(LOG, "gr_log." + name); GR_LOG_SET_LEVEL(LOG, log_level); - if(log_file.size() > 0) { - if(log_file == "stdout") { - GR_LOG_SET_CONSOLE_APPENDER(LOG, "stdout","gr::log :%p: %c{1} - %m%n"); - } - else if(log_file == "stderr") { - GR_LOG_SET_CONSOLE_APPENDER(LOG, "stderr","gr::log :%p: %c{1} - %m%n"); - } - else { - GR_LOG_SET_FILE_APPENDER(LOG, log_file , true,"%r :%p: %c{1} - %m%n"); - } + if (log_file.size() > 0) { + if (log_file == "stdout") { + GR_LOG_SET_CONSOLE_APPENDER(LOG, "stdout", "gr::log :%p: %c{1} - %m%n"); + } else if (log_file == "stderr") { + GR_LOG_SET_CONSOLE_APPENDER(LOG, "stderr", "gr::log :%p: %c{1} - %m%n"); + } else { + GR_LOG_SET_FILE_APPENDER(LOG, log_file, true, "%r :%p: %c{1} - %m%n"); + } } l = LOG; GR_LOG_GETLOGGER(DLOG, "gr_log_debug." + name); GR_LOG_SET_LEVEL(DLOG, debug_level); - if(debug_file.size() > 0) { - if(debug_file == "stdout") { - GR_LOG_SET_CONSOLE_APPENDER(DLOG, "stdout","gr::debug :%p: %c{1} - %m%n"); - } - else if(debug_file == "stderr") { - GR_LOG_SET_CONSOLE_APPENDER(DLOG, "stderr", "gr::debug :%p: %c{1} - %m%n"); - } - else { - GR_LOG_SET_FILE_APPENDER(DLOG, debug_file, true, "%r :%p: %c{1} - %m%n"); - } + if (debug_file.size() > 0) { + if (debug_file == "stdout") { + GR_LOG_SET_CONSOLE_APPENDER(DLOG, "stdout", "gr::debug :%p: %c{1} - %m%n"); + } else if (debug_file == "stderr") { + GR_LOG_SET_CONSOLE_APPENDER(DLOG, "stderr", "gr::debug :%p: %c{1} - %m%n"); + } else { + GR_LOG_SET_FILE_APPENDER(DLOG, debug_file, true, "%r :%p: %c{1} - %m%n"); + } } d = DLOG; return true; - } +} - bool - update_logger_alias(const std::string &name, const std::string &alias) - { - prefs *p = prefs::singleton(); +bool update_logger_alias(const std::string& name, const std::string& alias) +{ + prefs* p = prefs::singleton(); std::string log_file = p->get_string("LOG", "log_file", ""); std::string debug_file = p->get_string("LOG", "debug_file", ""); GR_LOG_GETLOGGER(LOG, "gr_log." + name); - if(log_file.size() > 0) { - if(log_file == "stdout") { - boost::format str("gr::log :%%p: %1% - %%m%%n"); - GR_LOG_SET_CONSOLE_APPENDER(LOG, "stdout", boost::str(str % alias)); - } - else if(log_file == "stderr") { - boost::format str("gr::log :%%p: %1% - %%m%%n"); - GR_LOG_SET_CONSOLE_APPENDER(LOG, "stderr", boost::str(str % alias)); - } - else { - boost::format str("%%r :%%p: %1% - %%m%%n"); - GR_LOG_SET_FILE_APPENDER(LOG, log_file, true, boost::str(str % alias)); - } + if (log_file.size() > 0) { + if (log_file == "stdout") { + boost::format str("gr::log :%%p: %1% - %%m%%n"); + GR_LOG_SET_CONSOLE_APPENDER(LOG, "stdout", boost::str(str % alias)); + } else if (log_file == "stderr") { + boost::format str("gr::log :%%p: %1% - %%m%%n"); + GR_LOG_SET_CONSOLE_APPENDER(LOG, "stderr", boost::str(str % alias)); + } else { + boost::format str("%%r :%%p: %1% - %%m%%n"); + GR_LOG_SET_FILE_APPENDER(LOG, log_file, true, boost::str(str % alias)); + } } return true; - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/math/fast_atan2f.cc b/gnuradio-runtime/lib/math/fast_atan2f.cc index 72e7291913..f0f37586a3 100644 --- a/gnuradio-runtime/lib/math/fast_atan2f.cc +++ b/gnuradio-runtime/lib/math/fast_atan2f.cc @@ -20,110 +20,86 @@ * Boston, MA 02110-1301, USA. */ -#include <gnuradio/math.h> // declaration is in here +#include <gnuradio/math.h> // declaration is in here #include <cmath> namespace gr { - /***************************************************************************/ - /* Constant definitions */ - /***************************************************************************/ - - #define TAN_MAP_RES 0.003921569 /* (smallest non-zero value in table) */ - #define RAD_PER_DEG 0.017453293 - #define TAN_MAP_SIZE 255 - - /* arctangents from 0 to pi/4 radians */ - static float - fast_atan_table[257] = { - 0.000000e+00, 3.921549e-03, 7.842976e-03, 1.176416e-02, - 1.568499e-02, 1.960533e-02, 2.352507e-02, 2.744409e-02, - 3.136226e-02, 3.527947e-02, 3.919560e-02, 4.311053e-02, - 4.702413e-02, 5.093629e-02, 5.484690e-02, 5.875582e-02, - 6.266295e-02, 6.656816e-02, 7.047134e-02, 7.437238e-02, - 7.827114e-02, 8.216752e-02, 8.606141e-02, 8.995267e-02, - 9.384121e-02, 9.772691e-02, 1.016096e-01, 1.054893e-01, - 1.093658e-01, 1.132390e-01, 1.171087e-01, 1.209750e-01, - 1.248376e-01, 1.286965e-01, 1.325515e-01, 1.364026e-01, - 1.402496e-01, 1.440924e-01, 1.479310e-01, 1.517652e-01, - 1.555948e-01, 1.594199e-01, 1.632403e-01, 1.670559e-01, - 1.708665e-01, 1.746722e-01, 1.784728e-01, 1.822681e-01, - 1.860582e-01, 1.898428e-01, 1.936220e-01, 1.973956e-01, - 2.011634e-01, 2.049255e-01, 2.086818e-01, 2.124320e-01, - 2.161762e-01, 2.199143e-01, 2.236461e-01, 2.273716e-01, - 2.310907e-01, 2.348033e-01, 2.385093e-01, 2.422086e-01, - 2.459012e-01, 2.495869e-01, 2.532658e-01, 2.569376e-01, - 2.606024e-01, 2.642600e-01, 2.679104e-01, 2.715535e-01, - 2.751892e-01, 2.788175e-01, 2.824383e-01, 2.860514e-01, - 2.896569e-01, 2.932547e-01, 2.968447e-01, 3.004268e-01, - 3.040009e-01, 3.075671e-01, 3.111252e-01, 3.146752e-01, - 3.182170e-01, 3.217506e-01, 3.252758e-01, 3.287927e-01, - 3.323012e-01, 3.358012e-01, 3.392926e-01, 3.427755e-01, - 3.462497e-01, 3.497153e-01, 3.531721e-01, 3.566201e-01, - 3.600593e-01, 3.634896e-01, 3.669110e-01, 3.703234e-01, - 3.737268e-01, 3.771211e-01, 3.805064e-01, 3.838825e-01, - 3.872494e-01, 3.906070e-01, 3.939555e-01, 3.972946e-01, - 4.006244e-01, 4.039448e-01, 4.072558e-01, 4.105574e-01, - 4.138496e-01, 4.171322e-01, 4.204054e-01, 4.236689e-01, - 4.269229e-01, 4.301673e-01, 4.334021e-01, 4.366272e-01, - 4.398426e-01, 4.430483e-01, 4.462443e-01, 4.494306e-01, - 4.526070e-01, 4.557738e-01, 4.589307e-01, 4.620778e-01, - 4.652150e-01, 4.683424e-01, 4.714600e-01, 4.745676e-01, - 4.776654e-01, 4.807532e-01, 4.838312e-01, 4.868992e-01, - 4.899573e-01, 4.930055e-01, 4.960437e-01, 4.990719e-01, - 5.020902e-01, 5.050985e-01, 5.080968e-01, 5.110852e-01, - 5.140636e-01, 5.170320e-01, 5.199904e-01, 5.229388e-01, - 5.258772e-01, 5.288056e-01, 5.317241e-01, 5.346325e-01, - 5.375310e-01, 5.404195e-01, 5.432980e-01, 5.461666e-01, - 5.490251e-01, 5.518738e-01, 5.547124e-01, 5.575411e-01, - 5.603599e-01, 5.631687e-01, 5.659676e-01, 5.687566e-01, - 5.715357e-01, 5.743048e-01, 5.770641e-01, 5.798135e-01, - 5.825531e-01, 5.852828e-01, 5.880026e-01, 5.907126e-01, - 5.934128e-01, 5.961032e-01, 5.987839e-01, 6.014547e-01, - 6.041158e-01, 6.067672e-01, 6.094088e-01, 6.120407e-01, - 6.146630e-01, 6.172755e-01, 6.198784e-01, 6.224717e-01, - 6.250554e-01, 6.276294e-01, 6.301939e-01, 6.327488e-01, - 6.352942e-01, 6.378301e-01, 6.403565e-01, 6.428734e-01, - 6.453808e-01, 6.478788e-01, 6.503674e-01, 6.528466e-01, - 6.553165e-01, 6.577770e-01, 6.602282e-01, 6.626701e-01, - 6.651027e-01, 6.675261e-01, 6.699402e-01, 6.723452e-01, - 6.747409e-01, 6.771276e-01, 6.795051e-01, 6.818735e-01, - 6.842328e-01, 6.865831e-01, 6.889244e-01, 6.912567e-01, - 6.935800e-01, 6.958943e-01, 6.981998e-01, 7.004964e-01, - 7.027841e-01, 7.050630e-01, 7.073330e-01, 7.095943e-01, - 7.118469e-01, 7.140907e-01, 7.163258e-01, 7.185523e-01, - 7.207701e-01, 7.229794e-01, 7.251800e-01, 7.273721e-01, - 7.295557e-01, 7.317307e-01, 7.338974e-01, 7.360555e-01, - 7.382053e-01, 7.403467e-01, 7.424797e-01, 7.446045e-01, - 7.467209e-01, 7.488291e-01, 7.509291e-01, 7.530208e-01, - 7.551044e-01, 7.571798e-01, 7.592472e-01, 7.613064e-01, - 7.633576e-01, 7.654008e-01, 7.674360e-01, 7.694633e-01, - 7.714826e-01, 7.734940e-01, 7.754975e-01, 7.774932e-01, - 7.794811e-01, 7.814612e-01, 7.834335e-01, 7.853982e-01, - 7.853982e-01 - }; - - - /***************************************************************************** - Function: Arc tangent - - Syntax: angle = fast_atan2(y, x); - float y y component of input vector - float x x component of input vector - float angle angle of vector (x, y) in radians - - Description: This function calculates the angle of the vector (x,y) - based on a table lookup and linear interpolation. The table uses a - 256 point table covering -45 to +45 degrees and uses symmetry to - determine the final angle value in the range of -180 to 180 - degrees. Note that this function uses the small angle approximation - for values close to zero. This routine calculates the arc tangent - with an average error of +/- 3.56e-5 degrees (6.21e-7 radians). - *****************************************************************************/ - - float - fast_atan2f(float y, float x) - { +/***************************************************************************/ +/* Constant definitions */ +/***************************************************************************/ + +#define TAN_MAP_RES 0.003921569 /* (smallest non-zero value in table) */ +#define RAD_PER_DEG 0.017453293 +#define TAN_MAP_SIZE 255 + +/* arctangents from 0 to pi/4 radians */ +static float fast_atan_table[257] = { + 0.000000e+00, 3.921549e-03, 7.842976e-03, 1.176416e-02, 1.568499e-02, 1.960533e-02, + 2.352507e-02, 2.744409e-02, 3.136226e-02, 3.527947e-02, 3.919560e-02, 4.311053e-02, + 4.702413e-02, 5.093629e-02, 5.484690e-02, 5.875582e-02, 6.266295e-02, 6.656816e-02, + 7.047134e-02, 7.437238e-02, 7.827114e-02, 8.216752e-02, 8.606141e-02, 8.995267e-02, + 9.384121e-02, 9.772691e-02, 1.016096e-01, 1.054893e-01, 1.093658e-01, 1.132390e-01, + 1.171087e-01, 1.209750e-01, 1.248376e-01, 1.286965e-01, 1.325515e-01, 1.364026e-01, + 1.402496e-01, 1.440924e-01, 1.479310e-01, 1.517652e-01, 1.555948e-01, 1.594199e-01, + 1.632403e-01, 1.670559e-01, 1.708665e-01, 1.746722e-01, 1.784728e-01, 1.822681e-01, + 1.860582e-01, 1.898428e-01, 1.936220e-01, 1.973956e-01, 2.011634e-01, 2.049255e-01, + 2.086818e-01, 2.124320e-01, 2.161762e-01, 2.199143e-01, 2.236461e-01, 2.273716e-01, + 2.310907e-01, 2.348033e-01, 2.385093e-01, 2.422086e-01, 2.459012e-01, 2.495869e-01, + 2.532658e-01, 2.569376e-01, 2.606024e-01, 2.642600e-01, 2.679104e-01, 2.715535e-01, + 2.751892e-01, 2.788175e-01, 2.824383e-01, 2.860514e-01, 2.896569e-01, 2.932547e-01, + 2.968447e-01, 3.004268e-01, 3.040009e-01, 3.075671e-01, 3.111252e-01, 3.146752e-01, + 3.182170e-01, 3.217506e-01, 3.252758e-01, 3.287927e-01, 3.323012e-01, 3.358012e-01, + 3.392926e-01, 3.427755e-01, 3.462497e-01, 3.497153e-01, 3.531721e-01, 3.566201e-01, + 3.600593e-01, 3.634896e-01, 3.669110e-01, 3.703234e-01, 3.737268e-01, 3.771211e-01, + 3.805064e-01, 3.838825e-01, 3.872494e-01, 3.906070e-01, 3.939555e-01, 3.972946e-01, + 4.006244e-01, 4.039448e-01, 4.072558e-01, 4.105574e-01, 4.138496e-01, 4.171322e-01, + 4.204054e-01, 4.236689e-01, 4.269229e-01, 4.301673e-01, 4.334021e-01, 4.366272e-01, + 4.398426e-01, 4.430483e-01, 4.462443e-01, 4.494306e-01, 4.526070e-01, 4.557738e-01, + 4.589307e-01, 4.620778e-01, 4.652150e-01, 4.683424e-01, 4.714600e-01, 4.745676e-01, + 4.776654e-01, 4.807532e-01, 4.838312e-01, 4.868992e-01, 4.899573e-01, 4.930055e-01, + 4.960437e-01, 4.990719e-01, 5.020902e-01, 5.050985e-01, 5.080968e-01, 5.110852e-01, + 5.140636e-01, 5.170320e-01, 5.199904e-01, 5.229388e-01, 5.258772e-01, 5.288056e-01, + 5.317241e-01, 5.346325e-01, 5.375310e-01, 5.404195e-01, 5.432980e-01, 5.461666e-01, + 5.490251e-01, 5.518738e-01, 5.547124e-01, 5.575411e-01, 5.603599e-01, 5.631687e-01, + 5.659676e-01, 5.687566e-01, 5.715357e-01, 5.743048e-01, 5.770641e-01, 5.798135e-01, + 5.825531e-01, 5.852828e-01, 5.880026e-01, 5.907126e-01, 5.934128e-01, 5.961032e-01, + 5.987839e-01, 6.014547e-01, 6.041158e-01, 6.067672e-01, 6.094088e-01, 6.120407e-01, + 6.146630e-01, 6.172755e-01, 6.198784e-01, 6.224717e-01, 6.250554e-01, 6.276294e-01, + 6.301939e-01, 6.327488e-01, 6.352942e-01, 6.378301e-01, 6.403565e-01, 6.428734e-01, + 6.453808e-01, 6.478788e-01, 6.503674e-01, 6.528466e-01, 6.553165e-01, 6.577770e-01, + 6.602282e-01, 6.626701e-01, 6.651027e-01, 6.675261e-01, 6.699402e-01, 6.723452e-01, + 6.747409e-01, 6.771276e-01, 6.795051e-01, 6.818735e-01, 6.842328e-01, 6.865831e-01, + 6.889244e-01, 6.912567e-01, 6.935800e-01, 6.958943e-01, 6.981998e-01, 7.004964e-01, + 7.027841e-01, 7.050630e-01, 7.073330e-01, 7.095943e-01, 7.118469e-01, 7.140907e-01, + 7.163258e-01, 7.185523e-01, 7.207701e-01, 7.229794e-01, 7.251800e-01, 7.273721e-01, + 7.295557e-01, 7.317307e-01, 7.338974e-01, 7.360555e-01, 7.382053e-01, 7.403467e-01, + 7.424797e-01, 7.446045e-01, 7.467209e-01, 7.488291e-01, 7.509291e-01, 7.530208e-01, + 7.551044e-01, 7.571798e-01, 7.592472e-01, 7.613064e-01, 7.633576e-01, 7.654008e-01, + 7.674360e-01, 7.694633e-01, 7.714826e-01, 7.734940e-01, 7.754975e-01, 7.774932e-01, + 7.794811e-01, 7.814612e-01, 7.834335e-01, 7.853982e-01, 7.853982e-01 +}; + + +/***************************************************************************** + Function: Arc tangent + + Syntax: angle = fast_atan2(y, x); + float y y component of input vector + float x x component of input vector + float angle angle of vector (x, y) in radians + + Description: This function calculates the angle of the vector (x,y) + based on a table lookup and linear interpolation. The table uses a + 256 point table covering -45 to +45 degrees and uses symmetry to + determine the final angle value in the range of -180 to 180 + degrees. Note that this function uses the small angle approximation + for values close to zero. This routine calculates the arc tangent + with an average error of +/- 3.56e-5 degrees (6.21e-7 radians). +*****************************************************************************/ + +float fast_atan2f(float y, float x) +{ float x_abs, y_abs, z; float alpha, angle, base_angle; int index; @@ -132,69 +108,66 @@ namespace gr { y_abs = fabsf(y); x_abs = fabsf(x); /* don't divide by zero! */ - if(!((y_abs > 0.0f) || (x_abs > 0.0f))) - return 0.0; + if (!((y_abs > 0.0f) || (x_abs > 0.0f))) + return 0.0; - if(y_abs < x_abs) - z = y_abs / x_abs; + if (y_abs < x_abs) + z = y_abs / x_abs; else - z = x_abs / y_abs; + z = x_abs / y_abs; /* when ratio approaches the table resolution, the angle is */ /* best approximated with the argument itself... */ - if(z < TAN_MAP_RES) - base_angle = z; + if (z < TAN_MAP_RES) + base_angle = z; else { - /* find index and interpolation value */ - alpha = z * (float)TAN_MAP_SIZE; - index = ((int)alpha) & 0xff; - alpha -= (float)index; - /* determine base angle based on quadrant and */ - /* add or subtract table value from base angle based on quadrant */ - base_angle = fast_atan_table[index]; - base_angle += (fast_atan_table[index + 1] - fast_atan_table[index]) * alpha; + /* find index and interpolation value */ + alpha = z * (float)TAN_MAP_SIZE; + index = ((int)alpha) & 0xff; + alpha -= (float)index; + /* determine base angle based on quadrant and */ + /* add or subtract table value from base angle based on quadrant */ + base_angle = fast_atan_table[index]; + base_angle += (fast_atan_table[index + 1] - fast_atan_table[index]) * alpha; } - if(x_abs > y_abs) { /* -45 -> 45 or 135 -> 225 */ - if(x >= 0.0) { /* -45 -> 45 */ - if(y >= 0.0) - angle = base_angle; /* 0 -> 45, angle OK */ - else - angle = -base_angle; /* -45 -> 0, angle = -angle */ - } - else { /* 135 -> 180 or 180 -> -135 */ - angle = 3.14159265358979323846; - if(y >= 0.0) - angle -= base_angle; /* 135 -> 180, angle = 180 - angle */ - else - angle = base_angle - angle; /* 180 -> -135, angle = angle - 180 */ - } - } - else { /* 45 -> 135 or -135 -> -45 */ - if(y >= 0.0) { /* 45 -> 135 */ - angle = 1.57079632679489661923; - if(x >= 0.0) - angle -= base_angle; /* 45 -> 90, angle = 90 - angle */ - else - angle += base_angle; /* 90 -> 135, angle = 90 + angle */ - } - else { /* -135 -> -45 */ - angle = -1.57079632679489661923; - if(x >= 0.0) - angle += base_angle; /* -90 -> -45, angle = -90 + angle */ - else - angle -= base_angle; /* -135 -> -90, angle = -90 - angle */ - } + if (x_abs > y_abs) { /* -45 -> 45 or 135 -> 225 */ + if (x >= 0.0) { /* -45 -> 45 */ + if (y >= 0.0) + angle = base_angle; /* 0 -> 45, angle OK */ + else + angle = -base_angle; /* -45 -> 0, angle = -angle */ + } else { /* 135 -> 180 or 180 -> -135 */ + angle = 3.14159265358979323846; + if (y >= 0.0) + angle -= base_angle; /* 135 -> 180, angle = 180 - angle */ + else + angle = base_angle - angle; /* 180 -> -135, angle = angle - 180 */ + } + } else { /* 45 -> 135 or -135 -> -45 */ + if (y >= 0.0) { /* 45 -> 135 */ + angle = 1.57079632679489661923; + if (x >= 0.0) + angle -= base_angle; /* 45 -> 90, angle = 90 - angle */ + else + angle += base_angle; /* 90 -> 135, angle = 90 + angle */ + } else { /* -135 -> -45 */ + angle = -1.57079632679489661923; + if (x >= 0.0) + angle += base_angle; /* -90 -> -45, angle = -90 + angle */ + else + angle -= base_angle; /* -135 -> -90, angle = -90 - angle */ + } } - #ifdef ZERO_TO_TWOPI +#ifdef ZERO_TO_TWOPI if (angle < 0) - return (angle + TWOPI); + return (angle + TWOPI); else - return (angle); - #else + return (angle); +#else return (angle); - #endif - } +#endif +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/math/fxpt.cc b/gnuradio-runtime/lib/math/fxpt.cc index b40b082194..ef8d99c35d 100644 --- a/gnuradio-runtime/lib/math/fxpt.cc +++ b/gnuradio-runtime/lib/math/fxpt.cc @@ -28,12 +28,12 @@ namespace gr { - const float fxpt::s_sine_table[1 << NBITS][2] = { - #include "sine_table.h" - }; +const float fxpt::s_sine_table[1 << NBITS][2] = { +#include "sine_table.h" +}; - const float fxpt::PI = 3.14159265358979323846; - const float fxpt::TAU = 2.0 * 3.14159265358979323846; - const float fxpt::TWO_TO_THE_31 = 2147483648.0; +const float fxpt::PI = 3.14159265358979323846; +const float fxpt::TAU = 2.0 * 3.14159265358979323846; +const float fxpt::TWO_TO_THE_31 = 2147483648.0; } /* namespace gr */ diff --git a/gnuradio-runtime/lib/math/qa_fast_atan2f.cc b/gnuradio-runtime/lib/math/qa_fast_atan2f.cc index 423a8bc415..fe41ba7e06 100644 --- a/gnuradio-runtime/lib/math/qa_fast_atan2f.cc +++ b/gnuradio-runtime/lib/math/qa_fast_atan2f.cc @@ -35,98 +35,100 @@ #define ISNAN std::isnan #endif -BOOST_AUTO_TEST_CASE(t1) { - static const unsigned int N = 100; - float c_atan2; - float gr_atan2f; - - for(float i = -N/2; i < N/2; i++) { - for(float j =-N/2; i < N/2; i++) { - float x = i/10.0; - float y = j/10.0; - c_atan2 = atan2(y, x); - - gr_atan2f = gr::fast_atan2f(y, x); - - BOOST_CHECK_CLOSE(c_atan2, gr_atan2f, 0.0); +BOOST_AUTO_TEST_CASE(t1) +{ + static const unsigned int N = 100; + float c_atan2; + float gr_atan2f; + + for (float i = -N / 2; i < N / 2; i++) { + for (float j = -N / 2; i < N / 2; i++) { + float x = i / 10.0; + float y = j / 10.0; + c_atan2 = atan2(y, x); + + gr_atan2f = gr::fast_atan2f(y, x); + + BOOST_CHECK_CLOSE(c_atan2, gr_atan2f, 0.0); + } } - } } -BOOST_AUTO_TEST_CASE(t2) { - float c_atan2; - float gr_atan2f; - float x, y; - - float inf = std::numeric_limits<float>::infinity(); - float nan = std::numeric_limits<float>::quiet_NaN(); - - /* Test x as INF */ - x = inf; - y = 0; - c_atan2 = atan2(y, x); - gr_atan2f = gr::fast_atan2f(y, x); - BOOST_CHECK_CLOSE(c_atan2, gr_atan2f, 0.0); - - x = -inf; - y = 0; - c_atan2 = atan2(y, x); - gr_atan2f = gr::fast_atan2f(y, x); - BOOST_CHECK_CLOSE(c_atan2, gr_atan2f, 0.0); - - - /* Test y as INF */ - x = 0; - y = inf; - c_atan2 = atan2(y, x); - gr_atan2f = gr::fast_atan2f(y, x); - BOOST_CHECK_CLOSE(c_atan2, gr_atan2f, 0.0); - - x = 0; - y = -inf; - c_atan2 = atan2(y, x); - gr_atan2f = gr::fast_atan2f(y, x); - BOOST_CHECK_CLOSE(c_atan2, gr_atan2f, 0.0); - - - /* Test x and y as INF */ - x = inf; - y = inf; - gr_atan2f = gr::fast_atan2f(y, x); - BOOST_CHECK(ISNAN(gr_atan2f)); - - - /* Test x as NAN */ - x = nan; - y = 0; - gr_atan2f = gr::fast_atan2f(y, x); - BOOST_CHECK_CLOSE(0.0f, gr_atan2f, 0.0001); - - x = -nan; - y = 0; - gr_atan2f = gr::fast_atan2f(y, x); - BOOST_CHECK_CLOSE(0.0f, gr_atan2f, 0.0001); - - - /* Test y as NAN */ - x = 0; - y = nan; - gr_atan2f = gr::fast_atan2f(y, x); - BOOST_CHECK_CLOSE(0.0f, gr_atan2f, 0.0001); - - x = 0; - y = -nan; - gr_atan2f = gr::fast_atan2f(y, x); - BOOST_CHECK_CLOSE(0.0f, gr_atan2f, 0.0001); - - /* Test mixed NAN and INF */ - x = inf; - y = nan; - gr_atan2f = gr::fast_atan2f(y, x); - BOOST_CHECK(ISNAN(gr_atan2f)); - - x = nan; - y = inf; - gr_atan2f = gr::fast_atan2f(y, x); - BOOST_CHECK(ISNAN(gr_atan2f)); +BOOST_AUTO_TEST_CASE(t2) +{ + float c_atan2; + float gr_atan2f; + float x, y; + + float inf = std::numeric_limits<float>::infinity(); + float nan = std::numeric_limits<float>::quiet_NaN(); + + /* Test x as INF */ + x = inf; + y = 0; + c_atan2 = atan2(y, x); + gr_atan2f = gr::fast_atan2f(y, x); + BOOST_CHECK_CLOSE(c_atan2, gr_atan2f, 0.0); + + x = -inf; + y = 0; + c_atan2 = atan2(y, x); + gr_atan2f = gr::fast_atan2f(y, x); + BOOST_CHECK_CLOSE(c_atan2, gr_atan2f, 0.0); + + + /* Test y as INF */ + x = 0; + y = inf; + c_atan2 = atan2(y, x); + gr_atan2f = gr::fast_atan2f(y, x); + BOOST_CHECK_CLOSE(c_atan2, gr_atan2f, 0.0); + + x = 0; + y = -inf; + c_atan2 = atan2(y, x); + gr_atan2f = gr::fast_atan2f(y, x); + BOOST_CHECK_CLOSE(c_atan2, gr_atan2f, 0.0); + + + /* Test x and y as INF */ + x = inf; + y = inf; + gr_atan2f = gr::fast_atan2f(y, x); + BOOST_CHECK(ISNAN(gr_atan2f)); + + + /* Test x as NAN */ + x = nan; + y = 0; + gr_atan2f = gr::fast_atan2f(y, x); + BOOST_CHECK_CLOSE(0.0f, gr_atan2f, 0.0001); + + x = -nan; + y = 0; + gr_atan2f = gr::fast_atan2f(y, x); + BOOST_CHECK_CLOSE(0.0f, gr_atan2f, 0.0001); + + + /* Test y as NAN */ + x = 0; + y = nan; + gr_atan2f = gr::fast_atan2f(y, x); + BOOST_CHECK_CLOSE(0.0f, gr_atan2f, 0.0001); + + x = 0; + y = -nan; + gr_atan2f = gr::fast_atan2f(y, x); + BOOST_CHECK_CLOSE(0.0f, gr_atan2f, 0.0001); + + /* Test mixed NAN and INF */ + x = inf; + y = nan; + gr_atan2f = gr::fast_atan2f(y, x); + BOOST_CHECK(ISNAN(gr_atan2f)); + + x = nan; + y = inf; + gr_atan2f = gr::fast_atan2f(y, x); + BOOST_CHECK(ISNAN(gr_atan2f)); } diff --git a/gnuradio-runtime/lib/math/qa_fxpt.cc b/gnuradio-runtime/lib/math/qa_fxpt.cc index ed5ea856d6..16e04b819a 100644 --- a/gnuradio-runtime/lib/math/qa_fxpt.cc +++ b/gnuradio-runtime/lib/math/qa_fxpt.cc @@ -34,61 +34,68 @@ static const float SIN_COS_TOLERANCE = 1e-5; -BOOST_AUTO_TEST_CASE(t0) { - BOOST_CHECK(std::abs(GR_M_PI/2 - gr::fxpt::fixed_to_float(0x40000000)) <= SIN_COS_TOLERANCE); - BOOST_CHECK(std::abs(0.0 - gr::fxpt::fixed_to_float(0x00000000)) <= SIN_COS_TOLERANCE); - BOOST_CHECK(std::abs(-GR_M_PI - gr::fxpt::fixed_to_float(0x80000000)) <= SIN_COS_TOLERANCE); +BOOST_AUTO_TEST_CASE(t0) +{ + BOOST_CHECK(std::abs(GR_M_PI / 2 - gr::fxpt::fixed_to_float(0x40000000)) <= + SIN_COS_TOLERANCE); + BOOST_CHECK(std::abs(0.0 - gr::fxpt::fixed_to_float(0x00000000)) <= + SIN_COS_TOLERANCE); + BOOST_CHECK(std::abs(-GR_M_PI - gr::fxpt::fixed_to_float(0x80000000)) <= + SIN_COS_TOLERANCE); - if(0) { - /* - * These are disabled because of some precision issues. - * - * Different compilers seem to have different opinions on whether - * the calculations are done single or double (or extended) - * precision. Any of the answers are fine for our real purpose, but - * sometimes the answer is off by a few bits at the bottom. - * Hence, the disabled check. - */ - BOOST_CHECK_EQUAL((int32_t)0x40000000, gr::fxpt::float_to_fixed(GR_M_PI/2)); - BOOST_CHECK_EQUAL((int32_t)0, gr::fxpt::float_to_fixed(0)); - BOOST_CHECK_EQUAL((int32_t)0x80000000, gr::fxpt::float_to_fixed(-GR_M_PI)); - } + if (0) { + /* + * These are disabled because of some precision issues. + * + * Different compilers seem to have different opinions on whether + * the calculations are done single or double (or extended) + * precision. Any of the answers are fine for our real purpose, but + * sometimes the answer is off by a few bits at the bottom. + * Hence, the disabled check. + */ + BOOST_CHECK_EQUAL((int32_t)0x40000000, gr::fxpt::float_to_fixed(GR_M_PI / 2)); + BOOST_CHECK_EQUAL((int32_t)0, gr::fxpt::float_to_fixed(0)); + BOOST_CHECK_EQUAL((int32_t)0x80000000, gr::fxpt::float_to_fixed(-GR_M_PI)); + } } -BOOST_AUTO_TEST_CASE(t1) { - BOOST_CHECK(std::abs( 0 - gr::fxpt::sin(0x00000000)) <= SIN_COS_TOLERANCE); - BOOST_CHECK(std::abs( 0.707106781 - gr::fxpt::sin(0x20000000)) <= SIN_COS_TOLERANCE); - BOOST_CHECK(std::abs( 1 - gr::fxpt::sin(0x40000000)) <= SIN_COS_TOLERANCE); - BOOST_CHECK(std::abs( 0.707106781 - gr::fxpt::sin(0x60000000)) <= SIN_COS_TOLERANCE); - BOOST_CHECK(std::abs( 0 - gr::fxpt::sin(0x7fffffff)) <= SIN_COS_TOLERANCE); - BOOST_CHECK(std::abs( 0 - gr::fxpt::sin(0x80000000)) <= SIN_COS_TOLERANCE); - BOOST_CHECK(std::abs( 0 - gr::fxpt::sin(0x80000001)) <= SIN_COS_TOLERANCE); - BOOST_CHECK(std::abs(-1 - gr::fxpt::sin(-0x40000000)) <= SIN_COS_TOLERANCE); - BOOST_CHECK(std::abs(-0.707106781 - gr::fxpt::sin(-0x20000000)) <= SIN_COS_TOLERANCE); +BOOST_AUTO_TEST_CASE(t1) +{ + BOOST_CHECK(std::abs(0 - gr::fxpt::sin(0x00000000)) <= SIN_COS_TOLERANCE); + BOOST_CHECK(std::abs(0.707106781 - gr::fxpt::sin(0x20000000)) <= SIN_COS_TOLERANCE); + BOOST_CHECK(std::abs(1 - gr::fxpt::sin(0x40000000)) <= SIN_COS_TOLERANCE); + BOOST_CHECK(std::abs(0.707106781 - gr::fxpt::sin(0x60000000)) <= SIN_COS_TOLERANCE); + BOOST_CHECK(std::abs(0 - gr::fxpt::sin(0x7fffffff)) <= SIN_COS_TOLERANCE); + BOOST_CHECK(std::abs(0 - gr::fxpt::sin(0x80000000)) <= SIN_COS_TOLERANCE); + BOOST_CHECK(std::abs(0 - gr::fxpt::sin(0x80000001)) <= SIN_COS_TOLERANCE); + BOOST_CHECK(std::abs(-1 - gr::fxpt::sin(-0x40000000)) <= SIN_COS_TOLERANCE); + BOOST_CHECK(std::abs(-0.707106781 - gr::fxpt::sin(-0x20000000)) <= SIN_COS_TOLERANCE); - for(float p = -GR_M_PI; p < GR_M_PI; p += 2 * GR_M_PI / 3600) { - float expected = sin(p); - float actual = gr::fxpt::sin(gr::fxpt::float_to_fixed (p)); - BOOST_CHECK(std::abs(expected - actual) <= SIN_COS_TOLERANCE); - } + for (float p = -GR_M_PI; p < GR_M_PI; p += 2 * GR_M_PI / 3600) { + float expected = sin(p); + float actual = gr::fxpt::sin(gr::fxpt::float_to_fixed(p)); + BOOST_CHECK(std::abs(expected - actual) <= SIN_COS_TOLERANCE); + } } -BOOST_AUTO_TEST_CASE(t2) { - for(float p = -GR_M_PI; p < GR_M_PI; p += 2 * GR_M_PI / 3600) { - float expected = cos(p); - float actual = gr::fxpt::cos(gr::fxpt::float_to_fixed(p)); - BOOST_CHECK(std::abs(expected - actual) <= SIN_COS_TOLERANCE); - } +BOOST_AUTO_TEST_CASE(t2) +{ + for (float p = -GR_M_PI; p < GR_M_PI; p += 2 * GR_M_PI / 3600) { + float expected = cos(p); + float actual = gr::fxpt::cos(gr::fxpt::float_to_fixed(p)); + BOOST_CHECK(std::abs(expected - actual) <= SIN_COS_TOLERANCE); + } } -BOOST_AUTO_TEST_CASE(t3) { - for(float p = -GR_M_PI; p < GR_M_PI; p += 2 * GR_M_PI / 3600) { - float expected_sin = sin(p); - float expected_cos = cos(p); - float actual_sin; - float actual_cos; - gr::fxpt::sincos(gr::fxpt::float_to_fixed (p), &actual_sin, &actual_cos); - BOOST_CHECK(std::abs(expected_sin - actual_sin) <= SIN_COS_TOLERANCE); - BOOST_CHECK(std::abs(expected_cos - actual_cos) <= SIN_COS_TOLERANCE); - } +BOOST_AUTO_TEST_CASE(t3) +{ + for (float p = -GR_M_PI; p < GR_M_PI; p += 2 * GR_M_PI / 3600) { + float expected_sin = sin(p); + float expected_cos = cos(p); + float actual_sin; + float actual_cos; + gr::fxpt::sincos(gr::fxpt::float_to_fixed(p), &actual_sin, &actual_cos); + BOOST_CHECK(std::abs(expected_sin - actual_sin) <= SIN_COS_TOLERANCE); + BOOST_CHECK(std::abs(expected_cos - actual_cos) <= SIN_COS_TOLERANCE); + } } diff --git a/gnuradio-runtime/lib/math/qa_fxpt_nco.cc b/gnuradio-runtime/lib/math/qa_fxpt_nco.cc index da10f49c92..2c4a8c327a 100644 --- a/gnuradio-runtime/lib/math/qa_fxpt_nco.cc +++ b/gnuradio-runtime/lib/math/qa_fxpt_nco.cc @@ -34,76 +34,80 @@ static const float SIN_COS_TOLERANCE = 1e-5; -//static const float SIN_COS_FREQ = 5003; +// static const float SIN_COS_FREQ = 5003; static const float SIN_COS_FREQ = 4096; static const int SIN_COS_BLOCK_SIZE = 100000; -static double max_d(double a, double b) -{ - return fabs(a) > fabs(b) ? a : b; -} +static double max_d(double a, double b) { return fabs(a) > fabs(b) ? a : b; } -BOOST_AUTO_TEST_CASE(t0) { - gr::nco<float,float> ref_nco; - gr::fxpt_nco new_nco; - double max_error = 0, max_phase_error = 0; +BOOST_AUTO_TEST_CASE(t0) +{ + gr::nco<float, float> ref_nco; + gr::fxpt_nco new_nco; + double max_error = 0, max_phase_error = 0; - ref_nco.set_freq((float)(2 * GR_M_PI / SIN_COS_FREQ)); - new_nco.set_freq((float)(2 * GR_M_PI / SIN_COS_FREQ)); + ref_nco.set_freq((float)(2 * GR_M_PI / SIN_COS_FREQ)); + new_nco.set_freq((float)(2 * GR_M_PI / SIN_COS_FREQ)); - BOOST_CHECK(std::abs(ref_nco.get_freq() - new_nco.get_freq()) <= SIN_COS_TOLERANCE); + BOOST_CHECK(std::abs(ref_nco.get_freq() - new_nco.get_freq()) <= SIN_COS_TOLERANCE); - for(int i = 0; i < SIN_COS_BLOCK_SIZE; i++) { - float ref_sin = ref_nco.sin(); - float new_sin = new_nco.sin(); - //printf ("i = %6d\n", i); - BOOST_CHECK(std::abs(ref_sin - new_sin) <= SIN_COS_TOLERANCE); + for (int i = 0; i < SIN_COS_BLOCK_SIZE; i++) { + float ref_sin = ref_nco.sin(); + float new_sin = new_nco.sin(); + // printf ("i = %6d\n", i); + BOOST_CHECK(std::abs(ref_sin - new_sin) <= SIN_COS_TOLERANCE); - max_error = max_d(max_error, ref_sin-new_sin); + max_error = max_d(max_error, ref_sin - new_sin); - float ref_cos = ref_nco.cos(); - float new_cos = new_nco.cos(); - BOOST_CHECK(std::abs(ref_cos - new_cos) <= SIN_COS_TOLERANCE); + float ref_cos = ref_nco.cos(); + float new_cos = new_nco.cos(); + BOOST_CHECK(std::abs(ref_cos - new_cos) <= SIN_COS_TOLERANCE); - max_error = max_d(max_error, ref_cos-new_cos); + max_error = max_d(max_error, ref_cos - new_cos); - ref_nco.step(); - new_nco.step(); + ref_nco.step(); + new_nco.step(); - BOOST_CHECK(std::abs(ref_nco.get_phase() - new_nco.get_phase()) <= SIN_COS_TOLERANCE); + BOOST_CHECK(std::abs(ref_nco.get_phase() - new_nco.get_phase()) <= + SIN_COS_TOLERANCE); - max_phase_error = max_d(max_phase_error, ref_nco.get_phase()-new_nco.get_phase()); - } - // printf ("Fxpt max error %.9f, max phase error %.9f\n", max_error, max_phase_error); + max_phase_error = + max_d(max_phase_error, ref_nco.get_phase() - new_nco.get_phase()); + } + // printf ("Fxpt max error %.9f, max phase error %.9f\n", max_error, + // max_phase_error); } -BOOST_AUTO_TEST_CASE(t1) { - gr::nco<float,float> ref_nco; - gr::fxpt_nco new_nco; - gr_complex* ref_block = new gr_complex[SIN_COS_BLOCK_SIZE]; - gr_complex* new_block = new gr_complex[SIN_COS_BLOCK_SIZE]; - double max_error = 0; +BOOST_AUTO_TEST_CASE(t1) +{ + gr::nco<float, float> ref_nco; + gr::fxpt_nco new_nco; + gr_complex* ref_block = new gr_complex[SIN_COS_BLOCK_SIZE]; + gr_complex* new_block = new gr_complex[SIN_COS_BLOCK_SIZE]; + double max_error = 0; - ref_nco.set_freq((float)(2 * GR_M_PI / SIN_COS_FREQ)); - new_nco.set_freq((float)(2 * GR_M_PI / SIN_COS_FREQ)); + ref_nco.set_freq((float)(2 * GR_M_PI / SIN_COS_FREQ)); + new_nco.set_freq((float)(2 * GR_M_PI / SIN_COS_FREQ)); - BOOST_CHECK(std::abs(ref_nco.get_freq() - new_nco.get_freq()) <= SIN_COS_TOLERANCE); + BOOST_CHECK(std::abs(ref_nco.get_freq() - new_nco.get_freq()) <= SIN_COS_TOLERANCE); - ref_nco.sincos((gr_complex*)ref_block, SIN_COS_BLOCK_SIZE); - new_nco.sincos((gr_complex*)new_block, SIN_COS_BLOCK_SIZE); + ref_nco.sincos((gr_complex*)ref_block, SIN_COS_BLOCK_SIZE); + new_nco.sincos((gr_complex*)new_block, SIN_COS_BLOCK_SIZE); - for(int i = 0; i < SIN_COS_BLOCK_SIZE; i++) { - BOOST_CHECK(std::abs(ref_block[i].real() - new_block[i].real()) <= SIN_COS_TOLERANCE); - max_error = max_d (max_error, ref_block[i].real()-new_block[i].real()); + for (int i = 0; i < SIN_COS_BLOCK_SIZE; i++) { + BOOST_CHECK(std::abs(ref_block[i].real() - new_block[i].real()) <= + SIN_COS_TOLERANCE); + max_error = max_d(max_error, ref_block[i].real() - new_block[i].real()); - BOOST_CHECK(std::abs(ref_block[i].imag() - new_block[i].imag()) <= SIN_COS_TOLERANCE); - max_error = max_d (max_error, ref_block[i].imag()-new_block[i].imag()); - } - BOOST_CHECK(std::abs(ref_nco.get_phase() - new_nco.get_phase()) <= SIN_COS_TOLERANCE); - // printf ("Fxpt max error %.9f, max phase error %.9f\n", max_error, max_phase_error); - delete[] ref_block; - delete[] new_block; + BOOST_CHECK(std::abs(ref_block[i].imag() - new_block[i].imag()) <= + SIN_COS_TOLERANCE); + max_error = max_d(max_error, ref_block[i].imag() - new_block[i].imag()); + } + BOOST_CHECK(std::abs(ref_nco.get_phase() - new_nco.get_phase()) <= SIN_COS_TOLERANCE); + // printf ("Fxpt max error %.9f, max phase error %.9f\n", max_error, + // max_phase_error); + delete[] ref_block; + delete[] new_block; } - diff --git a/gnuradio-runtime/lib/math/qa_fxpt_vco.cc b/gnuradio-runtime/lib/math/qa_fxpt_vco.cc index d4952fe25c..a24e38d63b 100644 --- a/gnuradio-runtime/lib/math/qa_fxpt_vco.cc +++ b/gnuradio-runtime/lib/math/qa_fxpt_vco.cc @@ -39,90 +39,92 @@ static const float SIN_COS_AMPL = 0.8; static const int SIN_COS_BLOCK_SIZE = 100000; -static double max_d(double a, double b) +static double max_d(double a, double b) { return fabs(a) > fabs(b) ? a : b; } + +BOOST_AUTO_TEST_CASE(t0) { - return fabs(a) > fabs(b) ? a : b; -} + gr::vco<float, float> ref_vco; + gr::fxpt_vco new_vco; + double max_error = 0, max_phase_error = 0; + float input[SIN_COS_BLOCK_SIZE]; -BOOST_AUTO_TEST_CASE(t0) { - gr::vco<float,float> ref_vco; - gr::fxpt_vco new_vco; - double max_error = 0, max_phase_error = 0; - float input[SIN_COS_BLOCK_SIZE]; + for (int i = 0; i < SIN_COS_BLOCK_SIZE; i++) { + input[i] = sin(double(i)); + } - for(int i = 0; i < SIN_COS_BLOCK_SIZE; i++) { - input[i] = sin(double(i)); - } + for (int i = 0; i < SIN_COS_BLOCK_SIZE; i++) { + float ref_cos = ref_vco.cos(); + float new_cos = new_vco.cos(); + BOOST_CHECK(std::abs(ref_cos - new_cos) <= SIN_COS_TOLERANCE); - for(int i = 0; i < SIN_COS_BLOCK_SIZE; i++) { - float ref_cos = ref_vco.cos(); - float new_cos = new_vco.cos(); - BOOST_CHECK(std::abs(ref_cos - new_cos) <= SIN_COS_TOLERANCE); + max_error = max_d(max_error, ref_cos - new_cos); - max_error = max_d(max_error, ref_cos-new_cos); + ref_vco.adjust_phase(input[i]); + new_vco.adjust_phase(input[i]); - ref_vco.adjust_phase(input[i]); - new_vco.adjust_phase(input[i]); + BOOST_CHECK(std::abs(ref_vco.get_phase() - new_vco.get_phase()) <= + SIN_COS_TOLERANCE); - BOOST_CHECK(std::abs(ref_vco.get_phase() - new_vco.get_phase()) <= SIN_COS_TOLERANCE); - - max_phase_error = max_d(max_phase_error, ref_vco.get_phase()-new_vco.get_phase()); - } - // printf ("Fxpt max error %.9f, max phase error %.9f\n", max_error, max_phase_error); + max_phase_error = + max_d(max_phase_error, ref_vco.get_phase() - new_vco.get_phase()); + } + // printf ("Fxpt max error %.9f, max phase error %.9f\n", max_error, + // max_phase_error); } -BOOST_AUTO_TEST_CASE(t1) { - gr::vco<float,float> ref_vco; - gr::fxpt_vco new_vco; - float *ref_block = new float[SIN_COS_BLOCK_SIZE]; - float *new_block = new float[SIN_COS_BLOCK_SIZE]; - float *input = new float[SIN_COS_BLOCK_SIZE]; - double max_error = 0; - - for(int i = 0; i < SIN_COS_BLOCK_SIZE; i++) { - input[i] = sin(double(i)); - } - - ref_vco.cos(ref_block, input, SIN_COS_BLOCK_SIZE, SIN_COS_K, SIN_COS_AMPL); - new_vco.cos(new_block, input, SIN_COS_BLOCK_SIZE, SIN_COS_K, SIN_COS_AMPL); - - for(int i = 0; i < SIN_COS_BLOCK_SIZE; i++) { - BOOST_CHECK(std::abs(ref_block[i] - new_block[i]) <= SIN_COS_TOLERANCE); - max_error = max_d(max_error, ref_block[i]-new_block[i]); - } - BOOST_CHECK(std::abs(ref_vco.get_phase() - new_vco.get_phase()) <= SIN_COS_TOLERANCE); - // printf ("Fxpt max error %.9f, max phase error %.9f\n", max_error, ref_vco.get_phase()-new_vco.get_phase()); - delete[] ref_block; - delete[] new_block; - delete[] input; +BOOST_AUTO_TEST_CASE(t1) +{ + gr::vco<float, float> ref_vco; + gr::fxpt_vco new_vco; + float* ref_block = new float[SIN_COS_BLOCK_SIZE]; + float* new_block = new float[SIN_COS_BLOCK_SIZE]; + float* input = new float[SIN_COS_BLOCK_SIZE]; + double max_error = 0; + + for (int i = 0; i < SIN_COS_BLOCK_SIZE; i++) { + input[i] = sin(double(i)); + } + + ref_vco.cos(ref_block, input, SIN_COS_BLOCK_SIZE, SIN_COS_K, SIN_COS_AMPL); + new_vco.cos(new_block, input, SIN_COS_BLOCK_SIZE, SIN_COS_K, SIN_COS_AMPL); + + for (int i = 0; i < SIN_COS_BLOCK_SIZE; i++) { + BOOST_CHECK(std::abs(ref_block[i] - new_block[i]) <= SIN_COS_TOLERANCE); + max_error = max_d(max_error, ref_block[i] - new_block[i]); + } + BOOST_CHECK(std::abs(ref_vco.get_phase() - new_vco.get_phase()) <= SIN_COS_TOLERANCE); + // printf ("Fxpt max error %.9f, max phase error %.9f\n", max_error, + // ref_vco.get_phase()-new_vco.get_phase()); + delete[] ref_block; + delete[] new_block; + delete[] input; } -BOOST_AUTO_TEST_CASE(t2) { - gr::vco<gr_complex,float> ref_vco; - gr::fxpt_vco new_vco; - gr_complex *ref_block = new gr_complex[SIN_COS_BLOCK_SIZE]; - gr_complex *new_block = new gr_complex[SIN_COS_BLOCK_SIZE]; - float *input = new float[SIN_COS_BLOCK_SIZE]; - double max_error = 0; - - for(int i = 0; i < SIN_COS_BLOCK_SIZE; i++) { - input[i] = sin(double(i)); - } - - ref_vco.sincos(ref_block, input, SIN_COS_BLOCK_SIZE, SIN_COS_K, SIN_COS_AMPL); - new_vco.sincos(new_block, input, SIN_COS_BLOCK_SIZE, SIN_COS_K, SIN_COS_AMPL); - - for(int i = 0; i < SIN_COS_BLOCK_SIZE; i++) { - BOOST_CHECK(std::abs(ref_block[i] - new_block[i]) <= SIN_COS_TOLERANCE); - max_error = max_d(max_error, abs(ref_block[i]-new_block[i])); - } - BOOST_CHECK( - std::abs(ref_vco.get_phase() - new_vco.get_phase()) <= SIN_COS_TOLERANCE - ); - // printf ("Fxpt max error %.9f, max phase error %.9f\n", max_error, ref_vco.get_phase()-new_vco.get_phase()); - delete[] ref_block; - delete[] new_block; - delete[] input; +BOOST_AUTO_TEST_CASE(t2) +{ + gr::vco<gr_complex, float> ref_vco; + gr::fxpt_vco new_vco; + gr_complex* ref_block = new gr_complex[SIN_COS_BLOCK_SIZE]; + gr_complex* new_block = new gr_complex[SIN_COS_BLOCK_SIZE]; + float* input = new float[SIN_COS_BLOCK_SIZE]; + double max_error = 0; + + for (int i = 0; i < SIN_COS_BLOCK_SIZE; i++) { + input[i] = sin(double(i)); + } + + ref_vco.sincos(ref_block, input, SIN_COS_BLOCK_SIZE, SIN_COS_K, SIN_COS_AMPL); + new_vco.sincos(new_block, input, SIN_COS_BLOCK_SIZE, SIN_COS_K, SIN_COS_AMPL); + + for (int i = 0; i < SIN_COS_BLOCK_SIZE; i++) { + BOOST_CHECK(std::abs(ref_block[i] - new_block[i]) <= SIN_COS_TOLERANCE); + max_error = max_d(max_error, abs(ref_block[i] - new_block[i])); + } + BOOST_CHECK(std::abs(ref_vco.get_phase() - new_vco.get_phase()) <= SIN_COS_TOLERANCE); + // printf ("Fxpt max error %.9f, max phase error %.9f\n", max_error, + // ref_vco.get_phase()-new_vco.get_phase()); + delete[] ref_block; + delete[] new_block; + delete[] input; } - diff --git a/gnuradio-runtime/lib/math/qa_math.cc b/gnuradio-runtime/lib/math/qa_math.cc index da8322059c..46833286e9 100644 --- a/gnuradio-runtime/lib/math/qa_math.cc +++ b/gnuradio-runtime/lib/math/qa_math.cc @@ -24,76 +24,82 @@ #include <stdio.h> #include <cmath> -BOOST_AUTO_TEST_CASE(test_binary_slicer1) { - float x[5] = {-1, -0.5, 0, 0.5, 1.0}; - unsigned int z[5] = {0, 0, 1, 1, 1}; - unsigned int y; - - //printf("\nBinary\n"); - for(unsigned int i = 0; i < 5; i++) { - y = gr::binary_slicer(x[i]); - //printf("in: %f out: %d desired: %d\n", x[i], y, z[i]); - - BOOST_CHECK_EQUAL(y, z[i]); - } - - //printf("\nBranchless Binary\n"); - for (unsigned int i = 0; i < 5; i++) { - y = gr::branchless_binary_slicer(x[i]); - //printf("in: %f out: %d desired: %d\n", x[i], y, z[i]); - - BOOST_CHECK_EQUAL(y, z[i]); - } +BOOST_AUTO_TEST_CASE(test_binary_slicer1) +{ + float x[5] = { -1, -0.5, 0, 0.5, 1.0 }; + unsigned int z[5] = { 0, 0, 1, 1, 1 }; + unsigned int y; + + // printf("\nBinary\n"); + for (unsigned int i = 0; i < 5; i++) { + y = gr::binary_slicer(x[i]); + // printf("in: %f out: %d desired: %d\n", x[i], y, z[i]); + + BOOST_CHECK_EQUAL(y, z[i]); + } + + // printf("\nBranchless Binary\n"); + for (unsigned int i = 0; i < 5; i++) { + y = gr::branchless_binary_slicer(x[i]); + // printf("in: %f out: %d desired: %d\n", x[i], y, z[i]); + + BOOST_CHECK_EQUAL(y, z[i]); + } } -BOOST_AUTO_TEST_CASE(test_quad_0deg_slicer1) { - gr_complex x[4] = {gr_complex(1, 0), - gr_complex(0, 1), - gr_complex(-1, 0), - gr_complex(0, -1)}; +BOOST_AUTO_TEST_CASE(test_quad_0deg_slicer1) +{ + gr_complex x[4] = { + gr_complex(1, 0), gr_complex(0, 1), gr_complex(-1, 0), gr_complex(0, -1) + }; - unsigned int z[4] = {0, 1, 2, 3}; - unsigned int y; + unsigned int z[4] = { 0, 1, 2, 3 }; + unsigned int y; - //printf("\nQuad0\n"); - for (unsigned int i = 0; i < 4; i++) { - y = gr::quad_0deg_slicer(x[i]); - //printf("in: %.4f+j%.4f out: %d desired: %d\n", x[i].real(), x[i].imag(), y, z[i]); + // printf("\nQuad0\n"); + for (unsigned int i = 0; i < 4; i++) { + y = gr::quad_0deg_slicer(x[i]); + // printf("in: %.4f+j%.4f out: %d desired: %d\n", x[i].real(), x[i].imag(), y, + // z[i]); - BOOST_CHECK_EQUAL(y, z[i]); - } + BOOST_CHECK_EQUAL(y, z[i]); + } - //printf("\nBranchless Quad0\n"); - for (unsigned int i = 0; i < 4; i++) { - y = gr::branchless_quad_0deg_slicer(x[i]); - //printf("in: %.4f+j%.4f out: %d desired: %d\n", x[i].real(), x[i].imag(), y, z[i]); + // printf("\nBranchless Quad0\n"); + for (unsigned int i = 0; i < 4; i++) { + y = gr::branchless_quad_0deg_slicer(x[i]); + // printf("in: %.4f+j%.4f out: %d desired: %d\n", x[i].real(), x[i].imag(), y, + // z[i]); - BOOST_CHECK_EQUAL(y, z[i]); - } + BOOST_CHECK_EQUAL(y, z[i]); + } } -BOOST_AUTO_TEST_CASE(test_quad_45deg_slicer1) { - gr_complex x[4] = {gr_complex(0.707, 0.707), - gr_complex(-0.707, 0.707), - gr_complex(-0.707, -0.707), - gr_complex(0.707, -0.707)}; - - unsigned int z[4] = {0, 1, 2, 3}; - unsigned int y; - - //printf("\nQuad45\n"); - for (unsigned int i = 0; i < 4; i++) { - y = gr::quad_45deg_slicer(x[i]); - //printf("in: %.4f+j%.4f out: %d desired: %d\n", x[i].real(), x[i].imag(), y, z[i]); - - BOOST_CHECK_EQUAL(y, z[i]); - } - - //printf("\nBranchless Quad45\n"); - for (unsigned int i = 0; i < 4; i++) { - y = gr::branchless_quad_45deg_slicer(x[i]); - //printf("in: %.4f+j%.4f out: %d desired: %d\n", x[i].real(), x[i].imag(), y, z[i]); - - BOOST_CHECK_EQUAL(y, z[i]); - } +BOOST_AUTO_TEST_CASE(test_quad_45deg_slicer1) +{ + gr_complex x[4] = { gr_complex(0.707, 0.707), + gr_complex(-0.707, 0.707), + gr_complex(-0.707, -0.707), + gr_complex(0.707, -0.707) }; + + unsigned int z[4] = { 0, 1, 2, 3 }; + unsigned int y; + + // printf("\nQuad45\n"); + for (unsigned int i = 0; i < 4; i++) { + y = gr::quad_45deg_slicer(x[i]); + // printf("in: %.4f+j%.4f out: %d desired: %d\n", x[i].real(), x[i].imag(), y, + // z[i]); + + BOOST_CHECK_EQUAL(y, z[i]); + } + + // printf("\nBranchless Quad45\n"); + for (unsigned int i = 0; i < 4; i++) { + y = gr::branchless_quad_45deg_slicer(x[i]); + // printf("in: %.4f+j%.4f out: %d desired: %d\n", x[i].real(), x[i].imag(), y, + // z[i]); + + BOOST_CHECK_EQUAL(y, z[i]); + } } diff --git a/gnuradio-runtime/lib/math/qa_sincos.cc b/gnuradio-runtime/lib/math/qa_sincos.cc index 4ce81fb4f8..52fbc53d3c 100644 --- a/gnuradio-runtime/lib/math/qa_sincos.cc +++ b/gnuradio-runtime/lib/math/qa_sincos.cc @@ -28,36 +28,38 @@ #include <boost/test/unit_test.hpp> #include <cmath> -BOOST_AUTO_TEST_CASE(t1) { - static const unsigned int N = 1000; - double c_sin, c_cos; - double gr_sin, gr_cos; +BOOST_AUTO_TEST_CASE(t1) +{ + static const unsigned int N = 1000; + double c_sin, c_cos; + double gr_sin, gr_cos; - for(unsigned i = 0; i < N; i++) { - double x = i/100.0; - c_sin = sin(x); - c_cos = cos(x); + for (unsigned i = 0; i < N; i++) { + double x = i / 100.0; + c_sin = sin(x); + c_cos = cos(x); - gr::sincos(x, &gr_sin, &gr_cos); + gr::sincos(x, &gr_sin, &gr_cos); - BOOST_CHECK_CLOSE(c_sin, gr_sin, 0.0001); - BOOST_CHECK_CLOSE(c_cos, gr_cos, 0.0001); - } + BOOST_CHECK_CLOSE(c_sin, gr_sin, 0.0001); + BOOST_CHECK_CLOSE(c_cos, gr_cos, 0.0001); + } } -BOOST_AUTO_TEST_CASE(t2) { - static const unsigned int N = 1000; - float c_sin, c_cos; - float gr_sin, gr_cos; +BOOST_AUTO_TEST_CASE(t2) +{ + static const unsigned int N = 1000; + float c_sin, c_cos; + float gr_sin, gr_cos; - for(unsigned i = 0; i < N; i++) { - float x = i/100.0; - c_sin = sinf(x); - c_cos = cosf(x); + for (unsigned i = 0; i < N; i++) { + float x = i / 100.0; + c_sin = sinf(x); + c_cos = cosf(x); - gr::sincosf(x, &gr_sin, &gr_cos); + gr::sincosf(x, &gr_sin, &gr_cos); - BOOST_CHECK_CLOSE(c_sin, gr_sin, 0.0001); - BOOST_CHECK_CLOSE(c_cos, gr_cos, 0.0001); - } + BOOST_CHECK_CLOSE(c_sin, gr_sin, 0.0001); + BOOST_CHECK_CLOSE(c_cos, gr_cos, 0.0001); + } } diff --git a/gnuradio-runtime/lib/math/random.cc b/gnuradio-runtime/lib/math/random.cc index 6a509f1796..9e30c94399 100644 --- a/gnuradio-runtime/lib/math/random.cc +++ b/gnuradio-runtime/lib/math/random.cc @@ -46,134 +46,124 @@ namespace gr { - random::random(unsigned int seed, int min_integer, int max_integer) - { +random::random(unsigned int seed, int min_integer, int max_integer) +{ d_gauss_stored = false; // set gasdev (gauss distributed numbers) on calculation state // Setup random number generators - d_rng = new boost::mt19937; // random numbers are generated here. - d_uniform = new boost::uniform_real<float>; // map random number to distribution + d_rng = new boost::mt19937; // random numbers are generated here. + d_uniform = new boost::uniform_real<float>; // map random number to distribution d_integer_dis = new boost::uniform_int<>(0, 1); // another "mapper" d_generator = NULL; // MUST be reinstantiated on every call to reseed. - d_integer_generator = NULL; // MUST be reinstantiated on everytime d_rng or d_integer_dis is changed. + d_integer_generator = + NULL; // MUST be reinstantiated on everytime d_rng or d_integer_dis is changed. reseed(seed); // set seed for random number generator set_integer_limits(min_integer, max_integer); - } - - random::~random() - { - delete d_rng; - delete d_uniform; - delete d_integer_dis; - delete d_generator; - delete d_integer_generator; - } - - /* - * Seed is initialized with time if the given seed is 0. Otherwise the seed is taken directly. Sets the seed for the random number generator. - */ - void - random::reseed(unsigned int seed) - { +} + +random::~random() +{ + delete d_rng; + delete d_uniform; + delete d_integer_dis; + delete d_generator; + delete d_integer_generator; +} + +/* + * Seed is initialized with time if the given seed is 0. Otherwise the seed is taken + * directly. Sets the seed for the random number generator. + */ +void random::reseed(unsigned int seed) +{ d_seed = seed; - if (d_seed == 0){ - d_rng->seed(); + if (d_seed == 0) { + d_rng->seed(); } else { - d_rng->seed(d_seed); + d_rng->seed(d_seed); } // reinstantiate generators. Otherwise reseed doesn't take effect. delete d_generator; - d_generator = new boost::variate_generator<boost::mt19937&, boost::uniform_real<float> > (*d_rng,*d_uniform); // create number generator in [0,1) from boost.random + d_generator = + new boost::variate_generator<boost::mt19937&, boost::uniform_real<float>>( + *d_rng, *d_uniform); // create number generator in [0,1) from boost.random delete d_integer_generator; - d_integer_generator = new boost::variate_generator<boost::mt19937&, boost::uniform_int<> >(*d_rng, *d_integer_dis); - } + d_integer_generator = + new boost::variate_generator<boost::mt19937&, boost::uniform_int<>>( + *d_rng, *d_integer_dis); +} - void - random::set_integer_limits(const int minimum, const int maximum){ +void random::set_integer_limits(const int minimum, const int maximum) +{ // boost expects integer limits defined as [minimum, maximum] which is unintuitive. // use the expected half open interval behavior! [minimum, maximum)! delete d_integer_generator; delete d_integer_dis; d_integer_dis = new boost::uniform_int<>(minimum, maximum - 1); - d_integer_generator = new boost::variate_generator<boost::mt19937&, boost::uniform_int<> >(*d_rng, *d_integer_dis); - } - - /*! - * Uniform random integers in the range set by 'set_integer_limits' [min, max). - */ - int - random::ran_int(){ - return (*d_integer_generator)(); - } - - /* - * Returns uniformly distributed numbers in [0,1) taken from boost.random using a Mersenne twister - */ - float - random::ran1() - { - return (*d_generator)(); - } - - /* - * Returns a normally distributed deviate with zero mean and variance 1. - * Used is the Marsaglia polar method. - * Every second call a number is stored because the transformation works only in pairs. Otherwise half calculation is thrown away. - */ - float - random::gasdev() - { - if(d_gauss_stored){ // just return the stored value if available - d_gauss_stored = false; - return d_gauss_value; - } - else{ // generate a pair of gaussian distributed numbers - float x,y,s; - do{ - x = 2.0*ran1()-1.0; - y = 2.0*ran1()-1.0; - s = x*x+y*y; - }while(s >= 1.0f || s == 0.0f); - d_gauss_stored = true; - d_gauss_value = x*sqrtf(-2.0*logf(s)/s); - return y*sqrtf(-2.0*logf(s)/s); - } - } - - float - random::laplacian() - { - float z = ran1(); - if (z > 0.5f){ - return -logf(2.0f * (1.0f - z) ); - } - return logf(2 * z); - } - /* - * Copied from The KC7WW / OH2BNS Channel Simulator - * FIXME Need to check how good this is at some point - */ - // 5 => scratchy, 8 => Geiger - float - random::impulse(float factor = 5) - { + d_integer_generator = + new boost::variate_generator<boost::mt19937&, boost::uniform_int<>>( + *d_rng, *d_integer_dis); +} + +/*! + * Uniform random integers in the range set by 'set_integer_limits' [min, max). + */ +int random::ran_int() { return (*d_integer_generator)(); } + +/* + * Returns uniformly distributed numbers in [0,1) taken from boost.random using a Mersenne + * twister + */ +float random::ran1() { return (*d_generator)(); } + +/* + * Returns a normally distributed deviate with zero mean and variance 1. + * Used is the Marsaglia polar method. + * Every second call a number is stored because the transformation works only in pairs. + * Otherwise half calculation is thrown away. + */ +float random::gasdev() +{ + if (d_gauss_stored) { // just return the stored value if available + d_gauss_stored = false; + return d_gauss_value; + } else { // generate a pair of gaussian distributed numbers + float x, y, s; + do { + x = 2.0 * ran1() - 1.0; + y = 2.0 * ran1() - 1.0; + s = x * x + y * y; + } while (s >= 1.0f || s == 0.0f); + d_gauss_stored = true; + d_gauss_value = x * sqrtf(-2.0 * logf(s) / s); + return y * sqrtf(-2.0 * logf(s) / s); + } +} + +float random::laplacian() +{ + float z = ran1(); + if (z > 0.5f) { + return -logf(2.0f * (1.0f - z)); + } + return logf(2 * z); +} +/* + * Copied from The KC7WW / OH2BNS Channel Simulator + * FIXME Need to check how good this is at some point + */ +// 5 => scratchy, 8 => Geiger +float random::impulse(float factor = 5) +{ float z = -GR_M_SQRT2 * logf(ran1()); - if(fabsf(z) <= factor) - return 0.0; + if (fabsf(z) <= factor) + return 0.0; else - return z; - } - - gr_complex - random::rayleigh_complex() - { - return gr_complex(gasdev(),gasdev()); - } - - float - random::rayleigh() - { - return sqrtf(-2.0 * logf(ran1())); - } + return z; +} + +gr_complex random::rayleigh_complex() { return gr_complex(gasdev(), gasdev()); } + +float random::rayleigh() { return sqrtf(-2.0 * logf(ran1())); } } /* namespace gr */ diff --git a/gnuradio-runtime/lib/math/sincos.cc b/gnuradio-runtime/lib/math/sincos.cc index 49a90d2128..de97fc355e 100644 --- a/gnuradio-runtime/lib/math/sincos.cc +++ b/gnuradio-runtime/lib/math/sincos.cc @@ -25,7 +25,7 @@ #endif #ifndef _GNU_SOURCE -#define _GNU_SOURCE // ask for GNU extensions if available +#define _GNU_SOURCE // ask for GNU extensions if available #endif #include <gnuradio/sincos.h> @@ -33,52 +33,41 @@ namespace gr { -#if defined (HAVE_SINCOS) +#if defined(HAVE_SINCOS) - void - sincos(double x, double *sinx, double *cosx) - { - ::sincos(x, sinx, cosx); - } +void sincos(double x, double* sinx, double* cosx) { ::sincos(x, sinx, cosx); } #else - void - sincos(double x, double *sinx, double *cosx) - { +void sincos(double x, double* sinx, double* cosx) +{ *sinx = ::sin(x); *cosx = ::cos(x); - } +} #endif - // ---------------------------------------------------------------- +// ---------------------------------------------------------------- -#if defined (HAVE_SINCOSF) +#if defined(HAVE_SINCOSF) - void - sincosf(float x, float *sinx, float *cosx) - { - ::sincosf(x, sinx, cosx); - } +void sincosf(float x, float* sinx, float* cosx) { ::sincosf(x, sinx, cosx); } -#elif defined (HAVE_SINF) && defined (HAVE_COSF) +#elif defined(HAVE_SINF) && defined(HAVE_COSF) - void - sincosf(float x, float *sinx, float *cosx) - { +void sincosf(float x, float* sinx, float* cosx) +{ *sinx = ::sinf(x); *cosx = ::cosf(x); - } +} #else - void - sincosf(float x, float *sinx, float *cosx) - { +void sincosf(float x, float* sinx, float* cosx) +{ *sinx = ::sin(x); *cosx = ::cos(x); - } +} #endif diff --git a/gnuradio-runtime/lib/math/sine_table.h b/gnuradio-runtime/lib/math/sine_table.h index 69834943bc..cf6732d78a 100644 --- a/gnuradio-runtime/lib/math/sine_table.h +++ b/gnuradio-runtime/lib/math/sine_table.h @@ -1,1025 +1,1025 @@ - // max_error = 2.353084136763606e-06 - { 2.925817799165007e-09, 7.219194364267018e-09 }, - { 2.925707643778599e-09, 2.526699001579799e-07 }, - { 2.925487337153070e-09, 1.191140162167675e-06 }, - { 2.925156887582842e-09, 3.284585035595589e-06 }, - { 2.924716307509151e-09, 6.994872605695784e-06 }, - { 2.924165613519592e-09, 1.278374920658798e-05 }, - { 2.923504826347475e-09, 2.111280464718590e-05 }, - { 2.922733970871080e-09, 3.244343744537165e-05 }, - { 2.921853076112655e-09, 4.723682007436170e-05 }, - { 2.920862175237416e-09, 6.595386421935634e-05 }, - { 2.919761305552202e-09, 8.905518605213658e-05 }, - { 2.918550508504146e-09, 1.170010715193098e-04 }, - { 2.917229829679050e-09, 1.502514416517192e-04 }, - { 2.915799318799769e-09, 1.892658178912071e-04 }, - { 2.914259029724184e-09, 2.345032874456615e-04 }, - { 2.912609020443340e-09, 2.864224686607020e-04 }, - { 2.910849353079123e-09, 3.454814764261432e-04 }, - { 2.908980093882049e-09, 4.121378876027343e-04 }, - { 2.907001313228646e-09, 4.868487064877691e-04 }, - { 2.904913085618902e-09, 5.700703303049837e-04 }, - { 2.902715489673383e-09, 6.622585147355725e-04 }, - { 2.900408608130373e-09, 7.638683394782519e-04 }, - { 2.897992527842612e-09, 8.753541738578119e-04 }, - { 2.895467339774186e-09, 9.971696424604937e-04 }, - { 2.892833138996999e-09, 1.129767590823255e-03 }, - { 2.890090024687216e-09, 1.273600051161478e-03 }, - { 2.887238100121550e-09, 1.429118208142094e-03 }, - { 2.884277472673313e-09, 1.596772364709564e-03 }, - { 2.881208253808507e-09, 1.777011907950626e-03 }, - { 2.878030559081432e-09, 1.970285275029487e-03 }, - { 2.874744508130554e-09, 2.177039919152579e-03 }, - { 2.871350224673798e-09, 2.397722275614272e-03 }, - { 2.867847836504030e-09, 2.632777727878843e-03 }, - { 2.864237475484149e-09, 2.882650573737405e-03 }, - { 2.860519277542297e-09, 3.147783991507308e-03 }, - { 2.856693382666432e-09, 3.428620006328931e-03 }, - { 2.852759934899389e-09, 3.725599456482154e-03 }, - { 2.848719082333207e-09, 4.039161959812243e-03 }, - { 2.844570977103752e-09, 4.369745880190706e-03 }, - { 2.840315775384800e-09, 4.717788294077374e-03 }, - { 2.835953637382310e-09, 5.083724957128360e-03 }, - { 2.831484727328322e-09, 5.467990270896617e-03 }, - { 2.826909213474759e-09, 5.871017249604038e-03 }, - { 2.822227268087134e-09, 6.293237486988512e-03 }, - { 2.817439067438018e-09, 6.735081123237729e-03 }, - { 2.812544791800534e-09, 7.196976811989608e-03 }, - { 2.807544625441273e-09, 7.679351687456759e-03 }, - { 2.802438756613836e-09, 8.182631331563162e-03 }, - { 2.797227377551135e-09, 8.707239741274575e-03 }, - { 2.791910684458716e-09, 9.253599295902304e-03 }, - { 2.786488877507140e-09, 9.822130724578715e-03 }, - { 2.780962160824228e-09, 1.041325307382490e-02 }, - { 2.775330742487884e-09, 1.102738367513773e-02 }, - { 2.769594834517682e-09, 1.166493811278924e-02 }, - { 2.763754652867477e-09, 1.232633019159818e-02 }, - { 2.757810417416620e-09, 1.301197190494069e-02 }, - { 2.751762351962413e-09, 1.372227340270610e-02 }, - { 2.745610684210923e-09, 1.445764295952962e-02 }, - { 2.739355645769094e-09, 1.521848694296229e-02 }, - { 2.732997472135539e-09, 1.600520978188769e-02 }, - { 2.726536402691907e-09, 1.681821393496225e-02 }, - { 2.719972680693777e-09, 1.765789985920713e-02 }, - { 2.713306553261610e-09, 1.852466597868779e-02 }, - { 2.706538271371373e-09, 1.941890865333146e-02 }, - { 2.699668089844909e-09, 2.034102214787814e-02 }, - { 2.692696267340880e-09, 2.129139860085272e-02 }, - { 2.685623066344263e-09, 2.227042799383416e-02 }, - { 2.678448753157212e-09, 2.327849812064098e-02 }, - { 2.671173597888530e-09, 2.431599455681316e-02 }, - { 2.663797874443630e-09, 2.538330062913108e-02 }, - { 2.656321860514457e-09, 2.648079738524795e-02 }, - { 2.648745837568575e-09, 2.760886356354952e-02 }, - { 2.641070090839117e-09, 2.876787556300114e-02 }, - { 2.633294909313421e-09, 2.995820741329835e-02 }, - { 2.625420585722845e-09, 3.118023074495535e-02 }, - { 2.617447416531143e-09, 3.243431475972608e-02 }, - { 2.609375701923643e-09, 3.372082620101990e-02 }, - { 2.601205745795833e-09, 3.504012932452527e-02 }, - { 2.592937855741933e-09, 3.639258586895711e-02 }, - { 2.584572343043400e-09, 3.777855502693250e-02 }, - { 2.576109522656942e-09, 3.919839341605197e-02 }, - { 2.567549713203028e-09, 4.065245505002102e-02 }, - { 2.558893236953688e-09, 4.214109131001403e-02 }, - { 2.550140419820252e-09, 4.366465091617666e-02 }, - { 2.541291591341445e-09, 4.522347989919473e-02 }, - { 2.532347084670572e-09, 4.681792157215026e-02 }, - { 2.523307236563343e-09, 4.844831650239501e-02 }, - { 2.514172387364900e-09, 5.011500248369893e-02 }, - { 2.504942880997064e-09, 5.181831450849345e-02 }, - { 2.495619064945627e-09, 5.355858474024022e-02 }, - { 2.486201290246928e-09, 5.533614248606705e-02 }, - { 2.476689911475047e-09, 5.715131416942842e-02 }, - { 2.467085286727668e-09, 5.900442330315692e-02 }, - { 2.457387777613798e-09, 6.089579046229943e-02 }, - { 2.447597749239101e-09, 6.282573325755320e-02 }, - { 2.437715570192557e-09, 6.479456630859221e-02 }, - { 2.427741612532542e-09, 6.680260121764925e-02 }, - { 2.417676251773166e-09, 6.885014654319160e-02 }, - { 2.407519866869294e-09, 7.093750777401114e-02 }, - { 2.397272840203310e-09, 7.306498730310884e-02 }, - { 2.386935557569868e-09, 7.523288440214027e-02 }, - { 2.376508408161815e-09, 7.744149519577415e-02 }, - { 2.365991784555363e-09, 7.969111263635709e-02 }, - { 2.355386082695641e-09, 8.198202647865405e-02 }, - { 2.344691701881232e-09, 8.431452325495814e-02 }, - { 2.333909044749407e-09, 8.668888625021409e-02 }, - { 2.323038517261246e-09, 8.910539547731611e-02 }, - { 2.312080528685971e-09, 9.156432765274414e-02 }, - { 2.301035491585642e-09, 9.406595617227698e-02 }, - { 2.289903821799651e-09, 9.661055108691619e-02 }, - { 2.278685938428940e-09, 9.919837907903295e-02 }, - { 2.267382263820762e-09, 1.018297034385580e-01 }, - { 2.255993223551837e-09, 1.045047840397028e-01 }, - { 2.244519246413220e-09, 1.072238773174577e-01 }, - { 2.232960764393620e-09, 1.099872362446146e-01 }, - { 2.221318212663309e-09, 1.127951103088245e-01 }, - { 2.209592029557811e-09, 1.156477454898748e-01 }, - { 2.197782656561395e-09, 1.185453842371912e-01 }, - { 2.185890538290176e-09, 1.214882654476019e-01 }, - { 2.173916122475606e-09, 1.244766244431883e-01 }, - { 2.161859859947797e-09, 1.275106929493488e-01 }, - { 2.149722204618256e-09, 1.305906990731841e-01 }, - { 2.137503613462743e-09, 1.337168672820376e-01 }, - { 2.125204546504321e-09, 1.368894183821595e-01 }, - { 2.112825466795944e-09, 1.401085694976751e-01 }, - { 2.100366840402933e-09, 1.433745340497602e-01 }, - { 2.087829136385612e-09, 1.466875217359607e-01 }, - { 2.075212826781308e-09, 1.500477385098620e-01 }, - { 2.062518386587093e-09, 1.534553865607503e-01 }, - { 2.049746293741359e-09, 1.569106642937665e-01 }, - { 2.036897029106193e-09, 1.604137663100403e-01 }, - { 2.023971076449323e-09, 1.639648833871233e-01 }, - { 2.010968922425217e-09, 1.675642024598467e-01 }, - { 1.997891056557933e-09, 1.712119066008896e-01 }, - { 1.984737971221581e-09, 1.749081750021970e-01 }, - { 1.971510161622434e-09, 1.786531829561379e-01 }, - { 1.958208125780130e-09, 1.824471018371070e-01 }, - { 1.944832364508511e-09, 1.862900990834311e-01 }, - { 1.931383381397782e-09, 1.901823381790926e-01 }, - { 1.917861682794392e-09, 1.941239786363039e-01 }, - { 1.904267777782611e-09, 1.981151759777950e-01 }, - { 1.890602178165317e-09, 2.021560817195309e-01 }, - { 1.876865398444616e-09, 2.062468433536743e-01 }, - { 1.863057955802572e-09, 2.103876043317229e-01 }, - { 1.849180370081465e-09, 2.145785040479915e-01 }, - { 1.835233163764673e-09, 2.188196778231083e-01 }, - { 1.821216861956509e-09, 2.231112568880342e-01 }, - { 1.807131992362945e-09, 2.274533683680190e-01 }, - { 1.792979085271234e-09, 2.318461352671018e-01 }, - { 1.778758673530482e-09, 2.362896764525300e-01 }, - { 1.764471292530943e-09, 2.407841066397789e-01 }, - { 1.750117480184598e-09, 2.453295363773890e-01 }, - { 1.735697776904342e-09, 2.499260720324433e-01 }, - { 1.721212725583874e-09, 2.545738157760434e-01 }, - { 1.706662871577097e-09, 2.592728655691494e-01 }, - { 1.692048762677849e-09, 2.640233151485341e-01 }, - { 1.677370949099090e-09, 2.688252540131204e-01 }, - { 1.662629983452104e-09, 2.736787674105404e-01 }, - { 1.647826420726167e-09, 2.785839363237506e-01 }, - { 1.632960818266680e-09, 2.835408374583758e-01 }, - { 1.618033735755429e-09, 2.885495432295704e-01 }, - { 1.603045735188609e-09, 2.936101217498361e-01 }, - { 1.587997380855918e-09, 2.987226368167127e-01 }, - { 1.572889239319430e-09, 3.038871479007593e-01 }, - { 1.557721879392051e-09, 3.091037101339017e-01 }, - { 1.542495872116447e-09, 3.143723742978435e-01 }, - { 1.527211790743024e-09, 3.196931868130269e-01 }, - { 1.511870210708909e-09, 3.250661897274744e-01 }, - { 1.496471709615926e-09, 3.304914207062036e-01 }, - { 1.481016867208896e-09, 3.359689130207621e-01 }, - { 1.465506265353924e-09, 3.414986955389885e-01 }, - { 1.449940488016384e-09, 3.470807927151147e-01 }, - { 1.434320121238994e-09, 3.527152245800635e-01 }, - { 1.418645753119802e-09, 3.584020067320109e-01 }, - { 1.402917973789838e-09, 3.641411503272979e-01 }, - { 1.387137375391042e-09, 3.699326620714776e-01 }, - { 1.371304552054134e-09, 3.757765442106153e-01 }, - { 1.355420099875958e-09, 3.816727945230153e-01 }, - { 1.339484616897137e-09, 3.876214063110671e-01 }, - { 1.323498703079580e-09, 3.936223683933865e-01 }, - { 1.307462960283922e-09, 3.996756650972121e-01 }, - { 1.291377992246768e-09, 4.057812762511174e-01 }, - { 1.275244404558188e-09, 4.119391771778626e-01 }, - { 1.259062804638585e-09, 4.181493386877248e-01 }, - { 1.242833801715929e-09, 4.244117270719281e-01 }, - { 1.226558006803155e-09, 4.307263040962509e-01 }, - { 1.210236032674760e-09, 4.370930269951803e-01 }, - { 1.193868493843725e-09, 4.435118484661861e-01 }, - { 1.177456006538695e-09, 4.499827166641340e-01 }, - { 1.160999188680582e-09, 4.565055751961679e-01 }, - { 1.144498659859216e-09, 4.630803631168164e-01 }, - { 1.127955041310214e-09, 4.697070149232604e-01 }, - { 1.111368955891417e-09, 4.763854605510119e-01 }, - { 1.094741028059551e-09, 4.831156253697562e-01 }, - { 1.078071883846871e-09, 4.898974301794375e-01 }, - { 1.061362150836978e-09, 4.967307912069362e-01 }, - { 1.044612458142151e-09, 5.036156201023686e-01 }, - { 1.027823436378632e-09, 5.105518239364775e-01 }, - { 1.010995717643647e-09, 5.175393051975563e-01 }, - { 9.941299354913699e-10, 5.245779617890562e-01 }, - { 9.772267249089968e-10, 5.316676870274011e-01 }, - { 9.602867222926046e-10, 5.388083696401416e-01 }, - { 9.433105654240147e-10, 5.459998937639375e-01 }, - { 9.262988934458084e-10, 5.532421389435711e-01 }, - { 9.092523468378193e-10, 5.605349801305876e-01 }, - { 8.921715673928355e-10, 5.678782876825250e-01 }, - { 8.750571981926701e-10, 5.752719273622372e-01 }, - { 8.579098835836508e-10, 5.827157603377209e-01 }, - { 8.407302691522673e-10, 5.902096431821322e-01 }, - { 8.235190017016133e-10, 5.977534278737073e-01 }, - { 8.062767292259225e-10, 6.053469617967722e-01 }, - { 7.890041008871165e-10, 6.129900877421282e-01 }, - { 7.717017669898175e-10, 6.206826439083659e-01 }, - { 7.543703789572603e-10, 6.284244639030392e-01 }, - { 7.370105893063053e-10, 6.362153767444958e-01 }, - { 7.196230516231919e-10, 6.440552068636356e-01 }, - { 7.022084205389746e-10, 6.519437741060674e-01 }, - { 6.847673517046416e-10, 6.598808937346672e-01 }, - { 6.673005017664976e-10, 6.678663764322770e-01 }, - { 6.498085283416530e-10, 6.759000283046127e-01 }, - { 6.322920899929834e-10, 6.839816508836737e-01 }, - { 6.147518462045659e-10, 6.921110411311926e-01 }, - { 5.971884573565851e-10, 7.002879914425926e-01 }, - { 5.796025847007168e-10, 7.085122896509806e-01 }, - { 5.619948903351406e-10, 7.167837190315758e-01 }, - { 5.443660371796048e-10, 7.251020583063744e-01 }, - { 5.267166889504394e-10, 7.334670816491009e-01 }, - { 5.090475101356742e-10, 7.418785586903696e-01 }, - { 4.913591659698399e-10, 7.503362545232619e-01 }, - { 4.736523224091392e-10, 7.588399297089872e-01 }, - { 4.559276461062478e-10, 7.673893402829834e-01 }, - { 4.381858043851147e-10, 7.759842377612828e-01 }, - { 4.204274652161870e-10, 7.846243691469355e-01 }, - { 4.026532971908398e-10, 7.933094769370790e-01 }, - { 3.848639694963359e-10, 8.020392991300200e-01 }, - { 3.670601518910503e-10, 8.108135692324444e-01 }, - { 3.492425146784233e-10, 8.196320162675177e-01 }, - { 3.314117286825031e-10, 8.284943647824689e-01 }, - { 3.135684652223755e-10, 8.374003348569865e-01 }, - { 2.957133960867535e-10, 8.463496421118015e-01 }, - { 2.778471935089361e-10, 8.553419977173513e-01 }, - { 2.599705301412391e-10, 8.643771084029740e-01 }, - { 2.420840790301135e-10, 8.734546764660205e-01 }, - { 2.241885135902046e-10, 8.825743997817682e-01 }, - { 2.062845075795238e-10, 8.917359718130367e-01 }, - { 1.883727350736140e-10, 9.009390816205823e-01 }, - { 1.704538704408269e-10, 9.101834138731877e-01 }, - { 1.525285883160648e-10, 9.194686488588080e-01 }, - { 1.345975635762696e-10, 9.287944624950824e-01 }, - { 1.166614713141648e-10, 9.381605263410157e-01 }, - { 9.872098681369190e-11, 9.475665076080466e-01 }, - { 8.077678552380464e-11, 9.570120691722380e-01 }, - { 6.282954303364090e-11, 9.664968695860140e-01 }, - { 4.487993504668797e-11, 9.760205630906909e-01 }, - { 2.692863735553042e-11, 9.855827996289697e-01 }, - { 8.976325816439114e-12, 9.951832248577780e-01 }, - { -8.976323676304494e-12, 1.004821480161519e+00 }, - { -2.692863521550168e-11, 1.014497202665280e+00 }, - { -4.487993290681805e-11, 1.024210025248670e+00 }, - { -6.282954089398273e-11, 1.033959576559617e+00 }, - { -8.077678338451706e-11, 1.043745481028715e+00 }, - { -9.872098467477489e-11, 1.053567358883467e+00 }, - { -1.166614691757772e-10, 1.063424826163223e+00 }, - { -1.345975614383584e-10, 1.073317494734013e+00 }, - { -1.525285861788948e-10, 1.083244972303963e+00 }, - { -1.704538683042922e-10, 1.093206862438572e+00 }, - { -1.883727329379793e-10, 1.103202764576806e+00 }, - { -2.062845054446831e-10, 1.113232274046796e+00 }, - { -2.241885114563697e-10, 1.123294982082432e+00 }, - { -2.420840768973375e-10, 1.133390475839767e+00 }, - { -2.599705280096278e-10, 1.143518338413855e+00 }, - { -2.778471913784365e-10, 1.153678148855860e+00 }, - { -2.957133939575774e-10, 1.163869482190458e+00 }, - { -3.135684630945758e-10, 1.174091909433296e+00 }, - { -3.314117265561857e-10, 1.184344997608959e+00 }, - { -3.492425125535882e-10, 1.194628309769018e+00 }, - { -3.670601497678034e-10, 1.204941405010466e+00 }, - { -3.848639673748360e-10, 1.215283838494269e+00 }, - { -4.026532950710339e-10, 1.225655161464298e+00 }, - { -4.204274630982869e-10, 1.236054921266445e+00 }, - { -4.381858022691734e-10, 1.246482661367958e+00 }, - { -4.559276439922654e-10, 1.256937921377146e+00 }, - { -4.736523202972214e-10, 1.267420237063216e+00 }, - { -4.913591638600925e-10, 1.277929140376502e+00 }, - { -5.090475080282032e-10, 1.288464159468706e+00 }, - { -5.267166868452449e-10, 1.299024818713528e+00 }, - { -5.443660350768455e-10, 1.309610638727845e+00 }, - { -5.619948882348695e-10, 1.320221136392390e+00 }, - { -5.796025826029868e-10, 1.330855824873457e+00 }, - { -5.971884552615020e-10, 1.341514213644420e+00 }, - { -6.147518441122357e-10, 1.352195808507556e+00 }, - { -6.322920879034590e-10, 1.362900111616144e+00 }, - { -6.498085262549874e-10, 1.373626621496939e+00 }, - { -6.673004996827436e-10, 1.384374833072571e+00 }, - { -6.847673496239581e-10, 1.395144237684605e+00 }, - { -7.022084184613616e-10, 1.405934323116231e+00 }, - { -7.196230495488082e-10, 1.416744573616104e+00 }, - { -7.370105872352039e-10, 1.427574469921397e+00 }, - { -7.543703768894941e-10, 1.438423489281758e+00 }, - { -7.717017649255453e-10, 1.449291105483472e+00 }, - { -7.890040988262324e-10, 1.460176788873383e+00 }, - { -8.062767271686383e-10, 1.471080006383765e+00 }, - { -8.235189996479819e-10, 1.482000221556656e+00 }, - { -8.407302671024475e-10, 1.492936894569018e+00 }, - { -8.579098815375368e-10, 1.503889482257845e+00 }, - { -8.750571961505266e-10, 1.514857438145604e+00 }, - { -8.921715653546624e-10, 1.525840212465756e+00 }, - { -9.092523448036167e-10, 1.536837252188703e+00 }, - { -9.262988914157881e-10, 1.547848001047890e+00 }, - { -9.433105633981766e-10, 1.558871899565883e+00 }, - { -9.602867202711075e-10, 1.569908385081254e+00 }, - { -9.772267228916820e-10, 1.580956891774897e+00 }, - { -9.941299334786078e-10, 1.592016850697478e+00 }, - { -1.010995715635332e-09, 1.603087689796053e+00 }, - { -1.027823434374870e-09, 1.614168833942028e+00 }, - { -1.044612456143047e-09, 1.625259704958335e+00 }, - { -1.061362148842745e-09, 1.636359721647526e+00 }, - { -1.078071881857297e-09, 1.647468299819543e+00 }, - { -1.094741026074900e-09, 1.658584852320419e+00 }, - { -1.111368953911690e-09, 1.669708789060341e+00 }, - { -1.127955039335462e-09, 1.680839517042381e+00 }, - { -1.144498657889600e-09, 1.691976440391624e+00 }, - { -1.160999186716154e-09, 1.703118960383971e+00 }, - { -1.177456004579561e-09, 1.714266475475616e+00 }, - { -1.193868491889832e-09, 1.725418381332405e+00 }, - { -1.210236030726319e-09, 1.736574070859850e+00 }, - { -1.226558004860220e-09, 1.747732934232508e+00 }, - { -1.242833799778447e-09, 1.758894358924547e+00 }, - { -1.259062802706714e-09, 1.770057729740021e+00 }, - { -1.275244402631982e-09, 1.781222428842935e+00 }, - { -1.291377990326492e-09, 1.792387835788660e+00 }, - { -1.307462958369363e-09, 1.803553327553897e+00 }, - { -1.323498701170897e-09, 1.814718278568759e+00 }, - { -1.339484614994490e-09, 1.825882060747428e+00 }, - { -1.355420097979292e-09, 1.837044043519582e+00 }, - { -1.371304550163662e-09, 1.848203593862598e+00 }, - { -1.387137373506711e-09, 1.859360076332671e+00 }, - { -1.402917971911754e-09, 1.870512853097495e+00 }, - { -1.418645751248018e-09, 1.881661283967967e+00 }, - { -1.434320119373722e-09, 1.892804726431080e+00 }, - { -1.449940486157623e-09, 1.903942535681972e+00 }, - { -1.465506263501516e-09, 1.915074064656886e+00 }, - { -1.481016865363264e-09, 1.926198664066737e+00 }, - { -1.496471707776859e-09, 1.937315682428795e+00 }, - { -1.511870208876724e-09, 1.948424466101625e+00 }, - { -1.527211788917509e-09, 1.959524359317042e+00 }, - { -1.542495870297867e-09, 1.970614704215133e+00 }, - { -1.557721877580406e-09, 1.981694840876775e+00 }, - { -1.572889237514880e-09, 1.992764107358707e+00 }, - { -1.587997379058514e-09, 2.003821839726753e+00 }, - { -1.603045733398246e-09, 2.014867372090665e+00 }, - { -1.618033733972424e-09, 2.025900036638798e+00 }, - { -1.632960816490822e-09, 2.036919163671778e+00 }, - { -1.647826418957721e-09, 2.047924081638631e+00 }, - { -1.662629981691070e-09, 2.058914117170269e+00 }, - { -1.677370947345626e-09, 2.069888595116115e+00 }, - { -1.692048760931849e-09, 2.080846838577820e+00 }, - { -1.706662869838827e-09, 2.091788168946183e+00 }, - { -1.721212723853279e-09, 2.102711905935372e+00 }, - { -1.735697775181424e-09, 2.113617367619504e+00 }, - { -1.750117478469621e-09, 2.124503870468520e+00 }, - { -1.764471290823748e-09, 2.135370729383332e+00 }, - { -1.778758671831281e-09, 2.146217257733207e+00 }, - { -1.792979083579974e-09, 2.157042767390815e+00 }, - { -1.807131990679890e-09, 2.167846568770014e+00 }, - { -1.821216860281448e-09, 2.178627970860822e+00 }, - { -1.835233162097977e-09, 2.189386281268046e+00 }, - { -1.849180368423027e-09, 2.200120806246095e+00 }, - { -1.863057954152340e-09, 2.210830850737588e+00 }, - { -1.876865396802907e-09, 2.221515718409926e+00 }, - { -1.890602176531920e-09, 2.232174711691990e+00 }, - { -1.904267776157843e-09, 2.242807131812679e+00 }, - { -1.917861681178094e-09, 2.253412278837029e+00 }, - { -1.931383379790273e-09, 2.263989451705295e+00 }, - { -1.944832362909578e-09, 2.274537948269257e+00 }, - { -1.958208124189984e-09, 2.285057065331676e+00 }, - { -1.971510160041235e-09, 2.295546098682665e+00 }, - { -1.984737969649064e-09, 2.306004343138794e+00 }, - { -1.997891054994522e-09, 2.316431092581699e+00 }, - { -2.010968920870647e-09, 2.326825639994779e+00 }, - { -2.023971074903858e-09, 2.337187277503834e+00 }, - { -2.036897027569834e-09, 2.347515296413520e+00 }, - { -2.049746292214264e-09, 2.357808987247877e+00 }, - { -2.062518385069210e-09, 2.368067639787542e+00 }, - { -2.075212825272584e-09, 2.378290543109652e+00 }, - { -2.087829134886364e-09, 2.388476985626922e+00 }, - { -2.100366838912949e-09, 2.398626255125417e+00 }, - { -2.112825465315542e-09, 2.408737638805759e+00 }, - { -2.125204545033289e-09, 2.418810423320288e+00 }, - { -2.137503612001452e-09, 2.428843894814472e+00 }, - { -2.149722203166389e-09, 2.438837338964302e+00 }, - { -2.161859858505829e-09, 2.448790041018174e+00 }, - { -2.173916121043380e-09, 2.458701285834241e+00 }, - { -2.185890536867478e-09, 2.468570357921585e+00 }, - { -2.197782655148702e-09, 2.478396541480230e+00 }, - { -2.209592028154913e-09, 2.488179120439544e+00 }, - { -2.221318211270522e-09, 2.497917378500214e+00 }, - { -2.232960763010574e-09, 2.507610599172123e+00 }, - { -2.244519245040444e-09, 2.517258065817044e+00 }, - { -2.255993222189014e-09, 2.526859061686102e+00 }, - { -2.267382262468209e-09, 2.536412869962689e+00 }, - { -2.278685937086658e-09, 2.545918773800664e+00 }, - { -2.289903820467374e-09, 2.555376056366064e+00 }, - { -2.301035490263848e-09, 2.564784000877677e+00 }, - { -2.312080527374447e-09, 2.574141890646339e+00 }, - { -2.323038515960257e-09, 2.583449009117307e+00 }, - { -2.333909043458635e-09, 2.592704639909166e+00 }, - { -2.344691700601153e-09, 2.601908066856634e+00 }, - { -2.355386081425938e-09, 2.611058574048749e+00 }, - { -2.365991783296513e-09, 2.620155445872768e+00 }, - { -2.376508406913500e-09, 2.629197967052127e+00 }, - { -2.386935556332088e-09, 2.638185422689490e+00 }, - { -2.397272838976436e-09, 2.647117098307332e+00 }, - { -2.407519865653114e-09, 2.655992279887846e+00 }, - { -2.417676250567891e-09, 2.664810253915885e+00 }, - { -2.427741611338014e-09, 2.673570307418169e+00 }, - { -2.437715569009093e-09, 2.682271728006635e+00 }, - { -2.447597748066437e-09, 2.690913803917100e+00 }, - { -2.457387776452357e-09, 2.699495824053297e+00 }, - { -2.467085285577292e-09, 2.708017078025636e+00 }, - { -2.476689910335470e-09, 2.716476856194105e+00 }, - { -2.486201289118733e-09, 2.724874449709689e+00 }, - { -2.495619063828443e-09, 2.733209150554255e+00 }, - { -2.504942879891263e-09, 2.741480251583985e+00 }, - { -2.514172386270163e-09, 2.749687046568741e+00 }, - { -2.523307235480146e-09, 2.757828830235740e+00 }, - { -2.532347083598520e-09, 2.765904898308531e+00 }, - { -2.541291590280960e-09, 2.773914547551261e+00 }, - { -2.550140418771202e-09, 2.781857075807392e+00 }, - { -2.558893235915887e-09, 2.789731782043156e+00 }, - { -2.567549712176927e-09, 2.797537966388929e+00 }, - { -2.576109521642196e-09, 2.805274930179221e+00 }, - { -2.584572342040407e-09, 2.812941975996573e+00 }, - { -2.592937854750428e-09, 2.820538407710556e+00 }, - { -2.601205744816134e-09, 2.828063530521908e+00 }, - { -2.609375700955458e-09, 2.835516651001539e+00 }, - { -2.617447415574869e-09, 2.842897077134583e+00 }, - { -2.625420584778350e-09, 2.850204118359573e+00 }, - { -2.633294908380520e-09, 2.857437085611509e+00 }, - { -2.641070089918234e-09, 2.864595291363663e+00 }, - { -2.648745836659391e-09, 2.871678049666939e+00 }, - { -2.656321859617343e-09, 2.878684676194483e+00 }, - { -2.663797873558322e-09, 2.885614488280000e+00 }, - { -2.671173597015318e-09, 2.892466804962122e+00 }, - { -2.678448752295859e-09, 2.899240947023252e+00 }, - { -2.685623065495139e-09, 2.905936237033475e+00 }, - { -2.692696266503800e-09, 2.912551999389617e+00 }, - { -2.699668089019767e-09, 2.919087560358171e+00 }, - { -2.706538270558513e-09, 2.925542248116882e+00 }, - { -2.713306552460767e-09, 2.931915392794031e+00 }, - { -2.719972679905295e-09, 2.938206326512581e+00 }, - { -2.726536401915442e-09, 2.944414383428562e+00 }, - { -2.732997471371516e-09, 2.950538899775061e+00 }, - { -2.739355645017194e-09, 2.956579213900666e+00 }, - { -2.745610683471516e-09, 2.962534666313284e+00 }, - { -2.751762351235315e-09, 2.968404599718795e+00 }, - { -2.757810416701751e-09, 2.974188359063684e+00 }, - { -2.763754652165128e-09, 2.979885291576143e+00 }, - { -2.769594833827588e-09, 2.985494746805227e+00 }, - { -2.775330741810390e-09, 2.991016076664491e+00 }, - { -2.780962160159068e-09, 2.996448635469842e+00 }, - { -2.786488876854607e-09, 3.001791779983262e+00 }, - { -2.791910683818570e-09, 3.007044869450794e+00 }, - { -2.797227376923695e-09, 3.012207265645876e+00 }, - { -2.802438755998943e-09, 3.017278332907412e+00 }, - { -2.807544624838820e-09, 3.022257438182037e+00 }, - { -2.812544791210840e-09, 3.027143951064684e+00 }, - { -2.817439066860792e-09, 3.031937243837070e+00 }, - { -2.822227267522746e-09, 3.036636691510884e+00 }, - { -2.826909212922864e-09, 3.041241671864994e+00 }, - { -2.831484726789317e-09, 3.045751565488710e+00 }, - { -2.835953636855826e-09, 3.050165755818853e+00 }, - { -2.840315774871260e-09, 3.054483629182857e+00 }, - { -2.844570976602957e-09, 3.058704574835744e+00 }, - { -2.848719081844986e-09, 3.062827985002047e+00 }, - { -2.852759934424164e-09, 3.066853254915581e+00 }, - { -2.856693382203833e-09, 3.070779782857041e+00 }, - { -2.860519277092708e-09, 3.074606970196721e+00 }, - { -2.864237475047239e-09, 3.078334221430809e+00 }, - { -2.867847836080156e-09, 3.081960944223928e+00 }, - { -2.871350224262603e-09, 3.085486549445314e+00 }, - { -2.874744507732462e-09, 3.088910451211251e+00 }, - { -2.878030558696270e-09, 3.092232066921130e+00 }, - { -2.881208253436038e-09, 3.095450817298478e+00 }, - { -2.884277472313999e-09, 3.098566126429974e+00 }, - { -2.887238099774968e-09, 3.101577421802070e+00 }, - { -2.890090024353816e-09, 3.104484134342861e+00 }, - { -2.892833138676371e-09, 3.107285698457308e+00 }, - { -2.895467339466766e-09, 3.109981552069083e+00 }, - { -2.897992527547963e-09, 3.112571136655481e+00 }, - { -2.900408607848946e-09, 3.115053897289195e+00 }, - { -2.902715489404992e-09, 3.117429282673042e+00 }, - { -2.904913085363323e-09, 3.119696745180238e+00 }, - { -2.907001312986328e-09, 3.121855740892224e+00 }, - { -2.908980093652563e-09, 3.123905729634218e+00 }, - { -2.910849352862924e-09, 3.125846175016163e+00 }, - { -2.912609020239985e-09, 3.127676544466606e+00 }, - { -2.914259029534118e-09, 3.129396309273659e+00 }, - { -2.915799318622574e-09, 3.131004944618667e+00 }, - { -2.917229829515169e-09, 3.132501929616775e+00 }, - { -2.918550508353347e-09, 3.133886747350606e+00 }, - { -2.919761305414294e-09, 3.135158884909254e+00 }, - { -2.920862175112829e-09, 3.136317833424958e+00 }, - { -2.921853076000972e-09, 3.137363088107359e+00 }, - { -2.922733970772719e-09, 3.138294148283254e+00 }, - { -2.923504826262027e-09, 3.139110517429204e+00 }, - { -2.924165613447473e-09, 3.139811703211207e+00 }, - { -2.924716307449950e-09, 3.140397217517018e+00 }, - { -2.925156887536978e-09, 3.140866576495489e+00 }, - { -2.925487337120335e-09, 3.141219300588825e+00 }, - { -2.925707643758784e-09, 3.141454914570261e+00 }, - { -2.925817799158535e-09, 3.141572947579352e+00 }, - { -2.925817799171455e-09, 3.141572933154836e+00 }, - { -2.925707643798390e-09, 3.141454409272987e+00 }, - { -2.925487337185779e-09, 3.141216918378770e+00 }, - { -2.925156887628892e-09, 3.140860007424112e+00 }, - { -2.924716307568119e-09, 3.140383227898687e+00 }, - { -2.924165613591896e-09, 3.139786135867868e+00 }, - { -2.923504826432903e-09, 3.139068292003385e+00 }, - { -2.922733970969412e-09, 3.138229261619561e+00 }, - { -2.921853076224321e-09, 3.137268614707029e+00 }, - { -2.920862175361976e-09, 3.136185925964038e+00 }, - { -2.919761305690083e-09, 3.134980774833275e+00 }, - { -2.918550508654911e-09, 3.133652745531368e+00 }, - { -2.917229829843137e-09, 3.132201427085629e+00 }, - { -2.915799318976726e-09, 3.130626413363146e+00 }, - { -2.914259029914435e-09, 3.128927303107136e+00 }, - { -2.912609020646661e-09, 3.127103699965947e+00 }, - { -2.910849353295315e-09, 3.125155212527586e+00 }, - { -2.908980094111509e-09, 3.123081454351802e+00 }, - { -2.907001313470937e-09, 3.120882043999591e+00 }, - { -2.904913085874448e-09, 3.118556605068443e+00 }, - { -2.902715489941767e-09, 3.116104766219928e+00 }, - { -2.900408608411958e-09, 3.113526161214776e+00 }, - { -2.897992528137022e-09, 3.110820428940251e+00 }, - { -2.895467340081818e-09, 3.107987213444579e+00 }, - { -2.892833139317615e-09, 3.105026163964191e+00 }, - { -2.890090025020589e-09, 3.101936934956479e+00 }, - { -2.887238100468092e-09, 3.098719186130021e+00 }, - { -2.884277473032614e-09, 3.095372582472161e+00 }, - { -2.881208254180937e-09, 3.091896794282404e+00 }, - { -2.878030559466594e-09, 3.088291497198199e+00 }, - { -2.874744508528832e-09, 3.084556372228054e+00 }, - { -2.871350225084755e-09, 3.080691105776848e+00 }, - { -2.867847836928063e-09, 3.076695389678615e+00 }, - { -2.864237475921086e-09, 3.072568921221621e+00 }, - { -2.860519277991847e-09, 3.068311403179147e+00 }, - { -2.856693383129018e-09, 3.063922543837792e+00 }, - { -2.852759935374575e-09, 3.059402057023109e+00 }, - { -2.848719082821403e-09, 3.054749662130841e+00 }, - { -2.844570977604520e-09, 3.049965084150782e+00 }, - { -2.840315775898525e-09, 3.045048053697736e+00 }, - { -2.835953637908582e-09, 3.039998307034967e+00 }, - { -2.831484727867511e-09, 3.034815586104635e+00 }, - { -2.826909214026628e-09, 3.029499638550941e+00 }, - { -2.822227268651470e-09, 3.024050217748861e+00 }, - { -2.817439068015245e-09, 3.018467082830179e+00 }, - { -2.812544792390175e-09, 3.012749998707001e+00 }, - { -2.807544626043751e-09, 3.006898736100911e+00 }, - { -2.802438757228650e-09, 3.000913071564665e+00 }, - { -2.797227378178760e-09, 2.994792787510961e+00 }, - { -2.791910685098702e-09, 2.988537672233504e+00 }, - { -2.786488878159805e-09, 2.982147519935565e+00 }, - { -2.780962161489413e-09, 2.975622130750641e+00 }, - { -2.775330743165298e-09, 2.968961310769028e+00 }, - { -2.769594835207775e-09, 2.962164872061613e+00 }, - { -2.763754653569747e-09, 2.955232632701135e+00 }, - { -2.757810418131543e-09, 2.948164416789036e+00 }, - { -2.751762352689432e-09, 2.940960054474719e+00 }, - { -2.745610684950541e-09, 2.933619381982341e+00 }, - { -2.739355646520809e-09, 2.926142241629213e+00 }, - { -2.732997472899722e-09, 2.918528481852205e+00 }, - { -2.726536403468318e-09, 2.910777957226018e+00 }, - { -2.719972681482232e-09, 2.902890528487386e+00 }, - { -2.713306554062453e-09, 2.894866062556452e+00 }, - { -2.706538272184154e-09, 2.886704432555728e+00 }, - { -2.699668090670078e-09, 2.878405517834426e+00 }, - { -2.692696268177908e-09, 2.869969203985464e+00 }, - { -2.685623067193599e-09, 2.861395382869544e+00 }, - { -2.678448754018380e-09, 2.852683952631486e+00 }, - { -2.671173598761847e-09, 2.843834817723832e+00 }, - { -2.663797875328991e-09, 2.834847888922988e+00 }, - { -2.656321861411517e-09, 2.825723083350459e+00 }, - { -2.648745838477759e-09, 2.816460324492298e+00 }, - { -2.641070091759922e-09, 2.807059542215146e+00 }, - { -2.633294910246296e-09, 2.797520672788269e+00 }, - { -2.625420586667340e-09, 2.787843658897949e+00 }, - { -2.617447417487602e-09, 2.778028449668942e+00 }, - { -2.609375702891616e-09, 2.768075000678399e+00 }, - { -2.601205746775692e-09, 2.757983273976943e+00 }, - { -2.592937856733464e-09, 2.747753238101915e+00 }, - { -2.584572344046340e-09, 2.737384868096553e+00 }, - { -2.576109523671634e-09, 2.726878145526201e+00 }, - { -2.567549714229129e-09, 2.716233058492422e+00 }, - { -2.558893237991435e-09, 2.705449601651722e+00 }, - { -2.550140420869302e-09, 2.694527776227857e+00 }, - { -2.541291592402089e-09, 2.683467590030445e+00 }, - { -2.532347085742440e-09, 2.672269057466213e+00 }, - { -2.523307237646751e-09, 2.660932199557362e+00 }, - { -2.514172388459584e-09, 2.649457043952206e+00 }, - { -2.504942882102813e-09, 2.637843624941622e+00 }, - { -2.495619066062810e-09, 2.626091983472908e+00 }, - { -2.486201291375123e-09, 2.614202167160335e+00 }, - { -2.476689912614465e-09, 2.602174230302269e+00 }, - { -2.467085287878098e-09, 2.590008233889805e+00 }, - { -2.457387778775451e-09, 2.577704245623143e+00 }, - { -2.447597750411553e-09, 2.565262339920002e+00 }, - { -2.437715571376127e-09, 2.552682597931055e+00 }, - { -2.427741613727123e-09, 2.539965107548168e+00 }, - { -2.417676252978335e-09, 2.527109963417675e+00 }, - { -2.407519868085581e-09, 2.514117266951687e+00 }, - { -2.397272841430131e-09, 2.500987126335739e+00 }, - { -2.386935558807595e-09, 2.487719656543254e+00 }, - { -2.376508409410024e-09, 2.474314979341178e+00 }, - { -2.365991785814531e-09, 2.460773223303822e+00 }, - { -2.355386083965131e-09, 2.447094523817833e+00 }, - { -2.344691703161363e-09, 2.433279023095734e+00 }, - { -2.333909046040126e-09, 2.419326870180582e+00 }, - { -2.323038518562289e-09, 2.405238220956597e+00 }, - { -2.312080529997549e-09, 2.391013238157397e+00 }, - { -2.301035492907384e-09, 2.376652091371587e+00 }, - { -2.289903823131822e-09, 2.362154957053137e+00 }, - { -2.278685939771276e-09, 2.347522018525197e+00 }, - { -2.267382265173420e-09, 2.332753465990296e+00 }, - { -2.255993224914501e-09, 2.317849496533128e+00 }, - { -2.244519247786155e-09, 2.302810314130351e+00 }, - { -2.232960765776561e-09, 2.287636129652823e+00 }, - { -2.221318214056095e-09, 2.272327160873552e+00 }, - { -2.209592030960763e-09, 2.256883632472565e+00 }, - { -2.197782657974034e-09, 2.241305776039511e+00 }, - { -2.185890539712767e-09, 2.225593830081461e+00 }, - { -2.173916123907886e-09, 2.209748040023618e+00 }, - { -2.161859861389976e-09, 2.193768658216360e+00 }, - { -2.149722206070124e-09, 2.177655943935795e+00 }, - { -2.137503614923981e-09, 2.161410163388424e+00 }, - { -2.125204547975352e-09, 2.145031589714984e+00 }, - { -2.112825468276292e-09, 2.128520502989477e+00 }, - { -2.100366841892917e-09, 2.111877190225612e+00 }, - { -2.087829137884807e-09, 2.095101945374541e+00 }, - { -2.075212828290086e-09, 2.078195069329960e+00 }, - { -2.062518388104923e-09, 2.061156869925600e+00 }, - { -2.049746295268559e-09, 2.043987661939897e+00 }, - { -2.036897030642658e-09, 2.026687767092888e+00 }, - { -2.023971077994576e-09, 2.009257514048162e+00 }, - { -2.010968923979840e-09, 1.991697238413571e+00 }, - { -1.997891058121344e-09, 1.974007282737320e+00 }, - { -1.984737972794098e-09, 1.956187996511354e+00 }, - { -1.971510163203686e-09, 1.938239736166060e+00 }, - { -1.958208127370276e-09, 1.920162865072273e+00 }, - { -1.944832366107339e-09, 1.901957753535934e+00 }, - { -1.931383383005451e-09, 1.883624778799427e+00 }, - { -1.917861684410531e-09, 1.865164325035177e+00 }, - { -1.904267779407432e-09, 1.846576783346324e+00 }, - { -1.890602179798714e-09, 1.827862551760622e+00 }, - { -1.876865400086483e-09, 1.809022035228338e+00 }, - { -1.863057957452539e-09, 1.790055645617624e+00 }, - { -1.849180371740008e-09, 1.770963801711725e+00 }, - { -1.835233165431475e-09, 1.751746929201178e+00 }, - { -1.821216863631569e-09, 1.732405460681919e+00 }, - { -1.807131994045840e-09, 1.712939835648088e+00 }, - { -1.792979086962494e-09, 1.693350500488565e+00 }, - { -1.778758675229683e-09, 1.673637908477153e+00 }, - { -1.764471294238191e-09, 1.653802519770021e+00 }, - { -1.750117481899733e-09, 1.633844801396848e+00 }, - { -1.735697778626995e-09, 1.613765227254186e+00 }, - { -1.721212727314574e-09, 1.593564278099856e+00 }, - { -1.706662873315474e-09, 1.573242441540939e+00 }, - { -1.692048764423848e-09, 1.552800212030258e+00 }, - { -1.677370950852395e-09, 1.532238090855187e+00 }, - { -1.662629985213192e-09, 1.511556586131055e+00 }, - { -1.647826422494560e-09, 1.490756212788764e+00 }, - { -1.632960820042537e-09, 1.469837492568651e+00 }, - { -1.618033737538645e-09, 1.448800954008929e+00 }, - { -1.603045736978760e-09, 1.427647132435469e+00 }, - { -1.587997382653428e-09, 1.406376569953373e+00 }, - { -1.572889241124034e-09, 1.384989815432507e+00 }, - { -1.557721881203696e-09, 1.363487424499449e+00 }, - { -1.542495873934815e-09, 1.341869959524515e+00 }, - { -1.527211792568486e-09, 1.320137989611176e+00 }, - { -1.511870212541253e-09, 1.298292090581491e+00 }, - { -1.496471711454994e-09, 1.276332844965754e+00 }, - { -1.481016869054634e-09, 1.254260841988828e+00 }, - { -1.465506267206068e-09, 1.232076677556547e+00 }, - { -1.449940489875303e-09, 1.209780954243628e+00 }, - { -1.434320123104372e-09, 1.187374281276747e+00 }, - { -1.418645754991533e-09, 1.164857274523495e+00 }, - { -1.402917975667710e-09, 1.142230556475749e+00 }, - { -1.387137377275425e-09, 1.119494756236361e+00 }, - { -1.371304553944712e-09, 1.096650509501278e+00 }, - { -1.355420101772623e-09, 1.073698458546610e+00 }, - { -1.339484618799891e-09, 1.050639252211352e+00 }, - { -1.323498704988051e-09, 1.027473545880543e+00 }, - { -1.307462962198534e-09, 1.004202001471034e+00 }, - { -1.291377994167204e-09, 9.808252874104182e-01 }, - { -1.275244406484394e-09, 9.573440786237052e-01 }, - { -1.259062806570190e-09, 9.337590565128454e-01 }, - { -1.242833803653464e-09, 9.100709089414796e-01 }, - { -1.226558008746195e-09, 8.862803302125812e-01 }, - { -1.210236034623253e-09, 8.623880210538113e-01 }, - { -1.193868495797618e-09, 8.383946885959868e-01 }, - { -1.177456008497777e-09, 8.143010463544786e-01 }, - { -1.160999190645010e-09, 7.901078142102129e-01 }, - { -1.144498661828833e-09, 7.658157183877095e-01 }, - { -1.127955043284965e-09, 7.414254914366063e-01 }, - { -1.111368957870986e-09, 7.169378722095157e-01 }, - { -1.094741030044308e-09, 6.923536058430697e-01 }, - { -1.078071885836393e-09, 6.676734437331688e-01 }, - { -1.061362152831423e-09, 6.428981435165511e-01 }, - { -1.044612460141255e-09, 6.180284690466404e-01 }, - { -1.027823438382183e-09, 5.930651903718045e-01 }, - { -1.010995719652015e-09, 5.680090837138436e-01 }, - { -9.941299375042378e-10, 5.428609314418970e-01 }, - { -9.772267269262058e-10, 5.176215220520872e-01 }, - { -9.602867243141016e-10, 4.922916501421032e-01 }, - { -9.433105674499058e-10, 4.668721163885412e-01 }, - { -9.262988954758817e-10, 4.413637275202624e-01 }, - { -9.092523488719689e-10, 4.157672962958654e-01 }, - { -8.921715694311144e-10, 3.900836414778084e-01 }, - { -8.750572002347607e-10, 3.643135878065193e-01 }, - { -8.579098856296589e-10, 3.384579659762392e-01 }, - { -8.407302712022458e-10, 3.125176126069478e-01 }, - { -8.235190037551917e-10, 2.864933702193017e-01 }, - { -8.062767312831008e-10, 2.603860872080448e-01 }, - { -7.890041029479477e-10, 2.341966178147619e-01 }, - { -7.717017690542486e-10, 2.079258220999725e-01 }, - { -7.543703810250266e-10, 1.815745659161734e-01 }, - { -7.370105913774597e-10, 1.551437208801425e-01 }, - { -7.196230536974697e-10, 1.286341643433767e-01 }, - { -7.022084226165876e-10, 1.020467793657360e-01 }, - { -6.847673537853251e-10, 7.538245468350446e-02 }, - { -6.673005038502516e-10, 4.864208468284503e-02 }, - { -6.498085304282128e-10, 2.182656936863137e-02 }, - { -6.322920920826137e-10, -5.063185663820913e-03 }, - { -6.147518482969490e-10, -3.202626926150343e-02 }, - { -5.971884594516681e-10, -5.906176474160862e-02 }, - { -5.796025867984469e-10, -8.616874992366363e-02 }, - { -5.619948924353588e-10, -1.133462971605448e-01 }, - { -5.443660392823640e-10, -1.405934733692621e-01 }, - { -5.267166910556339e-10, -1.679093400638023e-01 }, - { -5.090475122431451e-10, -1.952929533862739e-01 }, - { -4.913591680795342e-10, -2.227433641394564e-01 }, - { -4.736523245210571e-10, -2.502596178194491e-01 }, - { -4.559276482202303e-10, -2.778407546490776e-01 }, - { -4.381858065011618e-10, -3.054858096104932e-01 }, - { -4.204274673340870e-10, -3.331938124792702e-01 }, - { -4.026532993105397e-10, -3.609637878577768e-01 }, - { -3.848639716178888e-10, -3.887947552098022e-01 }, - { -3.670601540142443e-10, -4.166857288948674e-01 }, - { -3.492425168032583e-10, -4.446357182029681e-01 }, - { -3.314117308088734e-10, -4.726437273896633e-01 }, - { -3.135684673501752e-10, -5.007087557112619e-01 }, - { -2.957133982159296e-10, -5.288297974607742e-01 }, - { -2.778471956393828e-10, -5.570058420037128e-01 }, - { -2.599705322729564e-10, -5.852358738143247e-01 }, - { -2.420840811628366e-10, -6.135188725122560e-01 }, - { -2.241885157240923e-10, -6.418538128986450e-01 }, - { -2.062845097142585e-10, -6.702396649949099e-01 }, - { -1.883727372093546e-10, -6.986753940779493e-01 }, - { -1.704538725773087e-10, -7.271599607197149e-01 }, - { -1.525285904532877e-10, -7.556923208240308e-01 }, - { -1.345975657140748e-10, -7.842714256651911e-01 }, - { -1.166614734526054e-10, -8.128962219265712e-01 }, - { -9.872098895260891e-11, -8.415656517393372e-01 }, - { -8.077678766314517e-11, -8.702786527215916e-01 }, - { -6.282954517324612e-11, -8.990341580176152e-01 }, - { -4.487993718655790e-11, -9.278310963373758e-01 }, - { -2.692863949561210e-11, -9.566683919968972e-01 }, - { -8.976327956520795e-12, -9.855449649582175e-01 }, - { 8.976321536169872e-12, -1.014459730869357e+00 }, - { 2.692863307547294e-11, -1.043411601105914e+00 }, - { 4.487993076694813e-11, -1.072399482811314e+00 }, - { 6.282953875437751e-11, -1.101422278938424e+00 }, - { 8.077678124517653e-11, -1.130478888291020e+00 }, - { 9.872098253591082e-11, -1.159568205565684e+00 }, - { 1.166614670373367e-10, -1.188689121393192e+00 }, - { 1.345975593005002e-10, -1.217840522381901e+00 }, - { 1.525285840416718e-10, -1.247021291159495e+00 }, - { 1.704538661678104e-10, -1.276230306415868e+00 }, - { 1.883727308022916e-10, -1.305466442946703e+00 }, - { 2.062845033098954e-10, -1.334728571696106e+00 }, - { 2.241885093225349e-10, -1.364015559800721e+00 }, - { 2.420840747645085e-10, -1.393326270633325e+00 }, - { 2.599705258779635e-10, -1.422659563847049e+00 }, - { 2.778471892479898e-10, -1.452014295419243e+00 }, - { 2.957133918284542e-10, -1.481389317696831e+00 }, - { 3.135684609667761e-10, -1.510783479440191e+00 }, - { 3.314117244297624e-10, -1.540195625869043e+00 }, - { 3.492425104288060e-10, -1.569624598707558e+00 }, - { 3.670601476445565e-10, -1.599069236228850e+00 }, - { 3.848639652533361e-10, -1.628528373302631e+00 }, - { 4.026532929512281e-10, -1.658000841439269e+00 }, - { 4.204274609803869e-10, -1.687485468837799e+00 }, - { 4.381858001531792e-10, -1.716981080430596e+00 }, - { 4.559276418782829e-10, -1.746486497931567e+00 }, - { 4.736523181853565e-10, -1.776000539882225e+00 }, - { 4.913591617503452e-10, -1.805522021699094e+00 }, - { 5.090475059206794e-10, -1.835049755721194e+00 }, - { 5.267166847401562e-10, -1.864582551257262e+00 }, - { 5.443660329740862e-10, -1.894119214633676e+00 }, - { 5.619948861345454e-10, -1.923658549242818e+00 }, - { 5.796025805053097e-10, -1.953199355591180e+00 }, - { 5.971884531664190e-10, -1.982740431347091e+00 }, - { 6.147518420199055e-10, -2.012280571390674e+00 }, - { 6.322920858139346e-10, -2.041818567861395e+00 }, - { 6.498085241682158e-10, -2.071353210208005e+00 }, - { 6.673004975990425e-10, -2.100883285238127e+00 }, - { 6.847673475432746e-10, -2.130407577166309e+00 }, - { 7.022084163838545e-10, -2.159924867664933e+00 }, - { 7.196230474743716e-10, -2.189433935913779e+00 }, - { 7.370105851640495e-10, -2.218933558650552e+00 }, - { 7.543703748217808e-10, -2.248422510220072e+00 }, - { 7.717017628611672e-10, -2.277899562625407e+00 }, - { 7.890040967654542e-10, -2.307363485579104e+00 }, - { 8.062767251113011e-10, -2.336813046552684e+00 }, - { 8.235189975944034e-10, -2.366247010829556e+00 }, - { 8.407302650525749e-10, -2.395664141553858e+00 }, - { 8.579098794915287e-10, -2.425063199784153e+00 }, - { 8.750571941082773e-10, -2.454442944543319e+00 }, - { 8.921715633164894e-10, -2.483802132872044e+00 }, - { 9.092523427695200e-10, -2.513139519878584e+00 }, - { 9.262988893857148e-10, -2.542453858792682e+00 }, - { 9.433105613723914e-10, -2.571743901017465e+00 }, - { 9.602867182493987e-10, -2.601008396180870e+00 }, - { 9.772267208744730e-10, -2.630246092190425e+00 }, - { 9.941299314658458e-10, -2.659455735283526e+00 }, - { 1.010995713627070e-09, -2.688636070081818e+00 }, - { 1.027823432371055e-09, -2.717785839644439e+00 }, - { 1.044612454143997e-09, -2.746903785521352e+00 }, - { 1.061362146848353e-09, -2.775988647805256e+00 }, - { 1.078071879867828e-09, -2.805039165187255e+00 }, - { 1.094741024090249e-09, -2.834054075009077e+00 }, - { 1.111368951931856e-09, -2.863032113318052e+00 }, - { 1.127955037360817e-09, -2.891972014920939e+00 }, - { 1.144498655920037e-09, -2.920872513436805e+00 }, - { 1.160999184751779e-09, -2.949732341353290e+00 }, - { 1.177456002620215e-09, -2.978550230079517e+00 }, - { 1.193868489936097e-09, -3.007324910002949e+00 }, - { 1.210236028777826e-09, -3.036055110540183e+00 }, - { 1.226558002917232e-09, -3.064739560196251e+00 }, - { 1.242833797841123e-09, -3.093376986616735e+00 }, - { 1.259062800774685e-09, -3.121966116643377e+00 }, - { 1.275244400705935e-09, -3.150505676371791e+00 }, - { 1.291377988406056e-09, -3.178994391202159e+00 }, - { 1.307462956454857e-09, -3.207430985899192e+00 }, - { 1.323498699262108e-09, -3.235814184645077e+00 }, - { 1.339484613091842e-09, -3.264142711097884e+00 }, - { 1.355420096082785e-09, -3.292415288443373e+00 }, - { 1.371304548273191e-09, -3.320630639454825e+00 }, - { 1.387137371622433e-09, -3.348787486547389e+00 }, - { 1.402917970033511e-09, -3.376884551834256e+00 }, - { 1.418645749376393e-09, -3.404920557184582e+00 }, - { 1.434320117508396e-09, -3.432894224276359e+00 }, - { 1.449940484298756e-09, -3.460804274656981e+00 }, - { 1.465506261649108e-09, -3.488649429796768e+00 }, - { 1.481016863517580e-09, -3.516428411149154e+00 }, - { 1.496471705937951e-09, -3.544139940202303e+00 }, - { 1.511870207044433e-09, -3.571782738540999e+00 }, - { 1.527211787092206e-09, -3.599355527901174e+00 }, - { 1.542495868479076e-09, -3.626857030226671e+00 }, - { 1.557721875768920e-09, -3.654285967729458e+00 }, - { 1.572889235710329e-09, -3.681641062941412e+00 }, - { 1.587997377261005e-09, -3.708921038776707e+00 }, - { 1.603045731607830e-09, -3.736124618586623e+00 }, - { 1.618033732189314e-09, -3.763250526218862e+00 }, - { 1.632960814715177e-09, -3.790297486071938e+00 }, - { 1.647826417189275e-09, -3.817264223155802e+00 }, - { 1.662629979930247e-09, -3.844149463148589e+00 }, - { 1.677370945591844e-09, -3.870951932452996e+00 }, - { 1.692048759186008e-09, -3.897670358257890e+00 }, - { 1.706662868100504e-09, -3.924303468590212e+00 }, - { 1.721212722122685e-09, -3.950849992378278e+00 }, - { 1.735697773458400e-09, -3.977308659506432e+00 }, - { 1.750117476754591e-09, -4.003678200876669e+00 }, - { 1.764471289116712e-09, -4.029957348461003e+00 }, - { 1.778758670132079e-09, -4.056144835364877e+00 }, - { 1.792979081888926e-09, -4.082239395882965e+00 }, - { 1.807131988996465e-09, -4.108239765556996e+00 }, - { 1.821216858606652e-09, -4.134144681236933e+00 }, - { 1.835233160431175e-09, -4.159952881133585e+00 }, - { 1.849180366764537e-09, -4.185663104882633e+00 }, - { 1.863057952502055e-09, -4.211274093599509e+00 }, - { 1.876865395161145e-09, -4.236784589940537e+00 }, - { 1.890602174898734e-09, -4.262193338157148e+00 }, - { 1.904267774533022e-09, -4.287499084158302e+00 }, - { 1.917861679562008e-09, -4.312700575567174e+00 }, - { 1.931383378182392e-09, -4.337796561778708e+00 }, - { 1.944832361310856e-09, -4.362785794021793e+00 }, - { 1.958208122599839e-09, -4.387667025411434e+00 }, - { 1.971510158459931e-09, -4.412439011013396e+00 }, - { 1.984737968076495e-09, -4.437100507898339e+00 }, - { 1.997891053431005e-09, -4.461650275204912e+00 }, - { 2.010968919316289e-09, -4.486087074191693e+00 }, - { 2.023971073358447e-09, -4.510409668301784e+00 }, - { 2.036897026033634e-09, -4.534616823217992e+00 }, - { 2.049746290686799e-09, -4.558707306921882e+00 }, - { 2.062518383551274e-09, -4.582679889754607e+00 }, - { 2.075212823764071e-09, -4.606533344469879e+00 }, - { 2.087829133387063e-09, -4.630266446298172e+00 }, - { 2.100366837422912e-09, -4.653877973001258e+00 }, - { 2.112825463835087e-09, -4.677366704934605e+00 }, - { 2.125204543562522e-09, -4.700731425099899e+00 }, - { 2.137503610540056e-09, -4.723970919208608e+00 }, - { 2.149722201714786e-09, -4.747083975738060e+00 }, - { 2.161859857063438e-09, -4.770069385989595e+00 }, - { 2.173916119610994e-09, -4.792925944149308e+00 }, - { 2.185890535445098e-09, -4.815652447340950e+00 }, - { 2.197782653735957e-09, -4.838247695689436e+00 }, - { 2.209592026751962e-09, -4.860710492376411e+00 }, - { 2.221318209877576e-09, -4.883039643700314e+00 }, - { 2.232960761627846e-09, -4.905233959130168e+00 }, - { 2.244519243667616e-09, -4.927292251368517e+00 }, - { 2.255993220826402e-09, -4.949213336406265e+00 }, - { 2.267382261115285e-09, -4.970996033581527e+00 }, - { 2.278685935744269e-09, -4.992639165639563e+00 }, - { 2.289903819135414e-09, -5.014141558784778e+00 }, - { 2.301035488942000e-09, -5.035502042744443e+00 }, - { 2.312080526062763e-09, -5.056719450823151e+00 }, - { 2.323038514659161e-09, -5.077792619963239e+00 }, - { 2.333909042168180e-09, -5.098720390796817e+00 }, - { 2.344691699320969e-09, -5.119501607709159e+00 }, - { 2.355386080156553e-09, -5.140135118892792e+00 }, - { 2.365991782037187e-09, -5.160619776404897e+00 }, - { 2.376508405665132e-09, -5.180954436227641e+00 }, - { 2.386935555094626e-09, -5.201137958319343e+00 }, - { 2.397272837749508e-09, -5.221169206676762e+00 }, - { 2.407519864436774e-09, -5.241047049389645e+00 }, - { 2.417676249362563e-09, -5.260770358700167e+00 }, - { 2.427741610143750e-09, -5.280338011053974e+00 }, - { 2.437715567825576e-09, -5.299748887163106e+00 }, - { 2.447597746894037e-09, -5.319001872058887e+00 }, - { 2.457387775290440e-09, -5.338095855149190e+00 }, - { 2.467085284426756e-09, -5.357029730277389e+00 }, - { 2.476689909196263e-09, -5.375802395772283e+00 }, - { 2.486201287990485e-09, -5.394412754510426e+00 }, - { 2.495619062711154e-09, -5.412859713968929e+00 }, - { 2.504942878785408e-09, -5.431142186284682e+00 }, - { 2.514172385175743e-09, -5.449259088303476e+00 }, - { 2.523307234396791e-09, -5.467209341642627e+00 }, - { 2.532347082526785e-09, -5.484991872743321e+00 }, - { 2.541291589219998e-09, -5.502605612925014e+00 }, - { 2.550140417722072e-09, -5.520049498445633e+00 }, - { 2.558893234878378e-09, -5.537322470548212e+00 }, - { 2.567549711150773e-09, -5.554423475524196e+00 }, - { 2.576109520627371e-09, -5.571351464763084e+00 }, - { 2.584572341037361e-09, -5.588105394812198e+00 }, - { 2.592937853759161e-09, -5.604684227423386e+00 }, - { 2.601205743836355e-09, -5.621086929615246e+00 }, - { 2.609375699987564e-09, -5.637312473723475e+00 }, - { 2.617447414618146e-09, -5.653359837454964e+00 }, - { 2.625420583833750e-09, -5.669228003945694e+00 }, - { 2.633294907447937e-09, -5.684915961806963e+00 }, - { 2.641070088997271e-09, -5.700422705186584e+00 }, - { 2.648745835750128e-09, -5.715747233817712e+00 }, - { 2.656321858720176e-09, -5.730888553077074e+00 }, - { 2.663797872673252e-09, -5.745845674030161e+00 }, - { 2.671173596142054e-09, -5.760617613492118e+00 }, - { 2.678448751434797e-09, -5.775203394076705e+00 }, - { 2.685623064645538e-09, -5.789602044248679e+00 }, - { 2.692696265666640e-09, -5.803812598380606e+00 }, - { 2.699668088194915e-09, -5.817834096797069e+00 }, - { 2.706538269745573e-09, -5.831665585834668e+00 }, - { 2.713306551659817e-09, -5.845306117889361e+00 }, - { 2.719972679116734e-09, -5.858754751472542e+00 }, - { 2.726536401139295e-09, -5.872010551255358e+00 }, - { 2.732997470607439e-09, -5.885072588127400e+00 }, - { 2.739355644265558e-09, -5.897939939244211e+00 }, - { 2.745610682731633e-09, -5.910611688078208e+00 }, - { 2.751762350508137e-09, -5.923086924473290e+00 }, - { 2.757810415987146e-09, -5.935364744687794e+00 }, - { 2.763754651462700e-09, -5.947444251452243e+00 }, - { 2.769594833137415e-09, -5.959324554015538e+00 }, - { 2.775330741132843e-09, -5.971004768198829e+00 }, - { 2.780962159494174e-09, -5.982484016437981e+00 }, - { 2.786488876202047e-09, -5.993761427840588e+00 }, - { 2.791910683178690e-09, -6.004836138231525e+00 }, - { 2.797227376295779e-09, -6.015707290202086e+00 }, - { 2.802438755383971e-09, -6.026374033162623e+00 }, - { 2.807544624236659e-09, -6.036835523383457e+00 }, - { 2.812544790621093e-09, -6.047090924050914e+00 }, - { 2.817439066283459e-09, -6.057139405311101e+00 }, - { 2.822227266958278e-09, -6.066980144322601e+00 }, - { 2.826909212371261e-09, -6.076612325295799e+00 }, - { 2.831484726250221e-09, -6.086035139548830e+00 }, - { 2.835953636329660e-09, -6.095247785550617e+00 }, - { 2.840315774357203e-09, -6.104249468967751e+00 }, - { 2.844570976102082e-09, -6.113039402715685e+00 }, - { 2.848719081357095e-09, -6.121616806996519e+00 }, - { 2.852759933948860e-09, -6.129980909353977e+00 }, - { 2.856693381741114e-09, -6.138130944714082e+00 }, - { 2.860519276643053e-09, -6.146066155436312e+00 }, - { 2.864237474610633e-09, -6.153785791350256e+00 }, - { 2.867847835656203e-09, -6.161289109809551e+00 }, - { 2.871350223851726e-09, -6.168575375732642e+00 }, - { 2.874744507333867e-09, -6.175643861647406e+00 }, - { 2.878030558310989e-09, -6.182493847739853e+00 }, - { 2.881208253063899e-09, -6.189124621889823e+00 }, - { 2.884277471954592e-09, -6.195535479723423e+00 }, - { 2.887238099428306e-09, -6.201725724651554e+00 }, - { 2.890090024020323e-09, -6.207694667918394e+00 }, - { 2.892833138356060e-09, -6.213441628635915e+00 }, - { 2.895467339159240e-09, -6.218965933835304e+00 }, - { 2.897992527253659e-09, -6.224266918505075e+00 }, - { 2.900408607567016e-09, -6.229343925633495e+00 }, - { 2.902715489136496e-09, -6.234196306254763e+00 }, - { 2.904913085108075e-09, -6.238823419482017e+00 }, - { 2.907001312743911e-09, -6.243224632557377e+00 }, - { 2.908980093422997e-09, -6.247399320887848e+00 }, - { 2.910849352646620e-09, -6.251346868091392e+00 }, - { 2.912609020036956e-09, -6.255066666028537e+00 }, - { 2.914259029343965e-09, -6.258558114851525e+00 }, - { 2.915799318445710e-09, -6.261820623039620e+00 }, - { 2.917229829350759e-09, -6.264853607438842e+00 }, - { 2.918550508202463e-09, -6.267656493305673e+00 }, - { 2.919761305276718e-09, -6.270228714337005e+00 }, - { 2.920862174988150e-09, -6.272569712717951e+00 }, - { 2.921853075889193e-09, -6.274678939154603e+00 }, - { 2.922733970674264e-09, -6.276555852917634e+00 }, - { 2.923504826176907e-09, -6.278199921870962e+00 }, - { 2.924165613375264e-09, -6.279610622518139e+00 }, - { 2.924716307391075e-09, -6.280787440034993e+00 }, - { 2.925156887490598e-09, -6.281729868306345e+00 }, - { 2.925487337087508e-09, -6.282437409966992e+00 }, - { 2.925707643739298e-09, -6.282909576428774e+00 }, - { 2.925817799151970e-09, -6.283145887925411e+00 }, +// max_error = 2.353084136763606e-06 +{ 2.925817799165007e-09, 7.219194364267018e-09 }, + { 2.925707643778599e-09, 2.526699001579799e-07 }, + { 2.925487337153070e-09, 1.191140162167675e-06 }, + { 2.925156887582842e-09, 3.284585035595589e-06 }, + { 2.924716307509151e-09, 6.994872605695784e-06 }, + { 2.924165613519592e-09, 1.278374920658798e-05 }, + { 2.923504826347475e-09, 2.111280464718590e-05 }, + { 2.922733970871080e-09, 3.244343744537165e-05 }, + { 2.921853076112655e-09, 4.723682007436170e-05 }, + { 2.920862175237416e-09, 6.595386421935634e-05 }, + { 2.919761305552202e-09, 8.905518605213658e-05 }, + { 2.918550508504146e-09, 1.170010715193098e-04 }, + { 2.917229829679050e-09, 1.502514416517192e-04 }, + { 2.915799318799769e-09, 1.892658178912071e-04 }, + { 2.914259029724184e-09, 2.345032874456615e-04 }, + { 2.912609020443340e-09, 2.864224686607020e-04 }, + { 2.910849353079123e-09, 3.454814764261432e-04 }, + { 2.908980093882049e-09, 4.121378876027343e-04 }, + { 2.907001313228646e-09, 4.868487064877691e-04 }, + { 2.904913085618902e-09, 5.700703303049837e-04 }, + { 2.902715489673383e-09, 6.622585147355725e-04 }, + { 2.900408608130373e-09, 7.638683394782519e-04 }, + { 2.897992527842612e-09, 8.753541738578119e-04 }, + { 2.895467339774186e-09, 9.971696424604937e-04 }, + { 2.892833138996999e-09, 1.129767590823255e-03 }, + { 2.890090024687216e-09, 1.273600051161478e-03 }, + { 2.887238100121550e-09, 1.429118208142094e-03 }, + { 2.884277472673313e-09, 1.596772364709564e-03 }, + { 2.881208253808507e-09, 1.777011907950626e-03 }, + { 2.878030559081432e-09, 1.970285275029487e-03 }, + { 2.874744508130554e-09, 2.177039919152579e-03 }, + { 2.871350224673798e-09, 2.397722275614272e-03 }, + { 2.867847836504030e-09, 2.632777727878843e-03 }, + { 2.864237475484149e-09, 2.882650573737405e-03 }, + { 2.860519277542297e-09, 3.147783991507308e-03 }, + { 2.856693382666432e-09, 3.428620006328931e-03 }, + { 2.852759934899389e-09, 3.725599456482154e-03 }, + { 2.848719082333207e-09, 4.039161959812243e-03 }, + { 2.844570977103752e-09, 4.369745880190706e-03 }, + { 2.840315775384800e-09, 4.717788294077374e-03 }, + { 2.835953637382310e-09, 5.083724957128360e-03 }, + { 2.831484727328322e-09, 5.467990270896617e-03 }, + { 2.826909213474759e-09, 5.871017249604038e-03 }, + { 2.822227268087134e-09, 6.293237486988512e-03 }, + { 2.817439067438018e-09, 6.735081123237729e-03 }, + { 2.812544791800534e-09, 7.196976811989608e-03 }, + { 2.807544625441273e-09, 7.679351687456759e-03 }, + { 2.802438756613836e-09, 8.182631331563162e-03 }, + { 2.797227377551135e-09, 8.707239741274575e-03 }, + { 2.791910684458716e-09, 9.253599295902304e-03 }, + { 2.786488877507140e-09, 9.822130724578715e-03 }, + { 2.780962160824228e-09, 1.041325307382490e-02 }, + { 2.775330742487884e-09, 1.102738367513773e-02 }, + { 2.769594834517682e-09, 1.166493811278924e-02 }, + { 2.763754652867477e-09, 1.232633019159818e-02 }, + { 2.757810417416620e-09, 1.301197190494069e-02 }, + { 2.751762351962413e-09, 1.372227340270610e-02 }, + { 2.745610684210923e-09, 1.445764295952962e-02 }, + { 2.739355645769094e-09, 1.521848694296229e-02 }, + { 2.732997472135539e-09, 1.600520978188769e-02 }, + { 2.726536402691907e-09, 1.681821393496225e-02 }, + { 2.719972680693777e-09, 1.765789985920713e-02 }, + { 2.713306553261610e-09, 1.852466597868779e-02 }, + { 2.706538271371373e-09, 1.941890865333146e-02 }, + { 2.699668089844909e-09, 2.034102214787814e-02 }, + { 2.692696267340880e-09, 2.129139860085272e-02 }, + { 2.685623066344263e-09, 2.227042799383416e-02 }, + { 2.678448753157212e-09, 2.327849812064098e-02 }, + { 2.671173597888530e-09, 2.431599455681316e-02 }, + { 2.663797874443630e-09, 2.538330062913108e-02 }, + { 2.656321860514457e-09, 2.648079738524795e-02 }, + { 2.648745837568575e-09, 2.760886356354952e-02 }, + { 2.641070090839117e-09, 2.876787556300114e-02 }, + { 2.633294909313421e-09, 2.995820741329835e-02 }, + { 2.625420585722845e-09, 3.118023074495535e-02 }, + { 2.617447416531143e-09, 3.243431475972608e-02 }, + { 2.609375701923643e-09, 3.372082620101990e-02 }, + { 2.601205745795833e-09, 3.504012932452527e-02 }, + { 2.592937855741933e-09, 3.639258586895711e-02 }, + { 2.584572343043400e-09, 3.777855502693250e-02 }, + { 2.576109522656942e-09, 3.919839341605197e-02 }, + { 2.567549713203028e-09, 4.065245505002102e-02 }, + { 2.558893236953688e-09, 4.214109131001403e-02 }, + { 2.550140419820252e-09, 4.366465091617666e-02 }, + { 2.541291591341445e-09, 4.522347989919473e-02 }, + { 2.532347084670572e-09, 4.681792157215026e-02 }, + { 2.523307236563343e-09, 4.844831650239501e-02 }, + { 2.514172387364900e-09, 5.011500248369893e-02 }, + { 2.504942880997064e-09, 5.181831450849345e-02 }, + { 2.495619064945627e-09, 5.355858474024022e-02 }, + { 2.486201290246928e-09, 5.533614248606705e-02 }, + { 2.476689911475047e-09, 5.715131416942842e-02 }, + { 2.467085286727668e-09, 5.900442330315692e-02 }, + { 2.457387777613798e-09, 6.089579046229943e-02 }, + { 2.447597749239101e-09, 6.282573325755320e-02 }, + { 2.437715570192557e-09, 6.479456630859221e-02 }, + { 2.427741612532542e-09, 6.680260121764925e-02 }, + { 2.417676251773166e-09, 6.885014654319160e-02 }, + { 2.407519866869294e-09, 7.093750777401114e-02 }, + { 2.397272840203310e-09, 7.306498730310884e-02 }, + { 2.386935557569868e-09, 7.523288440214027e-02 }, + { 2.376508408161815e-09, 7.744149519577415e-02 }, + { 2.365991784555363e-09, 7.969111263635709e-02 }, + { 2.355386082695641e-09, 8.198202647865405e-02 }, + { 2.344691701881232e-09, 8.431452325495814e-02 }, + { 2.333909044749407e-09, 8.668888625021409e-02 }, + { 2.323038517261246e-09, 8.910539547731611e-02 }, + { 2.312080528685971e-09, 9.156432765274414e-02 }, + { 2.301035491585642e-09, 9.406595617227698e-02 }, + { 2.289903821799651e-09, 9.661055108691619e-02 }, + { 2.278685938428940e-09, 9.919837907903295e-02 }, + { 2.267382263820762e-09, 1.018297034385580e-01 }, + { 2.255993223551837e-09, 1.045047840397028e-01 }, + { 2.244519246413220e-09, 1.072238773174577e-01 }, + { 2.232960764393620e-09, 1.099872362446146e-01 }, + { 2.221318212663309e-09, 1.127951103088245e-01 }, + { 2.209592029557811e-09, 1.156477454898748e-01 }, + { 2.197782656561395e-09, 1.185453842371912e-01 }, + { 2.185890538290176e-09, 1.214882654476019e-01 }, + { 2.173916122475606e-09, 1.244766244431883e-01 }, + { 2.161859859947797e-09, 1.275106929493488e-01 }, + { 2.149722204618256e-09, 1.305906990731841e-01 }, + { 2.137503613462743e-09, 1.337168672820376e-01 }, + { 2.125204546504321e-09, 1.368894183821595e-01 }, + { 2.112825466795944e-09, 1.401085694976751e-01 }, + { 2.100366840402933e-09, 1.433745340497602e-01 }, + { 2.087829136385612e-09, 1.466875217359607e-01 }, + { 2.075212826781308e-09, 1.500477385098620e-01 }, + { 2.062518386587093e-09, 1.534553865607503e-01 }, + { 2.049746293741359e-09, 1.569106642937665e-01 }, + { 2.036897029106193e-09, 1.604137663100403e-01 }, + { 2.023971076449323e-09, 1.639648833871233e-01 }, + { 2.010968922425217e-09, 1.675642024598467e-01 }, + { 1.997891056557933e-09, 1.712119066008896e-01 }, + { 1.984737971221581e-09, 1.749081750021970e-01 }, + { 1.971510161622434e-09, 1.786531829561379e-01 }, + { 1.958208125780130e-09, 1.824471018371070e-01 }, + { 1.944832364508511e-09, 1.862900990834311e-01 }, + { 1.931383381397782e-09, 1.901823381790926e-01 }, + { 1.917861682794392e-09, 1.941239786363039e-01 }, + { 1.904267777782611e-09, 1.981151759777950e-01 }, + { 1.890602178165317e-09, 2.021560817195309e-01 }, + { 1.876865398444616e-09, 2.062468433536743e-01 }, + { 1.863057955802572e-09, 2.103876043317229e-01 }, + { 1.849180370081465e-09, 2.145785040479915e-01 }, + { 1.835233163764673e-09, 2.188196778231083e-01 }, + { 1.821216861956509e-09, 2.231112568880342e-01 }, + { 1.807131992362945e-09, 2.274533683680190e-01 }, + { 1.792979085271234e-09, 2.318461352671018e-01 }, + { 1.778758673530482e-09, 2.362896764525300e-01 }, + { 1.764471292530943e-09, 2.407841066397789e-01 }, + { 1.750117480184598e-09, 2.453295363773890e-01 }, + { 1.735697776904342e-09, 2.499260720324433e-01 }, + { 1.721212725583874e-09, 2.545738157760434e-01 }, + { 1.706662871577097e-09, 2.592728655691494e-01 }, + { 1.692048762677849e-09, 2.640233151485341e-01 }, + { 1.677370949099090e-09, 2.688252540131204e-01 }, + { 1.662629983452104e-09, 2.736787674105404e-01 }, + { 1.647826420726167e-09, 2.785839363237506e-01 }, + { 1.632960818266680e-09, 2.835408374583758e-01 }, + { 1.618033735755429e-09, 2.885495432295704e-01 }, + { 1.603045735188609e-09, 2.936101217498361e-01 }, + { 1.587997380855918e-09, 2.987226368167127e-01 }, + { 1.572889239319430e-09, 3.038871479007593e-01 }, + { 1.557721879392051e-09, 3.091037101339017e-01 }, + { 1.542495872116447e-09, 3.143723742978435e-01 }, + { 1.527211790743024e-09, 3.196931868130269e-01 }, + { 1.511870210708909e-09, 3.250661897274744e-01 }, + { 1.496471709615926e-09, 3.304914207062036e-01 }, + { 1.481016867208896e-09, 3.359689130207621e-01 }, + { 1.465506265353924e-09, 3.414986955389885e-01 }, + { 1.449940488016384e-09, 3.470807927151147e-01 }, + { 1.434320121238994e-09, 3.527152245800635e-01 }, + { 1.418645753119802e-09, 3.584020067320109e-01 }, + { 1.402917973789838e-09, 3.641411503272979e-01 }, + { 1.387137375391042e-09, 3.699326620714776e-01 }, + { 1.371304552054134e-09, 3.757765442106153e-01 }, + { 1.355420099875958e-09, 3.816727945230153e-01 }, + { 1.339484616897137e-09, 3.876214063110671e-01 }, + { 1.323498703079580e-09, 3.936223683933865e-01 }, + { 1.307462960283922e-09, 3.996756650972121e-01 }, + { 1.291377992246768e-09, 4.057812762511174e-01 }, + { 1.275244404558188e-09, 4.119391771778626e-01 }, + { 1.259062804638585e-09, 4.181493386877248e-01 }, + { 1.242833801715929e-09, 4.244117270719281e-01 }, + { 1.226558006803155e-09, 4.307263040962509e-01 }, + { 1.210236032674760e-09, 4.370930269951803e-01 }, + { 1.193868493843725e-09, 4.435118484661861e-01 }, + { 1.177456006538695e-09, 4.499827166641340e-01 }, + { 1.160999188680582e-09, 4.565055751961679e-01 }, + { 1.144498659859216e-09, 4.630803631168164e-01 }, + { 1.127955041310214e-09, 4.697070149232604e-01 }, + { 1.111368955891417e-09, 4.763854605510119e-01 }, + { 1.094741028059551e-09, 4.831156253697562e-01 }, + { 1.078071883846871e-09, 4.898974301794375e-01 }, + { 1.061362150836978e-09, 4.967307912069362e-01 }, + { 1.044612458142151e-09, 5.036156201023686e-01 }, + { 1.027823436378632e-09, 5.105518239364775e-01 }, + { 1.010995717643647e-09, 5.175393051975563e-01 }, + { 9.941299354913699e-10, 5.245779617890562e-01 }, + { 9.772267249089968e-10, 5.316676870274011e-01 }, + { 9.602867222926046e-10, 5.388083696401416e-01 }, + { 9.433105654240147e-10, 5.459998937639375e-01 }, + { 9.262988934458084e-10, 5.532421389435711e-01 }, + { 9.092523468378193e-10, 5.605349801305876e-01 }, + { 8.921715673928355e-10, 5.678782876825250e-01 }, + { 8.750571981926701e-10, 5.752719273622372e-01 }, + { 8.579098835836508e-10, 5.827157603377209e-01 }, + { 8.407302691522673e-10, 5.902096431821322e-01 }, + { 8.235190017016133e-10, 5.977534278737073e-01 }, + { 8.062767292259225e-10, 6.053469617967722e-01 }, + { 7.890041008871165e-10, 6.129900877421282e-01 }, + { 7.717017669898175e-10, 6.206826439083659e-01 }, + { 7.543703789572603e-10, 6.284244639030392e-01 }, + { 7.370105893063053e-10, 6.362153767444958e-01 }, + { 7.196230516231919e-10, 6.440552068636356e-01 }, + { 7.022084205389746e-10, 6.519437741060674e-01 }, + { 6.847673517046416e-10, 6.598808937346672e-01 }, + { 6.673005017664976e-10, 6.678663764322770e-01 }, + { 6.498085283416530e-10, 6.759000283046127e-01 }, + { 6.322920899929834e-10, 6.839816508836737e-01 }, + { 6.147518462045659e-10, 6.921110411311926e-01 }, + { 5.971884573565851e-10, 7.002879914425926e-01 }, + { 5.796025847007168e-10, 7.085122896509806e-01 }, + { 5.619948903351406e-10, 7.167837190315758e-01 }, + { 5.443660371796048e-10, 7.251020583063744e-01 }, + { 5.267166889504394e-10, 7.334670816491009e-01 }, + { 5.090475101356742e-10, 7.418785586903696e-01 }, + { 4.913591659698399e-10, 7.503362545232619e-01 }, + { 4.736523224091392e-10, 7.588399297089872e-01 }, + { 4.559276461062478e-10, 7.673893402829834e-01 }, + { 4.381858043851147e-10, 7.759842377612828e-01 }, + { 4.204274652161870e-10, 7.846243691469355e-01 }, + { 4.026532971908398e-10, 7.933094769370790e-01 }, + { 3.848639694963359e-10, 8.020392991300200e-01 }, + { 3.670601518910503e-10, 8.108135692324444e-01 }, + { 3.492425146784233e-10, 8.196320162675177e-01 }, + { 3.314117286825031e-10, 8.284943647824689e-01 }, + { 3.135684652223755e-10, 8.374003348569865e-01 }, + { 2.957133960867535e-10, 8.463496421118015e-01 }, + { 2.778471935089361e-10, 8.553419977173513e-01 }, + { 2.599705301412391e-10, 8.643771084029740e-01 }, + { 2.420840790301135e-10, 8.734546764660205e-01 }, + { 2.241885135902046e-10, 8.825743997817682e-01 }, + { 2.062845075795238e-10, 8.917359718130367e-01 }, + { 1.883727350736140e-10, 9.009390816205823e-01 }, + { 1.704538704408269e-10, 9.101834138731877e-01 }, + { 1.525285883160648e-10, 9.194686488588080e-01 }, + { 1.345975635762696e-10, 9.287944624950824e-01 }, + { 1.166614713141648e-10, 9.381605263410157e-01 }, + { 9.872098681369190e-11, 9.475665076080466e-01 }, + { 8.077678552380464e-11, 9.570120691722380e-01 }, + { 6.282954303364090e-11, 9.664968695860140e-01 }, + { 4.487993504668797e-11, 9.760205630906909e-01 }, + { 2.692863735553042e-11, 9.855827996289697e-01 }, + { 8.976325816439114e-12, 9.951832248577780e-01 }, + { -8.976323676304494e-12, 1.004821480161519e+00 }, + { -2.692863521550168e-11, 1.014497202665280e+00 }, + { -4.487993290681805e-11, 1.024210025248670e+00 }, + { -6.282954089398273e-11, 1.033959576559617e+00 }, + { -8.077678338451706e-11, 1.043745481028715e+00 }, + { -9.872098467477489e-11, 1.053567358883467e+00 }, + { -1.166614691757772e-10, 1.063424826163223e+00 }, + { -1.345975614383584e-10, 1.073317494734013e+00 }, + { -1.525285861788948e-10, 1.083244972303963e+00 }, + { -1.704538683042922e-10, 1.093206862438572e+00 }, + { -1.883727329379793e-10, 1.103202764576806e+00 }, + { -2.062845054446831e-10, 1.113232274046796e+00 }, + { -2.241885114563697e-10, 1.123294982082432e+00 }, + { -2.420840768973375e-10, 1.133390475839767e+00 }, + { -2.599705280096278e-10, 1.143518338413855e+00 }, + { -2.778471913784365e-10, 1.153678148855860e+00 }, + { -2.957133939575774e-10, 1.163869482190458e+00 }, + { -3.135684630945758e-10, 1.174091909433296e+00 }, + { -3.314117265561857e-10, 1.184344997608959e+00 }, + { -3.492425125535882e-10, 1.194628309769018e+00 }, + { -3.670601497678034e-10, 1.204941405010466e+00 }, + { -3.848639673748360e-10, 1.215283838494269e+00 }, + { -4.026532950710339e-10, 1.225655161464298e+00 }, + { -4.204274630982869e-10, 1.236054921266445e+00 }, + { -4.381858022691734e-10, 1.246482661367958e+00 }, + { -4.559276439922654e-10, 1.256937921377146e+00 }, + { -4.736523202972214e-10, 1.267420237063216e+00 }, + { -4.913591638600925e-10, 1.277929140376502e+00 }, + { -5.090475080282032e-10, 1.288464159468706e+00 }, + { -5.267166868452449e-10, 1.299024818713528e+00 }, + { -5.443660350768455e-10, 1.309610638727845e+00 }, + { -5.619948882348695e-10, 1.320221136392390e+00 }, + { -5.796025826029868e-10, 1.330855824873457e+00 }, + { -5.971884552615020e-10, 1.341514213644420e+00 }, + { -6.147518441122357e-10, 1.352195808507556e+00 }, + { -6.322920879034590e-10, 1.362900111616144e+00 }, + { -6.498085262549874e-10, 1.373626621496939e+00 }, + { -6.673004996827436e-10, 1.384374833072571e+00 }, + { -6.847673496239581e-10, 1.395144237684605e+00 }, + { -7.022084184613616e-10, 1.405934323116231e+00 }, + { -7.196230495488082e-10, 1.416744573616104e+00 }, + { -7.370105872352039e-10, 1.427574469921397e+00 }, + { -7.543703768894941e-10, 1.438423489281758e+00 }, + { -7.717017649255453e-10, 1.449291105483472e+00 }, + { -7.890040988262324e-10, 1.460176788873383e+00 }, + { -8.062767271686383e-10, 1.471080006383765e+00 }, + { -8.235189996479819e-10, 1.482000221556656e+00 }, + { -8.407302671024475e-10, 1.492936894569018e+00 }, + { -8.579098815375368e-10, 1.503889482257845e+00 }, + { -8.750571961505266e-10, 1.514857438145604e+00 }, + { -8.921715653546624e-10, 1.525840212465756e+00 }, + { -9.092523448036167e-10, 1.536837252188703e+00 }, + { -9.262988914157881e-10, 1.547848001047890e+00 }, + { -9.433105633981766e-10, 1.558871899565883e+00 }, + { -9.602867202711075e-10, 1.569908385081254e+00 }, + { -9.772267228916820e-10, 1.580956891774897e+00 }, + { -9.941299334786078e-10, 1.592016850697478e+00 }, + { -1.010995715635332e-09, 1.603087689796053e+00 }, + { -1.027823434374870e-09, 1.614168833942028e+00 }, + { -1.044612456143047e-09, 1.625259704958335e+00 }, + { -1.061362148842745e-09, 1.636359721647526e+00 }, + { -1.078071881857297e-09, 1.647468299819543e+00 }, + { -1.094741026074900e-09, 1.658584852320419e+00 }, + { -1.111368953911690e-09, 1.669708789060341e+00 }, + { -1.127955039335462e-09, 1.680839517042381e+00 }, + { -1.144498657889600e-09, 1.691976440391624e+00 }, + { -1.160999186716154e-09, 1.703118960383971e+00 }, + { -1.177456004579561e-09, 1.714266475475616e+00 }, + { -1.193868491889832e-09, 1.725418381332405e+00 }, + { -1.210236030726319e-09, 1.736574070859850e+00 }, + { -1.226558004860220e-09, 1.747732934232508e+00 }, + { -1.242833799778447e-09, 1.758894358924547e+00 }, + { -1.259062802706714e-09, 1.770057729740021e+00 }, + { -1.275244402631982e-09, 1.781222428842935e+00 }, + { -1.291377990326492e-09, 1.792387835788660e+00 }, + { -1.307462958369363e-09, 1.803553327553897e+00 }, + { -1.323498701170897e-09, 1.814718278568759e+00 }, + { -1.339484614994490e-09, 1.825882060747428e+00 }, + { -1.355420097979292e-09, 1.837044043519582e+00 }, + { -1.371304550163662e-09, 1.848203593862598e+00 }, + { -1.387137373506711e-09, 1.859360076332671e+00 }, + { -1.402917971911754e-09, 1.870512853097495e+00 }, + { -1.418645751248018e-09, 1.881661283967967e+00 }, + { -1.434320119373722e-09, 1.892804726431080e+00 }, + { -1.449940486157623e-09, 1.903942535681972e+00 }, + { -1.465506263501516e-09, 1.915074064656886e+00 }, + { -1.481016865363264e-09, 1.926198664066737e+00 }, + { -1.496471707776859e-09, 1.937315682428795e+00 }, + { -1.511870208876724e-09, 1.948424466101625e+00 }, + { -1.527211788917509e-09, 1.959524359317042e+00 }, + { -1.542495870297867e-09, 1.970614704215133e+00 }, + { -1.557721877580406e-09, 1.981694840876775e+00 }, + { -1.572889237514880e-09, 1.992764107358707e+00 }, + { -1.587997379058514e-09, 2.003821839726753e+00 }, + { -1.603045733398246e-09, 2.014867372090665e+00 }, + { -1.618033733972424e-09, 2.025900036638798e+00 }, + { -1.632960816490822e-09, 2.036919163671778e+00 }, + { -1.647826418957721e-09, 2.047924081638631e+00 }, + { -1.662629981691070e-09, 2.058914117170269e+00 }, + { -1.677370947345626e-09, 2.069888595116115e+00 }, + { -1.692048760931849e-09, 2.080846838577820e+00 }, + { -1.706662869838827e-09, 2.091788168946183e+00 }, + { -1.721212723853279e-09, 2.102711905935372e+00 }, + { -1.735697775181424e-09, 2.113617367619504e+00 }, + { -1.750117478469621e-09, 2.124503870468520e+00 }, + { -1.764471290823748e-09, 2.135370729383332e+00 }, + { -1.778758671831281e-09, 2.146217257733207e+00 }, + { -1.792979083579974e-09, 2.157042767390815e+00 }, + { -1.807131990679890e-09, 2.167846568770014e+00 }, + { -1.821216860281448e-09, 2.178627970860822e+00 }, + { -1.835233162097977e-09, 2.189386281268046e+00 }, + { -1.849180368423027e-09, 2.200120806246095e+00 }, + { -1.863057954152340e-09, 2.210830850737588e+00 }, + { -1.876865396802907e-09, 2.221515718409926e+00 }, + { -1.890602176531920e-09, 2.232174711691990e+00 }, + { -1.904267776157843e-09, 2.242807131812679e+00 }, + { -1.917861681178094e-09, 2.253412278837029e+00 }, + { -1.931383379790273e-09, 2.263989451705295e+00 }, + { -1.944832362909578e-09, 2.274537948269257e+00 }, + { -1.958208124189984e-09, 2.285057065331676e+00 }, + { -1.971510160041235e-09, 2.295546098682665e+00 }, + { -1.984737969649064e-09, 2.306004343138794e+00 }, + { -1.997891054994522e-09, 2.316431092581699e+00 }, + { -2.010968920870647e-09, 2.326825639994779e+00 }, + { -2.023971074903858e-09, 2.337187277503834e+00 }, + { -2.036897027569834e-09, 2.347515296413520e+00 }, + { -2.049746292214264e-09, 2.357808987247877e+00 }, + { -2.062518385069210e-09, 2.368067639787542e+00 }, + { -2.075212825272584e-09, 2.378290543109652e+00 }, + { -2.087829134886364e-09, 2.388476985626922e+00 }, + { -2.100366838912949e-09, 2.398626255125417e+00 }, + { -2.112825465315542e-09, 2.408737638805759e+00 }, + { -2.125204545033289e-09, 2.418810423320288e+00 }, + { -2.137503612001452e-09, 2.428843894814472e+00 }, + { -2.149722203166389e-09, 2.438837338964302e+00 }, + { -2.161859858505829e-09, 2.448790041018174e+00 }, + { -2.173916121043380e-09, 2.458701285834241e+00 }, + { -2.185890536867478e-09, 2.468570357921585e+00 }, + { -2.197782655148702e-09, 2.478396541480230e+00 }, + { -2.209592028154913e-09, 2.488179120439544e+00 }, + { -2.221318211270522e-09, 2.497917378500214e+00 }, + { -2.232960763010574e-09, 2.507610599172123e+00 }, + { -2.244519245040444e-09, 2.517258065817044e+00 }, + { -2.255993222189014e-09, 2.526859061686102e+00 }, + { -2.267382262468209e-09, 2.536412869962689e+00 }, + { -2.278685937086658e-09, 2.545918773800664e+00 }, + { -2.289903820467374e-09, 2.555376056366064e+00 }, + { -2.301035490263848e-09, 2.564784000877677e+00 }, + { -2.312080527374447e-09, 2.574141890646339e+00 }, + { -2.323038515960257e-09, 2.583449009117307e+00 }, + { -2.333909043458635e-09, 2.592704639909166e+00 }, + { -2.344691700601153e-09, 2.601908066856634e+00 }, + { -2.355386081425938e-09, 2.611058574048749e+00 }, + { -2.365991783296513e-09, 2.620155445872768e+00 }, + { -2.376508406913500e-09, 2.629197967052127e+00 }, + { -2.386935556332088e-09, 2.638185422689490e+00 }, + { -2.397272838976436e-09, 2.647117098307332e+00 }, + { -2.407519865653114e-09, 2.655992279887846e+00 }, + { -2.417676250567891e-09, 2.664810253915885e+00 }, + { -2.427741611338014e-09, 2.673570307418169e+00 }, + { -2.437715569009093e-09, 2.682271728006635e+00 }, + { -2.447597748066437e-09, 2.690913803917100e+00 }, + { -2.457387776452357e-09, 2.699495824053297e+00 }, + { -2.467085285577292e-09, 2.708017078025636e+00 }, + { -2.476689910335470e-09, 2.716476856194105e+00 }, + { -2.486201289118733e-09, 2.724874449709689e+00 }, + { -2.495619063828443e-09, 2.733209150554255e+00 }, + { -2.504942879891263e-09, 2.741480251583985e+00 }, + { -2.514172386270163e-09, 2.749687046568741e+00 }, + { -2.523307235480146e-09, 2.757828830235740e+00 }, + { -2.532347083598520e-09, 2.765904898308531e+00 }, + { -2.541291590280960e-09, 2.773914547551261e+00 }, + { -2.550140418771202e-09, 2.781857075807392e+00 }, + { -2.558893235915887e-09, 2.789731782043156e+00 }, + { -2.567549712176927e-09, 2.797537966388929e+00 }, + { -2.576109521642196e-09, 2.805274930179221e+00 }, + { -2.584572342040407e-09, 2.812941975996573e+00 }, + { -2.592937854750428e-09, 2.820538407710556e+00 }, + { -2.601205744816134e-09, 2.828063530521908e+00 }, + { -2.609375700955458e-09, 2.835516651001539e+00 }, + { -2.617447415574869e-09, 2.842897077134583e+00 }, + { -2.625420584778350e-09, 2.850204118359573e+00 }, + { -2.633294908380520e-09, 2.857437085611509e+00 }, + { -2.641070089918234e-09, 2.864595291363663e+00 }, + { -2.648745836659391e-09, 2.871678049666939e+00 }, + { -2.656321859617343e-09, 2.878684676194483e+00 }, + { -2.663797873558322e-09, 2.885614488280000e+00 }, + { -2.671173597015318e-09, 2.892466804962122e+00 }, + { -2.678448752295859e-09, 2.899240947023252e+00 }, + { -2.685623065495139e-09, 2.905936237033475e+00 }, + { -2.692696266503800e-09, 2.912551999389617e+00 }, + { -2.699668089019767e-09, 2.919087560358171e+00 }, + { -2.706538270558513e-09, 2.925542248116882e+00 }, + { -2.713306552460767e-09, 2.931915392794031e+00 }, + { -2.719972679905295e-09, 2.938206326512581e+00 }, + { -2.726536401915442e-09, 2.944414383428562e+00 }, + { -2.732997471371516e-09, 2.950538899775061e+00 }, + { -2.739355645017194e-09, 2.956579213900666e+00 }, + { -2.745610683471516e-09, 2.962534666313284e+00 }, + { -2.751762351235315e-09, 2.968404599718795e+00 }, + { -2.757810416701751e-09, 2.974188359063684e+00 }, + { -2.763754652165128e-09, 2.979885291576143e+00 }, + { -2.769594833827588e-09, 2.985494746805227e+00 }, + { -2.775330741810390e-09, 2.991016076664491e+00 }, + { -2.780962160159068e-09, 2.996448635469842e+00 }, + { -2.786488876854607e-09, 3.001791779983262e+00 }, + { -2.791910683818570e-09, 3.007044869450794e+00 }, + { -2.797227376923695e-09, 3.012207265645876e+00 }, + { -2.802438755998943e-09, 3.017278332907412e+00 }, + { -2.807544624838820e-09, 3.022257438182037e+00 }, + { -2.812544791210840e-09, 3.027143951064684e+00 }, + { -2.817439066860792e-09, 3.031937243837070e+00 }, + { -2.822227267522746e-09, 3.036636691510884e+00 }, + { -2.826909212922864e-09, 3.041241671864994e+00 }, + { -2.831484726789317e-09, 3.045751565488710e+00 }, + { -2.835953636855826e-09, 3.050165755818853e+00 }, + { -2.840315774871260e-09, 3.054483629182857e+00 }, + { -2.844570976602957e-09, 3.058704574835744e+00 }, + { -2.848719081844986e-09, 3.062827985002047e+00 }, + { -2.852759934424164e-09, 3.066853254915581e+00 }, + { -2.856693382203833e-09, 3.070779782857041e+00 }, + { -2.860519277092708e-09, 3.074606970196721e+00 }, + { -2.864237475047239e-09, 3.078334221430809e+00 }, + { -2.867847836080156e-09, 3.081960944223928e+00 }, + { -2.871350224262603e-09, 3.085486549445314e+00 }, + { -2.874744507732462e-09, 3.088910451211251e+00 }, + { -2.878030558696270e-09, 3.092232066921130e+00 }, + { -2.881208253436038e-09, 3.095450817298478e+00 }, + { -2.884277472313999e-09, 3.098566126429974e+00 }, + { -2.887238099774968e-09, 3.101577421802070e+00 }, + { -2.890090024353816e-09, 3.104484134342861e+00 }, + { -2.892833138676371e-09, 3.107285698457308e+00 }, + { -2.895467339466766e-09, 3.109981552069083e+00 }, + { -2.897992527547963e-09, 3.112571136655481e+00 }, + { -2.900408607848946e-09, 3.115053897289195e+00 }, + { -2.902715489404992e-09, 3.117429282673042e+00 }, + { -2.904913085363323e-09, 3.119696745180238e+00 }, + { -2.907001312986328e-09, 3.121855740892224e+00 }, + { -2.908980093652563e-09, 3.123905729634218e+00 }, + { -2.910849352862924e-09, 3.125846175016163e+00 }, + { -2.912609020239985e-09, 3.127676544466606e+00 }, + { -2.914259029534118e-09, 3.129396309273659e+00 }, + { -2.915799318622574e-09, 3.131004944618667e+00 }, + { -2.917229829515169e-09, 3.132501929616775e+00 }, + { -2.918550508353347e-09, 3.133886747350606e+00 }, + { -2.919761305414294e-09, 3.135158884909254e+00 }, + { -2.920862175112829e-09, 3.136317833424958e+00 }, + { -2.921853076000972e-09, 3.137363088107359e+00 }, + { -2.922733970772719e-09, 3.138294148283254e+00 }, + { -2.923504826262027e-09, 3.139110517429204e+00 }, + { -2.924165613447473e-09, 3.139811703211207e+00 }, + { -2.924716307449950e-09, 3.140397217517018e+00 }, + { -2.925156887536978e-09, 3.140866576495489e+00 }, + { -2.925487337120335e-09, 3.141219300588825e+00 }, + { -2.925707643758784e-09, 3.141454914570261e+00 }, + { -2.925817799158535e-09, 3.141572947579352e+00 }, + { -2.925817799171455e-09, 3.141572933154836e+00 }, + { -2.925707643798390e-09, 3.141454409272987e+00 }, + { -2.925487337185779e-09, 3.141216918378770e+00 }, + { -2.925156887628892e-09, 3.140860007424112e+00 }, + { -2.924716307568119e-09, 3.140383227898687e+00 }, + { -2.924165613591896e-09, 3.139786135867868e+00 }, + { -2.923504826432903e-09, 3.139068292003385e+00 }, + { -2.922733970969412e-09, 3.138229261619561e+00 }, + { -2.921853076224321e-09, 3.137268614707029e+00 }, + { -2.920862175361976e-09, 3.136185925964038e+00 }, + { -2.919761305690083e-09, 3.134980774833275e+00 }, + { -2.918550508654911e-09, 3.133652745531368e+00 }, + { -2.917229829843137e-09, 3.132201427085629e+00 }, + { -2.915799318976726e-09, 3.130626413363146e+00 }, + { -2.914259029914435e-09, 3.128927303107136e+00 }, + { -2.912609020646661e-09, 3.127103699965947e+00 }, + { -2.910849353295315e-09, 3.125155212527586e+00 }, + { -2.908980094111509e-09, 3.123081454351802e+00 }, + { -2.907001313470937e-09, 3.120882043999591e+00 }, + { -2.904913085874448e-09, 3.118556605068443e+00 }, + { -2.902715489941767e-09, 3.116104766219928e+00 }, + { -2.900408608411958e-09, 3.113526161214776e+00 }, + { -2.897992528137022e-09, 3.110820428940251e+00 }, + { -2.895467340081818e-09, 3.107987213444579e+00 }, + { -2.892833139317615e-09, 3.105026163964191e+00 }, + { -2.890090025020589e-09, 3.101936934956479e+00 }, + { -2.887238100468092e-09, 3.098719186130021e+00 }, + { -2.884277473032614e-09, 3.095372582472161e+00 }, + { -2.881208254180937e-09, 3.091896794282404e+00 }, + { -2.878030559466594e-09, 3.088291497198199e+00 }, + { -2.874744508528832e-09, 3.084556372228054e+00 }, + { -2.871350225084755e-09, 3.080691105776848e+00 }, + { -2.867847836928063e-09, 3.076695389678615e+00 }, + { -2.864237475921086e-09, 3.072568921221621e+00 }, + { -2.860519277991847e-09, 3.068311403179147e+00 }, + { -2.856693383129018e-09, 3.063922543837792e+00 }, + { -2.852759935374575e-09, 3.059402057023109e+00 }, + { -2.848719082821403e-09, 3.054749662130841e+00 }, + { -2.844570977604520e-09, 3.049965084150782e+00 }, + { -2.840315775898525e-09, 3.045048053697736e+00 }, + { -2.835953637908582e-09, 3.039998307034967e+00 }, + { -2.831484727867511e-09, 3.034815586104635e+00 }, + { -2.826909214026628e-09, 3.029499638550941e+00 }, + { -2.822227268651470e-09, 3.024050217748861e+00 }, + { -2.817439068015245e-09, 3.018467082830179e+00 }, + { -2.812544792390175e-09, 3.012749998707001e+00 }, + { -2.807544626043751e-09, 3.006898736100911e+00 }, + { -2.802438757228650e-09, 3.000913071564665e+00 }, + { -2.797227378178760e-09, 2.994792787510961e+00 }, + { -2.791910685098702e-09, 2.988537672233504e+00 }, + { -2.786488878159805e-09, 2.982147519935565e+00 }, + { -2.780962161489413e-09, 2.975622130750641e+00 }, + { -2.775330743165298e-09, 2.968961310769028e+00 }, + { -2.769594835207775e-09, 2.962164872061613e+00 }, + { -2.763754653569747e-09, 2.955232632701135e+00 }, + { -2.757810418131543e-09, 2.948164416789036e+00 }, + { -2.751762352689432e-09, 2.940960054474719e+00 }, + { -2.745610684950541e-09, 2.933619381982341e+00 }, + { -2.739355646520809e-09, 2.926142241629213e+00 }, + { -2.732997472899722e-09, 2.918528481852205e+00 }, + { -2.726536403468318e-09, 2.910777957226018e+00 }, + { -2.719972681482232e-09, 2.902890528487386e+00 }, + { -2.713306554062453e-09, 2.894866062556452e+00 }, + { -2.706538272184154e-09, 2.886704432555728e+00 }, + { -2.699668090670078e-09, 2.878405517834426e+00 }, + { -2.692696268177908e-09, 2.869969203985464e+00 }, + { -2.685623067193599e-09, 2.861395382869544e+00 }, + { -2.678448754018380e-09, 2.852683952631486e+00 }, + { -2.671173598761847e-09, 2.843834817723832e+00 }, + { -2.663797875328991e-09, 2.834847888922988e+00 }, + { -2.656321861411517e-09, 2.825723083350459e+00 }, + { -2.648745838477759e-09, 2.816460324492298e+00 }, + { -2.641070091759922e-09, 2.807059542215146e+00 }, + { -2.633294910246296e-09, 2.797520672788269e+00 }, + { -2.625420586667340e-09, 2.787843658897949e+00 }, + { -2.617447417487602e-09, 2.778028449668942e+00 }, + { -2.609375702891616e-09, 2.768075000678399e+00 }, + { -2.601205746775692e-09, 2.757983273976943e+00 }, + { -2.592937856733464e-09, 2.747753238101915e+00 }, + { -2.584572344046340e-09, 2.737384868096553e+00 }, + { -2.576109523671634e-09, 2.726878145526201e+00 }, + { -2.567549714229129e-09, 2.716233058492422e+00 }, + { -2.558893237991435e-09, 2.705449601651722e+00 }, + { -2.550140420869302e-09, 2.694527776227857e+00 }, + { -2.541291592402089e-09, 2.683467590030445e+00 }, + { -2.532347085742440e-09, 2.672269057466213e+00 }, + { -2.523307237646751e-09, 2.660932199557362e+00 }, + { -2.514172388459584e-09, 2.649457043952206e+00 }, + { -2.504942882102813e-09, 2.637843624941622e+00 }, + { -2.495619066062810e-09, 2.626091983472908e+00 }, + { -2.486201291375123e-09, 2.614202167160335e+00 }, + { -2.476689912614465e-09, 2.602174230302269e+00 }, + { -2.467085287878098e-09, 2.590008233889805e+00 }, + { -2.457387778775451e-09, 2.577704245623143e+00 }, + { -2.447597750411553e-09, 2.565262339920002e+00 }, + { -2.437715571376127e-09, 2.552682597931055e+00 }, + { -2.427741613727123e-09, 2.539965107548168e+00 }, + { -2.417676252978335e-09, 2.527109963417675e+00 }, + { -2.407519868085581e-09, 2.514117266951687e+00 }, + { -2.397272841430131e-09, 2.500987126335739e+00 }, + { -2.386935558807595e-09, 2.487719656543254e+00 }, + { -2.376508409410024e-09, 2.474314979341178e+00 }, + { -2.365991785814531e-09, 2.460773223303822e+00 }, + { -2.355386083965131e-09, 2.447094523817833e+00 }, + { -2.344691703161363e-09, 2.433279023095734e+00 }, + { -2.333909046040126e-09, 2.419326870180582e+00 }, + { -2.323038518562289e-09, 2.405238220956597e+00 }, + { -2.312080529997549e-09, 2.391013238157397e+00 }, + { -2.301035492907384e-09, 2.376652091371587e+00 }, + { -2.289903823131822e-09, 2.362154957053137e+00 }, + { -2.278685939771276e-09, 2.347522018525197e+00 }, + { -2.267382265173420e-09, 2.332753465990296e+00 }, + { -2.255993224914501e-09, 2.317849496533128e+00 }, + { -2.244519247786155e-09, 2.302810314130351e+00 }, + { -2.232960765776561e-09, 2.287636129652823e+00 }, + { -2.221318214056095e-09, 2.272327160873552e+00 }, + { -2.209592030960763e-09, 2.256883632472565e+00 }, + { -2.197782657974034e-09, 2.241305776039511e+00 }, + { -2.185890539712767e-09, 2.225593830081461e+00 }, + { -2.173916123907886e-09, 2.209748040023618e+00 }, + { -2.161859861389976e-09, 2.193768658216360e+00 }, + { -2.149722206070124e-09, 2.177655943935795e+00 }, + { -2.137503614923981e-09, 2.161410163388424e+00 }, + { -2.125204547975352e-09, 2.145031589714984e+00 }, + { -2.112825468276292e-09, 2.128520502989477e+00 }, + { -2.100366841892917e-09, 2.111877190225612e+00 }, + { -2.087829137884807e-09, 2.095101945374541e+00 }, + { -2.075212828290086e-09, 2.078195069329960e+00 }, + { -2.062518388104923e-09, 2.061156869925600e+00 }, + { -2.049746295268559e-09, 2.043987661939897e+00 }, + { -2.036897030642658e-09, 2.026687767092888e+00 }, + { -2.023971077994576e-09, 2.009257514048162e+00 }, + { -2.010968923979840e-09, 1.991697238413571e+00 }, + { -1.997891058121344e-09, 1.974007282737320e+00 }, + { -1.984737972794098e-09, 1.956187996511354e+00 }, + { -1.971510163203686e-09, 1.938239736166060e+00 }, + { -1.958208127370276e-09, 1.920162865072273e+00 }, + { -1.944832366107339e-09, 1.901957753535934e+00 }, + { -1.931383383005451e-09, 1.883624778799427e+00 }, + { -1.917861684410531e-09, 1.865164325035177e+00 }, + { -1.904267779407432e-09, 1.846576783346324e+00 }, + { -1.890602179798714e-09, 1.827862551760622e+00 }, + { -1.876865400086483e-09, 1.809022035228338e+00 }, + { -1.863057957452539e-09, 1.790055645617624e+00 }, + { -1.849180371740008e-09, 1.770963801711725e+00 }, + { -1.835233165431475e-09, 1.751746929201178e+00 }, + { -1.821216863631569e-09, 1.732405460681919e+00 }, + { -1.807131994045840e-09, 1.712939835648088e+00 }, + { -1.792979086962494e-09, 1.693350500488565e+00 }, + { -1.778758675229683e-09, 1.673637908477153e+00 }, + { -1.764471294238191e-09, 1.653802519770021e+00 }, + { -1.750117481899733e-09, 1.633844801396848e+00 }, + { -1.735697778626995e-09, 1.613765227254186e+00 }, + { -1.721212727314574e-09, 1.593564278099856e+00 }, + { -1.706662873315474e-09, 1.573242441540939e+00 }, + { -1.692048764423848e-09, 1.552800212030258e+00 }, + { -1.677370950852395e-09, 1.532238090855187e+00 }, + { -1.662629985213192e-09, 1.511556586131055e+00 }, + { -1.647826422494560e-09, 1.490756212788764e+00 }, + { -1.632960820042537e-09, 1.469837492568651e+00 }, + { -1.618033737538645e-09, 1.448800954008929e+00 }, + { -1.603045736978760e-09, 1.427647132435469e+00 }, + { -1.587997382653428e-09, 1.406376569953373e+00 }, + { -1.572889241124034e-09, 1.384989815432507e+00 }, + { -1.557721881203696e-09, 1.363487424499449e+00 }, + { -1.542495873934815e-09, 1.341869959524515e+00 }, + { -1.527211792568486e-09, 1.320137989611176e+00 }, + { -1.511870212541253e-09, 1.298292090581491e+00 }, + { -1.496471711454994e-09, 1.276332844965754e+00 }, + { -1.481016869054634e-09, 1.254260841988828e+00 }, + { -1.465506267206068e-09, 1.232076677556547e+00 }, + { -1.449940489875303e-09, 1.209780954243628e+00 }, + { -1.434320123104372e-09, 1.187374281276747e+00 }, + { -1.418645754991533e-09, 1.164857274523495e+00 }, + { -1.402917975667710e-09, 1.142230556475749e+00 }, + { -1.387137377275425e-09, 1.119494756236361e+00 }, + { -1.371304553944712e-09, 1.096650509501278e+00 }, + { -1.355420101772623e-09, 1.073698458546610e+00 }, + { -1.339484618799891e-09, 1.050639252211352e+00 }, + { -1.323498704988051e-09, 1.027473545880543e+00 }, + { -1.307462962198534e-09, 1.004202001471034e+00 }, + { -1.291377994167204e-09, 9.808252874104182e-01 }, + { -1.275244406484394e-09, 9.573440786237052e-01 }, + { -1.259062806570190e-09, 9.337590565128454e-01 }, + { -1.242833803653464e-09, 9.100709089414796e-01 }, + { -1.226558008746195e-09, 8.862803302125812e-01 }, + { -1.210236034623253e-09, 8.623880210538113e-01 }, + { -1.193868495797618e-09, 8.383946885959868e-01 }, + { -1.177456008497777e-09, 8.143010463544786e-01 }, + { -1.160999190645010e-09, 7.901078142102129e-01 }, + { -1.144498661828833e-09, 7.658157183877095e-01 }, + { -1.127955043284965e-09, 7.414254914366063e-01 }, + { -1.111368957870986e-09, 7.169378722095157e-01 }, + { -1.094741030044308e-09, 6.923536058430697e-01 }, + { -1.078071885836393e-09, 6.676734437331688e-01 }, + { -1.061362152831423e-09, 6.428981435165511e-01 }, + { -1.044612460141255e-09, 6.180284690466404e-01 }, + { -1.027823438382183e-09, 5.930651903718045e-01 }, + { -1.010995719652015e-09, 5.680090837138436e-01 }, + { -9.941299375042378e-10, 5.428609314418970e-01 }, + { -9.772267269262058e-10, 5.176215220520872e-01 }, + { -9.602867243141016e-10, 4.922916501421032e-01 }, + { -9.433105674499058e-10, 4.668721163885412e-01 }, + { -9.262988954758817e-10, 4.413637275202624e-01 }, + { -9.092523488719689e-10, 4.157672962958654e-01 }, + { -8.921715694311144e-10, 3.900836414778084e-01 }, + { -8.750572002347607e-10, 3.643135878065193e-01 }, + { -8.579098856296589e-10, 3.384579659762392e-01 }, + { -8.407302712022458e-10, 3.125176126069478e-01 }, + { -8.235190037551917e-10, 2.864933702193017e-01 }, + { -8.062767312831008e-10, 2.603860872080448e-01 }, + { -7.890041029479477e-10, 2.341966178147619e-01 }, + { -7.717017690542486e-10, 2.079258220999725e-01 }, + { -7.543703810250266e-10, 1.815745659161734e-01 }, + { -7.370105913774597e-10, 1.551437208801425e-01 }, + { -7.196230536974697e-10, 1.286341643433767e-01 }, + { -7.022084226165876e-10, 1.020467793657360e-01 }, + { -6.847673537853251e-10, 7.538245468350446e-02 }, + { -6.673005038502516e-10, 4.864208468284503e-02 }, + { -6.498085304282128e-10, 2.182656936863137e-02 }, + { -6.322920920826137e-10, -5.063185663820913e-03 }, + { -6.147518482969490e-10, -3.202626926150343e-02 }, + { -5.971884594516681e-10, -5.906176474160862e-02 }, + { -5.796025867984469e-10, -8.616874992366363e-02 }, + { -5.619948924353588e-10, -1.133462971605448e-01 }, + { -5.443660392823640e-10, -1.405934733692621e-01 }, + { -5.267166910556339e-10, -1.679093400638023e-01 }, + { -5.090475122431451e-10, -1.952929533862739e-01 }, + { -4.913591680795342e-10, -2.227433641394564e-01 }, + { -4.736523245210571e-10, -2.502596178194491e-01 }, + { -4.559276482202303e-10, -2.778407546490776e-01 }, + { -4.381858065011618e-10, -3.054858096104932e-01 }, + { -4.204274673340870e-10, -3.331938124792702e-01 }, + { -4.026532993105397e-10, -3.609637878577768e-01 }, + { -3.848639716178888e-10, -3.887947552098022e-01 }, + { -3.670601540142443e-10, -4.166857288948674e-01 }, + { -3.492425168032583e-10, -4.446357182029681e-01 }, + { -3.314117308088734e-10, -4.726437273896633e-01 }, + { -3.135684673501752e-10, -5.007087557112619e-01 }, + { -2.957133982159296e-10, -5.288297974607742e-01 }, + { -2.778471956393828e-10, -5.570058420037128e-01 }, + { -2.599705322729564e-10, -5.852358738143247e-01 }, + { -2.420840811628366e-10, -6.135188725122560e-01 }, + { -2.241885157240923e-10, -6.418538128986450e-01 }, + { -2.062845097142585e-10, -6.702396649949099e-01 }, + { -1.883727372093546e-10, -6.986753940779493e-01 }, + { -1.704538725773087e-10, -7.271599607197149e-01 }, + { -1.525285904532877e-10, -7.556923208240308e-01 }, + { -1.345975657140748e-10, -7.842714256651911e-01 }, + { -1.166614734526054e-10, -8.128962219265712e-01 }, + { -9.872098895260891e-11, -8.415656517393372e-01 }, + { -8.077678766314517e-11, -8.702786527215916e-01 }, + { -6.282954517324612e-11, -8.990341580176152e-01 }, + { -4.487993718655790e-11, -9.278310963373758e-01 }, + { -2.692863949561210e-11, -9.566683919968972e-01 }, + { -8.976327956520795e-12, -9.855449649582175e-01 }, + { 8.976321536169872e-12, -1.014459730869357e+00 }, + { 2.692863307547294e-11, -1.043411601105914e+00 }, + { 4.487993076694813e-11, -1.072399482811314e+00 }, + { 6.282953875437751e-11, -1.101422278938424e+00 }, + { 8.077678124517653e-11, -1.130478888291020e+00 }, + { 9.872098253591082e-11, -1.159568205565684e+00 }, + { 1.166614670373367e-10, -1.188689121393192e+00 }, + { 1.345975593005002e-10, -1.217840522381901e+00 }, + { 1.525285840416718e-10, -1.247021291159495e+00 }, + { 1.704538661678104e-10, -1.276230306415868e+00 }, + { 1.883727308022916e-10, -1.305466442946703e+00 }, + { 2.062845033098954e-10, -1.334728571696106e+00 }, + { 2.241885093225349e-10, -1.364015559800721e+00 }, + { 2.420840747645085e-10, -1.393326270633325e+00 }, + { 2.599705258779635e-10, -1.422659563847049e+00 }, + { 2.778471892479898e-10, -1.452014295419243e+00 }, + { 2.957133918284542e-10, -1.481389317696831e+00 }, + { 3.135684609667761e-10, -1.510783479440191e+00 }, + { 3.314117244297624e-10, -1.540195625869043e+00 }, + { 3.492425104288060e-10, -1.569624598707558e+00 }, + { 3.670601476445565e-10, -1.599069236228850e+00 }, + { 3.848639652533361e-10, -1.628528373302631e+00 }, + { 4.026532929512281e-10, -1.658000841439269e+00 }, + { 4.204274609803869e-10, -1.687485468837799e+00 }, + { 4.381858001531792e-10, -1.716981080430596e+00 }, + { 4.559276418782829e-10, -1.746486497931567e+00 }, + { 4.736523181853565e-10, -1.776000539882225e+00 }, + { 4.913591617503452e-10, -1.805522021699094e+00 }, + { 5.090475059206794e-10, -1.835049755721194e+00 }, + { 5.267166847401562e-10, -1.864582551257262e+00 }, + { 5.443660329740862e-10, -1.894119214633676e+00 }, + { 5.619948861345454e-10, -1.923658549242818e+00 }, + { 5.796025805053097e-10, -1.953199355591180e+00 }, + { 5.971884531664190e-10, -1.982740431347091e+00 }, + { 6.147518420199055e-10, -2.012280571390674e+00 }, + { 6.322920858139346e-10, -2.041818567861395e+00 }, + { 6.498085241682158e-10, -2.071353210208005e+00 }, + { 6.673004975990425e-10, -2.100883285238127e+00 }, + { 6.847673475432746e-10, -2.130407577166309e+00 }, + { 7.022084163838545e-10, -2.159924867664933e+00 }, + { 7.196230474743716e-10, -2.189433935913779e+00 }, + { 7.370105851640495e-10, -2.218933558650552e+00 }, + { 7.543703748217808e-10, -2.248422510220072e+00 }, + { 7.717017628611672e-10, -2.277899562625407e+00 }, + { 7.890040967654542e-10, -2.307363485579104e+00 }, + { 8.062767251113011e-10, -2.336813046552684e+00 }, + { 8.235189975944034e-10, -2.366247010829556e+00 }, + { 8.407302650525749e-10, -2.395664141553858e+00 }, + { 8.579098794915287e-10, -2.425063199784153e+00 }, + { 8.750571941082773e-10, -2.454442944543319e+00 }, + { 8.921715633164894e-10, -2.483802132872044e+00 }, + { 9.092523427695200e-10, -2.513139519878584e+00 }, + { 9.262988893857148e-10, -2.542453858792682e+00 }, + { 9.433105613723914e-10, -2.571743901017465e+00 }, + { 9.602867182493987e-10, -2.601008396180870e+00 }, + { 9.772267208744730e-10, -2.630246092190425e+00 }, + { 9.941299314658458e-10, -2.659455735283526e+00 }, + { 1.010995713627070e-09, -2.688636070081818e+00 }, + { 1.027823432371055e-09, -2.717785839644439e+00 }, + { 1.044612454143997e-09, -2.746903785521352e+00 }, + { 1.061362146848353e-09, -2.775988647805256e+00 }, + { 1.078071879867828e-09, -2.805039165187255e+00 }, + { 1.094741024090249e-09, -2.834054075009077e+00 }, + { 1.111368951931856e-09, -2.863032113318052e+00 }, + { 1.127955037360817e-09, -2.891972014920939e+00 }, + { 1.144498655920037e-09, -2.920872513436805e+00 }, + { 1.160999184751779e-09, -2.949732341353290e+00 }, + { 1.177456002620215e-09, -2.978550230079517e+00 }, + { 1.193868489936097e-09, -3.007324910002949e+00 }, + { 1.210236028777826e-09, -3.036055110540183e+00 }, + { 1.226558002917232e-09, -3.064739560196251e+00 }, + { 1.242833797841123e-09, -3.093376986616735e+00 }, + { 1.259062800774685e-09, -3.121966116643377e+00 }, + { 1.275244400705935e-09, -3.150505676371791e+00 }, + { 1.291377988406056e-09, -3.178994391202159e+00 }, + { 1.307462956454857e-09, -3.207430985899192e+00 }, + { 1.323498699262108e-09, -3.235814184645077e+00 }, + { 1.339484613091842e-09, -3.264142711097884e+00 }, + { 1.355420096082785e-09, -3.292415288443373e+00 }, + { 1.371304548273191e-09, -3.320630639454825e+00 }, + { 1.387137371622433e-09, -3.348787486547389e+00 }, + { 1.402917970033511e-09, -3.376884551834256e+00 }, + { 1.418645749376393e-09, -3.404920557184582e+00 }, + { 1.434320117508396e-09, -3.432894224276359e+00 }, + { 1.449940484298756e-09, -3.460804274656981e+00 }, + { 1.465506261649108e-09, -3.488649429796768e+00 }, + { 1.481016863517580e-09, -3.516428411149154e+00 }, + { 1.496471705937951e-09, -3.544139940202303e+00 }, + { 1.511870207044433e-09, -3.571782738540999e+00 }, + { 1.527211787092206e-09, -3.599355527901174e+00 }, + { 1.542495868479076e-09, -3.626857030226671e+00 }, + { 1.557721875768920e-09, -3.654285967729458e+00 }, + { 1.572889235710329e-09, -3.681641062941412e+00 }, + { 1.587997377261005e-09, -3.708921038776707e+00 }, + { 1.603045731607830e-09, -3.736124618586623e+00 }, + { 1.618033732189314e-09, -3.763250526218862e+00 }, + { 1.632960814715177e-09, -3.790297486071938e+00 }, + { 1.647826417189275e-09, -3.817264223155802e+00 }, + { 1.662629979930247e-09, -3.844149463148589e+00 }, + { 1.677370945591844e-09, -3.870951932452996e+00 }, + { 1.692048759186008e-09, -3.897670358257890e+00 }, + { 1.706662868100504e-09, -3.924303468590212e+00 }, + { 1.721212722122685e-09, -3.950849992378278e+00 }, + { 1.735697773458400e-09, -3.977308659506432e+00 }, + { 1.750117476754591e-09, -4.003678200876669e+00 }, + { 1.764471289116712e-09, -4.029957348461003e+00 }, + { 1.778758670132079e-09, -4.056144835364877e+00 }, + { 1.792979081888926e-09, -4.082239395882965e+00 }, + { 1.807131988996465e-09, -4.108239765556996e+00 }, + { 1.821216858606652e-09, -4.134144681236933e+00 }, + { 1.835233160431175e-09, -4.159952881133585e+00 }, + { 1.849180366764537e-09, -4.185663104882633e+00 }, + { 1.863057952502055e-09, -4.211274093599509e+00 }, + { 1.876865395161145e-09, -4.236784589940537e+00 }, + { 1.890602174898734e-09, -4.262193338157148e+00 }, + { 1.904267774533022e-09, -4.287499084158302e+00 }, + { 1.917861679562008e-09, -4.312700575567174e+00 }, + { 1.931383378182392e-09, -4.337796561778708e+00 }, + { 1.944832361310856e-09, -4.362785794021793e+00 }, + { 1.958208122599839e-09, -4.387667025411434e+00 }, + { 1.971510158459931e-09, -4.412439011013396e+00 }, + { 1.984737968076495e-09, -4.437100507898339e+00 }, + { 1.997891053431005e-09, -4.461650275204912e+00 }, + { 2.010968919316289e-09, -4.486087074191693e+00 }, + { 2.023971073358447e-09, -4.510409668301784e+00 }, + { 2.036897026033634e-09, -4.534616823217992e+00 }, + { 2.049746290686799e-09, -4.558707306921882e+00 }, + { 2.062518383551274e-09, -4.582679889754607e+00 }, + { 2.075212823764071e-09, -4.606533344469879e+00 }, + { 2.087829133387063e-09, -4.630266446298172e+00 }, + { 2.100366837422912e-09, -4.653877973001258e+00 }, + { 2.112825463835087e-09, -4.677366704934605e+00 }, + { 2.125204543562522e-09, -4.700731425099899e+00 }, + { 2.137503610540056e-09, -4.723970919208608e+00 }, + { 2.149722201714786e-09, -4.747083975738060e+00 }, + { 2.161859857063438e-09, -4.770069385989595e+00 }, + { 2.173916119610994e-09, -4.792925944149308e+00 }, + { 2.185890535445098e-09, -4.815652447340950e+00 }, + { 2.197782653735957e-09, -4.838247695689436e+00 }, + { 2.209592026751962e-09, -4.860710492376411e+00 }, + { 2.221318209877576e-09, -4.883039643700314e+00 }, + { 2.232960761627846e-09, -4.905233959130168e+00 }, + { 2.244519243667616e-09, -4.927292251368517e+00 }, + { 2.255993220826402e-09, -4.949213336406265e+00 }, + { 2.267382261115285e-09, -4.970996033581527e+00 }, + { 2.278685935744269e-09, -4.992639165639563e+00 }, + { 2.289903819135414e-09, -5.014141558784778e+00 }, + { 2.301035488942000e-09, -5.035502042744443e+00 }, + { 2.312080526062763e-09, -5.056719450823151e+00 }, + { 2.323038514659161e-09, -5.077792619963239e+00 }, + { 2.333909042168180e-09, -5.098720390796817e+00 }, + { 2.344691699320969e-09, -5.119501607709159e+00 }, + { 2.355386080156553e-09, -5.140135118892792e+00 }, + { 2.365991782037187e-09, -5.160619776404897e+00 }, + { 2.376508405665132e-09, -5.180954436227641e+00 }, + { 2.386935555094626e-09, -5.201137958319343e+00 }, + { 2.397272837749508e-09, -5.221169206676762e+00 }, + { 2.407519864436774e-09, -5.241047049389645e+00 }, + { 2.417676249362563e-09, -5.260770358700167e+00 }, + { 2.427741610143750e-09, -5.280338011053974e+00 }, + { 2.437715567825576e-09, -5.299748887163106e+00 }, + { 2.447597746894037e-09, -5.319001872058887e+00 }, + { 2.457387775290440e-09, -5.338095855149190e+00 }, + { 2.467085284426756e-09, -5.357029730277389e+00 }, + { 2.476689909196263e-09, -5.375802395772283e+00 }, + { 2.486201287990485e-09, -5.394412754510426e+00 }, + { 2.495619062711154e-09, -5.412859713968929e+00 }, + { 2.504942878785408e-09, -5.431142186284682e+00 }, + { 2.514172385175743e-09, -5.449259088303476e+00 }, + { 2.523307234396791e-09, -5.467209341642627e+00 }, + { 2.532347082526785e-09, -5.484991872743321e+00 }, + { 2.541291589219998e-09, -5.502605612925014e+00 }, + { 2.550140417722072e-09, -5.520049498445633e+00 }, + { 2.558893234878378e-09, -5.537322470548212e+00 }, + { 2.567549711150773e-09, -5.554423475524196e+00 }, + { 2.576109520627371e-09, -5.571351464763084e+00 }, + { 2.584572341037361e-09, -5.588105394812198e+00 }, + { 2.592937853759161e-09, -5.604684227423386e+00 }, + { 2.601205743836355e-09, -5.621086929615246e+00 }, + { 2.609375699987564e-09, -5.637312473723475e+00 }, + { 2.617447414618146e-09, -5.653359837454964e+00 }, + { 2.625420583833750e-09, -5.669228003945694e+00 }, + { 2.633294907447937e-09, -5.684915961806963e+00 }, + { 2.641070088997271e-09, -5.700422705186584e+00 }, + { 2.648745835750128e-09, -5.715747233817712e+00 }, + { 2.656321858720176e-09, -5.730888553077074e+00 }, + { 2.663797872673252e-09, -5.745845674030161e+00 }, + { 2.671173596142054e-09, -5.760617613492118e+00 }, + { 2.678448751434797e-09, -5.775203394076705e+00 }, + { 2.685623064645538e-09, -5.789602044248679e+00 }, + { 2.692696265666640e-09, -5.803812598380606e+00 }, + { 2.699668088194915e-09, -5.817834096797069e+00 }, + { 2.706538269745573e-09, -5.831665585834668e+00 }, + { 2.713306551659817e-09, -5.845306117889361e+00 }, + { 2.719972679116734e-09, -5.858754751472542e+00 }, + { 2.726536401139295e-09, -5.872010551255358e+00 }, + { 2.732997470607439e-09, -5.885072588127400e+00 }, + { 2.739355644265558e-09, -5.897939939244211e+00 }, + { 2.745610682731633e-09, -5.910611688078208e+00 }, + { 2.751762350508137e-09, -5.923086924473290e+00 }, + { 2.757810415987146e-09, -5.935364744687794e+00 }, + { 2.763754651462700e-09, -5.947444251452243e+00 }, + { 2.769594833137415e-09, -5.959324554015538e+00 }, + { 2.775330741132843e-09, -5.971004768198829e+00 }, + { 2.780962159494174e-09, -5.982484016437981e+00 }, + { 2.786488876202047e-09, -5.993761427840588e+00 }, + { 2.791910683178690e-09, -6.004836138231525e+00 }, + { 2.797227376295779e-09, -6.015707290202086e+00 }, + { 2.802438755383971e-09, -6.026374033162623e+00 }, + { 2.807544624236659e-09, -6.036835523383457e+00 }, + { 2.812544790621093e-09, -6.047090924050914e+00 }, + { 2.817439066283459e-09, -6.057139405311101e+00 }, + { 2.822227266958278e-09, -6.066980144322601e+00 }, + { 2.826909212371261e-09, -6.076612325295799e+00 }, + { 2.831484726250221e-09, -6.086035139548830e+00 }, + { 2.835953636329660e-09, -6.095247785550617e+00 }, + { 2.840315774357203e-09, -6.104249468967751e+00 }, + { 2.844570976102082e-09, -6.113039402715685e+00 }, + { 2.848719081357095e-09, -6.121616806996519e+00 }, + { 2.852759933948860e-09, -6.129980909353977e+00 }, + { 2.856693381741114e-09, -6.138130944714082e+00 }, + { 2.860519276643053e-09, -6.146066155436312e+00 }, + { 2.864237474610633e-09, -6.153785791350256e+00 }, + { 2.867847835656203e-09, -6.161289109809551e+00 }, + { 2.871350223851726e-09, -6.168575375732642e+00 }, + { 2.874744507333867e-09, -6.175643861647406e+00 }, + { 2.878030558310989e-09, -6.182493847739853e+00 }, + { 2.881208253063899e-09, -6.189124621889823e+00 }, + { 2.884277471954592e-09, -6.195535479723423e+00 }, + { 2.887238099428306e-09, -6.201725724651554e+00 }, + { 2.890090024020323e-09, -6.207694667918394e+00 }, + { 2.892833138356060e-09, -6.213441628635915e+00 }, + { 2.895467339159240e-09, -6.218965933835304e+00 }, + { 2.897992527253659e-09, -6.224266918505075e+00 }, + { 2.900408607567016e-09, -6.229343925633495e+00 }, + { 2.902715489136496e-09, -6.234196306254763e+00 }, + { 2.904913085108075e-09, -6.238823419482017e+00 }, + { 2.907001312743911e-09, -6.243224632557377e+00 }, + { 2.908980093422997e-09, -6.247399320887848e+00 }, + { 2.910849352646620e-09, -6.251346868091392e+00 }, + { 2.912609020036956e-09, -6.255066666028537e+00 }, + { 2.914259029343965e-09, -6.258558114851525e+00 }, + { 2.915799318445710e-09, -6.261820623039620e+00 }, + { 2.917229829350759e-09, -6.264853607438842e+00 }, + { 2.918550508202463e-09, -6.267656493305673e+00 }, + { 2.919761305276718e-09, -6.270228714337005e+00 }, + { 2.920862174988150e-09, -6.272569712717951e+00 }, + { 2.921853075889193e-09, -6.274678939154603e+00 }, + { 2.922733970674264e-09, -6.276555852917634e+00 }, + { 2.923504826176907e-09, -6.278199921870962e+00 }, + { 2.924165613375264e-09, -6.279610622518139e+00 }, + { 2.924716307391075e-09, -6.280787440034993e+00 }, + { 2.925156887490598e-09, -6.281729868306345e+00 }, + { 2.925487337087508e-09, -6.282437409966992e+00 }, + { 2.925707643739298e-09, -6.282909576428774e+00 }, + { 2.925817799151970e-09, -6.283145887925411e+00 }, diff --git a/gnuradio-runtime/lib/math/vco.h b/gnuradio-runtime/lib/math/vco.h index 7ac1e1ca6d..1687de6af7 100644 --- a/gnuradio-runtime/lib/math/vco.h +++ b/gnuradio-runtime/lib/math/vco.h @@ -32,83 +32,85 @@ namespace gr { - /*! - * \brief base class template for Voltage Controlled Oscillator (VCO) - * \ingroup misc - */ - template<class o_type, class i_type> - class vco - { - public: +/*! + * \brief base class template for Voltage Controlled Oscillator (VCO) + * \ingroup misc + */ +template <class o_type, class i_type> +class vco +{ +public: vco() : d_phase(0) {} virtual ~vco() {} // radians - void set_phase(double angle) { - d_phase = angle; - } + void set_phase(double angle) { d_phase = angle; } - void adjust_phase(double delta_phase) { - d_phase += delta_phase; - if(fabs (d_phase) > GR_M_PI){ + void adjust_phase(double delta_phase) + { + d_phase += delta_phase; + if (fabs(d_phase) > GR_M_PI) { - while(d_phase > GR_M_PI) - d_phase -= 2*GR_M_PI; + while (d_phase > GR_M_PI) + d_phase -= 2 * GR_M_PI; - while(d_phase < -GR_M_PI) - d_phase += 2*GR_M_PI; - } + while (d_phase < -GR_M_PI) + d_phase += 2 * GR_M_PI; + } } double get_phase() const { return d_phase; } // compute sin and cos for current phase angle - void sincos(float *sinx, float *cosx) const; + void sincos(float* sinx, float* cosx) const; - void sincos(gr_complex *output, const float *input, - int noutput_items, double k, double ampl = 1.0); + void sincos(gr_complex* output, + const float* input, + int noutput_items, + double k, + double ampl = 1.0); // compute cos or sin for current phase angle float cos() const { return std::cos(d_phase); } float sin() const { return std::sin(d_phase); } // compute a block at a time - void cos(float *output, const float *input, - int noutput_items, double k, double ampl = 1.0); + void cos(float* output, + const float* input, + int noutput_items, + double k, + double ampl = 1.0); - protected: +protected: double d_phase; - }; +}; - template<class o_type, class i_type> - void - vco<o_type,i_type>::sincos(float *sinx, float *cosx) const - { +template <class o_type, class i_type> +void vco<o_type, i_type>::sincos(float* sinx, float* cosx) const +{ gr::sincosf(d_phase, sinx, cosx); - } - - template<class o_type, class i_type> - void - vco<o_type,i_type>::sincos(gr_complex *output, const float *input, - int noutput_items, double k, double ampl) - { - for(int i = 0; i < noutput_items; i++) { - output[i] = gr_complex(cos() * ampl, sin() * ampl); - adjust_phase(input[i] * k); +} + +template <class o_type, class i_type> +void vco<o_type, i_type>::sincos( + gr_complex* output, const float* input, int noutput_items, double k, double ampl) +{ + for (int i = 0; i < noutput_items; i++) { + output[i] = gr_complex(cos() * ampl, sin() * ampl); + adjust_phase(input[i] * k); } - } - - template<class o_type, class i_type> - void - vco<o_type,i_type>::cos(float *output, const float *input, - int noutput_items, double k, double ampl) - { - for(int i = 0; i < noutput_items; i++) { - output[i] = cos() * ampl; - adjust_phase(input[i] * k); +} + +template <class o_type, class i_type> +void vco<o_type, i_type>::cos( + float* output, const float* input, int noutput_items, double k, double ampl) +{ + for (int i = 0; i < noutput_items; i++) { + output[i] = cos() * ampl; + adjust_phase(input[i] * k); } - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/message.cc b/gnuradio-runtime/lib/message.cc index ac066d668e..9872caf61d 100644 --- a/gnuradio-runtime/lib/message.cc +++ b/gnuradio-runtime/lib/message.cc @@ -30,53 +30,47 @@ namespace gr { - static long s_ncurrently_allocated = 0; +static long s_ncurrently_allocated = 0; - message::sptr - message::make(long type, double arg1, double arg2, size_t length) - { +message::sptr message::make(long type, double arg1, double arg2, size_t length) +{ return message::sptr(new message(type, arg1, arg2, length)); - } +} - message::sptr - message::make_from_string(const std::string s, long type, double arg1, double arg2) - { +message::sptr +message::make_from_string(const std::string s, long type, double arg1, double arg2) +{ message::sptr m = message::make(type, arg1, arg2, s.size()); memcpy(m->msg(), s.data(), s.size()); return m; - } +} - message::message(long type, double arg1, double arg2, size_t length) +message::message(long type, double arg1, double arg2, size_t length) : d_type(type), d_arg1(arg1), d_arg2(arg2) - { - if(length == 0) - d_buf_start = d_msg_start = d_msg_end = d_buf_end = 0; +{ + if (length == 0) + d_buf_start = d_msg_start = d_msg_end = d_buf_end = 0; else { - d_buf_start = new unsigned char[length]; - d_msg_start = d_buf_start; - d_msg_end = d_buf_end = d_buf_start + length; + d_buf_start = new unsigned char[length]; + d_msg_start = d_buf_start; + d_msg_end = d_buf_end = d_buf_start + length; } s_ncurrently_allocated++; - } +} - message::~message() - { - assert (d_next == 0); - delete [] d_buf_start; +message::~message() +{ + assert(d_next == 0); + delete[] d_buf_start; d_msg_start = d_msg_end = d_buf_end = 0; s_ncurrently_allocated--; - } +} - std::string - message::to_string() const - { - return std::string((char *)d_msg_start, length()); - } +std::string message::to_string() const +{ + return std::string((char*)d_msg_start, length()); +} - long - message_ncurrently_allocated() - { - return s_ncurrently_allocated; - } +long message_ncurrently_allocated() { return s_ncurrently_allocated; } } /* namespace gr */ diff --git a/gnuradio-runtime/lib/messages/msg_accepter.cc b/gnuradio-runtime/lib/messages/msg_accepter.cc index cc86a6ff8a..f6a0d957aa 100644 --- a/gnuradio-runtime/lib/messages/msg_accepter.cc +++ b/gnuradio-runtime/lib/messages/msg_accepter.cc @@ -27,12 +27,12 @@ #include <gnuradio/messages/msg_accepter.h> namespace gr { - namespace messages { +namespace messages { - msg_accepter::~msg_accepter() - { - // NOP, required as virtual destructor - } +msg_accepter::~msg_accepter() +{ + // NOP, required as virtual destructor +} - } /* namespace messages */ +} /* namespace messages */ } /* namespace gr */ diff --git a/gnuradio-runtime/lib/messages/msg_accepter_msgq.cc b/gnuradio-runtime/lib/messages/msg_accepter_msgq.cc index 7ee6ea02c1..b2db5105d5 100644 --- a/gnuradio-runtime/lib/messages/msg_accepter_msgq.cc +++ b/gnuradio-runtime/lib/messages/msg_accepter_msgq.cc @@ -26,23 +26,16 @@ #include <gnuradio/messages/msg_accepter_msgq.h> namespace gr { - namespace messages { +namespace messages { - msg_accepter_msgq::msg_accepter_msgq(msg_queue_sptr msgq) - : d_msg_queue(msgq) - { - } +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 - } +msg_accepter_msgq::~msg_accepter_msgq() +{ + // NOP, required as virtual destructor +} - void - msg_accepter_msgq::post(pmt::pmt_t msg) - { - d_msg_queue->insert_tail(msg); - } +void msg_accepter_msgq::post(pmt::pmt_t msg) { d_msg_queue->insert_tail(msg); } - } /* namespace messages */ +} /* namespace messages */ } /* namespace gr */ diff --git a/gnuradio-runtime/lib/messages/msg_producer.cc b/gnuradio-runtime/lib/messages/msg_producer.cc index 3f56bc6637..19ced499b0 100644 --- a/gnuradio-runtime/lib/messages/msg_producer.cc +++ b/gnuradio-runtime/lib/messages/msg_producer.cc @@ -27,12 +27,12 @@ #include <gnuradio/messages/msg_producer.h> namespace gr { - namespace messages { +namespace messages { - msg_producer::~msg_producer() - { - // NOP, required as virtual destructor - } +msg_producer::~msg_producer() +{ + // NOP, required as virtual destructor +} - } /* namespace messages */ +} /* namespace messages */ } /* namespace gr */ diff --git a/gnuradio-runtime/lib/messages/msg_queue.cc b/gnuradio-runtime/lib/messages/msg_queue.cc index 321b229358..6476ddc4ee 100644 --- a/gnuradio-runtime/lib/messages/msg_queue.cc +++ b/gnuradio-runtime/lib/messages/msg_queue.cc @@ -28,76 +28,65 @@ #include <stdexcept> namespace gr { - namespace messages { - - 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::pmt_t msg) - { - gr::thread::scoped_lock guard(d_mutex); - - while(full_p()) +namespace messages { + +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::pmt_t msg) +{ + gr::thread::scoped_lock guard(d_mutex); + + while (full_p()) d_not_full.wait(guard); - d_msgs.push_back(msg); - d_not_empty.notify_one(); - } + d_msgs.push_back(msg); + d_not_empty.notify_one(); +} - pmt::pmt_t - msg_queue::delete_head() - { - gr::thread::scoped_lock guard(d_mutex); +pmt::pmt_t msg_queue::delete_head() +{ + gr::thread::scoped_lock guard(d_mutex); - while(empty_p()) + while (empty_p()) d_not_empty.wait(guard); - pmt::pmt_t m(d_msgs.front()); - d_msgs.pop_front(); + pmt::pmt_t m(d_msgs.front()); + d_msgs.pop_front(); - if(d_limit > 0) // Unlimited length queues never block on write + if (d_limit > 0) // Unlimited length queues never block on write d_not_full.notify_one(); - return m; - } + return m; +} - pmt::pmt_t - msg_queue::delete_head_nowait() - { - gr::thread::scoped_lock guard(d_mutex); +pmt::pmt_t msg_queue::delete_head_nowait() +{ + gr::thread::scoped_lock guard(d_mutex); - if(empty_p()) + if (empty_p()) return pmt::pmt_t(); - pmt::pmt_t m(d_msgs.front()); - d_msgs.pop_front(); + pmt::pmt_t m(d_msgs.front()); + d_msgs.pop_front(); - if(d_limit > 0) // Unlimited length queues never block on write + if (d_limit > 0) // Unlimited length queues never block on write d_not_full.notify_one(); - return m; - } + return m; +} - void - msg_queue::flush() - { - while(delete_head_nowait() != pmt::pmt_t()) +void msg_queue::flush() +{ + while (delete_head_nowait() != pmt::pmt_t()) ; - } +} - } /* namespace messages */ +} /* namespace messages */ } /* namespace gr */ diff --git a/gnuradio-runtime/lib/misc.cc b/gnuradio-runtime/lib/misc.cc index f9ad6ca89c..22c9fbed99 100644 --- a/gnuradio-runtime/lib/misc.cc +++ b/gnuradio-runtime/lib/misc.cc @@ -28,43 +28,38 @@ namespace gr { - unsigned int - rounduppow2(unsigned int n) - { +unsigned int rounduppow2(unsigned int n) +{ int i; - for(i=0;((n-1)>>i) != 0;i++) - ; - return 1<<i; - } + for (i = 0; ((n - 1) >> i) != 0; i++) + ; + return 1 << i; +} - // ---------------------------------------------------------------- +// ---------------------------------------------------------------- - void - zero_vector(std::vector<float> &v) - { - for(unsigned int i=0; i < v.size(); i++) - v[i] = 0; - } +void zero_vector(std::vector<float>& v) +{ + for (unsigned int i = 0; i < v.size(); i++) + v[i] = 0; +} - void - zero_vector(std::vector<double> &v) - { - for(unsigned int i=0; i < v.size(); i++) - v[i] = 0; - } +void zero_vector(std::vector<double>& v) +{ + for (unsigned int i = 0; i < v.size(); i++) + v[i] = 0; +} - void - zero_vector(std::vector<int> &v) - { - for(unsigned int i=0; i < v.size(); i++) - v[i] = 0; - } +void zero_vector(std::vector<int>& v) +{ + for (unsigned int i = 0; i < v.size(); i++) + v[i] = 0; +} - void - zero_vector(std::vector<gr_complex> &v) - { - for(unsigned int i=0; i < v.size(); i++) - v[i] = 0; - } +void zero_vector(std::vector<gr_complex>& v) +{ + for (unsigned int i = 0; i < v.size(); i++) + v[i] = 0; +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/misc.h b/gnuradio-runtime/lib/misc.h index 833b6470a5..0d2df38138 100644 --- a/gnuradio-runtime/lib/misc.h +++ b/gnuradio-runtime/lib/misc.h @@ -28,14 +28,13 @@ namespace gr { - GR_RUNTIME_API unsigned int - rounduppow2(unsigned int n); +GR_RUNTIME_API unsigned int rounduppow2(unsigned int n); - // FIXME should be template - GR_RUNTIME_API void zero_vector(std::vector<float> &v); - GR_RUNTIME_API void zero_vector(std::vector<double> &v); - GR_RUNTIME_API void zero_vector(std::vector<int> &v); - GR_RUNTIME_API void zero_vector(std::vector<gr_complex> &v); +// FIXME should be template +GR_RUNTIME_API void zero_vector(std::vector<float>& v); +GR_RUNTIME_API void zero_vector(std::vector<double>& v); +GR_RUNTIME_API void zero_vector(std::vector<int>& v); +GR_RUNTIME_API void zero_vector(std::vector<gr_complex>& v); } /* namespace gr */ diff --git a/gnuradio-runtime/lib/msg_accepter.cc b/gnuradio-runtime/lib/msg_accepter.cc index 354fce0c3d..77870ad498 100644 --- a/gnuradio-runtime/lib/msg_accepter.cc +++ b/gnuradio-runtime/lib/msg_accepter.cc @@ -31,32 +31,29 @@ namespace gr { - msg_accepter::msg_accepter() - { - } +msg_accepter::msg_accepter() {} - msg_accepter::~msg_accepter() - { +msg_accepter::~msg_accepter() +{ // NOP, required as virtual destructor - } +} - void - msg_accepter::post(pmt::pmt_t which_port, pmt::pmt_t msg) - { +void msg_accepter::post(pmt::pmt_t which_port, pmt::pmt_t msg) +{ // Notify derived class, handled case by case - block *p = dynamic_cast<block *>(this); - if(p) { - p->_post(which_port, msg); - return; + block* p = dynamic_cast<block*>(this); + if (p) { + p->_post(which_port, msg); + return; } - hier_block2 *p2 = dynamic_cast<hier_block2 *>(this); - if(p2) { - // FIXME do the right thing - return; + hier_block2* p2 = dynamic_cast<hier_block2*>(this); + if (p2) { + // FIXME do the right thing + return; } throw std::runtime_error("unknown derived class"); - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/msg_handler.cc b/gnuradio-runtime/lib/msg_handler.cc index f23b424e1a..9f6e382609 100644 --- a/gnuradio-runtime/lib/msg_handler.cc +++ b/gnuradio-runtime/lib/msg_handler.cc @@ -28,8 +28,6 @@ namespace gr { - msg_handler::~msg_handler() - { - } +msg_handler::~msg_handler() {} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/msg_queue.cc b/gnuradio-runtime/lib/msg_queue.cc index 9961f76296..8ae4601309 100644 --- a/gnuradio-runtime/lib/msg_queue.cc +++ b/gnuradio-runtime/lib/msg_queue.cc @@ -29,62 +29,57 @@ namespace gr { - msg_queue::sptr - msg_queue::make(unsigned int limit) - { +msg_queue::sptr msg_queue::make(unsigned int limit) +{ return msg_queue::sptr(new msg_queue(limit)); - } +} - msg_queue::msg_queue(unsigned int limit) - : d_not_empty(), d_not_full(), - /*d_head(0), d_tail(0),*/ d_count(0), d_limit(limit) - { - } +msg_queue::msg_queue(unsigned int limit) + : d_not_empty(), + d_not_full(), + /*d_head(0), d_tail(0),*/ d_count(0), + d_limit(limit) +{ +} - msg_queue::~msg_queue() - { - flush (); - } +msg_queue::~msg_queue() { flush(); } - void - msg_queue::insert_tail(message::sptr msg) - { - if(msg->d_next) - throw std::invalid_argument("gr::msg_queue::insert_tail: msg already in queue"); +void msg_queue::insert_tail(message::sptr msg) +{ + if (msg->d_next) + throw std::invalid_argument("gr::msg_queue::insert_tail: msg already in queue"); gr::thread::scoped_lock guard(d_mutex); - while(full_p()) - d_not_full.wait(guard); - - if(d_tail == 0) { - d_tail = d_head = msg; - //msg->d_next = 0; - msg->d_next.reset(); - } - else { - d_tail->d_next = msg; - d_tail = msg; - //msg->d_next = 0; - msg->d_next.reset(); + while (full_p()) + d_not_full.wait(guard); + + if (d_tail == 0) { + d_tail = d_head = msg; + // msg->d_next = 0; + msg->d_next.reset(); + } else { + d_tail->d_next = msg; + d_tail = msg; + // msg->d_next = 0; + msg->d_next.reset(); } d_count++; d_not_empty.notify_one(); - } +} - message::sptr - msg_queue::delete_head() - { +message::sptr msg_queue::delete_head() +{ gr::thread::scoped_lock guard(d_mutex); message::sptr m; - while((m = d_head) == 0) - d_not_empty.wait(guard); + while ((m = d_head) == 0) + d_not_empty.wait(guard); d_head = m->d_next; - if(d_head == 0){ - //d_tail = 0; - d_tail.reset(); + if (d_head == 0) { + // d_tail = 0; + d_tail.reset(); } d_count--; @@ -92,39 +87,37 @@ namespace gr { m->d_next.reset(); d_not_full.notify_one(); return m; - } +} - message::sptr - msg_queue::delete_head_nowait() - { +message::sptr msg_queue::delete_head_nowait() +{ gr::thread::scoped_lock guard(d_mutex); message::sptr m; - if((m = d_head) == 0) { - //return 0; - return message::sptr(); + if ((m = d_head) == 0) { + // return 0; + return message::sptr(); } d_head = m->d_next; - if(d_head == 0) { - //d_tail = 0; - d_tail.reset(); + if (d_head == 0) { + // d_tail = 0; + d_tail.reset(); } d_count--; - //m->d_next = 0; + // m->d_next = 0; m->d_next.reset(); d_not_full.notify_one(); return m; - } +} - void - msg_queue::flush() - { +void msg_queue::flush() +{ message::sptr m; - while((m = delete_head_nowait ()) != 0) - ; - } + while ((m = delete_head_nowait()) != 0) + ; +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/pagesize.cc b/gnuradio-runtime/lib/pagesize.cc index 373c0b6654..3a58c3d8d7 100644 --- a/gnuradio-runtime/lib/pagesize.cc +++ b/gnuradio-runtime/lib/pagesize.cc @@ -31,29 +31,28 @@ namespace gr { #if defined(_WIN32) && defined(HAVE_GETPAGESIZE) - extern "C" size_t getpagesize(void); +extern "C" size_t getpagesize(void); #endif - int - pagesize() - { +int pagesize() +{ static int s_pagesize = -1; - if(s_pagesize == -1) { + if (s_pagesize == -1) { #if defined(HAVE_GETPAGESIZE) - s_pagesize = getpagesize(); -#elif defined (HAVE_SYSCONF) - s_pagesize = sysconf(_SC_PAGESIZE); - if(s_pagesize == -1) { - perror("_SC_PAGESIZE"); - s_pagesize = 4096; - } + s_pagesize = getpagesize(); +#elif defined(HAVE_SYSCONF) + s_pagesize = sysconf(_SC_PAGESIZE); + if (s_pagesize == -1) { + perror("_SC_PAGESIZE"); + s_pagesize = 4096; + } #else - fprintf(stderr, "gr::pagesize: no info; setting pagesize = 4096\n"); - s_pagesize = 4096; + fprintf(stderr, "gr::pagesize: no info; setting pagesize = 4096\n"); + s_pagesize = 4096; #endif } return s_pagesize; - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/pagesize.h b/gnuradio-runtime/lib/pagesize.h index 6a16882002..f7dffe2790 100644 --- a/gnuradio-runtime/lib/pagesize.h +++ b/gnuradio-runtime/lib/pagesize.h @@ -27,10 +27,10 @@ namespace gr { - /*! - * \brief return the page size in bytes - */ - GR_RUNTIME_API int pagesize(); +/*! + * \brief return the page size in bytes + */ +GR_RUNTIME_API int pagesize(); } /* namespace gr */ diff --git a/gnuradio-runtime/lib/pmt/pmt.cc b/gnuradio-runtime/lib/pmt/pmt.cc index e0f50b5b0b..4adb763e5f 100644 --- a/gnuradio-runtime/lib/pmt/pmt.cc +++ b/gnuradio-runtime/lib/pmt/pmt.cc @@ -36,30 +36,30 @@ namespace pmt { pmt_base::~pmt_base() { - // nop -- out of line virtual destructor + // nop -- out of line virtual destructor } //////////////////////////////////////////////////////////////////////////// // Exceptions //////////////////////////////////////////////////////////////////////////// -exception::exception(const std::string &msg, pmt_t obj) - : logic_error(msg + ": " + write_string(obj)) +exception::exception(const std::string& msg, pmt_t obj) + : logic_error(msg + ": " + write_string(obj)) { } -wrong_type::wrong_type(const std::string &msg, pmt_t obj) - : exception(msg + ": wrong_type ", obj) +wrong_type::wrong_type(const std::string& msg, pmt_t obj) + : exception(msg + ": wrong_type ", obj) { } -out_of_range::out_of_range(const std::string &msg, pmt_t obj) - : exception(msg + ": out of range ", obj) +out_of_range::out_of_range(const std::string& msg, pmt_t obj) + : exception(msg + ": out of range ", obj) { } -notimplemented::notimplemented(const std::string &msg, pmt_t obj) - : exception(msg + ": notimplemented ", obj) +notimplemented::notimplemented(const std::string& msg, pmt_t obj) + : exception(msg + ": notimplemented ", obj) { } @@ -67,65 +67,28 @@ notimplemented::notimplemented(const std::string &msg, pmt_t obj) // Dynamic Casts //////////////////////////////////////////////////////////////////////////// -static pmt_symbol * -_symbol(pmt_t x) -{ - return dynamic_cast<pmt_symbol*>(x.get()); -} +static pmt_symbol* _symbol(pmt_t x) { return dynamic_cast<pmt_symbol*>(x.get()); } -static pmt_integer * -_integer(pmt_t x) -{ - return dynamic_cast<pmt_integer*>(x.get()); -} +static pmt_integer* _integer(pmt_t x) { return dynamic_cast<pmt_integer*>(x.get()); } -static pmt_uint64 * -_uint64(pmt_t x) -{ - return dynamic_cast<pmt_uint64*>(x.get()); -} +static pmt_uint64* _uint64(pmt_t x) { return dynamic_cast<pmt_uint64*>(x.get()); } -static pmt_real * -_real(pmt_t x) -{ - return dynamic_cast<pmt_real*>(x.get()); -} +static pmt_real* _real(pmt_t x) { return dynamic_cast<pmt_real*>(x.get()); } -static pmt_complex * -_complex(pmt_t x) -{ - return dynamic_cast<pmt_complex*>(x.get()); -} +static pmt_complex* _complex(pmt_t x) { return dynamic_cast<pmt_complex*>(x.get()); } -static pmt_pair * -_pair(pmt_t x) -{ - return dynamic_cast<pmt_pair*>(x.get()); -} +static pmt_pair* _pair(pmt_t x) { return dynamic_cast<pmt_pair*>(x.get()); } -static pmt_vector * -_vector(pmt_t x) -{ - return dynamic_cast<pmt_vector*>(x.get()); -} +static pmt_vector* _vector(pmt_t x) { return dynamic_cast<pmt_vector*>(x.get()); } -static pmt_tuple * -_tuple(pmt_t x) -{ - return dynamic_cast<pmt_tuple*>(x.get()); -} +static pmt_tuple* _tuple(pmt_t x) { return dynamic_cast<pmt_tuple*>(x.get()); } -static pmt_uniform_vector * -_uniform_vector(pmt_t x) +static pmt_uniform_vector* _uniform_vector(pmt_t x) { - return dynamic_cast<pmt_uniform_vector*>(x.get()); + return dynamic_cast<pmt_uniform_vector*>(x.get()); } -static pmt_any * -_any(pmt_t x) -{ - return dynamic_cast<pmt_any*>(x.get()); -} +static pmt_any* _any(pmt_t x) { return dynamic_cast<pmt_any*>(x.get()); } //////////////////////////////////////////////////////////////////////////// // Globals @@ -133,167 +96,132 @@ _any(pmt_t x) pmt_t get_PMT_NIL() { - static pmt_t _NIL = pmt_t(new pmt_null()); - return _NIL; + static pmt_t _NIL = pmt_t(new pmt_null()); + return _NIL; } pmt_t get_PMT_T() { - static const pmt_t _T = pmt_t(new pmt_bool()); - return _T; + static const pmt_t _T = pmt_t(new pmt_bool()); + return _T; } pmt_t get_PMT_F() { - static const pmt_t _F = pmt_t(new pmt_bool()); - return _F; + static const pmt_t _F = pmt_t(new pmt_bool()); + return _F; } pmt_t get_PMT_EOF() { - static const pmt_t _EOF = cons(get_PMT_NIL(), get_PMT_NIL()); - return _EOF; + static const pmt_t _EOF = cons(get_PMT_NIL(), get_PMT_NIL()); + return _EOF; } //////////////////////////////////////////////////////////////////////////// // Booleans //////////////////////////////////////////////////////////////////////////// -pmt_bool::pmt_bool(){} +pmt_bool::pmt_bool() {} -bool -is_true(pmt_t obj) -{ - return obj != PMT_F; -} +bool is_true(pmt_t obj) { return obj != PMT_F; } -bool -is_false(pmt_t obj) -{ - return obj == PMT_F; -} +bool is_false(pmt_t obj) { return obj == PMT_F; } -bool -is_bool(pmt_t obj) -{ - return obj->is_bool(); -} +bool is_bool(pmt_t obj) { return obj->is_bool(); } -pmt_t -from_bool(bool val) -{ - return val ? PMT_T : PMT_F; -} +pmt_t from_bool(bool val) { return val ? PMT_T : PMT_F; } -bool -to_bool(pmt_t val) +bool to_bool(pmt_t val) { - if (val == PMT_T) - return true; - if (val == PMT_F) - return false; - throw wrong_type("pmt_to_bool", val); + if (val == PMT_T) + return true; + if (val == PMT_F) + return false; + throw wrong_type("pmt_to_bool", val); } //////////////////////////////////////////////////////////////////////////// // Symbols //////////////////////////////////////////////////////////////////////////// -static const unsigned int -get_symbol_hash_table_size() +static const unsigned int get_symbol_hash_table_size() { - static const unsigned int SYMBOL_HASH_TABLE_SIZE = 701; - return SYMBOL_HASH_TABLE_SIZE; + static const unsigned int SYMBOL_HASH_TABLE_SIZE = 701; + return SYMBOL_HASH_TABLE_SIZE; } -static std::vector<pmt_t>* -get_symbol_hash_table() +static std::vector<pmt_t>* get_symbol_hash_table() { - static std::vector<pmt_t> s_symbol_hash_table(get_symbol_hash_table_size()); - return &s_symbol_hash_table; + static std::vector<pmt_t> s_symbol_hash_table(get_symbol_hash_table_size()); + return &s_symbol_hash_table; } -pmt_symbol::pmt_symbol(const std::string &name) : d_name(name){} +pmt_symbol::pmt_symbol(const std::string& name) : d_name(name) {} -static unsigned int -hash_string(const std::string &s) +static unsigned int hash_string(const std::string& s) { - unsigned int h = 0; - unsigned int g = 0; + 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; + 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; + return h; } -bool -is_symbol(const pmt_t& obj) -{ - return obj->is_symbol(); -} +bool is_symbol(const pmt_t& obj) { return obj->is_symbol(); } -pmt_t -string_to_symbol(const std::string &name) +pmt_t string_to_symbol(const std::string& name) { - unsigned hash = hash_string(name) % get_symbol_hash_table_size(); + unsigned hash = hash_string(name) % get_symbol_hash_table_size(); - // Does a symbol with this name already exist? - for (pmt_t sym = (*get_symbol_hash_table())[hash]; sym; sym = _symbol(sym)->next()){ - if (name == _symbol(sym)->name()) - return sym; // Yes. Return it - } + // Does a symbol with this name already exist? + for (pmt_t sym = (*get_symbol_hash_table())[hash]; sym; sym = _symbol(sym)->next()) { + if (name == _symbol(sym)->name()) + return sym; // Yes. Return it + } - // Lock the table on insert for thread safety: - static boost::mutex thread_safety; - boost::mutex::scoped_lock lock(thread_safety); - // Re-do the search in case another thread inserted this symbol into the table - // before we got the lock - for (pmt_t sym = (*get_symbol_hash_table())[hash]; sym; sym = _symbol(sym)->next()){ - if (name == _symbol(sym)->name()) - return sym; // Yes. Return it - } + // Lock the table on insert for thread safety: + static boost::mutex thread_safety; + boost::mutex::scoped_lock lock(thread_safety); + // Re-do the search in case another thread inserted this symbol into the table + // before we got the lock + for (pmt_t sym = (*get_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((*get_symbol_hash_table())[hash]); - (*get_symbol_hash_table())[hash] = sym; - return sym; + // Nope. Make a new one. + pmt_t sym = pmt_t(new pmt_symbol(name)); + _symbol(sym)->set_next((*get_symbol_hash_table())[hash]); + (*get_symbol_hash_table())[hash] = sym; + return sym; } // alias... -pmt_t -intern(const std::string &name) -{ - return string_to_symbol(name); -} +pmt_t intern(const std::string& name) { return string_to_symbol(name); } -const std::string -symbol_to_string(const pmt_t& sym) +const std::string symbol_to_string(const pmt_t& sym) { - if (!sym->is_symbol()) - throw wrong_type("pmt_symbol_to_string", sym); + if (!sym->is_symbol()) + throw wrong_type("pmt_symbol_to_string", sym); - return _symbol(sym)->name(); + return _symbol(sym)->name(); } - //////////////////////////////////////////////////////////////////////////// // Number //////////////////////////////////////////////////////////////////////////// -bool -is_number(pmt_t x) -{ - return x->is_number(); -} +bool is_number(pmt_t x) { return x->is_number(); } //////////////////////////////////////////////////////////////////////////// // Integer @@ -301,27 +229,18 @@ is_number(pmt_t x) pmt_integer::pmt_integer(long value) : d_value(value) {} -bool -is_integer(pmt_t x) -{ - return x->is_integer(); -} +bool is_integer(pmt_t x) { return x->is_integer(); } -pmt_t -from_long(long x) -{ - return pmt_t(new pmt_integer(x)); -} +pmt_t from_long(long x) { return pmt_t(new pmt_integer(x)); } -long -to_long(pmt_t x) +long to_long(pmt_t x) { - pmt_integer* i = dynamic_cast<pmt_integer*>(x.get()); - if ( i ) - return i->value(); + pmt_integer* i = dynamic_cast<pmt_integer*>(x.get()); + if (i) + return i->value(); - throw wrong_type("pmt_to_long", x); + throw wrong_type("pmt_to_long", x); } //////////////////////////////////////////////////////////////////////////// @@ -330,32 +249,22 @@ to_long(pmt_t x) pmt_uint64::pmt_uint64(uint64_t value) : d_value(value) {} -bool -is_uint64(pmt_t x) -{ - return x->is_uint64(); -} +bool is_uint64(pmt_t x) { return x->is_uint64(); } -pmt_t -from_uint64(uint64_t x) -{ - return pmt_t(new pmt_uint64(x)); -} +pmt_t from_uint64(uint64_t x) { return pmt_t(new pmt_uint64(x)); } -uint64_t -to_uint64(pmt_t x) +uint64_t 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; + 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 wrong_type("pmt_to_uint64", x); + throw wrong_type("pmt_to_uint64", x); } //////////////////////////////////////////////////////////////////////////// @@ -364,40 +273,23 @@ to_uint64(pmt_t x) pmt_real::pmt_real(double value) : d_value(value) {} -bool -is_real(pmt_t x) -{ - return x->is_real(); -} +bool is_real(pmt_t x) { return x->is_real(); } -pmt_t -from_double(double x) -{ - return pmt_t(new pmt_real(x)); -} +pmt_t from_double(double x) { return pmt_t(new pmt_real(x)); } -pmt_t -from_float(float x) -{ - return pmt_t(new pmt_real(x)); -} +pmt_t from_float(float x) { return pmt_t(new pmt_real(x)); } -double -to_double(pmt_t x) +double to_double(pmt_t x) { - if (x->is_real()) - return _real(x)->value(); - if (x->is_integer()) - return _integer(x)->value(); + if (x->is_real()) + return _real(x)->value(); + if (x->is_integer()) + return _integer(x)->value(); - throw wrong_type("pmt_to_double", x); + throw wrong_type("pmt_to_double", x); } -float -to_float(pmt_t x) -{ - return float(to_double(x)); -} +float to_float(pmt_t x) { return float(to_double(x)); } //////////////////////////////////////////////////////////////////////////// // Complex @@ -405,46 +297,29 @@ to_float(pmt_t x) pmt_complex::pmt_complex(std::complex<double> value) : d_value(value) {} -bool -is_complex(pmt_t x) -{ - return x->is_complex(); -} +bool is_complex(pmt_t x) { return x->is_complex(); } -pmt_t -make_rectangular(double re, double im) -{ - return from_complex(re, im); -} +pmt_t make_rectangular(double re, double im) { return from_complex(re, im); } -pmt_t -from_complex(double re, double im) -{ - return pmt_from_complex(re, im); -} +pmt_t from_complex(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<double>(re, im))); + return pmt_t(new pmt_complex(std::complex<double>(re, im))); } -pmt_t -from_complex(const std::complex<double> &z) -{ - return pmt_t(new pmt_complex(z)); -} +pmt_t from_complex(const std::complex<double>& z) { return pmt_t(new pmt_complex(z)); } -std::complex<double> -to_complex(pmt_t x) +std::complex<double> 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(); + 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 wrong_type("pmt_to_complex", x); + throw wrong_type("pmt_to_complex", x); } //////////////////////////////////////////////////////////////////////////// @@ -454,363 +329,335 @@ to_complex(pmt_t x) pmt_null::pmt_null() {} pmt_pair::pmt_pair(const pmt_t& car, const pmt_t& cdr) : d_car(car), d_cdr(cdr) {} -bool -is_null(const pmt_t& x) -{ - return x == PMT_NIL; -} +bool is_null(const pmt_t& x) { return x == PMT_NIL; } -bool -is_pair(const pmt_t& obj) -{ - return obj->is_pair(); -} +bool is_pair(const pmt_t& obj) { return obj->is_pair(); } -pmt_t -cons(const pmt_t& x, const pmt_t& y) -{ - return pmt_t(new pmt_pair(x, y)); -} +pmt_t cons(const pmt_t& x, const pmt_t& y) { return pmt_t(new pmt_pair(x, y)); } -pmt_t -car(const pmt_t& pair) +pmt_t car(const pmt_t& pair) { - pmt_pair* p = dynamic_cast<pmt_pair*>(pair.get()); - if ( p ) - return p->car(); + pmt_pair* p = dynamic_cast<pmt_pair*>(pair.get()); + if (p) + return p->car(); - throw wrong_type("pmt_car", pair); + throw wrong_type("pmt_car", pair); } -pmt_t -cdr(const pmt_t& pair) +pmt_t cdr(const pmt_t& pair) { - pmt_pair* p = dynamic_cast<pmt_pair*>(pair.get()); - if ( p ) - return p->cdr(); + pmt_pair* p = dynamic_cast<pmt_pair*>(pair.get()); + if (p) + return p->cdr(); - throw wrong_type("pmt_cdr", pair); + throw wrong_type("pmt_cdr", pair); } -void -set_car(pmt_t pair, pmt_t obj) +void set_car(pmt_t pair, pmt_t obj) { - if (pair->is_pair()) - _pair(pair)->set_car(obj); - else - throw wrong_type("pmt_set_car", pair); + if (pair->is_pair()) + _pair(pair)->set_car(obj); + else + throw wrong_type("pmt_set_car", pair); } -void -set_cdr(pmt_t pair, pmt_t obj) +void set_cdr(pmt_t pair, pmt_t obj) { - if (pair->is_pair()) - _pair(pair)->set_cdr(obj); - else - throw wrong_type("pmt_set_cdr", pair); + if (pair->is_pair()) + _pair(pair)->set_cdr(obj); + else + throw wrong_type("pmt_set_cdr", pair); } //////////////////////////////////////////////////////////////////////////// // Vectors //////////////////////////////////////////////////////////////////////////// -pmt_vector::pmt_vector(size_t len, pmt_t fill) - : d_v(len) +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; + for (size_t i = 0; i < len; i++) + d_v[i] = fill; } -pmt_t -pmt_vector::ref(size_t k) const +pmt_t pmt_vector::ref(size_t k) const { - if (k >= length()) - throw out_of_range("pmt_vector_ref", from_long(k)); - return d_v[k]; + if (k >= length()) + throw out_of_range("pmt_vector_ref", from_long(k)); + return d_v[k]; } -void -pmt_vector::set(size_t k, pmt_t obj) +void pmt_vector::set(size_t k, pmt_t obj) { - if (k >= length()) - throw out_of_range("pmt_vector_set", from_long(k)); - d_v[k] = obj; + if (k >= length()) + throw out_of_range("pmt_vector_set", from_long(k)); + d_v[k] = obj; } -void -pmt_vector::fill(pmt_t obj) +void pmt_vector::fill(pmt_t obj) { - for (size_t i = 0; i < length(); i++) - d_v[i] = obj; + for (size_t i = 0; i < length(); i++) + d_v[i] = obj; } -bool -is_vector(pmt_t obj) -{ - return obj->is_vector(); -} +bool is_vector(pmt_t obj) { return obj->is_vector(); } -pmt_t -make_vector(size_t k, pmt_t fill) -{ - return pmt_t(new pmt_vector(k, fill)); -} +pmt_t make_vector(size_t k, pmt_t fill) { return pmt_t(new pmt_vector(k, fill)); } -pmt_t -vector_ref(pmt_t vector, size_t k) +pmt_t vector_ref(pmt_t vector, size_t k) { - if (!vector->is_vector()) - throw wrong_type("pmt_vector_ref", vector); - return _vector(vector)->ref(k); + if (!vector->is_vector()) + throw wrong_type("pmt_vector_ref", vector); + return _vector(vector)->ref(k); } -void -vector_set(pmt_t vector, size_t k, pmt_t obj) +void vector_set(pmt_t vector, size_t k, pmt_t obj) { - if (!vector->is_vector()) - throw wrong_type("pmt_vector_set", vector); - _vector(vector)->set(k, obj); + if (!vector->is_vector()) + throw wrong_type("pmt_vector_set", vector); + _vector(vector)->set(k, obj); } -void -vector_fill(pmt_t vector, pmt_t obj) +void vector_fill(pmt_t vector, pmt_t obj) { - if (!vector->is_vector()) - throw wrong_type("pmt_vector_set", vector); - _vector(vector)->fill(obj); + if (!vector->is_vector()) + throw wrong_type("pmt_vector_set", vector); + _vector(vector)->fill(obj); } //////////////////////////////////////////////////////////////////////////// // Tuples //////////////////////////////////////////////////////////////////////////// -pmt_tuple::pmt_tuple(size_t len) - : d_v(len) -{ -} +pmt_tuple::pmt_tuple(size_t len) : d_v(len) {} -pmt_t -pmt_tuple::ref(size_t k) const +pmt_t pmt_tuple::ref(size_t k) const { - if (k >= length()) - throw out_of_range("pmt_tuple_ref", from_long(k)); - return d_v[k]; + if (k >= length()) + throw out_of_range("pmt_tuple_ref", from_long(k)); + return d_v[k]; } -bool -is_tuple(pmt_t obj) -{ - return obj->is_tuple(); -} +bool is_tuple(pmt_t obj) { return obj->is_tuple(); } -pmt_t -tuple_ref(const pmt_t &tuple, size_t k) +pmt_t tuple_ref(const pmt_t& tuple, size_t k) { - if (!tuple->is_tuple()) - throw wrong_type("pmt_tuple_ref", tuple); - return _tuple(tuple)->ref(k); + if (!tuple->is_tuple()) + throw wrong_type("pmt_tuple_ref", tuple); + return _tuple(tuple)->ref(k); } // for (i=0; i < 10; i++) // make_constructor() -pmt_t -make_tuple() -{ - return pmt_t(new pmt_tuple(0)); -} - -pmt_t -make_tuple(const pmt_t &e0) -{ - pmt_tuple *t = new pmt_tuple(1); - t->_set(0, e0); - return pmt_t(t); -} - -pmt_t -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 -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 -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 -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 -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 -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 -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 make_tuple() { return pmt_t(new pmt_tuple(0)); } + +pmt_t make_tuple(const pmt_t& e0) +{ + pmt_tuple* t = new pmt_tuple(1); + t->_set(0, e0); + return pmt_t(t); +} + +pmt_t 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 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 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 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 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 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 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 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 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 to_tuple(const pmt_t& x) +{ + if (x->is_tuple()) // already one + return x; + + size_t len = 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 r; + } -pmt_t -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 -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 -to_tuple(const pmt_t &x) -{ - if (x->is_tuple()) // already one - return x; - - size_t len = 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 r; - } - - if (x->is_pair()){ - pmt_t y = x; - for (size_t i = 0; i < len; i++){ - t->_set(i, car(y)); - y = cdr(y); + if (x->is_pair()) { + pmt_t y = x; + for (size_t i = 0; i < len; i++) { + t->_set(i, car(y)); + y = cdr(y); + } + return r; } - return r; - } - throw wrong_type("pmt_to_tuple", x); + throw wrong_type("pmt_to_tuple", x); } - //////////////////////////////////////////////////////////////////////////// // Uniform Numeric Vectors //////////////////////////////////////////////////////////////////////////// -bool -is_uniform_vector(pmt_t x) -{ - return x->is_uniform_vector(); -} +bool is_uniform_vector(pmt_t x) { return x->is_uniform_vector(); } -size_t -uniform_vector_itemsize(pmt_t vector) +size_t uniform_vector_itemsize(pmt_t vector) { - if (!vector->is_uniform_vector()) - throw wrong_type("pmt_uniform_vector_itemsize", vector); - return _uniform_vector(vector)->itemsize(); + if (!vector->is_uniform_vector()) + throw wrong_type("pmt_uniform_vector_itemsize", vector); + return _uniform_vector(vector)->itemsize(); } -const void * -uniform_vector_elements(pmt_t vector, size_t &len) +const void* uniform_vector_elements(pmt_t vector, size_t& len) { - if (!vector->is_uniform_vector()) - throw wrong_type("pmt_uniform_vector_elements", vector); - return _uniform_vector(vector)->uniform_elements(len); + if (!vector->is_uniform_vector()) + throw wrong_type("pmt_uniform_vector_elements", vector); + return _uniform_vector(vector)->uniform_elements(len); } -void * -uniform_vector_writable_elements(pmt_t vector, size_t &len) +void* uniform_vector_writable_elements(pmt_t vector, size_t& len) { - if (!vector->is_uniform_vector()) - throw wrong_type("pmt_uniform_vector_writable_elements", vector); - return _uniform_vector(vector)->uniform_writable_elements(len); + if (!vector->is_uniform_vector()) + throw wrong_type("pmt_uniform_vector_writable_elements", vector); + return _uniform_vector(vector)->uniform_writable_elements(len); } - //////////////////////////////////////////////////////////////////////////// // Dictionaries //////////////////////////////////////////////////////////////////////////// @@ -823,163 +670,130 @@ uniform_vector_writable_elements(pmt_t vector, size_t &len) * Chris Okasaki, 1998, section 3.3. */ -bool -is_dict(const pmt_t &obj) -{ - return is_null(obj) || is_pair(obj); -} +bool is_dict(const pmt_t& obj) { return is_null(obj) || is_pair(obj); } -pmt_t -make_dict() -{ - return PMT_NIL; -} +pmt_t make_dict() { return PMT_NIL; } -pmt_t -dict_add(const pmt_t &dict, const pmt_t &key, const pmt_t &value) +pmt_t dict_add(const pmt_t& dict, const pmt_t& key, const pmt_t& value) { - if (is_null(dict)) - return acons(key, value, PMT_NIL); + if (is_null(dict)) + return acons(key, value, PMT_NIL); - if (dict_has_key(dict, key)) - return acons(key, value, dict_delete(dict, key)); + if (dict_has_key(dict, key)) + return acons(key, value, dict_delete(dict, key)); - return acons(key, value, dict); + return acons(key, value, dict); } -pmt_t -dict_update(const pmt_t &dict1, const pmt_t &dict2) +pmt_t dict_update(const pmt_t& dict1, const pmt_t& dict2) { - pmt_t d(dict1); - pmt_t k(dict_keys(dict2)); - while(is_pair(k)){ - d = dict_add(d, car(k), dict_ref(dict2, car(k), PMT_NIL)); - k = cdr(k); + pmt_t d(dict1); + pmt_t k(dict_keys(dict2)); + while (is_pair(k)) { + d = dict_add(d, car(k), dict_ref(dict2, car(k), PMT_NIL)); + k = cdr(k); } - return d; + return d; } -pmt_t -dict_delete(const pmt_t &dict, const pmt_t &key) +pmt_t dict_delete(const pmt_t& dict, const pmt_t& key) { - if (is_null(dict)) - return dict; + if (is_null(dict)) + return dict; - if (eqv(caar(dict), key)) - return cdr(dict); + if (eqv(caar(dict), key)) + return cdr(dict); - return cons(car(dict), dict_delete(cdr(dict), key)); + return cons(car(dict), dict_delete(cdr(dict), key)); } -pmt_t -dict_ref(const pmt_t &dict, const pmt_t &key, const pmt_t ¬_found) +pmt_t dict_ref(const pmt_t& dict, const pmt_t& key, const pmt_t& not_found) { - pmt_t p = assv(key, dict); // look for (key . value) pair - if (is_pair(p)) - return cdr(p); - else - return not_found; + pmt_t p = assv(key, dict); // look for (key . value) pair + if (is_pair(p)) + return cdr(p); + else + return not_found; } -bool -dict_has_key(const pmt_t &dict, const pmt_t &key) +bool dict_has_key(const pmt_t& dict, const pmt_t& key) { - return is_pair(assv(key, dict)); + return is_pair(assv(key, dict)); } -pmt_t -dict_items(pmt_t dict) +pmt_t dict_items(pmt_t dict) { - if (!is_dict(dict)) - throw wrong_type("pmt_dict_values", dict); + if (!is_dict(dict)) + throw wrong_type("pmt_dict_values", dict); - return dict; // equivalent to dict in the a-list case + return dict; // equivalent to dict in the a-list case } -pmt_t -dict_keys(pmt_t dict) +pmt_t dict_keys(pmt_t dict) { - if (!is_dict(dict)) - throw wrong_type("pmt_dict_keys", dict); + if (!is_dict(dict)) + throw wrong_type("pmt_dict_keys", dict); - return map(car, dict); + return map(car, dict); } -pmt_t -dict_values(pmt_t dict) +pmt_t dict_values(pmt_t dict) { - if (!is_dict(dict)) - throw wrong_type("pmt_dict_keys", dict); + if (!is_dict(dict)) + throw wrong_type("pmt_dict_keys", dict); - return map(cdr, dict); + return map(cdr, dict); } //////////////////////////////////////////////////////////////////////////// // Any //////////////////////////////////////////////////////////////////////////// -pmt_any::pmt_any(const boost::any &any) : d_any(any) {} +pmt_any::pmt_any(const boost::any& any) : d_any(any) {} -bool -is_any(pmt_t obj) -{ - return obj->is_any(); -} +bool is_any(pmt_t obj) { return obj->is_any(); } -pmt_t -make_any(const boost::any &any) -{ - return pmt_t(new pmt_any(any)); -} +pmt_t make_any(const boost::any& any) { return pmt_t(new pmt_any(any)); } -boost::any -any_ref(pmt_t obj) +boost::any any_ref(pmt_t obj) { - if (!obj->is_any()) - throw wrong_type("pmt_any_ref", obj); - return _any(obj)->ref(); + if (!obj->is_any()) + throw wrong_type("pmt_any_ref", obj); + return _any(obj)->ref(); } -void -any_set(pmt_t obj, const boost::any &any) +void any_set(pmt_t obj, const boost::any& any) { - if (!obj->is_any()) - throw wrong_type("pmt_any_set", obj); - _any(obj)->set(any); + if (!obj->is_any()) + throw wrong_type("pmt_any_set", obj); + _any(obj)->set(any); } //////////////////////////////////////////////////////////////////////////// // msg_accepter -- built from "any" //////////////////////////////////////////////////////////////////////////// -bool -is_msg_accepter(const pmt_t &obj) +bool is_msg_accepter(const pmt_t& obj) { - if (!is_any(obj)) - return false; + if (!is_any(obj)) + return false; - boost::any r = any_ref(obj); - return boost::any_cast<gr::messages::msg_accepter_sptr>(&r) != 0; + boost::any r = any_ref(obj); + return boost::any_cast<gr::messages::msg_accepter_sptr>(&r) != 0; } //! make a msg_accepter -pmt_t -make_msg_accepter(gr::messages::msg_accepter_sptr ma) -{ - return make_any(ma); -} +pmt_t make_msg_accepter(gr::messages::msg_accepter_sptr ma) { return make_any(ma); } //! Return underlying msg_accepter -gr::messages::msg_accepter_sptr -msg_accepter_ref(const pmt_t &obj) +gr::messages::msg_accepter_sptr msg_accepter_ref(const pmt_t& obj) { - try { - return boost::any_cast<gr::messages::msg_accepter_sptr>(any_ref(obj)); - } - catch (boost::bad_any_cast &e){ - throw wrong_type("pmt_msg_accepter_ref", obj); - } + try { + return boost::any_cast<gr::messages::msg_accepter_sptr>(any_ref(obj)); + } catch (boost::bad_any_cast& e) { + throw wrong_type("pmt_msg_accepter_ref", obj); + } } @@ -987,31 +801,24 @@ msg_accepter_ref(const pmt_t &obj) // Binary Large Object -- currently a u8vector //////////////////////////////////////////////////////////////////////////// -bool -is_blob(pmt_t x) -{ - return is_u8vector(x); -} +bool is_blob(pmt_t x) { return is_u8vector(x); } -pmt_t -make_blob(const void *buf, size_t len_in_bytes) +pmt_t make_blob(const void* buf, size_t len_in_bytes) { - return init_u8vector(len_in_bytes, (const uint8_t *) buf); + return init_u8vector(len_in_bytes, (const uint8_t*)buf); } -const void * -blob_data(pmt_t blob) +const void* blob_data(pmt_t blob) { - size_t len; - return uniform_vector_elements(blob, len); + size_t len; + return uniform_vector_elements(blob, len); } -size_t -blob_length(pmt_t blob) +size_t blob_length(pmt_t blob) { - size_t len; - uniform_vector_elements(blob, len); - return len; + size_t len; + uniform_vector_elements(blob, len); + return len; } @@ -1019,413 +826,356 @@ blob_length(pmt_t blob) // General Functions //////////////////////////////////////////////////////////////////////////// -bool -eq(const pmt_t& x, const pmt_t& y) -{ - return x == y; -} +bool eq(const pmt_t& x, const pmt_t& y) { return x == y; } -bool -eqv(const pmt_t& x, const pmt_t& y) +bool eqv(const pmt_t& x, const pmt_t& y) { - if (x == y) - return true; + if (x == y) + return true; - if (x->is_integer() && y->is_integer()) - return _integer(x)->value() == _integer(y)->value(); + 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_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(); + 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(); + if (x->is_complex() && y->is_complex()) + return _complex(x)->value() == _complex(y)->value(); - return false; + return false; } -bool -equal(const pmt_t& x, const pmt_t& y) +bool equal(const pmt_t& x, const pmt_t& y) { - if (eqv(x, y)) - return true; + if (eqv(x, y)) + return true; - if (x->is_pair() && y->is_pair()) - return equal(car(x), car(y)) && equal(cdr(x), cdr(y)); + if (x->is_pair() && y->is_pair()) + return equal(car(x), car(y)) && equal(cdr(x), 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; + 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 (!equal(xv->_ref(i), yv->_ref(i))) - return false; + for (unsigned i = 0; i < xv->length(); i++) + if (!equal(xv->_ref(i), yv->_ref(i))) + return false; - return true; - } + 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; + 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 (!equal(xv->_ref(i), yv->_ref(i))) - return false; + for (unsigned i = 0; i < xv->length(); i++) + if (!equal(xv->_ref(i), yv->_ref(i))) + return false; - return true; - } + 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; + 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; - const void *x_m = xv->uniform_elements(len_x); - const void *y_m = yv->uniform_elements(len_y); - if (memcmp(x_m, y_m, len_x) == 0) - return true; + size_t len_x, len_y; + const void* x_m = xv->uniform_elements(len_x); + const void* y_m = yv->uniform_elements(len_y); + if (memcmp(x_m, y_m, len_x) == 0) + return true; - return false; - } + return false; + } - // FIXME add other cases here... + // FIXME add other cases here... - return false; + return false; } -size_t -length(const pmt_t& x) +size_t length(const pmt_t& x) { - if (x->is_vector()) - return _vector(x)->length(); + if (x->is_vector()) + return _vector(x)->length(); - if (x->is_uniform_vector()) - return _uniform_vector(x)->length(); + if (x->is_uniform_vector()) + return _uniform_vector(x)->length(); - if (x->is_tuple()) - return _tuple(x)->length(); + if (x->is_tuple()) + return _tuple(x)->length(); - if (x->is_null()) - return 0; + if (x->is_null()) + return 0; - if (x->is_pair()) { - size_t length=1; - pmt_t it = cdr(x); - while (is_pair(it)){ - length++; - it = cdr(it); - } - if (is_null(it)) - return length; + if (x->is_pair()) { + size_t length = 1; + pmt_t it = cdr(x); + while (is_pair(it)) { + length++; + it = cdr(it); + } + if (is_null(it)) + return length; - // not a proper list - throw wrong_type("pmt_length", x); - } + // not a proper list + throw wrong_type("pmt_length", x); + } - // FIXME dictionary length (number of entries) + // FIXME dictionary length (number of entries) - throw wrong_type("pmt_length", x); + throw wrong_type("pmt_length", x); } -pmt_t -assq(pmt_t obj, pmt_t alist) +pmt_t assq(pmt_t obj, pmt_t alist) { - while (is_pair(alist)){ - pmt_t p = car(alist); - if (!is_pair(p)) // malformed alist - return PMT_F; + while (is_pair(alist)) { + pmt_t p = car(alist); + if (!is_pair(p)) // malformed alist + return PMT_F; - if (eq(obj, car(p))) - return p; + if (eq(obj, car(p))) + return p; - alist = cdr(alist); - } - return PMT_F; + alist = cdr(alist); + } + return PMT_F; } -pmt_t -assv(pmt_t obj, pmt_t alist) +pmt_t assv(pmt_t obj, pmt_t alist) { - while (is_pair(alist)){ - pmt_t p = car(alist); - if (!is_pair(p)) // malformed alist - return PMT_F; + while (is_pair(alist)) { + pmt_t p = car(alist); + if (!is_pair(p)) // malformed alist + return PMT_F; - if (eqv(obj, car(p))) - return p; + if (eqv(obj, car(p))) + return p; - alist = cdr(alist); - } - return PMT_F; + alist = cdr(alist); + } + return PMT_F; } -pmt_t -assoc(pmt_t obj, pmt_t alist) +pmt_t assoc(pmt_t obj, pmt_t alist) { - while (is_pair(alist)){ - pmt_t p = car(alist); - if (!is_pair(p)) // malformed alist - return PMT_F; + while (is_pair(alist)) { + pmt_t p = car(alist); + if (!is_pair(p)) // malformed alist + return PMT_F; - if (equal(obj, car(p))) - return p; + if (equal(obj, car(p))) + return p; - alist = cdr(alist); - } - return PMT_F; + alist = cdr(alist); + } + return PMT_F; } -pmt_t -map(pmt_t proc(const pmt_t&), pmt_t list) +pmt_t map(pmt_t proc(const pmt_t&), pmt_t list) { - pmt_t r = PMT_NIL; + pmt_t r = PMT_NIL; - while(is_pair(list)){ - r = cons(proc(car(list)), r); - list = cdr(list); - } + while (is_pair(list)) { + r = cons(proc(car(list)), r); + list = cdr(list); + } - return reverse_x(r); + return reverse_x(r); } -pmt_t -reverse(pmt_t listx) +pmt_t reverse(pmt_t listx) { - pmt_t list = listx; - pmt_t r = PMT_NIL; + pmt_t list = listx; + pmt_t r = PMT_NIL; - while(is_pair(list)){ - r = cons(car(list), r); - list = cdr(list); - } - if (is_null(list)) - return r; - else - throw wrong_type("pmt_reverse", listx); + while (is_pair(list)) { + r = cons(car(list), r); + list = cdr(list); + } + if (is_null(list)) + return r; + else + throw wrong_type("pmt_reverse", listx); } -pmt_t -reverse_x(pmt_t list) +pmt_t reverse_x(pmt_t list) { - // FIXME do it destructively - return reverse(list); + // FIXME do it destructively + return reverse(list); } -pmt_t -nth(size_t n, pmt_t list) +pmt_t nth(size_t n, pmt_t list) { - pmt_t t = nthcdr(n, list); - if (is_pair(t)) - return car(t); - else - return PMT_NIL; + pmt_t t = nthcdr(n, list); + if (is_pair(t)) + return car(t); + else + return PMT_NIL; } -pmt_t -nthcdr(size_t n, pmt_t list) +pmt_t nthcdr(size_t n, pmt_t list) { - if (!(is_pair(list) || is_null(list))) - throw wrong_type("pmt_nthcdr", list); + if (!(is_pair(list) || is_null(list))) + throw wrong_type("pmt_nthcdr", list); - while (n > 0){ - if (is_pair(list)){ - list = cdr(list); - n--; - continue; + while (n > 0) { + if (is_pair(list)) { + list = cdr(list); + n--; + continue; + } + if (is_null(list)) + return PMT_NIL; + else + throw wrong_type("pmt_nthcdr: not a LIST", list); } - if (is_null(list)) - return PMT_NIL; - else - throw wrong_type("pmt_nthcdr: not a LIST", list); - } - return list; + return list; } -pmt_t -memq(pmt_t obj, pmt_t list) +pmt_t memq(pmt_t obj, pmt_t list) { - while (is_pair(list)){ - if (eq(obj, car(list))) - return list; - list = cdr(list); - } - return PMT_F; + while (is_pair(list)) { + if (eq(obj, car(list))) + return list; + list = cdr(list); + } + return PMT_F; } -pmt_t -memv(pmt_t obj, pmt_t list) +pmt_t memv(pmt_t obj, pmt_t list) { - while (is_pair(list)){ - if (eqv(obj, car(list))) - return list; - list = cdr(list); - } - return PMT_F; + while (is_pair(list)) { + if (eqv(obj, car(list))) + return list; + list = cdr(list); + } + return PMT_F; } -pmt_t -member(pmt_t obj, pmt_t list) +pmt_t member(pmt_t obj, pmt_t list) { - while (is_pair(list)){ - if (equal(obj, car(list))) - return list; - list = cdr(list); - } - return PMT_F; + while (is_pair(list)) { + if (equal(obj, car(list))) + return list; + list = cdr(list); + } + return PMT_F; } -bool -subsetp(pmt_t list1, pmt_t list2) +bool subsetp(pmt_t list1, pmt_t list2) { - while (is_pair(list1)){ - pmt_t p = car(list1); - if (is_false(memv(p, list2))) - return false; - list1 = cdr(list1); - } - return true; + while (is_pair(list1)) { + pmt_t p = car(list1); + if (is_false(memv(p, list2))) + return false; + list1 = cdr(list1); + } + return true; } -pmt_t -list1(const pmt_t& x1) -{ - return cons(x1, PMT_NIL); -} +pmt_t list1(const pmt_t& x1) { return cons(x1, PMT_NIL); } -pmt_t -list2(const pmt_t& x1, const pmt_t& x2) -{ - return cons(x1, cons(x2, PMT_NIL)); -} +pmt_t list2(const pmt_t& x1, const pmt_t& x2) { return cons(x1, cons(x2, PMT_NIL)); } -pmt_t -list3(const pmt_t& x1, const pmt_t& x2, const pmt_t& x3) +pmt_t list3(const pmt_t& x1, const pmt_t& x2, const pmt_t& x3) { - return cons(x1, cons(x2, cons(x3, PMT_NIL))); + return cons(x1, cons(x2, cons(x3, PMT_NIL))); } -pmt_t -list4(const pmt_t& x1, const pmt_t& x2, const pmt_t& x3, const pmt_t& x4) +pmt_t list4(const pmt_t& x1, const pmt_t& x2, const pmt_t& x3, const pmt_t& x4) { - return cons(x1, cons(x2, cons(x3, cons(x4, PMT_NIL)))); + return cons(x1, cons(x2, cons(x3, cons(x4, PMT_NIL)))); } -pmt_t -list5(const pmt_t& x1, const pmt_t& x2, const pmt_t& x3, const pmt_t& x4, const pmt_t& x5) +pmt_t list5( + const pmt_t& x1, const pmt_t& x2, const pmt_t& x3, const pmt_t& x4, const pmt_t& x5) { - return cons(x1, cons(x2, cons(x3, cons(x4, cons(x5, PMT_NIL))))); + return cons(x1, cons(x2, cons(x3, cons(x4, cons(x5, PMT_NIL))))); } -pmt_t -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) +pmt_t 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 cons(x1, cons(x2, cons(x3, cons(x4, cons(x5, cons(x6, PMT_NIL)))))); + return cons(x1, cons(x2, cons(x3, cons(x4, cons(x5, cons(x6, PMT_NIL)))))); } -pmt_t -list_add(pmt_t list, const pmt_t& item) +pmt_t list_add(pmt_t list, const pmt_t& item) { - return reverse(cons(item, reverse(list))); + return reverse(cons(item, reverse(list))); } -pmt_t -list_rm(pmt_t list, const pmt_t& item) +pmt_t list_rm(pmt_t list, const pmt_t& item) { - if(is_pair(list)){ - pmt_t left = car(list); - pmt_t right = cdr(list); - if(!equal(left, item)){ - return cons(left, list_rm(right, item)); + if (is_pair(list)) { + pmt_t left = car(list); + pmt_t right = cdr(list); + if (!equal(left, item)) { + return cons(left, list_rm(right, item)); } else { - return list_rm(right, item); + return list_rm(right, item); } } else { - return list; + return list; } } -bool -list_has(pmt_t list, const pmt_t& item) +bool list_has(pmt_t list, const pmt_t& item) { - if(is_pair(list)){ - pmt_t left = car(list); - pmt_t right = cdr(list); - if(equal(left,item)) - return true; - return list_has(right, item); - } else { - if(is_null(list)) - return false; - throw std::runtime_error("list contains invalid format!"); - } + if (is_pair(list)) { + pmt_t left = car(list); + pmt_t right = cdr(list); + if (equal(left, item)) + return true; + return list_has(right, item); + } else { + if (is_null(list)) + return false; + throw std::runtime_error("list contains invalid format!"); + } } -pmt_t -caar(pmt_t pair) -{ - return (car(car(pair))); -} +pmt_t caar(pmt_t pair) { return (car(car(pair))); } -pmt_t -cadr(pmt_t pair) -{ - return car(cdr(pair)); -} +pmt_t cadr(pmt_t pair) { return car(cdr(pair)); } -pmt_t -cdar(pmt_t pair) -{ - return cdr(car(pair)); -} +pmt_t cdar(pmt_t pair) { return cdr(car(pair)); } -pmt_t -cddr(pmt_t pair) -{ - return cdr(cdr(pair)); -} +pmt_t cddr(pmt_t pair) { return cdr(cdr(pair)); } -pmt_t -caddr(pmt_t pair) -{ - return car(cdr(cdr(pair))); -} +pmt_t caddr(pmt_t pair) { return car(cdr(cdr(pair))); } -pmt_t -cadddr(pmt_t pair) -{ - return car(cdr(cdr(cdr(pair)))); -} +pmt_t cadddr(pmt_t pair) { return car(cdr(cdr(cdr(pair)))); } -bool -is_eof_object(pmt_t obj) -{ - return eq(obj, PMT_EOF); -} +bool is_eof_object(pmt_t obj) { return eq(obj, PMT_EOF); } -void -dump_sizeof() +void 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_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)); - printf("sizeof(pmt_pair) = %3zd\n", sizeof(pmt_pair)); - printf("sizeof(pmt_vector) = %3zd\n", sizeof(pmt_vector)); - printf("sizeof(pmt_uniform_vector) = %3zd\n", sizeof(pmt_uniform_vector)); + 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_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)); + printf("sizeof(pmt_pair) = %3zd\n", sizeof(pmt_pair)); + printf("sizeof(pmt_vector) = %3zd\n", sizeof(pmt_vector)); + printf("sizeof(pmt_uniform_vector) = %3zd\n", sizeof(pmt_uniform_vector)); } } /* namespace pmt */ diff --git a/gnuradio-runtime/lib/pmt/pmt_int.h b/gnuradio-runtime/lib/pmt/pmt_int.h index 5f02518a62..ea3dd5e2c9 100644 --- a/gnuradio-runtime/lib/pmt/pmt_int.h +++ b/gnuradio-runtime/lib/pmt/pmt_int.h @@ -39,163 +39,166 @@ namespace pmt { class pmt_bool : public pmt_base { public: - pmt_bool(); - //~pmt_bool(){} + pmt_bool(); + //~pmt_bool(){} - bool is_bool() const { return true; } + bool is_bool() const { return true; } }; class pmt_symbol : public pmt_base { - std::string d_name; - pmt_t d_next; + std::string d_name; + pmt_t d_next; public: - pmt_symbol(const std::string &name); - //~pmt_symbol(){} + pmt_symbol(const std::string& name); + //~pmt_symbol(){} - bool is_symbol() const { return true; } - const std::string name() { return d_name; } + 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; } + pmt_t next() { return d_next; } // symbol table link + void set_next(pmt_t next) { d_next = next; } }; class pmt_integer : public pmt_base { public: - long d_value; + long d_value; - pmt_integer(long value); - //~pmt_integer(){} + pmt_integer(long value); + //~pmt_integer(){} - bool is_number() const { return true; } - bool is_integer() const { return true; } - long value() const { return d_value; } + bool is_number() const { return true; } + bool is_integer() const { return true; } + long value() const { return d_value; } }; class pmt_uint64 : public pmt_base { public: - uint64_t d_value; + uint64_t d_value; - pmt_uint64(uint64_t value); - //~pmt_uint64(){} + 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; } + 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: - double d_value; + double d_value; - pmt_real(double value); - //~pmt_real(){} + pmt_real(double value); + //~pmt_real(){} - bool is_number() const { return true; } - bool is_real() const { return true; } - double value() const { return d_value; } + bool is_number() const { return true; } + bool is_real() const { return true; } + double value() const { return d_value; } }; class pmt_complex : public pmt_base { public: - std::complex<double> d_value; + std::complex<double> d_value; - pmt_complex(std::complex<double> value); - //~pmt_complex(){} + pmt_complex(std::complex<double> value); + //~pmt_complex(){} - bool is_number() const { return true; } - bool is_complex() const { return true; } - std::complex<double> value() const { return d_value; } + bool is_number() const { return true; } + bool is_complex() const { return true; } + std::complex<double> value() const { return d_value; } }; -class pmt_null : public pmt_base +class pmt_null : public pmt_base { public: - pmt_null(); - //~pmt_null(){} + pmt_null(); + //~pmt_null(){} - bool is_null() const { return true; } + bool is_null() const { return true; } }; class pmt_pair : public pmt_base { public: - pmt_t d_car; - pmt_t d_cdr; + pmt_t d_car; + pmt_t d_cdr; - pmt_pair(const pmt_t& car, const pmt_t& cdr); - //~pmt_pair(){}; + 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; } + 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; } + 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<pmt_t> d_v; + std::vector<pmt_t> d_v; public: - pmt_vector(size_t len, pmt_t fill); - //~pmt_vector(); + 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(); } + 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]; } + pmt_t _ref(size_t k) const { return d_v[k]; } }; class pmt_tuple : public pmt_base { - std::vector<pmt_t> d_v; + std::vector<pmt_t> d_v; public: - pmt_tuple(size_t len); - //~pmt_tuple(); + 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(); } + 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; } + 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_any : public pmt_base { - boost::any d_any; + boost::any d_any; public: - pmt_any(const boost::any &any); - //~pmt_any(); + 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; } + 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; - virtual size_t itemsize() const = 0; - virtual const std::string string_ref(size_t k) const { return std::string("not implemented"); } + 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; + virtual size_t itemsize() const = 0; + virtual const std::string string_ref(size_t k) const + { + return std::string("not implemented"); + } }; } /* namespace pmt */ diff --git a/gnuradio-runtime/lib/pmt/pmt_io.cc b/gnuradio-runtime/lib/pmt/pmt_io.cc index e63bae4994..2c39a0872f 100644 --- a/gnuradio-runtime/lib/pmt/pmt_io.cc +++ b/gnuradio-runtime/lib/pmt/pmt_io.cc @@ -31,146 +31,122 @@ namespace pmt { -static void -write_list_tail(pmt_t obj, std::ostream &port) +static void write_list_tail(pmt_t obj, std::ostream& port) { - write(car(obj), port); // write the car - obj = cdr(obj); // step to cdr - - if (is_null(obj)) // () - port << ")"; - - else if (is_pair(obj)){ // normal list - port << " "; - write_list_tail(obj, port); - } - else { // dotted pair - port << " . "; - write(obj, port); - port << ")"; - } + write(car(obj), port); // write the car + obj = cdr(obj); // step to cdr + + if (is_null(obj)) // () + port << ")"; + + else if (is_pair(obj)) { // normal list + port << " "; + write_list_tail(obj, port); + } else { // dotted pair + port << " . "; + write(obj, port); + port << ")"; + } } -void -write(pmt_t obj, std::ostream &port) +void write(pmt_t obj, std::ostream& port) { - if (is_bool(obj)){ - if (is_true(obj)) - port << "#t"; - else - port << "#f"; - } - else if (is_symbol(obj)){ - port << symbol_to_string(obj); - } - else if (is_number(obj)){ - if (is_integer(obj)) - port << to_long(obj); - else if (is_uint64(obj)) - port << to_uint64(obj); - else if (is_real(obj)) - port << to_double(obj); - else if (is_complex(obj)){ - std::complex<double> c = to_complex(obj); - port << c.real() << '+' << c.imag() << 'i'; - } - else - goto error; - } - else if (is_null(obj)){ - port << "()"; - } - else if (is_pair(obj)){ - port << "("; - write_list_tail(obj, port); - } - else if (is_tuple(obj)){ - port << "{"; - size_t len = length(obj); - if (len > 0){ - port << tuple_ref(obj, 0); - for (size_t i = 1; i < len; i++) - port << " " << tuple_ref(obj, i); - } - port << "}"; - } - else if (is_vector(obj)){ - port << "#("; - size_t len = length(obj); - if (len > 0){ - port << vector_ref(obj, 0); - for (size_t i = 1; i < len; i++) - port << " " << vector_ref(obj, i); + if (is_bool(obj)) { + if (is_true(obj)) + port << "#t"; + else + port << "#f"; + } else if (is_symbol(obj)) { + port << symbol_to_string(obj); + } else if (is_number(obj)) { + if (is_integer(obj)) + port << to_long(obj); + else if (is_uint64(obj)) + port << to_uint64(obj); + else if (is_real(obj)) + port << to_double(obj); + else if (is_complex(obj)) { + std::complex<double> c = to_complex(obj); + port << c.real() << '+' << c.imag() << 'i'; + } else + goto error; + } else if (is_null(obj)) { + port << "()"; + } else if (is_pair(obj)) { + port << "("; + write_list_tail(obj, port); + } else if (is_tuple(obj)) { + port << "{"; + size_t len = length(obj); + if (len > 0) { + port << tuple_ref(obj, 0); + for (size_t i = 1; i < len; i++) + port << " " << tuple_ref(obj, i); + } + port << "}"; + } else if (is_vector(obj)) { + port << "#("; + size_t len = length(obj); + if (len > 0) { + port << vector_ref(obj, 0); + for (size_t i = 1; i < len; i++) + port << " " << vector_ref(obj, i); + } + port << ")"; + } else if (is_dict(obj)) { + // FIXME + // port << "#<dict " << obj << ">"; + port << "#<dict>"; + } else if (is_uniform_vector(obj)) { + port << "#["; + size_t len = length(obj); + if (len) { + pmt_uniform_vector* uv = static_cast<pmt_uniform_vector*>(obj.get()); + port << uv->string_ref(0); + for (size_t i = 1; i < len; i++) + port << " " << uv->string_ref(i); + } + port << "]"; + } else { + error: + // FIXME + // port << "#<" << obj << ">"; + port << "#<unknown>"; } - port << ")"; - } - else if (is_dict(obj)){ - // FIXME - // port << "#<dict " << obj << ">"; - port << "#<dict>"; - } - else if (is_uniform_vector(obj)){ - port << "#["; - size_t len = length(obj); - if (len) - { - pmt_uniform_vector *uv = static_cast<pmt_uniform_vector*>(obj.get()); - port << uv->string_ref(0); - for (size_t i = 1; i < len; i++) - port << " " << uv->string_ref(i); - } - port << "]"; - } - else { - error: - // FIXME - // port << "#<" << obj << ">"; - port << "#<unknown>"; - } } -std::ostream& operator<<(std::ostream &os, pmt_t obj) +std::ostream& operator<<(std::ostream& os, pmt_t obj) { - write(obj, os); - return os; + write(obj, os); + return os; } -std::string -write_string(pmt_t obj) +std::string write_string(pmt_t obj) { - std::ostringstream s; - s << obj; - return s.str(); + std::ostringstream s; + s << obj; + return s.str(); } -pmt_t -read(std::istream &port) +pmt_t read(std::istream& port) { - throw notimplemented("notimplemented: pmt::read", PMT_NIL); + throw notimplemented("notimplemented: pmt::read", PMT_NIL); } -void -serialize(pmt_t obj, std::ostream &sink) +void serialize(pmt_t obj, std::ostream& sink) { - throw notimplemented("notimplemented: pmt::serialize", obj); + throw notimplemented("notimplemented: pmt::serialize", obj); } /*! * \brief Create obj from portable byte-serial representation */ -pmt_t -deserialize(std::istream &source) +pmt_t deserialize(std::istream& source) { - throw notimplemented("notimplemented: pmt::deserialize", PMT_NIL); + throw notimplemented("notimplemented: pmt::deserialize", PMT_NIL); } } /* namespace pmt */ -void -pmt::print(pmt_t v) -{ - std::cout << write_string(v) << std::endl; -} - - +void pmt::print(pmt_t v) { std::cout << write_string(v) << std::endl; } diff --git a/gnuradio-runtime/lib/pmt/pmt_pool.cc b/gnuradio-runtime/lib/pmt/pmt_pool.cc index 8864f79dc2..066d31296f 100644 --- a/gnuradio-runtime/lib/pmt/pmt_pool.cc +++ b/gnuradio-runtime/lib/pmt/pmt_pool.cc @@ -29,85 +29,85 @@ namespace pmt { -static inline size_t -ROUNDUP(size_t x, size_t stride) +static inline size_t ROUNDUP(size_t x, size_t stride) { - return ((((x) + (stride) - 1)/(stride)) * (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(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]; - } + for (unsigned int i = 0; i < d_allocations.size(); i++) { + delete[] d_allocations[i]; + } } -void * -pmt_pool::malloc() +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? + 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; - } - - // 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) +void pmt_pool::free(void* foo) { - if (!foo) - return; + if (!foo) + return; - scoped_lock guard(d_mutex); + 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(); + 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/gnuradio-runtime/lib/pmt/pmt_serialize.cc b/gnuradio-runtime/lib/pmt/pmt_serialize.cc index e7d61030af..4f77c0378a 100644 --- a/gnuradio-runtime/lib/pmt/pmt_serialize.cc +++ b/gnuradio-runtime/lib/pmt/pmt_serialize.cc @@ -31,68 +31,63 @@ namespace pmt { -static pmt_t parse_pair(std::streambuf &sb); +static pmt_t parse_pair(std::streambuf& sb); // ---------------------------------------------------------------- // output primitives // ---------------------------------------------------------------- -static bool -serialize_untagged_u8(unsigned int i, std::streambuf &sb) +static bool serialize_untagged_u8(unsigned int i, std::streambuf& sb) { - return sb.sputc((i >> 0) & 0xff) != std::streambuf::traits_type::eof(); + 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) +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(); + 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) +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(); + 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(); } -static bool -serialize_untagged_f64(double i, std::streambuf &sb) +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(); + 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(); } // always writes big-endian -static bool -serialize_untagged_u64(uint64_t i, std::streambuf &sb) +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(); + 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(); } // ---------------------------------------------------------------- @@ -101,134 +96,127 @@ serialize_untagged_u64(uint64_t i, std::streambuf &sb) // always reads big-endian -static bool -deserialize_untagged_u8(uint8_t *ip, std::streambuf &sb) +static bool deserialize_untagged_u8(uint8_t* ip, std::streambuf& sb) { - std::streambuf::traits_type::int_type t; - int i; + std::streambuf::traits_type::int_type t; + int i; - t = sb.sbumpc(); - i = t & 0xff; + t = sb.sbumpc(); + i = t & 0xff; - *ip = i; - return t != std::streambuf::traits_type::eof(); + *ip = i; + return t != std::streambuf::traits_type::eof(); } // always reads big-endian -static bool -deserialize_untagged_u16(uint16_t *ip, std::streambuf &sb) +static bool deserialize_untagged_u16(uint16_t* ip, std::streambuf& sb) { - std::streambuf::traits_type::int_type t; - int i; + std::streambuf::traits_type::int_type t; + int i; - t = sb.sbumpc(); - i = t & 0xff; + t = sb.sbumpc(); + i = 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(); + *ip = i; + return t != std::streambuf::traits_type::eof(); } // always reads big-endian -static bool -deserialize_untagged_u32(uint32_t *ip, std::streambuf &sb) +static bool deserialize_untagged_u32(uint32_t* ip, std::streambuf& sb) { - std::streambuf::traits_type::int_type t; - int i; + std::streambuf::traits_type::int_type t; + int i; - t = sb.sbumpc(); - i = t & 0xff; + 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); - *ip = i; - return t != std::streambuf::traits_type::eof(); + *ip = i; + return t != std::streambuf::traits_type::eof(); } // always reads big-endian -static bool -deserialize_untagged_u64(uint64_t *ip, std::streambuf &sb) +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(); + 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(); } -static bool -deserialize_untagged_f64(double *ip, std::streambuf &sb) +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(); + 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(); } -static bool -deserialize_tuple(pmt_t *tuple, std::streambuf &sb) +static bool deserialize_tuple(pmt_t* tuple, std::streambuf& sb) { uint32_t nitems; bool ok = deserialize_untagged_u32(&nitems, sb); pmt_t list(PMT_NIL); - for(uint32_t i=0; i<nitems; i++) { - pmt_t item = deserialize(sb); - if(eq(list, PMT_NIL)) { - list = list1(item); - } - else { - list = list_add(list, item); - } + for (uint32_t i = 0; i < nitems; i++) { + pmt_t item = deserialize(sb); + if (eq(list, PMT_NIL)) { + list = list1(item); + } else { + list = list_add(list, item); + } } (*tuple) = to_tuple(list); return ok; @@ -240,283 +228,284 @@ deserialize_tuple(pmt_t *tuple, std::streambuf &sb) * * N.B., Circular structures cause infinite recursion. */ -bool -serialize(pmt_t obj, std::streambuf &sb) +bool serialize(pmt_t obj, std::streambuf& sb) { - bool ok = true; - - tail_recursion: - - if(is_bool(obj)) { - if(eq(obj, PMT_T)) - return serialize_untagged_u8(PST_TRUE, sb); - else - return serialize_untagged_u8(PST_FALSE, sb); - } - - if(is_null(obj)) - return serialize_untagged_u8(PST_NULL, sb); - - if(is_symbol(obj)) { - const std::string s = 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(is_pair(obj)) { - ok = serialize_untagged_u8(PST_PAIR, sb); - ok &= serialize(car(obj), sb); - if(!ok) - return false; - obj = cdr(obj); - goto tail_recursion; - } - - if(is_number(obj)) { - - if(is_uint64(obj)) { - uint64_t i = to_uint64(obj); - ok = serialize_untagged_u8(PST_UINT64, sb); - ok &= serialize_untagged_u64(i, sb); - return ok; + bool ok = true; + +tail_recursion: + + if (is_bool(obj)) { + if (eq(obj, PMT_T)) + return serialize_untagged_u8(PST_TRUE, sb); + else + return serialize_untagged_u8(PST_FALSE, sb); } - else { - if(is_integer(obj)) { - long i = to_long(obj); - if((sizeof(long) > 4) && ((i < std::numeric_limits<std::int32_t>::min() || i > std::numeric_limits<std::int32_t>::max()))) { - // Serializing as 4 bytes won't work for this value, serialize as 8 bytes - ok = serialize_untagged_u8(PST_INT64, sb); - ok &= serialize_untagged_u64(i, sb); - } else { - ok = serialize_untagged_u8(PST_INT32, sb); - ok &= serialize_untagged_u32(i, sb); - } + + if (is_null(obj)) + return serialize_untagged_u8(PST_NULL, sb); + + if (is_symbol(obj)) { + const std::string s = 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(is_real(obj)) { - double i = to_double(obj); - ok = serialize_untagged_u8(PST_DOUBLE, sb); - ok &= serialize_untagged_f64(i, sb); - return ok; + if (is_pair(obj)) { + ok = serialize_untagged_u8(PST_PAIR, sb); + ok &= serialize(car(obj), sb); + if (!ok) + return false; + obj = cdr(obj); + goto tail_recursion; } - if(is_complex(obj)) { - std::complex<double> i = 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(is_vector(obj)) { - size_t vec_len = pmt::length(obj); - ok = serialize_untagged_u8(PST_VECTOR, sb); - ok &= serialize_untagged_u32(vec_len, sb); - for(size_t i=0; i<vec_len; i++) { - ok &= serialize(vector_ref(obj, i), sb); - } - return ok; - } - - if(is_uniform_vector(obj)) { - size_t npad = 1; - size_t vec_len = pmt::length(obj); - - if(is_u8vector(obj)) { - ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb); - ok &= serialize_untagged_u8(UVI_U8, sb); - ok &= serialize_untagged_u32(vec_len, sb); - ok &= serialize_untagged_u8(npad, sb); - for(size_t i=0; i<npad; i++) { - ok &= serialize_untagged_u8(0, sb); - } - for(size_t i=0; i<vec_len; i++) { - ok &= serialize_untagged_u8(u8vector_ref(obj, i), sb); - } - return ok; - } + if (is_number(obj)) { - if(is_s8vector(obj)) { - ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb); - ok &= serialize_untagged_u8(UVI_S8, sb); - ok &= serialize_untagged_u32(vec_len, sb); - ok &= serialize_untagged_u8(npad, sb); - for(size_t i=0; i<npad; i++) { - ok &= serialize_untagged_u8(0, sb); - } - for(size_t i=0; i<vec_len; i++) { - ok &= serialize_untagged_u8(s8vector_ref(obj, i), sb); - } - return ok; - } + if (is_uint64(obj)) { + uint64_t i = to_uint64(obj); + ok = serialize_untagged_u8(PST_UINT64, sb); + ok &= serialize_untagged_u64(i, sb); + return ok; + } else { + if (is_integer(obj)) { + long i = to_long(obj); + if ((sizeof(long) > 4) && + ((i < std::numeric_limits<std::int32_t>::min() || + i > std::numeric_limits<std::int32_t>::max()))) { + // Serializing as 4 bytes won't work for this value, serialize as 8 + // bytes + ok = serialize_untagged_u8(PST_INT64, sb); + ok &= serialize_untagged_u64(i, sb); + } else { + ok = serialize_untagged_u8(PST_INT32, sb); + ok &= serialize_untagged_u32(i, sb); + } + return ok; + } + } - if(is_u16vector(obj)) { - ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb); - ok &= serialize_untagged_u8(UVI_U16, sb); - ok &= serialize_untagged_u32(vec_len, sb); - ok &= serialize_untagged_u8(npad, sb); - for(size_t i=0; i<npad; i++) { - ok &= serialize_untagged_u8(0, sb); - } - for(size_t i=0; i<vec_len; i++) { - ok &= serialize_untagged_u16(u16vector_ref(obj, i), sb); - } - return ok; - } + if (is_real(obj)) { + double i = to_double(obj); + ok = serialize_untagged_u8(PST_DOUBLE, sb); + ok &= serialize_untagged_f64(i, sb); + return ok; + } - if(is_s16vector(obj)) { - ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb); - ok &= serialize_untagged_u8(UVI_S16, sb); - ok &= serialize_untagged_u32(vec_len, sb); - ok &= serialize_untagged_u8(npad, sb); - for(size_t i=0; i<npad; i++) { - ok &= serialize_untagged_u8(0, sb); - } - for(size_t i=0; i<vec_len; i++) { - ok &= serialize_untagged_u16(s16vector_ref(obj, i), sb); - } - return ok; + if (is_complex(obj)) { + std::complex<double> i = 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(is_u32vector(obj)) { - ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb); - ok &= serialize_untagged_u8(UVI_U32, sb); - ok &= serialize_untagged_u32(vec_len, sb); - ok &= serialize_untagged_u8(npad, sb); - for(size_t i=0; i<npad; i++) { - ok &= serialize_untagged_u8(0, sb); - } - for(size_t i=0; i<vec_len; i++) { - ok &= serialize_untagged_u32(u32vector_ref(obj, i), sb); - } - return ok; + if (is_vector(obj)) { + size_t vec_len = pmt::length(obj); + ok = serialize_untagged_u8(PST_VECTOR, sb); + ok &= serialize_untagged_u32(vec_len, sb); + for (size_t i = 0; i < vec_len; i++) { + ok &= serialize(vector_ref(obj, i), sb); + } + return ok; } - if(is_s32vector(obj)) { - ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb); - ok &= serialize_untagged_u8(UVI_S32, sb); - ok &= serialize_untagged_u32(vec_len, sb); - ok &= serialize_untagged_u8(npad, sb); - for(size_t i=0; i<npad; i++) { - ok &= serialize_untagged_u8(0, sb); - } - for(size_t i=0; i<vec_len; i++) { - ok &= serialize_untagged_u32(s32vector_ref(obj, i), sb); - } - return ok; - } + if (is_uniform_vector(obj)) { + size_t npad = 1; + size_t vec_len = pmt::length(obj); + + if (is_u8vector(obj)) { + ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb); + ok &= serialize_untagged_u8(UVI_U8, sb); + ok &= serialize_untagged_u32(vec_len, sb); + ok &= serialize_untagged_u8(npad, sb); + for (size_t i = 0; i < npad; i++) { + ok &= serialize_untagged_u8(0, sb); + } + for (size_t i = 0; i < vec_len; i++) { + ok &= serialize_untagged_u8(u8vector_ref(obj, i), sb); + } + return ok; + } - if(is_u64vector(obj)) { - ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb); - ok &= serialize_untagged_u8(UVI_U64, sb); - ok &= serialize_untagged_u32(vec_len, sb); - ok &= serialize_untagged_u8(npad, sb); - for(size_t i=0; i<npad; i++) { - ok &= serialize_untagged_u8(0, sb); - } - for(size_t i=0; i<vec_len; i++) { - ok &= serialize_untagged_u64(u64vector_ref(obj, i), sb); - } - return ok; - } + if (is_s8vector(obj)) { + ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb); + ok &= serialize_untagged_u8(UVI_S8, sb); + ok &= serialize_untagged_u32(vec_len, sb); + ok &= serialize_untagged_u8(npad, sb); + for (size_t i = 0; i < npad; i++) { + ok &= serialize_untagged_u8(0, sb); + } + for (size_t i = 0; i < vec_len; i++) { + ok &= serialize_untagged_u8(s8vector_ref(obj, i), sb); + } + return ok; + } - if(is_s64vector(obj)) { - ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb); - ok &= serialize_untagged_u8(UVI_S64, sb); - ok &= serialize_untagged_u32(vec_len, sb); - ok &= serialize_untagged_u8(npad, sb); - for(size_t i=0; i<npad; i++) { - ok &= serialize_untagged_u8(0, sb); - } - for(size_t i=0; i<vec_len; i++) { - ok &= serialize_untagged_u64(s64vector_ref(obj, i), sb); - } - return ok; - } + if (is_u16vector(obj)) { + ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb); + ok &= serialize_untagged_u8(UVI_U16, sb); + ok &= serialize_untagged_u32(vec_len, sb); + ok &= serialize_untagged_u8(npad, sb); + for (size_t i = 0; i < npad; i++) { + ok &= serialize_untagged_u8(0, sb); + } + for (size_t i = 0; i < vec_len; i++) { + ok &= serialize_untagged_u16(u16vector_ref(obj, i), sb); + } + return ok; + } - if(is_f32vector(obj)) { - ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb); - ok &= serialize_untagged_u8(UVI_F32, sb); - ok &= serialize_untagged_u32(vec_len, sb); - ok &= serialize_untagged_u8(npad, sb); - for(size_t i=0; i<npad; i++) { - ok &= serialize_untagged_u8(0, sb); - } - for(size_t i=0; i<vec_len; i++) { - ok &= serialize_untagged_f64(f32vector_ref(obj, i), sb); - } - return ok; - } + if (is_s16vector(obj)) { + ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb); + ok &= serialize_untagged_u8(UVI_S16, sb); + ok &= serialize_untagged_u32(vec_len, sb); + ok &= serialize_untagged_u8(npad, sb); + for (size_t i = 0; i < npad; i++) { + ok &= serialize_untagged_u8(0, sb); + } + for (size_t i = 0; i < vec_len; i++) { + ok &= serialize_untagged_u16(s16vector_ref(obj, i), sb); + } + return ok; + } - if(is_f64vector(obj)) { - ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb); - ok &= serialize_untagged_u8(UVI_F64, sb); - ok &= serialize_untagged_u32(vec_len, sb); - ok &= serialize_untagged_u8(npad, sb); - for(size_t i=0; i<npad; i++) { - ok &= serialize_untagged_u8(0, sb); - } - for(size_t i=0; i<vec_len; i++) { - ok &= serialize_untagged_f64(f64vector_ref(obj, i), sb); - } - return ok; - } + if (is_u32vector(obj)) { + ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb); + ok &= serialize_untagged_u8(UVI_U32, sb); + ok &= serialize_untagged_u32(vec_len, sb); + ok &= serialize_untagged_u8(npad, sb); + for (size_t i = 0; i < npad; i++) { + ok &= serialize_untagged_u8(0, sb); + } + for (size_t i = 0; i < vec_len; i++) { + ok &= serialize_untagged_u32(u32vector_ref(obj, i), sb); + } + return ok; + } - if(is_c32vector(obj)) { - ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb); - ok &= serialize_untagged_u8(UVI_C32, sb); - ok &= serialize_untagged_u32(vec_len, sb); - ok &= serialize_untagged_u8(npad, sb); - for(size_t i=0; i<npad; i++) { - ok &= serialize_untagged_u8(0, sb); - } - for(size_t i=0; i<vec_len; i++) { - std::complex<float> c = c32vector_ref(obj, i); - ok &= serialize_untagged_f64(c.real(), sb); - ok &= serialize_untagged_f64(c.imag(), sb); - } - return ok; - } + if (is_s32vector(obj)) { + ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb); + ok &= serialize_untagged_u8(UVI_S32, sb); + ok &= serialize_untagged_u32(vec_len, sb); + ok &= serialize_untagged_u8(npad, sb); + for (size_t i = 0; i < npad; i++) { + ok &= serialize_untagged_u8(0, sb); + } + for (size_t i = 0; i < vec_len; i++) { + ok &= serialize_untagged_u32(s32vector_ref(obj, i), sb); + } + return ok; + } + + if (is_u64vector(obj)) { + ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb); + ok &= serialize_untagged_u8(UVI_U64, sb); + ok &= serialize_untagged_u32(vec_len, sb); + ok &= serialize_untagged_u8(npad, sb); + for (size_t i = 0; i < npad; i++) { + ok &= serialize_untagged_u8(0, sb); + } + for (size_t i = 0; i < vec_len; i++) { + ok &= serialize_untagged_u64(u64vector_ref(obj, i), sb); + } + return ok; + } + + if (is_s64vector(obj)) { + ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb); + ok &= serialize_untagged_u8(UVI_S64, sb); + ok &= serialize_untagged_u32(vec_len, sb); + ok &= serialize_untagged_u8(npad, sb); + for (size_t i = 0; i < npad; i++) { + ok &= serialize_untagged_u8(0, sb); + } + for (size_t i = 0; i < vec_len; i++) { + ok &= serialize_untagged_u64(s64vector_ref(obj, i), sb); + } + return ok; + } + + if (is_f32vector(obj)) { + ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb); + ok &= serialize_untagged_u8(UVI_F32, sb); + ok &= serialize_untagged_u32(vec_len, sb); + ok &= serialize_untagged_u8(npad, sb); + for (size_t i = 0; i < npad; i++) { + ok &= serialize_untagged_u8(0, sb); + } + for (size_t i = 0; i < vec_len; i++) { + ok &= serialize_untagged_f64(f32vector_ref(obj, i), sb); + } + return ok; + } - if(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<npad; i++) { - ok &= serialize_untagged_u8(0, sb); - } - for(size_t i=0; i<vec_len; i++) { - std::complex<double> c = c64vector_ref(obj, i); - ok &= serialize_untagged_f64(c.real(), sb); - ok &= serialize_untagged_f64(c.imag(), sb); - } - return ok; + if (is_f64vector(obj)) { + ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb); + ok &= serialize_untagged_u8(UVI_F64, sb); + ok &= serialize_untagged_u32(vec_len, sb); + ok &= serialize_untagged_u8(npad, sb); + for (size_t i = 0; i < npad; i++) { + ok &= serialize_untagged_u8(0, sb); + } + for (size_t i = 0; i < vec_len; i++) { + ok &= serialize_untagged_f64(f64vector_ref(obj, i), sb); + } + return ok; + } + + if (is_c32vector(obj)) { + ok = serialize_untagged_u8(PST_UNIFORM_VECTOR, sb); + ok &= serialize_untagged_u8(UVI_C32, sb); + ok &= serialize_untagged_u32(vec_len, sb); + ok &= serialize_untagged_u8(npad, sb); + for (size_t i = 0; i < npad; i++) { + ok &= serialize_untagged_u8(0, sb); + } + for (size_t i = 0; i < vec_len; i++) { + std::complex<float> c = c32vector_ref(obj, i); + ok &= serialize_untagged_f64(c.real(), sb); + ok &= serialize_untagged_f64(c.imag(), sb); + } + return ok; + } + + if (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 < npad; i++) { + ok &= serialize_untagged_u8(0, sb); + } + for (size_t i = 0; i < vec_len; i++) { + std::complex<double> c = c64vector_ref(obj, i); + ok &= serialize_untagged_f64(c.real(), sb); + ok &= serialize_untagged_f64(c.imag(), sb); + } + return ok; + } } - } - if (is_dict(obj)) - throw notimplemented("pmt::serialize (dict)", obj); + if (is_dict(obj)) + throw notimplemented("pmt::serialize (dict)", obj); - if (is_tuple(obj)){ - size_t tuple_len = pmt::length(obj); - ok = serialize_untagged_u8(PST_TUPLE, sb); - ok &= serialize_untagged_u32(tuple_len, sb); - for(size_t i=0; i<tuple_len; i++){ - ok &= serialize(tuple_ref(obj, i), sb); + if (is_tuple(obj)) { + size_t tuple_len = pmt::length(obj); + ok = serialize_untagged_u8(PST_TUPLE, sb); + ok &= serialize_untagged_u32(tuple_len, sb); + for (size_t i = 0; i < tuple_len; i++) { + ok &= serialize(tuple_ref(obj, i), sb); + } + return ok; } - return ok; - } - //throw pmt_notimplemented("pmt::serialize (tuple)", obj); + // throw pmt_notimplemented("pmt::serialize (tuple)", obj); - throw notimplemented("pmt::serialize (?)", obj); + throw notimplemented("pmt::serialize (?)", obj); } /* @@ -525,266 +514,247 @@ serialize(pmt_t obj, std::streambuf &sb) * Returns next obj from streambuf, or PMT_EOF at end of file. * Throws exception on malformed input. */ -pmt_t -deserialize(std::streambuf &sb) +pmt_t deserialize(std::streambuf& sb) { - uint8_t tag; - uint8_t u8; - uint16_t u16; - uint32_t u32; - uint64_t u64; - double f64; - 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 notimplemented("pmt::deserialize: very long symbol", - PMT_F); - if (sb.sgetn(tmpbuf, u16) != u16) - goto error; - return intern(std::string(tmpbuf, u16)); - - case PST_INT32: - if (!deserialize_untagged_u32(&u32, sb)) - goto error; - return from_long((int32_t) u32); - - case PST_UINT64: - if(!deserialize_untagged_u64(&u64, sb)) - goto error; - return from_uint64(u64); - - case PST_INT64: - if(!deserialize_untagged_u64(&u64, sb)) - goto error; - return from_long(u64); - - case PST_PAIR: - return parse_pair(sb); - - case PST_DOUBLE: - if(!deserialize_untagged_f64(&f64, sb)) - goto error; - return from_double( f64 ); - - case PST_COMPLEX: - { - double r,i; - if(!deserialize_untagged_f64(&r, sb) || !deserialize_untagged_f64(&i, sb)) - goto error; - return make_rectangular( r,i ); + uint8_t tag; + uint8_t u8; + uint16_t u16; + uint32_t u32; + uint64_t u64; + double f64; + 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 notimplemented("pmt::deserialize: very long symbol", PMT_F); + if (sb.sgetn(tmpbuf, u16) != u16) + goto error; + return intern(std::string(tmpbuf, u16)); + + case PST_INT32: + if (!deserialize_untagged_u32(&u32, sb)) + goto error; + return from_long((int32_t)u32); + + case PST_UINT64: + if (!deserialize_untagged_u64(&u64, sb)) + goto error; + return from_uint64(u64); + + case PST_INT64: + if (!deserialize_untagged_u64(&u64, sb)) + goto error; + return from_long(u64); + + case PST_PAIR: + return parse_pair(sb); + + case PST_DOUBLE: + if (!deserialize_untagged_f64(&f64, sb)) + goto error; + return from_double(f64); + + case PST_COMPLEX: { + double r, i; + if (!deserialize_untagged_f64(&r, sb) || !deserialize_untagged_f64(&i, sb)) + goto error; + return make_rectangular(r, i); } - case PST_TUPLE: - { - pmt_t tuple; - if(!deserialize_tuple(&tuple, sb)){ - goto error; - } - return tuple; + case PST_TUPLE: { + pmt_t tuple; + if (!deserialize_tuple(&tuple, sb)) { + goto error; + } + return tuple; } - case PST_VECTOR: - { - uint32_t nitems; - if(!deserialize_untagged_u32(&nitems, sb)) - goto error; - pmt_t vec = make_vector(nitems, PMT_NIL); - for(uint32_t i=0; i<nitems; i++) { - pmt_t item = deserialize(sb); - vector_set(vec, i, item); - } - return vec; + case PST_VECTOR: { + uint32_t nitems; + if (!deserialize_untagged_u32(&nitems, sb)) + goto error; + pmt_t vec = make_vector(nitems, PMT_NIL); + for (uint32_t i = 0; i < nitems; i++) { + pmt_t item = deserialize(sb); + vector_set(vec, i, item); + } + return vec; } - case PST_UNIFORM_VECTOR: - { - uint8_t utag, npad; - uint32_t nitems; - - if(!deserialize_untagged_u8(&utag, sb)) - return PMT_EOF; - - if(!deserialize_untagged_u32(&nitems, sb)) - goto error; - - deserialize_untagged_u8(&npad, sb); - for(size_t i = 0; i < npad; i++) - deserialize_untagged_u8(&u8, sb); - - switch(utag) { - case(UVI_U8): - { - pmt_t vec = make_u8vector(nitems, 0); - for(uint32_t i=0; i<nitems; i++) { - deserialize_untagged_u8(&u8, sb); - u8vector_set(vec, i, u8); - } - return vec; - } - case(UVI_S8): - { - pmt_t vec = make_s8vector(nitems, 0); - for(uint32_t i=0; i<nitems; i++) { - deserialize_untagged_u8(&u8, sb); - s8vector_set(vec, i, u8); - } - return vec; - } - case(UVI_U16): - { - pmt_t vec = make_u16vector(nitems, 0); - for(uint32_t i=0; i<nitems; i++) { - deserialize_untagged_u16(&u16, sb); - u16vector_set(vec, i, u16); - } - return vec; - } - case(UVI_S16): - { - pmt_t vec = make_s16vector(nitems, 0); - for(uint32_t i=0; i<nitems; i++) { - deserialize_untagged_u16(&u16, sb); - s16vector_set(vec, i, u16); - } - return vec; - } - case(UVI_U32): - { - pmt_t vec = make_u32vector(nitems, 0); - for(uint32_t i=0; i<nitems; i++) { - deserialize_untagged_u32(&u32, sb); - u32vector_set(vec, i, u32); - } - return vec; - } - case(UVI_S32): - { - pmt_t vec = make_s32vector(nitems, 0); - for(uint32_t i=0; i<nitems; i++) { - deserialize_untagged_u32(&u32, sb); - s32vector_set(vec, i, u32); - } - return vec; - } - case(UVI_U64): - { - pmt_t vec = make_u64vector(nitems, 0); - for(uint32_t i=0; i<nitems; i++) { - deserialize_untagged_u64(&u64, sb); - u64vector_set(vec, i, u64); - } - return vec; - } - case(UVI_S64): - { - pmt_t vec = make_s64vector(nitems, 0); - for(uint32_t i=0; i<nitems; i++) { - deserialize_untagged_u64(&u64, sb); - s64vector_set(vec, i, u64); - } - return vec; - } - case(UVI_F32): - { - pmt_t vec = make_f32vector(nitems, 0); - for(uint32_t i=0; i<nitems; i++) { - deserialize_untagged_f64(&f64, sb); - f32vector_set(vec, i, static_cast<float>(f64)); - } - return vec; - } - case(UVI_F64): - { - pmt_t vec = make_f64vector(nitems, 0); - for(uint32_t i=0; i<nitems; i++) { - deserialize_untagged_f64(&f64, sb); - f64vector_set(vec, i, f64); - } - return vec; - } - case(UVI_C32): - { - pmt_t vec = make_c32vector(nitems, 0); - for(uint32_t i=0; i<nitems; i++) { - float re, im; - deserialize_untagged_f64(&f64, sb); - re = static_cast<float>(f64); - deserialize_untagged_f64(&f64, sb); - im = static_cast<float>(f64); - c32vector_set(vec, i, std::complex<float>(re, im)); - } - return vec; - } - - case(UVI_C64): - { - pmt_t vec = make_c64vector(nitems, 0); - for(uint32_t i=0; i<nitems; i++) { - double re, im; - deserialize_untagged_f64(&f64, sb); - re = f64; - deserialize_untagged_f64(&f64, sb); - im = f64; - c64vector_set(vec, i, std::complex<double>(re, im)); - } - return vec; - } - - default: - throw exception("pmt::deserialize: malformed input stream, tag value = ", - from_long(tag)); - } + case PST_UNIFORM_VECTOR: { + uint8_t utag, npad; + uint32_t nitems; + + if (!deserialize_untagged_u8(&utag, sb)) + return PMT_EOF; + + if (!deserialize_untagged_u32(&nitems, sb)) + goto error; + + deserialize_untagged_u8(&npad, sb); + for (size_t i = 0; i < npad; i++) + deserialize_untagged_u8(&u8, sb); + + switch (utag) { + case (UVI_U8): { + pmt_t vec = make_u8vector(nitems, 0); + for (uint32_t i = 0; i < nitems; i++) { + deserialize_untagged_u8(&u8, sb); + u8vector_set(vec, i, u8); + } + return vec; + } + case (UVI_S8): { + pmt_t vec = make_s8vector(nitems, 0); + for (uint32_t i = 0; i < nitems; i++) { + deserialize_untagged_u8(&u8, sb); + s8vector_set(vec, i, u8); + } + return vec; + } + case (UVI_U16): { + pmt_t vec = make_u16vector(nitems, 0); + for (uint32_t i = 0; i < nitems; i++) { + deserialize_untagged_u16(&u16, sb); + u16vector_set(vec, i, u16); + } + return vec; + } + case (UVI_S16): { + pmt_t vec = make_s16vector(nitems, 0); + for (uint32_t i = 0; i < nitems; i++) { + deserialize_untagged_u16(&u16, sb); + s16vector_set(vec, i, u16); + } + return vec; + } + case (UVI_U32): { + pmt_t vec = make_u32vector(nitems, 0); + for (uint32_t i = 0; i < nitems; i++) { + deserialize_untagged_u32(&u32, sb); + u32vector_set(vec, i, u32); + } + return vec; + } + case (UVI_S32): { + pmt_t vec = make_s32vector(nitems, 0); + for (uint32_t i = 0; i < nitems; i++) { + deserialize_untagged_u32(&u32, sb); + s32vector_set(vec, i, u32); + } + return vec; + } + case (UVI_U64): { + pmt_t vec = make_u64vector(nitems, 0); + for (uint32_t i = 0; i < nitems; i++) { + deserialize_untagged_u64(&u64, sb); + u64vector_set(vec, i, u64); + } + return vec; + } + case (UVI_S64): { + pmt_t vec = make_s64vector(nitems, 0); + for (uint32_t i = 0; i < nitems; i++) { + deserialize_untagged_u64(&u64, sb); + s64vector_set(vec, i, u64); + } + return vec; + } + case (UVI_F32): { + pmt_t vec = make_f32vector(nitems, 0); + for (uint32_t i = 0; i < nitems; i++) { + deserialize_untagged_f64(&f64, sb); + f32vector_set(vec, i, static_cast<float>(f64)); + } + return vec; + } + case (UVI_F64): { + pmt_t vec = make_f64vector(nitems, 0); + for (uint32_t i = 0; i < nitems; i++) { + deserialize_untagged_f64(&f64, sb); + f64vector_set(vec, i, f64); + } + return vec; + } + case (UVI_C32): { + pmt_t vec = make_c32vector(nitems, 0); + for (uint32_t i = 0; i < nitems; i++) { + float re, im; + deserialize_untagged_f64(&f64, sb); + re = static_cast<float>(f64); + deserialize_untagged_f64(&f64, sb); + im = static_cast<float>(f64); + c32vector_set(vec, i, std::complex<float>(re, im)); + } + return vec; + } + + case (UVI_C64): { + pmt_t vec = make_c64vector(nitems, 0); + for (uint32_t i = 0; i < nitems; i++) { + double re, im; + deserialize_untagged_f64(&f64, sb); + re = f64; + deserialize_untagged_f64(&f64, sb); + im = f64; + c64vector_set(vec, i, std::complex<double>(re, im)); + } + return vec; + } + + default: + throw exception("pmt::deserialize: malformed input stream, tag value = ", + from_long(tag)); + } } - case PST_DICT: - case PST_COMMENT: - throw notimplemented("pmt::deserialize: tag value = ", - from_long(tag)); + case PST_DICT: + case PST_COMMENT: + throw notimplemented("pmt::deserialize: tag value = ", from_long(tag)); - default: - throw exception("pmt::deserialize: malformed input stream, tag value = ", - from_long(tag)); - } + default: + throw exception("pmt::deserialize: malformed input stream, tag value = ", + from_long(tag)); + } - error: - throw exception("pmt::deserialize: malformed input stream", PMT_F); +error: + throw exception("pmt::deserialize: malformed input stream", PMT_F); } /* * provide a simple string accessor to the serialized pmt form */ -std::string -serialize_str(pmt_t obj){ - std::stringbuf sb; - serialize(obj, sb); - return sb.str(); +std::string serialize_str(pmt_t obj) +{ + std::stringbuf sb; + serialize(obj, sb); + return sb.str(); } /* * provide a simple string accessor to the deserialized pmt form */ -pmt_t -deserialize_str(std::string s){ - std::stringbuf sb(s); - return deserialize(sb); +pmt_t deserialize_str(std::string s) +{ + std::stringbuf sb(s); + return deserialize(sb); } @@ -794,50 +764,49 @@ deserialize_str(std::string s){ * * On entry we've already eaten the PST_PAIR tag. */ -pmt_t -parse_pair(std::streambuf &sb) +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 = deserialize(sb); // read the car - - nptr = cons(expr, PMT_NIL); // build new cell - if (is_null(lastnptr)) - val = nptr; - else - set_cdr(lastnptr, nptr); - lastnptr = nptr; - - if (!deserialize_untagged_u8(&tag, sb)) // get tag of cdr - throw exception("pmt::deserialize: malformed input stream", PMT_F); - - if (tag == PST_PAIR) - continue; // keep on looping... - - if (tag == PST_NULL){ - expr = PMT_NIL; - break; + 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 = deserialize(sb); // read the car + + nptr = cons(expr, PMT_NIL); // build new cell + if (is_null(lastnptr)) + val = nptr; + else + set_cdr(lastnptr, nptr); + lastnptr = nptr; + + if (!deserialize_untagged_u8(&tag, sb)) // get tag of cdr + throw 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 = deserialize(sb); + break; } // - // default: push tag back and use pmt_deserialize to get the cdr + // At this point, expr contains the value of the final cdr in the list. // - sb.sungetc(); - expr = deserialize(sb); - break; - } - - // - // At this point, expr contains the value of the final cdr in the list. - // - set_cdr(lastnptr, expr); - return val; + set_cdr(lastnptr, expr); + return val; } } /* namespace pmt */ diff --git a/gnuradio-runtime/lib/pmt/pmt_unv.cc b/gnuradio-runtime/lib/pmt/pmt_unv.cc index 25cd9a3c95..fc295fb6b3 100644 --- a/gnuradio-runtime/lib/pmt/pmt_unv.cc +++ b/gnuradio-runtime/lib/pmt/pmt_unv.cc @@ -37,146 +37,119 @@ namespace pmt { -static pmt_u8vector * -_u8vector(pmt_t x) -{ - return dynamic_cast<pmt_u8vector*>(x.get()); -} +static pmt_u8vector* _u8vector(pmt_t x) { return dynamic_cast<pmt_u8vector*>(x.get()); } -pmt_u8vector::pmt_u8vector(size_t k, uint8_t fill) - : d_v(k) +pmt_u8vector::pmt_u8vector(size_t k, uint8_t fill) : d_v(k) { - for (size_t i = 0; i < k; i++) - d_v[i] = fill; + for (size_t i = 0; i < k; i++) + d_v[i] = fill; } -pmt_u8vector::pmt_u8vector(size_t k, const uint8_t *data) - : d_v(k) +pmt_u8vector::pmt_u8vector(size_t k, const uint8_t* data) : d_v(k) { - if(k) - memcpy( &d_v[0], data, k * sizeof(uint8_t) ); + if (k) + memcpy(&d_v[0], data, k * sizeof(uint8_t)); } -uint8_t -pmt_u8vector::ref(size_t k) const +uint8_t pmt_u8vector::ref(size_t k) const { - if (k >= length()) - throw out_of_range("pmt_u8vector_ref", from_long(k)); - return d_v[k]; + if (k >= length()) + throw out_of_range("pmt_u8vector_ref", from_long(k)); + return d_v[k]; } -void -pmt_u8vector::set(size_t k, uint8_t x) +void pmt_u8vector::set(size_t k, uint8_t x) { - if (k >= length()) - throw out_of_range("pmt_u8vector_set", from_long(k)); - d_v[k] = x; + if (k >= length()) + throw out_of_range("pmt_u8vector_set", from_long(k)); + d_v[k] = x; } -const uint8_t * -pmt_u8vector::elements(size_t &len) +const uint8_t* pmt_u8vector::elements(size_t& len) { - len = length(); - return len ? &d_v[0] : nullptr; + len = length(); + return len ? &d_v[0] : nullptr; } -uint8_t * -pmt_u8vector::writable_elements(size_t &len) +uint8_t* pmt_u8vector::writable_elements(size_t& len) { - len = length(); - return len ? &d_v[0] : nullptr; + len = length(); + return len ? &d_v[0] : nullptr; } -const void* -pmt_u8vector::uniform_elements(size_t &len) +const void* pmt_u8vector::uniform_elements(size_t& len) { - len = length() * sizeof(uint8_t); - return len ? &d_v[0] : nullptr; + len = length() * sizeof(uint8_t); + return len ? &d_v[0] : nullptr; } -void* -pmt_u8vector::uniform_writable_elements(size_t &len) +void* pmt_u8vector::uniform_writable_elements(size_t& len) { - len = length() * sizeof(uint8_t); - return len ? (&d_v[0]) : nullptr; + len = length() * sizeof(uint8_t); + return len ? (&d_v[0]) : nullptr; } -bool -is_u8vector(pmt_t obj) -{ - return obj->is_u8vector(); -} +bool is_u8vector(pmt_t obj) { return obj->is_u8vector(); } -pmt_t -make_u8vector(size_t k, uint8_t fill) -{ - return pmt_t(new pmt_u8vector(k, fill)); -} +pmt_t make_u8vector(size_t k, uint8_t fill) { return pmt_t(new pmt_u8vector(k, fill)); } -pmt_t -init_u8vector(size_t k, const uint8_t *data) +pmt_t init_u8vector(size_t k, const uint8_t* data) { - return pmt_t(new pmt_u8vector(k, data)); + return pmt_t(new pmt_u8vector(k, data)); } -pmt_t -init_u8vector(size_t k, const std::vector< uint8_t > &data) +pmt_t init_u8vector(size_t k, const std::vector<uint8_t>& data) { - if(k) { - return pmt_t(new pmt_u8vector(k, &data[0])); - } - return pmt_t(new pmt_u8vector(k, static_cast< uint8_t >(0))); // fills an empty vector with 0 + if (k) { + return pmt_t(new pmt_u8vector(k, &data[0])); + } + return pmt_t( + new pmt_u8vector(k, static_cast<uint8_t>(0))); // fills an empty vector with 0 } -uint8_t -u8vector_ref(pmt_t vector, size_t k) +uint8_t u8vector_ref(pmt_t vector, size_t k) { - if (!vector->is_u8vector()) - throw wrong_type("pmt_u8vector_ref", vector); - return _u8vector(vector)->ref(k); + if (!vector->is_u8vector()) + throw wrong_type("pmt_u8vector_ref", vector); + return _u8vector(vector)->ref(k); } -void -u8vector_set(pmt_t vector, size_t k, uint8_t obj) +void u8vector_set(pmt_t vector, size_t k, uint8_t obj) { - if (!vector->is_u8vector()) - throw wrong_type("pmt_u8vector_set", vector); - _u8vector(vector)->set(k, obj); + if (!vector->is_u8vector()) + throw wrong_type("pmt_u8vector_set", vector); + _u8vector(vector)->set(k, obj); } -const uint8_t * -u8vector_elements(pmt_t vector, size_t &len) +const uint8_t* u8vector_elements(pmt_t vector, size_t& len) { - if (!vector->is_u8vector()) - throw wrong_type("pmt_u8vector_elements", vector); - return _u8vector(vector)->elements(len); + if (!vector->is_u8vector()) + throw wrong_type("pmt_u8vector_elements", vector); + return _u8vector(vector)->elements(len); } -const std::vector< uint8_t > -u8vector_elements(pmt_t vector) +const std::vector<uint8_t> u8vector_elements(pmt_t vector) { - if (!vector->is_u8vector()) - throw wrong_type("pmt_u8vector_elements", vector); - size_t len; - const uint8_t *array = _u8vector(vector)->elements(len); - const std::vector< uint8_t > vec(array, array+len); - return vec; + if (!vector->is_u8vector()) + throw wrong_type("pmt_u8vector_elements", vector); + size_t len; + const uint8_t* array = _u8vector(vector)->elements(len); + const std::vector<uint8_t> vec(array, array + len); + return vec; } -uint8_t * -u8vector_writable_elements(pmt_t vector, size_t &len) +uint8_t* u8vector_writable_elements(pmt_t vector, size_t& len) { - if (!vector->is_u8vector()) - throw wrong_type("pmt_u8vector_writable_elements", vector); - return _u8vector(vector)->writable_elements(len); + if (!vector->is_u8vector()) + throw wrong_type("pmt_u8vector_writable_elements", vector); + return _u8vector(vector)->writable_elements(len); } -const std::string -pmt_u8vector::string_ref(size_t k) const +const std::string pmt_u8vector::string_ref(size_t k) const { - return boost::lexical_cast< std::string, uint8_t > (ref(k)); + return boost::lexical_cast<std::string, uint8_t>(ref(k)); } } /* namespace pmt */ @@ -186,146 +159,119 @@ pmt_u8vector::string_ref(size_t k) const namespace pmt { -static pmt_s8vector * -_s8vector(pmt_t x) -{ - return dynamic_cast<pmt_s8vector*>(x.get()); -} +static pmt_s8vector* _s8vector(pmt_t x) { return dynamic_cast<pmt_s8vector*>(x.get()); } -pmt_s8vector::pmt_s8vector(size_t k, int8_t fill) - : d_v(k) +pmt_s8vector::pmt_s8vector(size_t k, int8_t fill) : d_v(k) { - for (size_t i = 0; i < k; i++) - d_v[i] = fill; + for (size_t i = 0; i < k; i++) + d_v[i] = fill; } -pmt_s8vector::pmt_s8vector(size_t k, const int8_t *data) - : d_v(k) +pmt_s8vector::pmt_s8vector(size_t k, const int8_t* data) : d_v(k) { - if(k) - memcpy( &d_v[0], data, k * sizeof(int8_t) ); + if (k) + memcpy(&d_v[0], data, k * sizeof(int8_t)); } -int8_t -pmt_s8vector::ref(size_t k) const +int8_t pmt_s8vector::ref(size_t k) const { - if (k >= length()) - throw out_of_range("pmt_s8vector_ref", from_long(k)); - return d_v[k]; + if (k >= length()) + throw out_of_range("pmt_s8vector_ref", from_long(k)); + return d_v[k]; } -void -pmt_s8vector::set(size_t k, int8_t x) +void pmt_s8vector::set(size_t k, int8_t x) { - if (k >= length()) - throw out_of_range("pmt_s8vector_set", from_long(k)); - d_v[k] = x; + if (k >= length()) + throw out_of_range("pmt_s8vector_set", from_long(k)); + d_v[k] = x; } -const int8_t * -pmt_s8vector::elements(size_t &len) +const int8_t* pmt_s8vector::elements(size_t& len) { - len = length(); - return len ? &d_v[0] : nullptr; + len = length(); + return len ? &d_v[0] : nullptr; } -int8_t * -pmt_s8vector::writable_elements(size_t &len) +int8_t* pmt_s8vector::writable_elements(size_t& len) { - len = length(); - return len ? &d_v[0] : nullptr; + len = length(); + return len ? &d_v[0] : nullptr; } -const void* -pmt_s8vector::uniform_elements(size_t &len) +const void* pmt_s8vector::uniform_elements(size_t& len) { - len = length() * sizeof(int8_t); - return len ? &d_v[0] : nullptr; + len = length() * sizeof(int8_t); + return len ? &d_v[0] : nullptr; } -void* -pmt_s8vector::uniform_writable_elements(size_t &len) +void* pmt_s8vector::uniform_writable_elements(size_t& len) { - len = length() * sizeof(int8_t); - return len ? (&d_v[0]) : nullptr; + len = length() * sizeof(int8_t); + return len ? (&d_v[0]) : nullptr; } -bool -is_s8vector(pmt_t obj) -{ - return obj->is_s8vector(); -} +bool is_s8vector(pmt_t obj) { return obj->is_s8vector(); } -pmt_t -make_s8vector(size_t k, int8_t fill) -{ - return pmt_t(new pmt_s8vector(k, fill)); -} +pmt_t make_s8vector(size_t k, int8_t fill) { return pmt_t(new pmt_s8vector(k, fill)); } -pmt_t -init_s8vector(size_t k, const int8_t *data) +pmt_t init_s8vector(size_t k, const int8_t* data) { - return pmt_t(new pmt_s8vector(k, data)); + return pmt_t(new pmt_s8vector(k, data)); } -pmt_t -init_s8vector(size_t k, const std::vector< int8_t > &data) +pmt_t init_s8vector(size_t k, const std::vector<int8_t>& data) { - if(k) { - return pmt_t(new pmt_s8vector(k, &data[0])); - } - return pmt_t(new pmt_s8vector(k, static_cast< int8_t >(0))); // fills an empty vector with 0 + if (k) { + return pmt_t(new pmt_s8vector(k, &data[0])); + } + return pmt_t( + new pmt_s8vector(k, static_cast<int8_t>(0))); // fills an empty vector with 0 } -int8_t -s8vector_ref(pmt_t vector, size_t k) +int8_t s8vector_ref(pmt_t vector, size_t k) { - if (!vector->is_s8vector()) - throw wrong_type("pmt_s8vector_ref", vector); - return _s8vector(vector)->ref(k); + if (!vector->is_s8vector()) + throw wrong_type("pmt_s8vector_ref", vector); + return _s8vector(vector)->ref(k); } -void -s8vector_set(pmt_t vector, size_t k, int8_t obj) +void s8vector_set(pmt_t vector, size_t k, int8_t obj) { - if (!vector->is_s8vector()) - throw wrong_type("pmt_s8vector_set", vector); - _s8vector(vector)->set(k, obj); + if (!vector->is_s8vector()) + throw wrong_type("pmt_s8vector_set", vector); + _s8vector(vector)->set(k, obj); } -const int8_t * -s8vector_elements(pmt_t vector, size_t &len) +const int8_t* s8vector_elements(pmt_t vector, size_t& len) { - if (!vector->is_s8vector()) - throw wrong_type("pmt_s8vector_elements", vector); - return _s8vector(vector)->elements(len); + if (!vector->is_s8vector()) + throw wrong_type("pmt_s8vector_elements", vector); + return _s8vector(vector)->elements(len); } -const std::vector< int8_t > -s8vector_elements(pmt_t vector) +const std::vector<int8_t> s8vector_elements(pmt_t vector) { - if (!vector->is_s8vector()) - throw wrong_type("pmt_s8vector_elements", vector); - size_t len; - const int8_t *array = _s8vector(vector)->elements(len); - const std::vector< int8_t > vec(array, array+len); - return vec; + if (!vector->is_s8vector()) + throw wrong_type("pmt_s8vector_elements", vector); + size_t len; + const int8_t* array = _s8vector(vector)->elements(len); + const std::vector<int8_t> vec(array, array + len); + return vec; } -int8_t * -s8vector_writable_elements(pmt_t vector, size_t &len) +int8_t* s8vector_writable_elements(pmt_t vector, size_t& len) { - if (!vector->is_s8vector()) - throw wrong_type("pmt_s8vector_writable_elements", vector); - return _s8vector(vector)->writable_elements(len); + if (!vector->is_s8vector()) + throw wrong_type("pmt_s8vector_writable_elements", vector); + return _s8vector(vector)->writable_elements(len); } -const std::string -pmt_s8vector::string_ref(size_t k) const +const std::string pmt_s8vector::string_ref(size_t k) const { - return boost::lexical_cast< std::string, int8_t > (ref(k)); + return boost::lexical_cast<std::string, int8_t>(ref(k)); } } /* namespace pmt */ @@ -335,146 +281,125 @@ pmt_s8vector::string_ref(size_t k) const namespace pmt { -static pmt_u16vector * -_u16vector(pmt_t x) +static pmt_u16vector* _u16vector(pmt_t x) { - return dynamic_cast<pmt_u16vector*>(x.get()); + return dynamic_cast<pmt_u16vector*>(x.get()); } -pmt_u16vector::pmt_u16vector(size_t k, uint16_t fill) - : d_v(k) +pmt_u16vector::pmt_u16vector(size_t k, uint16_t fill) : d_v(k) { - for (size_t i = 0; i < k; i++) - d_v[i] = fill; + for (size_t i = 0; i < k; i++) + d_v[i] = fill; } -pmt_u16vector::pmt_u16vector(size_t k, const uint16_t *data) - : d_v(k) +pmt_u16vector::pmt_u16vector(size_t k, const uint16_t* data) : d_v(k) { - if(k) - memcpy( &d_v[0], data, k * sizeof(uint16_t) ); + if (k) + memcpy(&d_v[0], data, k * sizeof(uint16_t)); } -uint16_t -pmt_u16vector::ref(size_t k) const +uint16_t pmt_u16vector::ref(size_t k) const { - if (k >= length()) - throw out_of_range("pmt_u16vector_ref", from_long(k)); - return d_v[k]; + if (k >= length()) + throw out_of_range("pmt_u16vector_ref", from_long(k)); + return d_v[k]; } -void -pmt_u16vector::set(size_t k, uint16_t x) +void pmt_u16vector::set(size_t k, uint16_t x) { - if (k >= length()) - throw out_of_range("pmt_u16vector_set", from_long(k)); - d_v[k] = x; + if (k >= length()) + throw out_of_range("pmt_u16vector_set", from_long(k)); + d_v[k] = x; } -const uint16_t * -pmt_u16vector::elements(size_t &len) +const uint16_t* pmt_u16vector::elements(size_t& len) { - len = length(); - return len ? &d_v[0] : nullptr; + len = length(); + return len ? &d_v[0] : nullptr; } -uint16_t * -pmt_u16vector::writable_elements(size_t &len) +uint16_t* pmt_u16vector::writable_elements(size_t& len) { - len = length(); - return len ? &d_v[0] : nullptr; + len = length(); + return len ? &d_v[0] : nullptr; } -const void* -pmt_u16vector::uniform_elements(size_t &len) +const void* pmt_u16vector::uniform_elements(size_t& len) { - len = length() * sizeof(uint16_t); - return len ? &d_v[0] : nullptr; + len = length() * sizeof(uint16_t); + return len ? &d_v[0] : nullptr; } -void* -pmt_u16vector::uniform_writable_elements(size_t &len) +void* pmt_u16vector::uniform_writable_elements(size_t& len) { - len = length() * sizeof(uint16_t); - return len ? (&d_v[0]) : nullptr; + len = length() * sizeof(uint16_t); + return len ? (&d_v[0]) : nullptr; } -bool -is_u16vector(pmt_t obj) -{ - return obj->is_u16vector(); -} +bool is_u16vector(pmt_t obj) { return obj->is_u16vector(); } -pmt_t -make_u16vector(size_t k, uint16_t fill) +pmt_t make_u16vector(size_t k, uint16_t fill) { - return pmt_t(new pmt_u16vector(k, fill)); + return pmt_t(new pmt_u16vector(k, fill)); } -pmt_t -init_u16vector(size_t k, const uint16_t *data) +pmt_t init_u16vector(size_t k, const uint16_t* data) { - return pmt_t(new pmt_u16vector(k, data)); + return pmt_t(new pmt_u16vector(k, data)); } -pmt_t -init_u16vector(size_t k, const std::vector< uint16_t > &data) +pmt_t init_u16vector(size_t k, const std::vector<uint16_t>& data) { - if(k) { - return pmt_t(new pmt_u16vector(k, &data[0])); - } - return pmt_t(new pmt_u16vector(k, static_cast< uint16_t >(0))); // fills an empty vector with 0 + if (k) { + return pmt_t(new pmt_u16vector(k, &data[0])); + } + return pmt_t( + new pmt_u16vector(k, static_cast<uint16_t>(0))); // fills an empty vector with 0 } -uint16_t -u16vector_ref(pmt_t vector, size_t k) +uint16_t u16vector_ref(pmt_t vector, size_t k) { - if (!vector->is_u16vector()) - throw wrong_type("pmt_u16vector_ref", vector); - return _u16vector(vector)->ref(k); + if (!vector->is_u16vector()) + throw wrong_type("pmt_u16vector_ref", vector); + return _u16vector(vector)->ref(k); } -void -u16vector_set(pmt_t vector, size_t k, uint16_t obj) +void u16vector_set(pmt_t vector, size_t k, uint16_t obj) { - if (!vector->is_u16vector()) - throw wrong_type("pmt_u16vector_set", vector); - _u16vector(vector)->set(k, obj); + if (!vector->is_u16vector()) + throw wrong_type("pmt_u16vector_set", vector); + _u16vector(vector)->set(k, obj); } -const uint16_t * -u16vector_elements(pmt_t vector, size_t &len) +const uint16_t* u16vector_elements(pmt_t vector, size_t& len) { - if (!vector->is_u16vector()) - throw wrong_type("pmt_u16vector_elements", vector); - return _u16vector(vector)->elements(len); + if (!vector->is_u16vector()) + throw wrong_type("pmt_u16vector_elements", vector); + return _u16vector(vector)->elements(len); } -const std::vector< uint16_t > -u16vector_elements(pmt_t vector) +const std::vector<uint16_t> u16vector_elements(pmt_t vector) { - if (!vector->is_u16vector()) - throw wrong_type("pmt_u16vector_elements", vector); - size_t len; - const uint16_t *array = _u16vector(vector)->elements(len); - const std::vector< uint16_t > vec(array, array+len); - return vec; + if (!vector->is_u16vector()) + throw wrong_type("pmt_u16vector_elements", vector); + size_t len; + const uint16_t* array = _u16vector(vector)->elements(len); + const std::vector<uint16_t> vec(array, array + len); + return vec; } -uint16_t * -u16vector_writable_elements(pmt_t vector, size_t &len) +uint16_t* u16vector_writable_elements(pmt_t vector, size_t& len) { - if (!vector->is_u16vector()) - throw wrong_type("pmt_u16vector_writable_elements", vector); - return _u16vector(vector)->writable_elements(len); + if (!vector->is_u16vector()) + throw wrong_type("pmt_u16vector_writable_elements", vector); + return _u16vector(vector)->writable_elements(len); } -const std::string -pmt_u16vector::string_ref(size_t k) const +const std::string pmt_u16vector::string_ref(size_t k) const { - return std::to_string(ref(k)); + return std::to_string(ref(k)); } } /* namespace pmt */ @@ -484,146 +409,122 @@ pmt_u16vector::string_ref(size_t k) const namespace pmt { -static pmt_s16vector * -_s16vector(pmt_t x) +static pmt_s16vector* _s16vector(pmt_t x) { - return dynamic_cast<pmt_s16vector*>(x.get()); + return dynamic_cast<pmt_s16vector*>(x.get()); } -pmt_s16vector::pmt_s16vector(size_t k, int16_t fill) - : d_v(k) +pmt_s16vector::pmt_s16vector(size_t k, int16_t fill) : d_v(k) { - for (size_t i = 0; i < k; i++) - d_v[i] = fill; + for (size_t i = 0; i < k; i++) + d_v[i] = fill; } -pmt_s16vector::pmt_s16vector(size_t k, const int16_t *data) - : d_v(k) +pmt_s16vector::pmt_s16vector(size_t k, const int16_t* data) : d_v(k) { - if(k) - memcpy( &d_v[0], data, k * sizeof(int16_t) ); + if (k) + memcpy(&d_v[0], data, k * sizeof(int16_t)); } -int16_t -pmt_s16vector::ref(size_t k) const +int16_t pmt_s16vector::ref(size_t k) const { - if (k >= length()) - throw out_of_range("pmt_s16vector_ref", from_long(k)); - return d_v[k]; + if (k >= length()) + throw out_of_range("pmt_s16vector_ref", from_long(k)); + return d_v[k]; } -void -pmt_s16vector::set(size_t k, int16_t x) +void pmt_s16vector::set(size_t k, int16_t x) { - if (k >= length()) - throw out_of_range("pmt_s16vector_set", from_long(k)); - d_v[k] = x; + if (k >= length()) + throw out_of_range("pmt_s16vector_set", from_long(k)); + d_v[k] = x; } -const int16_t * -pmt_s16vector::elements(size_t &len) +const int16_t* pmt_s16vector::elements(size_t& len) { - len = length(); - return len ? &d_v[0] : nullptr; + len = length(); + return len ? &d_v[0] : nullptr; } -int16_t * -pmt_s16vector::writable_elements(size_t &len) +int16_t* pmt_s16vector::writable_elements(size_t& len) { - len = length(); - return len ? &d_v[0] : nullptr; + len = length(); + return len ? &d_v[0] : nullptr; } -const void* -pmt_s16vector::uniform_elements(size_t &len) +const void* pmt_s16vector::uniform_elements(size_t& len) { - len = length() * sizeof(int16_t); - return len ? &d_v[0] : nullptr; + len = length() * sizeof(int16_t); + return len ? &d_v[0] : nullptr; } -void* -pmt_s16vector::uniform_writable_elements(size_t &len) +void* pmt_s16vector::uniform_writable_elements(size_t& len) { - len = length() * sizeof(int16_t); - return len ? (&d_v[0]) : nullptr; + len = length() * sizeof(int16_t); + return len ? (&d_v[0]) : nullptr; } -bool -is_s16vector(pmt_t obj) -{ - return obj->is_s16vector(); -} +bool is_s16vector(pmt_t obj) { return obj->is_s16vector(); } -pmt_t -make_s16vector(size_t k, int16_t fill) -{ - return pmt_t(new pmt_s16vector(k, fill)); -} +pmt_t make_s16vector(size_t k, int16_t fill) { return pmt_t(new pmt_s16vector(k, fill)); } -pmt_t -init_s16vector(size_t k, const int16_t *data) +pmt_t init_s16vector(size_t k, const int16_t* data) { - return pmt_t(new pmt_s16vector(k, data)); + return pmt_t(new pmt_s16vector(k, data)); } -pmt_t -init_s16vector(size_t k, const std::vector< int16_t > &data) +pmt_t init_s16vector(size_t k, const std::vector<int16_t>& data) { - if(k) { - return pmt_t(new pmt_s16vector(k, &data[0])); - } - return pmt_t(new pmt_s16vector(k, static_cast< int16_t >(0))); // fills an empty vector with 0 + if (k) { + return pmt_t(new pmt_s16vector(k, &data[0])); + } + return pmt_t( + new pmt_s16vector(k, static_cast<int16_t>(0))); // fills an empty vector with 0 } -int16_t -s16vector_ref(pmt_t vector, size_t k) +int16_t s16vector_ref(pmt_t vector, size_t k) { - if (!vector->is_s16vector()) - throw wrong_type("pmt_s16vector_ref", vector); - return _s16vector(vector)->ref(k); + if (!vector->is_s16vector()) + throw wrong_type("pmt_s16vector_ref", vector); + return _s16vector(vector)->ref(k); } -void -s16vector_set(pmt_t vector, size_t k, int16_t obj) +void s16vector_set(pmt_t vector, size_t k, int16_t obj) { - if (!vector->is_s16vector()) - throw wrong_type("pmt_s16vector_set", vector); - _s16vector(vector)->set(k, obj); + if (!vector->is_s16vector()) + throw wrong_type("pmt_s16vector_set", vector); + _s16vector(vector)->set(k, obj); } -const int16_t * -s16vector_elements(pmt_t vector, size_t &len) +const int16_t* s16vector_elements(pmt_t vector, size_t& len) { - if (!vector->is_s16vector()) - throw wrong_type("pmt_s16vector_elements", vector); - return _s16vector(vector)->elements(len); + if (!vector->is_s16vector()) + throw wrong_type("pmt_s16vector_elements", vector); + return _s16vector(vector)->elements(len); } -const std::vector< int16_t > -s16vector_elements(pmt_t vector) +const std::vector<int16_t> s16vector_elements(pmt_t vector) { - if (!vector->is_s16vector()) - throw wrong_type("pmt_s16vector_elements", vector); - size_t len; - const int16_t *array = _s16vector(vector)->elements(len); - const std::vector< int16_t > vec(array, array+len); - return vec; + if (!vector->is_s16vector()) + throw wrong_type("pmt_s16vector_elements", vector); + size_t len; + const int16_t* array = _s16vector(vector)->elements(len); + const std::vector<int16_t> vec(array, array + len); + return vec; } -int16_t * -s16vector_writable_elements(pmt_t vector, size_t &len) +int16_t* s16vector_writable_elements(pmt_t vector, size_t& len) { - if (!vector->is_s16vector()) - throw wrong_type("pmt_s16vector_writable_elements", vector); - return _s16vector(vector)->writable_elements(len); + if (!vector->is_s16vector()) + throw wrong_type("pmt_s16vector_writable_elements", vector); + return _s16vector(vector)->writable_elements(len); } -const std::string -pmt_s16vector::string_ref(size_t k) const +const std::string pmt_s16vector::string_ref(size_t k) const { - return std::to_string(ref(k)); + return std::to_string(ref(k)); } } /* namespace pmt */ @@ -633,146 +534,125 @@ pmt_s16vector::string_ref(size_t k) const namespace pmt { -static pmt_u32vector * -_u32vector(pmt_t x) +static pmt_u32vector* _u32vector(pmt_t x) { - return dynamic_cast<pmt_u32vector*>(x.get()); + return dynamic_cast<pmt_u32vector*>(x.get()); } -pmt_u32vector::pmt_u32vector(size_t k, uint32_t fill) - : d_v(k) +pmt_u32vector::pmt_u32vector(size_t k, uint32_t fill) : d_v(k) { - for (size_t i = 0; i < k; i++) - d_v[i] = fill; + for (size_t i = 0; i < k; i++) + d_v[i] = fill; } -pmt_u32vector::pmt_u32vector(size_t k, const uint32_t *data) - : d_v(k) +pmt_u32vector::pmt_u32vector(size_t k, const uint32_t* data) : d_v(k) { - if(k) - memcpy( &d_v[0], data, k * sizeof(uint32_t) ); + if (k) + memcpy(&d_v[0], data, k * sizeof(uint32_t)); } -uint32_t -pmt_u32vector::ref(size_t k) const +uint32_t pmt_u32vector::ref(size_t k) const { - if (k >= length()) - throw out_of_range("pmt_u32vector_ref", from_long(k)); - return d_v[k]; + if (k >= length()) + throw out_of_range("pmt_u32vector_ref", from_long(k)); + return d_v[k]; } -void -pmt_u32vector::set(size_t k, uint32_t x) +void pmt_u32vector::set(size_t k, uint32_t x) { - if (k >= length()) - throw out_of_range("pmt_u32vector_set", from_long(k)); - d_v[k] = x; + if (k >= length()) + throw out_of_range("pmt_u32vector_set", from_long(k)); + d_v[k] = x; } -const uint32_t * -pmt_u32vector::elements(size_t &len) +const uint32_t* pmt_u32vector::elements(size_t& len) { - len = length(); - return len ? &d_v[0] : nullptr; + len = length(); + return len ? &d_v[0] : nullptr; } -uint32_t * -pmt_u32vector::writable_elements(size_t &len) +uint32_t* pmt_u32vector::writable_elements(size_t& len) { - len = length(); - return len ? &d_v[0] : nullptr; + len = length(); + return len ? &d_v[0] : nullptr; } -const void* -pmt_u32vector::uniform_elements(size_t &len) +const void* pmt_u32vector::uniform_elements(size_t& len) { - len = length() * sizeof(uint32_t); - return len ? &d_v[0] : nullptr; + len = length() * sizeof(uint32_t); + return len ? &d_v[0] : nullptr; } -void* -pmt_u32vector::uniform_writable_elements(size_t &len) +void* pmt_u32vector::uniform_writable_elements(size_t& len) { - len = length() * sizeof(uint32_t); - return len ? (&d_v[0]) : nullptr; + len = length() * sizeof(uint32_t); + return len ? (&d_v[0]) : nullptr; } -bool -is_u32vector(pmt_t obj) -{ - return obj->is_u32vector(); -} +bool is_u32vector(pmt_t obj) { return obj->is_u32vector(); } -pmt_t -make_u32vector(size_t k, uint32_t fill) +pmt_t make_u32vector(size_t k, uint32_t fill) { - return pmt_t(new pmt_u32vector(k, fill)); + return pmt_t(new pmt_u32vector(k, fill)); } -pmt_t -init_u32vector(size_t k, const uint32_t *data) +pmt_t init_u32vector(size_t k, const uint32_t* data) { - return pmt_t(new pmt_u32vector(k, data)); + return pmt_t(new pmt_u32vector(k, data)); } -pmt_t -init_u32vector(size_t k, const std::vector< uint32_t > &data) +pmt_t init_u32vector(size_t k, const std::vector<uint32_t>& data) { - if(k) { - return pmt_t(new pmt_u32vector(k, &data[0])); - } - return pmt_t(new pmt_u32vector(k, static_cast< uint32_t >(0))); // fills an empty vector with 0 + if (k) { + return pmt_t(new pmt_u32vector(k, &data[0])); + } + return pmt_t( + new pmt_u32vector(k, static_cast<uint32_t>(0))); // fills an empty vector with 0 } -uint32_t -u32vector_ref(pmt_t vector, size_t k) +uint32_t u32vector_ref(pmt_t vector, size_t k) { - if (!vector->is_u32vector()) - throw wrong_type("pmt_u32vector_ref", vector); - return _u32vector(vector)->ref(k); + if (!vector->is_u32vector()) + throw wrong_type("pmt_u32vector_ref", vector); + return _u32vector(vector)->ref(k); } -void -u32vector_set(pmt_t vector, size_t k, uint32_t obj) +void u32vector_set(pmt_t vector, size_t k, uint32_t obj) { - if (!vector->is_u32vector()) - throw wrong_type("pmt_u32vector_set", vector); - _u32vector(vector)->set(k, obj); + if (!vector->is_u32vector()) + throw wrong_type("pmt_u32vector_set", vector); + _u32vector(vector)->set(k, obj); } -const uint32_t * -u32vector_elements(pmt_t vector, size_t &len) +const uint32_t* u32vector_elements(pmt_t vector, size_t& len) { - if (!vector->is_u32vector()) - throw wrong_type("pmt_u32vector_elements", vector); - return _u32vector(vector)->elements(len); + if (!vector->is_u32vector()) + throw wrong_type("pmt_u32vector_elements", vector); + return _u32vector(vector)->elements(len); } -const std::vector< uint32_t > -u32vector_elements(pmt_t vector) +const std::vector<uint32_t> u32vector_elements(pmt_t vector) { - if (!vector->is_u32vector()) - throw wrong_type("pmt_u32vector_elements", vector); - size_t len; - const uint32_t *array = _u32vector(vector)->elements(len); - const std::vector< uint32_t > vec(array, array+len); - return vec; + if (!vector->is_u32vector()) + throw wrong_type("pmt_u32vector_elements", vector); + size_t len; + const uint32_t* array = _u32vector(vector)->elements(len); + const std::vector<uint32_t> vec(array, array + len); + return vec; } -uint32_t * -u32vector_writable_elements(pmt_t vector, size_t &len) +uint32_t* u32vector_writable_elements(pmt_t vector, size_t& len) { - if (!vector->is_u32vector()) - throw wrong_type("pmt_u32vector_writable_elements", vector); - return _u32vector(vector)->writable_elements(len); + if (!vector->is_u32vector()) + throw wrong_type("pmt_u32vector_writable_elements", vector); + return _u32vector(vector)->writable_elements(len); } -const std::string -pmt_u32vector::string_ref(size_t k) const +const std::string pmt_u32vector::string_ref(size_t k) const { - return std::to_string(ref(k)); + return std::to_string(ref(k)); } } /* namespace pmt */ @@ -782,146 +662,122 @@ pmt_u32vector::string_ref(size_t k) const namespace pmt { -static pmt_s32vector * -_s32vector(pmt_t x) +static pmt_s32vector* _s32vector(pmt_t x) { - return dynamic_cast<pmt_s32vector*>(x.get()); + return dynamic_cast<pmt_s32vector*>(x.get()); } -pmt_s32vector::pmt_s32vector(size_t k, int32_t fill) - : d_v(k) +pmt_s32vector::pmt_s32vector(size_t k, int32_t fill) : d_v(k) { - for (size_t i = 0; i < k; i++) - d_v[i] = fill; + for (size_t i = 0; i < k; i++) + d_v[i] = fill; } -pmt_s32vector::pmt_s32vector(size_t k, const int32_t *data) - : d_v(k) +pmt_s32vector::pmt_s32vector(size_t k, const int32_t* data) : d_v(k) { - if(k) - memcpy( &d_v[0], data, k * sizeof(int32_t) ); + if (k) + memcpy(&d_v[0], data, k * sizeof(int32_t)); } -int32_t -pmt_s32vector::ref(size_t k) const +int32_t pmt_s32vector::ref(size_t k) const { - if (k >= length()) - throw out_of_range("pmt_s32vector_ref", from_long(k)); - return d_v[k]; + if (k >= length()) + throw out_of_range("pmt_s32vector_ref", from_long(k)); + return d_v[k]; } -void -pmt_s32vector::set(size_t k, int32_t x) +void pmt_s32vector::set(size_t k, int32_t x) { - if (k >= length()) - throw out_of_range("pmt_s32vector_set", from_long(k)); - d_v[k] = x; + if (k >= length()) + throw out_of_range("pmt_s32vector_set", from_long(k)); + d_v[k] = x; } -const int32_t * -pmt_s32vector::elements(size_t &len) +const int32_t* pmt_s32vector::elements(size_t& len) { - len = length(); - return len ? &d_v[0] : nullptr; + len = length(); + return len ? &d_v[0] : nullptr; } -int32_t * -pmt_s32vector::writable_elements(size_t &len) +int32_t* pmt_s32vector::writable_elements(size_t& len) { - len = length(); - return len ? &d_v[0] : nullptr; + len = length(); + return len ? &d_v[0] : nullptr; } -const void* -pmt_s32vector::uniform_elements(size_t &len) +const void* pmt_s32vector::uniform_elements(size_t& len) { - len = length() * sizeof(int32_t); - return len ? &d_v[0] : nullptr; + len = length() * sizeof(int32_t); + return len ? &d_v[0] : nullptr; } -void* -pmt_s32vector::uniform_writable_elements(size_t &len) +void* pmt_s32vector::uniform_writable_elements(size_t& len) { - len = length() * sizeof(int32_t); - return len ? (&d_v[0]) : nullptr; + len = length() * sizeof(int32_t); + return len ? (&d_v[0]) : nullptr; } -bool -is_s32vector(pmt_t obj) -{ - return obj->is_s32vector(); -} +bool is_s32vector(pmt_t obj) { return obj->is_s32vector(); } -pmt_t -make_s32vector(size_t k, int32_t fill) -{ - return pmt_t(new pmt_s32vector(k, fill)); -} +pmt_t make_s32vector(size_t k, int32_t fill) { return pmt_t(new pmt_s32vector(k, fill)); } -pmt_t -init_s32vector(size_t k, const int32_t *data) +pmt_t init_s32vector(size_t k, const int32_t* data) { - return pmt_t(new pmt_s32vector(k, data)); + return pmt_t(new pmt_s32vector(k, data)); } -pmt_t -init_s32vector(size_t k, const std::vector< int32_t > &data) +pmt_t init_s32vector(size_t k, const std::vector<int32_t>& data) { - if(k) { - return pmt_t(new pmt_s32vector(k, &data[0])); - } - return pmt_t(new pmt_s32vector(k, static_cast< int32_t >(0))); // fills an empty vector with 0 + if (k) { + return pmt_t(new pmt_s32vector(k, &data[0])); + } + return pmt_t( + new pmt_s32vector(k, static_cast<int32_t>(0))); // fills an empty vector with 0 } -int32_t -s32vector_ref(pmt_t vector, size_t k) +int32_t s32vector_ref(pmt_t vector, size_t k) { - if (!vector->is_s32vector()) - throw wrong_type("pmt_s32vector_ref", vector); - return _s32vector(vector)->ref(k); + if (!vector->is_s32vector()) + throw wrong_type("pmt_s32vector_ref", vector); + return _s32vector(vector)->ref(k); } -void -s32vector_set(pmt_t vector, size_t k, int32_t obj) +void s32vector_set(pmt_t vector, size_t k, int32_t obj) { - if (!vector->is_s32vector()) - throw wrong_type("pmt_s32vector_set", vector); - _s32vector(vector)->set(k, obj); + if (!vector->is_s32vector()) + throw wrong_type("pmt_s32vector_set", vector); + _s32vector(vector)->set(k, obj); } -const int32_t * -s32vector_elements(pmt_t vector, size_t &len) +const int32_t* s32vector_elements(pmt_t vector, size_t& len) { - if (!vector->is_s32vector()) - throw wrong_type("pmt_s32vector_elements", vector); - return _s32vector(vector)->elements(len); + if (!vector->is_s32vector()) + throw wrong_type("pmt_s32vector_elements", vector); + return _s32vector(vector)->elements(len); } -const std::vector< int32_t > -s32vector_elements(pmt_t vector) +const std::vector<int32_t> s32vector_elements(pmt_t vector) { - if (!vector->is_s32vector()) - throw wrong_type("pmt_s32vector_elements", vector); - size_t len; - const int32_t *array = _s32vector(vector)->elements(len); - const std::vector< int32_t > vec(array, array+len); - return vec; + if (!vector->is_s32vector()) + throw wrong_type("pmt_s32vector_elements", vector); + size_t len; + const int32_t* array = _s32vector(vector)->elements(len); + const std::vector<int32_t> vec(array, array + len); + return vec; } -int32_t * -s32vector_writable_elements(pmt_t vector, size_t &len) +int32_t* s32vector_writable_elements(pmt_t vector, size_t& len) { - if (!vector->is_s32vector()) - throw wrong_type("pmt_s32vector_writable_elements", vector); - return _s32vector(vector)->writable_elements(len); + if (!vector->is_s32vector()) + throw wrong_type("pmt_s32vector_writable_elements", vector); + return _s32vector(vector)->writable_elements(len); } -const std::string -pmt_s32vector::string_ref(size_t k) const +const std::string pmt_s32vector::string_ref(size_t k) const { - return std::to_string(ref(k)); + return std::to_string(ref(k)); } } /* namespace pmt */ @@ -931,146 +787,125 @@ pmt_s32vector::string_ref(size_t k) const namespace pmt { -static pmt_u64vector * -_u64vector(pmt_t x) +static pmt_u64vector* _u64vector(pmt_t x) { - return dynamic_cast<pmt_u64vector*>(x.get()); + return dynamic_cast<pmt_u64vector*>(x.get()); } -pmt_u64vector::pmt_u64vector(size_t k, uint64_t fill) - : d_v(k) +pmt_u64vector::pmt_u64vector(size_t k, uint64_t fill) : d_v(k) { - for (size_t i = 0; i < k; i++) - d_v[i] = fill; + for (size_t i = 0; i < k; i++) + d_v[i] = fill; } -pmt_u64vector::pmt_u64vector(size_t k, const uint64_t *data) - : d_v(k) +pmt_u64vector::pmt_u64vector(size_t k, const uint64_t* data) : d_v(k) { - if(k) - memcpy( &d_v[0], data, k * sizeof(uint64_t) ); + if (k) + memcpy(&d_v[0], data, k * sizeof(uint64_t)); } -uint64_t -pmt_u64vector::ref(size_t k) const +uint64_t pmt_u64vector::ref(size_t k) const { - if (k >= length()) - throw out_of_range("pmt_u64vector_ref", from_long(k)); - return d_v[k]; + if (k >= length()) + throw out_of_range("pmt_u64vector_ref", from_long(k)); + return d_v[k]; } -void -pmt_u64vector::set(size_t k, uint64_t x) +void pmt_u64vector::set(size_t k, uint64_t x) { - if (k >= length()) - throw out_of_range("pmt_u64vector_set", from_long(k)); - d_v[k] = x; + if (k >= length()) + throw out_of_range("pmt_u64vector_set", from_long(k)); + d_v[k] = x; } -const uint64_t * -pmt_u64vector::elements(size_t &len) +const uint64_t* pmt_u64vector::elements(size_t& len) { - len = length(); - return len ? &d_v[0] : nullptr; + len = length(); + return len ? &d_v[0] : nullptr; } -uint64_t * -pmt_u64vector::writable_elements(size_t &len) +uint64_t* pmt_u64vector::writable_elements(size_t& len) { - len = length(); - return len ? &d_v[0] : nullptr; + len = length(); + return len ? &d_v[0] : nullptr; } -const void* -pmt_u64vector::uniform_elements(size_t &len) +const void* pmt_u64vector::uniform_elements(size_t& len) { - len = length() * sizeof(uint64_t); - return len ? &d_v[0] : nullptr; + len = length() * sizeof(uint64_t); + return len ? &d_v[0] : nullptr; } -void* -pmt_u64vector::uniform_writable_elements(size_t &len) +void* pmt_u64vector::uniform_writable_elements(size_t& len) { - len = length() * sizeof(uint64_t); - return len ? (&d_v[0]) : nullptr; + len = length() * sizeof(uint64_t); + return len ? (&d_v[0]) : nullptr; } -bool -is_u64vector(pmt_t obj) -{ - return obj->is_u64vector(); -} +bool is_u64vector(pmt_t obj) { return obj->is_u64vector(); } -pmt_t -make_u64vector(size_t k, uint64_t fill) +pmt_t make_u64vector(size_t k, uint64_t fill) { - return pmt_t(new pmt_u64vector(k, fill)); + return pmt_t(new pmt_u64vector(k, fill)); } -pmt_t -init_u64vector(size_t k, const uint64_t *data) +pmt_t init_u64vector(size_t k, const uint64_t* data) { - return pmt_t(new pmt_u64vector(k, data)); + return pmt_t(new pmt_u64vector(k, data)); } -pmt_t -init_u64vector(size_t k, const std::vector< uint64_t > &data) +pmt_t init_u64vector(size_t k, const std::vector<uint64_t>& data) { - if(k) { - return pmt_t(new pmt_u64vector(k, &data[0])); - } - return pmt_t(new pmt_u64vector(k, static_cast< uint64_t >(0))); // fills an empty vector with 0 + if (k) { + return pmt_t(new pmt_u64vector(k, &data[0])); + } + return pmt_t( + new pmt_u64vector(k, static_cast<uint64_t>(0))); // fills an empty vector with 0 } -uint64_t -u64vector_ref(pmt_t vector, size_t k) +uint64_t u64vector_ref(pmt_t vector, size_t k) { - if (!vector->is_u64vector()) - throw wrong_type("pmt_u64vector_ref", vector); - return _u64vector(vector)->ref(k); + if (!vector->is_u64vector()) + throw wrong_type("pmt_u64vector_ref", vector); + return _u64vector(vector)->ref(k); } -void -u64vector_set(pmt_t vector, size_t k, uint64_t obj) +void u64vector_set(pmt_t vector, size_t k, uint64_t obj) { - if (!vector->is_u64vector()) - throw wrong_type("pmt_u64vector_set", vector); - _u64vector(vector)->set(k, obj); + if (!vector->is_u64vector()) + throw wrong_type("pmt_u64vector_set", vector); + _u64vector(vector)->set(k, obj); } -const uint64_t * -u64vector_elements(pmt_t vector, size_t &len) +const uint64_t* u64vector_elements(pmt_t vector, size_t& len) { - if (!vector->is_u64vector()) - throw wrong_type("pmt_u64vector_elements", vector); - return _u64vector(vector)->elements(len); + if (!vector->is_u64vector()) + throw wrong_type("pmt_u64vector_elements", vector); + return _u64vector(vector)->elements(len); } -const std::vector< uint64_t > -u64vector_elements(pmt_t vector) +const std::vector<uint64_t> u64vector_elements(pmt_t vector) { - if (!vector->is_u64vector()) - throw wrong_type("pmt_u64vector_elements", vector); - size_t len; - const uint64_t *array = _u64vector(vector)->elements(len); - const std::vector< uint64_t > vec(array, array+len); - return vec; + if (!vector->is_u64vector()) + throw wrong_type("pmt_u64vector_elements", vector); + size_t len; + const uint64_t* array = _u64vector(vector)->elements(len); + const std::vector<uint64_t> vec(array, array + len); + return vec; } -uint64_t * -u64vector_writable_elements(pmt_t vector, size_t &len) +uint64_t* u64vector_writable_elements(pmt_t vector, size_t& len) { - if (!vector->is_u64vector()) - throw wrong_type("pmt_u64vector_writable_elements", vector); - return _u64vector(vector)->writable_elements(len); + if (!vector->is_u64vector()) + throw wrong_type("pmt_u64vector_writable_elements", vector); + return _u64vector(vector)->writable_elements(len); } -const std::string -pmt_u64vector::string_ref(size_t k) const +const std::string pmt_u64vector::string_ref(size_t k) const { - return std::to_string(ref(k)); + return std::to_string(ref(k)); } } /* namespace pmt */ @@ -1080,146 +915,122 @@ pmt_u64vector::string_ref(size_t k) const namespace pmt { -static pmt_s64vector * -_s64vector(pmt_t x) +static pmt_s64vector* _s64vector(pmt_t x) { - return dynamic_cast<pmt_s64vector*>(x.get()); + return dynamic_cast<pmt_s64vector*>(x.get()); } -pmt_s64vector::pmt_s64vector(size_t k, int64_t fill) - : d_v(k) +pmt_s64vector::pmt_s64vector(size_t k, int64_t fill) : d_v(k) { - for (size_t i = 0; i < k; i++) - d_v[i] = fill; + for (size_t i = 0; i < k; i++) + d_v[i] = fill; } -pmt_s64vector::pmt_s64vector(size_t k, const int64_t *data) - : d_v(k) +pmt_s64vector::pmt_s64vector(size_t k, const int64_t* data) : d_v(k) { - if(k) - memcpy( &d_v[0], data, k * sizeof(int64_t) ); + if (k) + memcpy(&d_v[0], data, k * sizeof(int64_t)); } -int64_t -pmt_s64vector::ref(size_t k) const +int64_t pmt_s64vector::ref(size_t k) const { - if (k >= length()) - throw out_of_range("pmt_s64vector_ref", from_long(k)); - return d_v[k]; + if (k >= length()) + throw out_of_range("pmt_s64vector_ref", from_long(k)); + return d_v[k]; } -void -pmt_s64vector::set(size_t k, int64_t x) +void pmt_s64vector::set(size_t k, int64_t x) { - if (k >= length()) - throw out_of_range("pmt_s64vector_set", from_long(k)); - d_v[k] = x; + if (k >= length()) + throw out_of_range("pmt_s64vector_set", from_long(k)); + d_v[k] = x; } -const int64_t * -pmt_s64vector::elements(size_t &len) +const int64_t* pmt_s64vector::elements(size_t& len) { - len = length(); - return len ? &d_v[0] : nullptr; + len = length(); + return len ? &d_v[0] : nullptr; } -int64_t * -pmt_s64vector::writable_elements(size_t &len) +int64_t* pmt_s64vector::writable_elements(size_t& len) { - len = length(); - return len ? &d_v[0] : nullptr; + len = length(); + return len ? &d_v[0] : nullptr; } -const void* -pmt_s64vector::uniform_elements(size_t &len) +const void* pmt_s64vector::uniform_elements(size_t& len) { - len = length() * sizeof(int64_t); - return len ? &d_v[0] : nullptr; + len = length() * sizeof(int64_t); + return len ? &d_v[0] : nullptr; } -void* -pmt_s64vector::uniform_writable_elements(size_t &len) +void* pmt_s64vector::uniform_writable_elements(size_t& len) { - len = length() * sizeof(int64_t); - return len ? (&d_v[0]) : nullptr; + len = length() * sizeof(int64_t); + return len ? (&d_v[0]) : nullptr; } -bool -is_s64vector(pmt_t obj) -{ - return obj->is_s64vector(); -} +bool is_s64vector(pmt_t obj) { return obj->is_s64vector(); } -pmt_t -make_s64vector(size_t k, int64_t fill) -{ - return pmt_t(new pmt_s64vector(k, fill)); -} +pmt_t make_s64vector(size_t k, int64_t fill) { return pmt_t(new pmt_s64vector(k, fill)); } -pmt_t -init_s64vector(size_t k, const int64_t *data) +pmt_t init_s64vector(size_t k, const int64_t* data) { - return pmt_t(new pmt_s64vector(k, data)); + return pmt_t(new pmt_s64vector(k, data)); } -pmt_t -init_s64vector(size_t k, const std::vector< int64_t > &data) +pmt_t init_s64vector(size_t k, const std::vector<int64_t>& data) { - if(k) { - return pmt_t(new pmt_s64vector(k, &data[0])); - } - return pmt_t(new pmt_s64vector(k, static_cast< int64_t >(0))); // fills an empty vector with 0 + if (k) { + return pmt_t(new pmt_s64vector(k, &data[0])); + } + return pmt_t( + new pmt_s64vector(k, static_cast<int64_t>(0))); // fills an empty vector with 0 } -int64_t -s64vector_ref(pmt_t vector, size_t k) +int64_t s64vector_ref(pmt_t vector, size_t k) { - if (!vector->is_s64vector()) - throw wrong_type("pmt_s64vector_ref", vector); - return _s64vector(vector)->ref(k); + if (!vector->is_s64vector()) + throw wrong_type("pmt_s64vector_ref", vector); + return _s64vector(vector)->ref(k); } -void -s64vector_set(pmt_t vector, size_t k, int64_t obj) +void s64vector_set(pmt_t vector, size_t k, int64_t obj) { - if (!vector->is_s64vector()) - throw wrong_type("pmt_s64vector_set", vector); - _s64vector(vector)->set(k, obj); + if (!vector->is_s64vector()) + throw wrong_type("pmt_s64vector_set", vector); + _s64vector(vector)->set(k, obj); } -const int64_t * -s64vector_elements(pmt_t vector, size_t &len) +const int64_t* s64vector_elements(pmt_t vector, size_t& len) { - if (!vector->is_s64vector()) - throw wrong_type("pmt_s64vector_elements", vector); - return _s64vector(vector)->elements(len); + if (!vector->is_s64vector()) + throw wrong_type("pmt_s64vector_elements", vector); + return _s64vector(vector)->elements(len); } -const std::vector< int64_t > -s64vector_elements(pmt_t vector) +const std::vector<int64_t> s64vector_elements(pmt_t vector) { - if (!vector->is_s64vector()) - throw wrong_type("pmt_s64vector_elements", vector); - size_t len; - const int64_t *array = _s64vector(vector)->elements(len); - const std::vector< int64_t > vec(array, array+len); - return vec; + if (!vector->is_s64vector()) + throw wrong_type("pmt_s64vector_elements", vector); + size_t len; + const int64_t* array = _s64vector(vector)->elements(len); + const std::vector<int64_t> vec(array, array + len); + return vec; } -int64_t * -s64vector_writable_elements(pmt_t vector, size_t &len) +int64_t* s64vector_writable_elements(pmt_t vector, size_t& len) { - if (!vector->is_s64vector()) - throw wrong_type("pmt_s64vector_writable_elements", vector); - return _s64vector(vector)->writable_elements(len); + if (!vector->is_s64vector()) + throw wrong_type("pmt_s64vector_writable_elements", vector); + return _s64vector(vector)->writable_elements(len); } -const std::string -pmt_s64vector::string_ref(size_t k) const +const std::string pmt_s64vector::string_ref(size_t k) const { - return std::to_string(ref(k)); + return std::to_string(ref(k)); } } /* namespace pmt */ @@ -1229,146 +1040,122 @@ pmt_s64vector::string_ref(size_t k) const namespace pmt { -static pmt_f32vector * -_f32vector(pmt_t x) +static pmt_f32vector* _f32vector(pmt_t x) { - return dynamic_cast<pmt_f32vector*>(x.get()); + return dynamic_cast<pmt_f32vector*>(x.get()); } -pmt_f32vector::pmt_f32vector(size_t k, float fill) - : d_v(k) +pmt_f32vector::pmt_f32vector(size_t k, float fill) : d_v(k) { - for (size_t i = 0; i < k; i++) - d_v[i] = fill; + for (size_t i = 0; i < k; i++) + d_v[i] = fill; } -pmt_f32vector::pmt_f32vector(size_t k, const float *data) - : d_v(k) +pmt_f32vector::pmt_f32vector(size_t k, const float* data) : d_v(k) { - if(k) - memcpy( &d_v[0], data, k * sizeof(float) ); + if (k) + memcpy(&d_v[0], data, k * sizeof(float)); } -float -pmt_f32vector::ref(size_t k) const +float pmt_f32vector::ref(size_t k) const { - if (k >= length()) - throw out_of_range("pmt_f32vector_ref", from_long(k)); - return d_v[k]; + if (k >= length()) + throw out_of_range("pmt_f32vector_ref", from_long(k)); + return d_v[k]; } -void -pmt_f32vector::set(size_t k, float x) +void pmt_f32vector::set(size_t k, float x) { - if (k >= length()) - throw out_of_range("pmt_f32vector_set", from_long(k)); - d_v[k] = x; + if (k >= length()) + throw out_of_range("pmt_f32vector_set", from_long(k)); + d_v[k] = x; } -const float * -pmt_f32vector::elements(size_t &len) +const float* pmt_f32vector::elements(size_t& len) { - len = length(); - return len ? &d_v[0] : nullptr; + len = length(); + return len ? &d_v[0] : nullptr; } -float * -pmt_f32vector::writable_elements(size_t &len) +float* pmt_f32vector::writable_elements(size_t& len) { - len = length(); - return len ? &d_v[0] : nullptr; + len = length(); + return len ? &d_v[0] : nullptr; } -const void* -pmt_f32vector::uniform_elements(size_t &len) +const void* pmt_f32vector::uniform_elements(size_t& len) { - len = length() * sizeof(float); - return len ? &d_v[0] : nullptr; + len = length() * sizeof(float); + return len ? &d_v[0] : nullptr; } -void* -pmt_f32vector::uniform_writable_elements(size_t &len) +void* pmt_f32vector::uniform_writable_elements(size_t& len) { - len = length() * sizeof(float); - return len ? (&d_v[0]) : nullptr; + len = length() * sizeof(float); + return len ? (&d_v[0]) : nullptr; } -bool -is_f32vector(pmt_t obj) -{ - return obj->is_f32vector(); -} +bool is_f32vector(pmt_t obj) { return obj->is_f32vector(); } -pmt_t -make_f32vector(size_t k, float fill) -{ - return pmt_t(new pmt_f32vector(k, fill)); -} +pmt_t make_f32vector(size_t k, float fill) { return pmt_t(new pmt_f32vector(k, fill)); } -pmt_t -init_f32vector(size_t k, const float *data) +pmt_t init_f32vector(size_t k, const float* data) { - return pmt_t(new pmt_f32vector(k, data)); + return pmt_t(new pmt_f32vector(k, data)); } -pmt_t -init_f32vector(size_t k, const std::vector< float > &data) +pmt_t init_f32vector(size_t k, const std::vector<float>& data) { - if(k) { - return pmt_t(new pmt_f32vector(k, &data[0])); - } - return pmt_t(new pmt_f32vector(k, static_cast< float >(0))); // fills an empty vector with 0 + if (k) { + return pmt_t(new pmt_f32vector(k, &data[0])); + } + return pmt_t( + new pmt_f32vector(k, static_cast<float>(0))); // fills an empty vector with 0 } -float -f32vector_ref(pmt_t vector, size_t k) +float f32vector_ref(pmt_t vector, size_t k) { - if (!vector->is_f32vector()) - throw wrong_type("pmt_f32vector_ref", vector); - return _f32vector(vector)->ref(k); + if (!vector->is_f32vector()) + throw wrong_type("pmt_f32vector_ref", vector); + return _f32vector(vector)->ref(k); } -void -f32vector_set(pmt_t vector, size_t k, float obj) +void f32vector_set(pmt_t vector, size_t k, float obj) { - if (!vector->is_f32vector()) - throw wrong_type("pmt_f32vector_set", vector); - _f32vector(vector)->set(k, obj); + if (!vector->is_f32vector()) + throw wrong_type("pmt_f32vector_set", vector); + _f32vector(vector)->set(k, obj); } -const float * -f32vector_elements(pmt_t vector, size_t &len) +const float* f32vector_elements(pmt_t vector, size_t& len) { - if (!vector->is_f32vector()) - throw wrong_type("pmt_f32vector_elements", vector); - return _f32vector(vector)->elements(len); + if (!vector->is_f32vector()) + throw wrong_type("pmt_f32vector_elements", vector); + return _f32vector(vector)->elements(len); } -const std::vector< float > -f32vector_elements(pmt_t vector) +const std::vector<float> f32vector_elements(pmt_t vector) { - if (!vector->is_f32vector()) - throw wrong_type("pmt_f32vector_elements", vector); - size_t len; - const float *array = _f32vector(vector)->elements(len); - const std::vector< float > vec(array, array+len); - return vec; + if (!vector->is_f32vector()) + throw wrong_type("pmt_f32vector_elements", vector); + size_t len; + const float* array = _f32vector(vector)->elements(len); + const std::vector<float> vec(array, array + len); + return vec; } -float * -f32vector_writable_elements(pmt_t vector, size_t &len) +float* f32vector_writable_elements(pmt_t vector, size_t& len) { - if (!vector->is_f32vector()) - throw wrong_type("pmt_f32vector_writable_elements", vector); - return _f32vector(vector)->writable_elements(len); + if (!vector->is_f32vector()) + throw wrong_type("pmt_f32vector_writable_elements", vector); + return _f32vector(vector)->writable_elements(len); } -const std::string -pmt_f32vector::string_ref(size_t k) const +const std::string pmt_f32vector::string_ref(size_t k) const { - return boost::lexical_cast< std::string, float > (ref(k)); + return boost::lexical_cast<std::string, float>(ref(k)); } } /* namespace pmt */ @@ -1378,146 +1165,122 @@ pmt_f32vector::string_ref(size_t k) const namespace pmt { -static pmt_f64vector * -_f64vector(pmt_t x) +static pmt_f64vector* _f64vector(pmt_t x) { - return dynamic_cast<pmt_f64vector*>(x.get()); + return dynamic_cast<pmt_f64vector*>(x.get()); } -pmt_f64vector::pmt_f64vector(size_t k, double fill) - : d_v(k) +pmt_f64vector::pmt_f64vector(size_t k, double fill) : d_v(k) { - for (size_t i = 0; i < k; i++) - d_v[i] = fill; + for (size_t i = 0; i < k; i++) + d_v[i] = fill; } -pmt_f64vector::pmt_f64vector(size_t k, const double *data) - : d_v(k) +pmt_f64vector::pmt_f64vector(size_t k, const double* data) : d_v(k) { - if(k) - memcpy( &d_v[0], data, k * sizeof(double) ); + if (k) + memcpy(&d_v[0], data, k * sizeof(double)); } -double -pmt_f64vector::ref(size_t k) const +double pmt_f64vector::ref(size_t k) const { - if (k >= length()) - throw out_of_range("pmt_f64vector_ref", from_long(k)); - return d_v[k]; + if (k >= length()) + throw out_of_range("pmt_f64vector_ref", from_long(k)); + return d_v[k]; } -void -pmt_f64vector::set(size_t k, double x) +void pmt_f64vector::set(size_t k, double x) { - if (k >= length()) - throw out_of_range("pmt_f64vector_set", from_long(k)); - d_v[k] = x; + if (k >= length()) + throw out_of_range("pmt_f64vector_set", from_long(k)); + d_v[k] = x; } -const double * -pmt_f64vector::elements(size_t &len) +const double* pmt_f64vector::elements(size_t& len) { - len = length(); - return len ? &d_v[0] : nullptr; + len = length(); + return len ? &d_v[0] : nullptr; } -double * -pmt_f64vector::writable_elements(size_t &len) +double* pmt_f64vector::writable_elements(size_t& len) { - len = length(); - return len ? &d_v[0] : nullptr; + len = length(); + return len ? &d_v[0] : nullptr; } -const void* -pmt_f64vector::uniform_elements(size_t &len) +const void* pmt_f64vector::uniform_elements(size_t& len) { - len = length() * sizeof(double); - return len ? &d_v[0] : nullptr; + len = length() * sizeof(double); + return len ? &d_v[0] : nullptr; } -void* -pmt_f64vector::uniform_writable_elements(size_t &len) +void* pmt_f64vector::uniform_writable_elements(size_t& len) { - len = length() * sizeof(double); - return len ? (&d_v[0]) : nullptr; + len = length() * sizeof(double); + return len ? (&d_v[0]) : nullptr; } -bool -is_f64vector(pmt_t obj) -{ - return obj->is_f64vector(); -} +bool is_f64vector(pmt_t obj) { return obj->is_f64vector(); } -pmt_t -make_f64vector(size_t k, double fill) -{ - return pmt_t(new pmt_f64vector(k, fill)); -} +pmt_t make_f64vector(size_t k, double fill) { return pmt_t(new pmt_f64vector(k, fill)); } -pmt_t -init_f64vector(size_t k, const double *data) +pmt_t init_f64vector(size_t k, const double* data) { - return pmt_t(new pmt_f64vector(k, data)); + return pmt_t(new pmt_f64vector(k, data)); } -pmt_t -init_f64vector(size_t k, const std::vector< double > &data) +pmt_t init_f64vector(size_t k, const std::vector<double>& data) { - if(k) { - return pmt_t(new pmt_f64vector(k, &data[0])); - } - return pmt_t(new pmt_f64vector(k, static_cast< double >(0))); // fills an empty vector with 0 + if (k) { + return pmt_t(new pmt_f64vector(k, &data[0])); + } + return pmt_t( + new pmt_f64vector(k, static_cast<double>(0))); // fills an empty vector with 0 } -double -f64vector_ref(pmt_t vector, size_t k) +double f64vector_ref(pmt_t vector, size_t k) { - if (!vector->is_f64vector()) - throw wrong_type("pmt_f64vector_ref", vector); - return _f64vector(vector)->ref(k); + if (!vector->is_f64vector()) + throw wrong_type("pmt_f64vector_ref", vector); + return _f64vector(vector)->ref(k); } -void -f64vector_set(pmt_t vector, size_t k, double obj) +void f64vector_set(pmt_t vector, size_t k, double obj) { - if (!vector->is_f64vector()) - throw wrong_type("pmt_f64vector_set", vector); - _f64vector(vector)->set(k, obj); + if (!vector->is_f64vector()) + throw wrong_type("pmt_f64vector_set", vector); + _f64vector(vector)->set(k, obj); } -const double * -f64vector_elements(pmt_t vector, size_t &len) +const double* f64vector_elements(pmt_t vector, size_t& len) { - if (!vector->is_f64vector()) - throw wrong_type("pmt_f64vector_elements", vector); - return _f64vector(vector)->elements(len); + if (!vector->is_f64vector()) + throw wrong_type("pmt_f64vector_elements", vector); + return _f64vector(vector)->elements(len); } -const std::vector< double > -f64vector_elements(pmt_t vector) +const std::vector<double> f64vector_elements(pmt_t vector) { - if (!vector->is_f64vector()) - throw wrong_type("pmt_f64vector_elements", vector); - size_t len; - const double *array = _f64vector(vector)->elements(len); - const std::vector< double > vec(array, array+len); - return vec; + if (!vector->is_f64vector()) + throw wrong_type("pmt_f64vector_elements", vector); + size_t len; + const double* array = _f64vector(vector)->elements(len); + const std::vector<double> vec(array, array + len); + return vec; } -double * -f64vector_writable_elements(pmt_t vector, size_t &len) +double* f64vector_writable_elements(pmt_t vector, size_t& len) { - if (!vector->is_f64vector()) - throw wrong_type("pmt_f64vector_writable_elements", vector); - return _f64vector(vector)->writable_elements(len); + if (!vector->is_f64vector()) + throw wrong_type("pmt_f64vector_writable_elements", vector); + return _f64vector(vector)->writable_elements(len); } -const std::string -pmt_f64vector::string_ref(size_t k) const +const std::string pmt_f64vector::string_ref(size_t k) const { - return boost::lexical_cast< std::string, double > (ref(k)); + return boost::lexical_cast<std::string, double>(ref(k)); } } /* namespace pmt */ @@ -1527,146 +1290,125 @@ pmt_f64vector::string_ref(size_t k) const namespace pmt { -static pmt_c32vector * -_c32vector(pmt_t x) +static pmt_c32vector* _c32vector(pmt_t x) { - return dynamic_cast<pmt_c32vector*>(x.get()); + return dynamic_cast<pmt_c32vector*>(x.get()); } -pmt_c32vector::pmt_c32vector(size_t k, std::complex<float> fill) - : d_v(k) +pmt_c32vector::pmt_c32vector(size_t k, std::complex<float> fill) : d_v(k) { - for (size_t i = 0; i < k; i++) - d_v[i] = fill; + for (size_t i = 0; i < k; i++) + d_v[i] = fill; } -pmt_c32vector::pmt_c32vector(size_t k, const std::complex<float> *data) - : d_v(k) +pmt_c32vector::pmt_c32vector(size_t k, const std::complex<float>* data) : d_v(k) { - if(k) - memcpy( &d_v[0], data, k * sizeof(std::complex<float>) ); + if (k) + memcpy(&d_v[0], data, k * sizeof(std::complex<float>)); } -std::complex<float> -pmt_c32vector::ref(size_t k) const +std::complex<float> pmt_c32vector::ref(size_t k) const { - if (k >= length()) - throw out_of_range("pmt_c32vector_ref", from_long(k)); - return d_v[k]; + if (k >= length()) + throw out_of_range("pmt_c32vector_ref", from_long(k)); + return d_v[k]; } -void -pmt_c32vector::set(size_t k, std::complex<float> x) +void pmt_c32vector::set(size_t k, std::complex<float> x) { - if (k >= length()) - throw out_of_range("pmt_c32vector_set", from_long(k)); - d_v[k] = x; + if (k >= length()) + throw out_of_range("pmt_c32vector_set", from_long(k)); + d_v[k] = x; } -const std::complex<float> * -pmt_c32vector::elements(size_t &len) +const std::complex<float>* pmt_c32vector::elements(size_t& len) { - len = length(); - return len ? &d_v[0] : nullptr; + len = length(); + return len ? &d_v[0] : nullptr; } -std::complex<float> * -pmt_c32vector::writable_elements(size_t &len) +std::complex<float>* pmt_c32vector::writable_elements(size_t& len) { - len = length(); - return len ? &d_v[0] : nullptr; + len = length(); + return len ? &d_v[0] : nullptr; } -const void* -pmt_c32vector::uniform_elements(size_t &len) +const void* pmt_c32vector::uniform_elements(size_t& len) { - len = length() * sizeof(std::complex<float>); - return len ? &d_v[0] : nullptr; + len = length() * sizeof(std::complex<float>); + return len ? &d_v[0] : nullptr; } -void* -pmt_c32vector::uniform_writable_elements(size_t &len) +void* pmt_c32vector::uniform_writable_elements(size_t& len) { - len = length() * sizeof(std::complex<float>); - return len ? (&d_v[0]) : nullptr; + len = length() * sizeof(std::complex<float>); + return len ? (&d_v[0]) : nullptr; } -bool -is_c32vector(pmt_t obj) -{ - return obj->is_c32vector(); -} +bool is_c32vector(pmt_t obj) { return obj->is_c32vector(); } -pmt_t -make_c32vector(size_t k, std::complex<float> fill) +pmt_t make_c32vector(size_t k, std::complex<float> fill) { - return pmt_t(new pmt_c32vector(k, fill)); + return pmt_t(new pmt_c32vector(k, fill)); } -pmt_t -init_c32vector(size_t k, const std::complex<float> *data) +pmt_t init_c32vector(size_t k, const std::complex<float>* data) { - return pmt_t(new pmt_c32vector(k, data)); + return pmt_t(new pmt_c32vector(k, data)); } -pmt_t -init_c32vector(size_t k, const std::vector< std::complex<float> > &data) +pmt_t init_c32vector(size_t k, const std::vector<std::complex<float>>& data) { - if(k) { - return pmt_t(new pmt_c32vector(k, &data[0])); - } - return pmt_t(new pmt_c32vector(k, static_cast< std::complex<float> >(0))); // fills an empty vector with 0 + if (k) { + return pmt_t(new pmt_c32vector(k, &data[0])); + } + return pmt_t(new pmt_c32vector( + k, static_cast<std::complex<float>>(0))); // fills an empty vector with 0 } -std::complex<float> -c32vector_ref(pmt_t vector, size_t k) +std::complex<float> c32vector_ref(pmt_t vector, size_t k) { - if (!vector->is_c32vector()) - throw wrong_type("pmt_c32vector_ref", vector); - return _c32vector(vector)->ref(k); + if (!vector->is_c32vector()) + throw wrong_type("pmt_c32vector_ref", vector); + return _c32vector(vector)->ref(k); } -void -c32vector_set(pmt_t vector, size_t k, std::complex<float> obj) +void c32vector_set(pmt_t vector, size_t k, std::complex<float> obj) { - if (!vector->is_c32vector()) - throw wrong_type("pmt_c32vector_set", vector); - _c32vector(vector)->set(k, obj); + if (!vector->is_c32vector()) + throw wrong_type("pmt_c32vector_set", vector); + _c32vector(vector)->set(k, obj); } -const std::complex<float> * -c32vector_elements(pmt_t vector, size_t &len) +const std::complex<float>* c32vector_elements(pmt_t vector, size_t& len) { - if (!vector->is_c32vector()) - throw wrong_type("pmt_c32vector_elements", vector); - return _c32vector(vector)->elements(len); + if (!vector->is_c32vector()) + throw wrong_type("pmt_c32vector_elements", vector); + return _c32vector(vector)->elements(len); } -const std::vector< std::complex<float> > -c32vector_elements(pmt_t vector) +const std::vector<std::complex<float>> c32vector_elements(pmt_t vector) { - if (!vector->is_c32vector()) - throw wrong_type("pmt_c32vector_elements", vector); - size_t len; - const std::complex<float> *array = _c32vector(vector)->elements(len); - const std::vector< std::complex<float> > vec(array, array+len); - return vec; + if (!vector->is_c32vector()) + throw wrong_type("pmt_c32vector_elements", vector); + size_t len; + const std::complex<float>* array = _c32vector(vector)->elements(len); + const std::vector<std::complex<float>> vec(array, array + len); + return vec; } -std::complex<float> * -c32vector_writable_elements(pmt_t vector, size_t &len) +std::complex<float>* c32vector_writable_elements(pmt_t vector, size_t& len) { - if (!vector->is_c32vector()) - throw wrong_type("pmt_c32vector_writable_elements", vector); - return _c32vector(vector)->writable_elements(len); + if (!vector->is_c32vector()) + throw wrong_type("pmt_c32vector_writable_elements", vector); + return _c32vector(vector)->writable_elements(len); } -const std::string -pmt_c32vector::string_ref(size_t k) const +const std::string pmt_c32vector::string_ref(size_t k) const { - return boost::lexical_cast< std::string, std::complex<float> > (ref(k)); + return boost::lexical_cast<std::string, std::complex<float>>(ref(k)); } } /* namespace pmt */ @@ -1676,146 +1418,125 @@ pmt_c32vector::string_ref(size_t k) const namespace pmt { -static pmt_c64vector * -_c64vector(pmt_t x) +static pmt_c64vector* _c64vector(pmt_t x) { - return dynamic_cast<pmt_c64vector*>(x.get()); + return dynamic_cast<pmt_c64vector*>(x.get()); } -pmt_c64vector::pmt_c64vector(size_t k, std::complex<double> fill) - : d_v(k) +pmt_c64vector::pmt_c64vector(size_t k, std::complex<double> fill) : d_v(k) { - for (size_t i = 0; i < k; i++) - d_v[i] = fill; + for (size_t i = 0; i < k; i++) + d_v[i] = fill; } -pmt_c64vector::pmt_c64vector(size_t k, const std::complex<double> *data) - : d_v(k) +pmt_c64vector::pmt_c64vector(size_t k, const std::complex<double>* data) : d_v(k) { - if(k) - memcpy( &d_v[0], data, k * sizeof(std::complex<double>) ); + if (k) + memcpy(&d_v[0], data, k * sizeof(std::complex<double>)); } -std::complex<double> -pmt_c64vector::ref(size_t k) const +std::complex<double> pmt_c64vector::ref(size_t k) const { - if (k >= length()) - throw out_of_range("pmt_c64vector_ref", from_long(k)); - return d_v[k]; + if (k >= length()) + throw out_of_range("pmt_c64vector_ref", from_long(k)); + return d_v[k]; } -void -pmt_c64vector::set(size_t k, std::complex<double> x) +void pmt_c64vector::set(size_t k, std::complex<double> x) { - if (k >= length()) - throw out_of_range("pmt_c64vector_set", from_long(k)); - d_v[k] = x; + if (k >= length()) + throw out_of_range("pmt_c64vector_set", from_long(k)); + d_v[k] = x; } -const std::complex<double> * -pmt_c64vector::elements(size_t &len) +const std::complex<double>* pmt_c64vector::elements(size_t& len) { - len = length(); - return len ? &d_v[0] : nullptr; + len = length(); + return len ? &d_v[0] : nullptr; } -std::complex<double> * -pmt_c64vector::writable_elements(size_t &len) +std::complex<double>* pmt_c64vector::writable_elements(size_t& len) { - len = length(); - return len ? &d_v[0] : nullptr; + len = length(); + return len ? &d_v[0] : nullptr; } -const void* -pmt_c64vector::uniform_elements(size_t &len) +const void* pmt_c64vector::uniform_elements(size_t& len) { - len = length() * sizeof(std::complex<double>); - return len ? &d_v[0] : nullptr; + len = length() * sizeof(std::complex<double>); + return len ? &d_v[0] : nullptr; } -void* -pmt_c64vector::uniform_writable_elements(size_t &len) +void* pmt_c64vector::uniform_writable_elements(size_t& len) { - len = length() * sizeof(std::complex<double>); - return len ? (&d_v[0]) : nullptr; + len = length() * sizeof(std::complex<double>); + return len ? (&d_v[0]) : nullptr; } -bool -is_c64vector(pmt_t obj) -{ - return obj->is_c64vector(); -} +bool is_c64vector(pmt_t obj) { return obj->is_c64vector(); } -pmt_t -make_c64vector(size_t k, std::complex<double> fill) +pmt_t make_c64vector(size_t k, std::complex<double> fill) { - return pmt_t(new pmt_c64vector(k, fill)); + return pmt_t(new pmt_c64vector(k, fill)); } -pmt_t -init_c64vector(size_t k, const std::complex<double> *data) +pmt_t init_c64vector(size_t k, const std::complex<double>* data) { - return pmt_t(new pmt_c64vector(k, data)); + return pmt_t(new pmt_c64vector(k, data)); } -pmt_t -init_c64vector(size_t k, const std::vector< std::complex<double> > &data) +pmt_t init_c64vector(size_t k, const std::vector<std::complex<double>>& data) { - if(k) { - return pmt_t(new pmt_c64vector(k, &data[0])); - } - return pmt_t(new pmt_c64vector(k, static_cast< std::complex<double> >(0))); // fills an empty vector with 0 + if (k) { + return pmt_t(new pmt_c64vector(k, &data[0])); + } + return pmt_t(new pmt_c64vector( + k, static_cast<std::complex<double>>(0))); // fills an empty vector with 0 } -std::complex<double> -c64vector_ref(pmt_t vector, size_t k) +std::complex<double> c64vector_ref(pmt_t vector, size_t k) { - if (!vector->is_c64vector()) - throw wrong_type("pmt_c64vector_ref", vector); - return _c64vector(vector)->ref(k); + if (!vector->is_c64vector()) + throw wrong_type("pmt_c64vector_ref", vector); + return _c64vector(vector)->ref(k); } -void -c64vector_set(pmt_t vector, size_t k, std::complex<double> obj) +void c64vector_set(pmt_t vector, size_t k, std::complex<double> obj) { - if (!vector->is_c64vector()) - throw wrong_type("pmt_c64vector_set", vector); - _c64vector(vector)->set(k, obj); + if (!vector->is_c64vector()) + throw wrong_type("pmt_c64vector_set", vector); + _c64vector(vector)->set(k, obj); } -const std::complex<double> * -c64vector_elements(pmt_t vector, size_t &len) +const std::complex<double>* c64vector_elements(pmt_t vector, size_t& len) { - if (!vector->is_c64vector()) - throw wrong_type("pmt_c64vector_elements", vector); - return _c64vector(vector)->elements(len); + if (!vector->is_c64vector()) + throw wrong_type("pmt_c64vector_elements", vector); + return _c64vector(vector)->elements(len); } -const std::vector< std::complex<double> > -c64vector_elements(pmt_t vector) +const std::vector<std::complex<double>> c64vector_elements(pmt_t vector) { - if (!vector->is_c64vector()) - throw wrong_type("pmt_c64vector_elements", vector); - size_t len; - const std::complex<double> *array = _c64vector(vector)->elements(len); - const std::vector< std::complex<double> > vec(array, array+len); - return vec; + if (!vector->is_c64vector()) + throw wrong_type("pmt_c64vector_elements", vector); + size_t len; + const std::complex<double>* array = _c64vector(vector)->elements(len); + const std::vector<std::complex<double>> vec(array, array + len); + return vec; } -std::complex<double> * -c64vector_writable_elements(pmt_t vector, size_t &len) +std::complex<double>* c64vector_writable_elements(pmt_t vector, size_t& len) { - if (!vector->is_c64vector()) - throw wrong_type("pmt_c64vector_writable_elements", vector); - return _c64vector(vector)->writable_elements(len); + if (!vector->is_c64vector()) + throw wrong_type("pmt_c64vector_writable_elements", vector); + return _c64vector(vector)->writable_elements(len); } -const std::string -pmt_c64vector::string_ref(size_t k) const +const std::string pmt_c64vector::string_ref(size_t k) const { - return boost::lexical_cast< std::string, std::complex<double> > (ref(k)); + return boost::lexical_cast<std::string, std::complex<double>>(ref(k)); } } /* namespace pmt */ diff --git a/gnuradio-runtime/lib/pmt/pmt_unv_int.h b/gnuradio-runtime/lib/pmt/pmt_unv_int.h index 4b4364b411..c2e2617f63 100644 --- a/gnuradio-runtime/lib/pmt/pmt_unv_int.h +++ b/gnuradio-runtime/lib/pmt/pmt_unv_int.h @@ -28,29 +28,29 @@ #include <vector> #include <cstdint> -namespace pmt{ +namespace pmt { //////////////////////////////////////////////////////////////////////////// // pmt_u8vector //////////////////////////////////////////////////////////////////////////// class PMT_API pmt_u8vector : public pmt_uniform_vector { - std::vector< uint8_t > d_v; + std::vector<uint8_t> d_v; public: - pmt_u8vector(size_t k, uint8_t fill); - pmt_u8vector(size_t k, const uint8_t *data); - // ~pmt_u8vector(); - - bool is_u8vector() const { return true; } - size_t length() const { return d_v.size(); } - size_t itemsize() const { return sizeof(uint8_t); } - uint8_t ref(size_t k) const; - void set(size_t k, uint8_t x); - const uint8_t *elements(size_t &len); - uint8_t *writable_elements(size_t &len); - const void *uniform_elements(size_t &len); - void *uniform_writable_elements(size_t &len); - virtual const std::string string_ref(size_t k) const; + pmt_u8vector(size_t k, uint8_t fill); + pmt_u8vector(size_t k, const uint8_t* data); + // ~pmt_u8vector(); + + bool is_u8vector() const { return true; } + size_t length() const { return d_v.size(); } + size_t itemsize() const { return sizeof(uint8_t); } + uint8_t ref(size_t k) const; + void set(size_t k, uint8_t x); + const uint8_t* elements(size_t& len); + uint8_t* writable_elements(size_t& len); + const void* uniform_elements(size_t& len); + void* uniform_writable_elements(size_t& len); + virtual const std::string string_ref(size_t k) const; }; //////////////////////////////////////////////////////////////////////////// @@ -59,23 +59,23 @@ public: class pmt_s8vector : public pmt_uniform_vector { - std::vector< int8_t > d_v; + std::vector<int8_t> d_v; public: - pmt_s8vector(size_t k, int8_t fill); - pmt_s8vector(size_t k, const int8_t *data); - // ~pmt_s8vector(); - - bool is_s8vector() const { return true; } - size_t length() const { return d_v.size(); } - size_t itemsize() const { return sizeof(int8_t); } - int8_t ref(size_t k) const; - void set(size_t k, int8_t x); - const int8_t *elements(size_t &len); - int8_t *writable_elements(size_t &len); - const void *uniform_elements(size_t &len); - void *uniform_writable_elements(size_t &len); - virtual const std::string string_ref(size_t k) const; + pmt_s8vector(size_t k, int8_t fill); + pmt_s8vector(size_t k, const int8_t* data); + // ~pmt_s8vector(); + + bool is_s8vector() const { return true; } + size_t length() const { return d_v.size(); } + size_t itemsize() const { return sizeof(int8_t); } + int8_t ref(size_t k) const; + void set(size_t k, int8_t x); + const int8_t* elements(size_t& len); + int8_t* writable_elements(size_t& len); + const void* uniform_elements(size_t& len); + void* uniform_writable_elements(size_t& len); + virtual const std::string string_ref(size_t k) const; }; //////////////////////////////////////////////////////////////////////////// @@ -84,23 +84,23 @@ public: class pmt_u16vector : public pmt_uniform_vector { - std::vector< uint16_t > d_v; + std::vector<uint16_t> d_v; public: - pmt_u16vector(size_t k, uint16_t fill); - pmt_u16vector(size_t k, const uint16_t *data); - // ~pmt_u16vector(); - - bool is_u16vector() const { return true; } - size_t length() const { return d_v.size(); } - size_t itemsize() const { return sizeof(uint16_t); } - uint16_t ref(size_t k) const; - void set(size_t k, uint16_t x); - const uint16_t *elements(size_t &len); - uint16_t *writable_elements(size_t &len); - const void *uniform_elements(size_t &len); - void *uniform_writable_elements(size_t &len); - virtual const std::string string_ref(size_t k) const; + pmt_u16vector(size_t k, uint16_t fill); + pmt_u16vector(size_t k, const uint16_t* data); + // ~pmt_u16vector(); + + bool is_u16vector() const { return true; } + size_t length() const { return d_v.size(); } + size_t itemsize() const { return sizeof(uint16_t); } + uint16_t ref(size_t k) const; + void set(size_t k, uint16_t x); + const uint16_t* elements(size_t& len); + uint16_t* writable_elements(size_t& len); + const void* uniform_elements(size_t& len); + void* uniform_writable_elements(size_t& len); + virtual const std::string string_ref(size_t k) const; }; //////////////////////////////////////////////////////////////////////////// @@ -109,23 +109,23 @@ public: class pmt_s16vector : public pmt_uniform_vector { - std::vector< int16_t > d_v; + std::vector<int16_t> d_v; public: - pmt_s16vector(size_t k, int16_t fill); - pmt_s16vector(size_t k, const int16_t *data); - // ~pmt_s16vector(); - - bool is_s16vector() const { return true; } - size_t length() const { return d_v.size(); } - size_t itemsize() const { return sizeof(int16_t); } - int16_t ref(size_t k) const; - void set(size_t k, int16_t x); - const int16_t *elements(size_t &len); - int16_t *writable_elements(size_t &len); - const void *uniform_elements(size_t &len); - void *uniform_writable_elements(size_t &len); - virtual const std::string string_ref(size_t k) const; + pmt_s16vector(size_t k, int16_t fill); + pmt_s16vector(size_t k, const int16_t* data); + // ~pmt_s16vector(); + + bool is_s16vector() const { return true; } + size_t length() const { return d_v.size(); } + size_t itemsize() const { return sizeof(int16_t); } + int16_t ref(size_t k) const; + void set(size_t k, int16_t x); + const int16_t* elements(size_t& len); + int16_t* writable_elements(size_t& len); + const void* uniform_elements(size_t& len); + void* uniform_writable_elements(size_t& len); + virtual const std::string string_ref(size_t k) const; }; //////////////////////////////////////////////////////////////////////////// @@ -134,23 +134,23 @@ public: class pmt_u32vector : public pmt_uniform_vector { - std::vector< uint32_t > d_v; + std::vector<uint32_t> d_v; public: - pmt_u32vector(size_t k, uint32_t fill); - pmt_u32vector(size_t k, const uint32_t *data); - // ~pmt_u32vector(); - - bool is_u32vector() const { return true; } - size_t length() const { return d_v.size(); } - size_t itemsize() const { return sizeof(uint32_t); } - uint32_t ref(size_t k) const; - void set(size_t k, uint32_t x); - const uint32_t *elements(size_t &len); - uint32_t *writable_elements(size_t &len); - const void *uniform_elements(size_t &len); - void *uniform_writable_elements(size_t &len); - virtual const std::string string_ref(size_t k) const; + pmt_u32vector(size_t k, uint32_t fill); + pmt_u32vector(size_t k, const uint32_t* data); + // ~pmt_u32vector(); + + bool is_u32vector() const { return true; } + size_t length() const { return d_v.size(); } + size_t itemsize() const { return sizeof(uint32_t); } + uint32_t ref(size_t k) const; + void set(size_t k, uint32_t x); + const uint32_t* elements(size_t& len); + uint32_t* writable_elements(size_t& len); + const void* uniform_elements(size_t& len); + void* uniform_writable_elements(size_t& len); + virtual const std::string string_ref(size_t k) const; }; //////////////////////////////////////////////////////////////////////////// @@ -159,23 +159,23 @@ public: class pmt_s32vector : public pmt_uniform_vector { - std::vector< int32_t > d_v; + std::vector<int32_t> d_v; public: - pmt_s32vector(size_t k, int32_t fill); - pmt_s32vector(size_t k, const int32_t *data); - // ~pmt_s32vector(); - - bool is_s32vector() const { return true; } - size_t length() const { return d_v.size(); } - size_t itemsize() const { return sizeof(int32_t); } - int32_t ref(size_t k) const; - void set(size_t k, int32_t x); - const int32_t *elements(size_t &len); - int32_t *writable_elements(size_t &len); - const void *uniform_elements(size_t &len); - void *uniform_writable_elements(size_t &len); - virtual const std::string string_ref(size_t k) const; + pmt_s32vector(size_t k, int32_t fill); + pmt_s32vector(size_t k, const int32_t* data); + // ~pmt_s32vector(); + + bool is_s32vector() const { return true; } + size_t length() const { return d_v.size(); } + size_t itemsize() const { return sizeof(int32_t); } + int32_t ref(size_t k) const; + void set(size_t k, int32_t x); + const int32_t* elements(size_t& len); + int32_t* writable_elements(size_t& len); + const void* uniform_elements(size_t& len); + void* uniform_writable_elements(size_t& len); + virtual const std::string string_ref(size_t k) const; }; //////////////////////////////////////////////////////////////////////////// @@ -184,23 +184,23 @@ public: class pmt_u64vector : public pmt_uniform_vector { - std::vector< uint64_t > d_v; + std::vector<uint64_t> d_v; public: - pmt_u64vector(size_t k, uint64_t fill); - pmt_u64vector(size_t k, const uint64_t *data); - // ~pmt_u64vector(); - - bool is_u64vector() const { return true; } - size_t length() const { return d_v.size(); } - size_t itemsize() const { return sizeof(uint64_t); } - uint64_t ref(size_t k) const; - void set(size_t k, uint64_t x); - const uint64_t *elements(size_t &len); - uint64_t *writable_elements(size_t &len); - const void *uniform_elements(size_t &len); - void *uniform_writable_elements(size_t &len); - virtual const std::string string_ref(size_t k) const; + pmt_u64vector(size_t k, uint64_t fill); + pmt_u64vector(size_t k, const uint64_t* data); + // ~pmt_u64vector(); + + bool is_u64vector() const { return true; } + size_t length() const { return d_v.size(); } + size_t itemsize() const { return sizeof(uint64_t); } + uint64_t ref(size_t k) const; + void set(size_t k, uint64_t x); + const uint64_t* elements(size_t& len); + uint64_t* writable_elements(size_t& len); + const void* uniform_elements(size_t& len); + void* uniform_writable_elements(size_t& len); + virtual const std::string string_ref(size_t k) const; }; //////////////////////////////////////////////////////////////////////////// @@ -209,23 +209,23 @@ public: class pmt_s64vector : public pmt_uniform_vector { - std::vector< int64_t > d_v; + std::vector<int64_t> d_v; public: - pmt_s64vector(size_t k, int64_t fill); - pmt_s64vector(size_t k, const int64_t *data); - // ~pmt_s64vector(); - - bool is_s64vector() const { return true; } - size_t length() const { return d_v.size(); } - size_t itemsize() const { return sizeof(int64_t); } - int64_t ref(size_t k) const; - void set(size_t k, int64_t x); - const int64_t *elements(size_t &len); - int64_t *writable_elements(size_t &len); - const void *uniform_elements(size_t &len); - void *uniform_writable_elements(size_t &len); - virtual const std::string string_ref(size_t k) const; + pmt_s64vector(size_t k, int64_t fill); + pmt_s64vector(size_t k, const int64_t* data); + // ~pmt_s64vector(); + + bool is_s64vector() const { return true; } + size_t length() const { return d_v.size(); } + size_t itemsize() const { return sizeof(int64_t); } + int64_t ref(size_t k) const; + void set(size_t k, int64_t x); + const int64_t* elements(size_t& len); + int64_t* writable_elements(size_t& len); + const void* uniform_elements(size_t& len); + void* uniform_writable_elements(size_t& len); + virtual const std::string string_ref(size_t k) const; }; //////////////////////////////////////////////////////////////////////////// @@ -234,23 +234,23 @@ public: class pmt_f32vector : public pmt_uniform_vector { - std::vector< float > d_v; + std::vector<float> d_v; public: - pmt_f32vector(size_t k, float fill); - pmt_f32vector(size_t k, const float *data); - // ~pmt_f32vector(); - - bool is_f32vector() const { return true; } - size_t length() const { return d_v.size(); } - size_t itemsize() const { return sizeof(float); } - float ref(size_t k) const; - void set(size_t k, float x); - const float *elements(size_t &len); - float *writable_elements(size_t &len); - const void *uniform_elements(size_t &len); - void *uniform_writable_elements(size_t &len); - virtual const std::string string_ref(size_t k) const; + pmt_f32vector(size_t k, float fill); + pmt_f32vector(size_t k, const float* data); + // ~pmt_f32vector(); + + bool is_f32vector() const { return true; } + size_t length() const { return d_v.size(); } + size_t itemsize() const { return sizeof(float); } + float ref(size_t k) const; + void set(size_t k, float x); + const float* elements(size_t& len); + float* writable_elements(size_t& len); + const void* uniform_elements(size_t& len); + void* uniform_writable_elements(size_t& len); + virtual const std::string string_ref(size_t k) const; }; //////////////////////////////////////////////////////////////////////////// @@ -259,23 +259,23 @@ public: class pmt_f64vector : public pmt_uniform_vector { - std::vector< double > d_v; + std::vector<double> d_v; public: - pmt_f64vector(size_t k, double fill); - pmt_f64vector(size_t k, const double *data); - // ~pmt_f64vector(); - - bool is_f64vector() const { return true; } - size_t length() const { return d_v.size(); } - size_t itemsize() const { return sizeof(double); } - double ref(size_t k) const; - void set(size_t k, double x); - const double *elements(size_t &len); - double *writable_elements(size_t &len); - const void *uniform_elements(size_t &len); - void *uniform_writable_elements(size_t &len); - virtual const std::string string_ref(size_t k) const; + pmt_f64vector(size_t k, double fill); + pmt_f64vector(size_t k, const double* data); + // ~pmt_f64vector(); + + bool is_f64vector() const { return true; } + size_t length() const { return d_v.size(); } + size_t itemsize() const { return sizeof(double); } + double ref(size_t k) const; + void set(size_t k, double x); + const double* elements(size_t& len); + double* writable_elements(size_t& len); + const void* uniform_elements(size_t& len); + void* uniform_writable_elements(size_t& len); + virtual const std::string string_ref(size_t k) const; }; //////////////////////////////////////////////////////////////////////////// @@ -284,23 +284,23 @@ public: class pmt_c32vector : public pmt_uniform_vector { - std::vector< std::complex<float> > d_v; + std::vector<std::complex<float>> d_v; public: - pmt_c32vector(size_t k, std::complex<float> fill); - pmt_c32vector(size_t k, const std::complex<float> *data); - // ~pmt_c32vector(); - - bool is_c32vector() const { return true; } - size_t length() const { return d_v.size(); } - size_t itemsize() const { return sizeof(std::complex<float>); } - std::complex<float> ref(size_t k) const; - void set(size_t k, std::complex<float> x); - const std::complex<float> *elements(size_t &len); - std::complex<float> *writable_elements(size_t &len); - const void *uniform_elements(size_t &len); - void *uniform_writable_elements(size_t &len); - virtual const std::string string_ref(size_t k) const; + pmt_c32vector(size_t k, std::complex<float> fill); + pmt_c32vector(size_t k, const std::complex<float>* data); + // ~pmt_c32vector(); + + bool is_c32vector() const { return true; } + size_t length() const { return d_v.size(); } + size_t itemsize() const { return sizeof(std::complex<float>); } + std::complex<float> ref(size_t k) const; + void set(size_t k, std::complex<float> x); + const std::complex<float>* elements(size_t& len); + std::complex<float>* writable_elements(size_t& len); + const void* uniform_elements(size_t& len); + void* uniform_writable_elements(size_t& len); + virtual const std::string string_ref(size_t k) const; }; //////////////////////////////////////////////////////////////////////////// @@ -309,23 +309,23 @@ public: class pmt_c64vector : public pmt_uniform_vector { - std::vector< std::complex<double> > d_v; + std::vector<std::complex<double>> d_v; public: - pmt_c64vector(size_t k, std::complex<double> fill); - pmt_c64vector(size_t k, const std::complex<double> *data); - // ~pmt_c64vector(); - - bool is_c64vector() const { return true; } - size_t length() const { return d_v.size(); } - size_t itemsize() const { return sizeof(std::complex<double>); } - std::complex<double> ref(size_t k) const; - void set(size_t k, std::complex<double> x); - const std::complex<double> *elements(size_t &len); - std::complex<double> *writable_elements(size_t &len); - const void *uniform_elements(size_t &len); - void *uniform_writable_elements(size_t &len); - virtual const std::string string_ref(size_t k) const; + pmt_c64vector(size_t k, std::complex<double> fill); + pmt_c64vector(size_t k, const std::complex<double>* data); + // ~pmt_c64vector(); + + bool is_c64vector() const { return true; } + size_t length() const { return d_v.size(); } + size_t itemsize() const { return sizeof(std::complex<double>); } + std::complex<double> ref(size_t k) const; + void set(size_t k, std::complex<double> x); + const std::complex<double>* elements(size_t& len); + std::complex<double>* writable_elements(size_t& len); + const void* uniform_elements(size_t& len); + void* uniform_writable_elements(size_t& len); + virtual const std::string string_ref(size_t k) const; }; } /* namespace pmt */ #endif diff --git a/gnuradio-runtime/lib/pmt/qa_pmt_prims.cc b/gnuradio-runtime/lib/pmt/qa_pmt_prims.cc index 356cf95203..b715d69df4 100644 --- a/gnuradio-runtime/lib/pmt/qa_pmt_prims.cc +++ b/gnuradio-runtime/lib/pmt/qa_pmt_prims.cc @@ -28,384 +28,397 @@ #include <cstring> #include <sstream> -BOOST_AUTO_TEST_CASE(test_symbols) { - BOOST_CHECK(!pmt::is_symbol(pmt::PMT_T)); - BOOST_CHECK(!pmt::is_symbol(pmt::PMT_F)); - BOOST_CHECK_THROW(pmt::symbol_to_string(pmt::PMT_F), pmt::wrong_type); - - pmt::pmt_t sym1 = pmt::mp("test"); - BOOST_CHECK(pmt::is_symbol(sym1)); - BOOST_CHECK_EQUAL(std::string("test"), pmt::symbol_to_string(sym1)); - BOOST_CHECK(pmt::is_true(sym1)); - BOOST_CHECK(!pmt::is_false(sym1)); - - pmt::pmt_t sym2 = pmt::mp("foo"); - pmt::pmt_t sym3 = pmt::mp("test"); - BOOST_CHECK_EQUAL(sym1, sym3); - BOOST_CHECK(sym1 != sym2); - BOOST_CHECK(sym1 == sym3); - - static const int N = 2048; - std::vector<pmt::pmt_t> v1(N); - std::vector<pmt::pmt_t> v2(N); - - // generate a bunch of symbols - for (int i = 0; i < N; i++){ - std::string buf = str(boost::format("test-%d") % i); - v1[i] = pmt::mp(buf.c_str()); - } - - // confirm that they are all unique - for (int i = 0; i < N; i++) - for (int j = i + 1; j < N; j++) - BOOST_CHECK(v1[i] != v1[j]); - - // generate the same symbols again - for (int i = 0; i < N; i++){ - std::string buf = str(boost::format("test-%d") % i); - v2[i] = pmt::mp(buf.c_str()); - } - - // confirm that we get the same ones back - for (int i = 0; i < N; i++) - BOOST_CHECK(v1[i] == v2[i]); +BOOST_AUTO_TEST_CASE(test_symbols) +{ + BOOST_CHECK(!pmt::is_symbol(pmt::PMT_T)); + BOOST_CHECK(!pmt::is_symbol(pmt::PMT_F)); + BOOST_CHECK_THROW(pmt::symbol_to_string(pmt::PMT_F), pmt::wrong_type); + + pmt::pmt_t sym1 = pmt::mp("test"); + BOOST_CHECK(pmt::is_symbol(sym1)); + BOOST_CHECK_EQUAL(std::string("test"), pmt::symbol_to_string(sym1)); + BOOST_CHECK(pmt::is_true(sym1)); + BOOST_CHECK(!pmt::is_false(sym1)); + + pmt::pmt_t sym2 = pmt::mp("foo"); + pmt::pmt_t sym3 = pmt::mp("test"); + BOOST_CHECK_EQUAL(sym1, sym3); + BOOST_CHECK(sym1 != sym2); + BOOST_CHECK(sym1 == sym3); + + static const int N = 2048; + std::vector<pmt::pmt_t> v1(N); + std::vector<pmt::pmt_t> v2(N); + + // generate a bunch of symbols + for (int i = 0; i < N; i++) { + std::string buf = str(boost::format("test-%d") % i); + v1[i] = pmt::mp(buf.c_str()); + } + + // confirm that they are all unique + for (int i = 0; i < N; i++) + for (int j = i + 1; j < N; j++) + BOOST_CHECK(v1[i] != v1[j]); + + // generate the same symbols again + for (int i = 0; i < N; i++) { + std::string buf = str(boost::format("test-%d") % i); + v2[i] = pmt::mp(buf.c_str()); + } + + // confirm that we get the same ones back + for (int i = 0; i < N; i++) + BOOST_CHECK(v1[i] == v2[i]); } -BOOST_AUTO_TEST_CASE(test_booleans) { - pmt::pmt_t sym = pmt::mp("test"); - BOOST_CHECK(pmt::is_bool(pmt::PMT_T)); - BOOST_CHECK(pmt::is_bool(pmt::PMT_F)); - BOOST_CHECK(!pmt::is_bool(sym)); - BOOST_CHECK_EQUAL(pmt::from_bool(false), pmt::PMT_F); - BOOST_CHECK_EQUAL(pmt::from_bool(true), pmt::PMT_T); - BOOST_CHECK_EQUAL(false, pmt::to_bool(pmt::PMT_F)); - BOOST_CHECK_EQUAL(true, pmt::to_bool(pmt::PMT_T)); - BOOST_CHECK_THROW(pmt::to_bool(sym), pmt::wrong_type); +BOOST_AUTO_TEST_CASE(test_booleans) +{ + pmt::pmt_t sym = pmt::mp("test"); + BOOST_CHECK(pmt::is_bool(pmt::PMT_T)); + BOOST_CHECK(pmt::is_bool(pmt::PMT_F)); + BOOST_CHECK(!pmt::is_bool(sym)); + BOOST_CHECK_EQUAL(pmt::from_bool(false), pmt::PMT_F); + BOOST_CHECK_EQUAL(pmt::from_bool(true), pmt::PMT_T); + BOOST_CHECK_EQUAL(false, pmt::to_bool(pmt::PMT_F)); + BOOST_CHECK_EQUAL(true, pmt::to_bool(pmt::PMT_T)); + BOOST_CHECK_THROW(pmt::to_bool(sym), pmt::wrong_type); } -BOOST_AUTO_TEST_CASE(test_integers) { - pmt::pmt_t p1 = pmt::from_long(1); - pmt::pmt_t m1 = pmt::from_long(-1); - BOOST_CHECK(!pmt::is_integer(pmt::PMT_T)); - BOOST_CHECK(pmt::is_integer(p1)); - BOOST_CHECK(pmt::is_integer(m1)); - BOOST_CHECK_THROW(pmt::to_long(pmt::PMT_T), pmt::wrong_type); - BOOST_CHECK_EQUAL(-1L, pmt::to_long(m1)); - BOOST_CHECK_EQUAL(1L, pmt::to_long(p1)); +BOOST_AUTO_TEST_CASE(test_integers) +{ + pmt::pmt_t p1 = pmt::from_long(1); + pmt::pmt_t m1 = pmt::from_long(-1); + BOOST_CHECK(!pmt::is_integer(pmt::PMT_T)); + BOOST_CHECK(pmt::is_integer(p1)); + BOOST_CHECK(pmt::is_integer(m1)); + BOOST_CHECK_THROW(pmt::to_long(pmt::PMT_T), pmt::wrong_type); + BOOST_CHECK_EQUAL(-1L, pmt::to_long(m1)); + BOOST_CHECK_EQUAL(1L, pmt::to_long(p1)); } -BOOST_AUTO_TEST_CASE(test_uint64s) { - pmt::pmt_t p1 = pmt::from_uint64((uint64_t)1); - pmt::pmt_t m1 = pmt::from_uint64((uint64_t)8589934592ULL); - BOOST_CHECK(!pmt::is_uint64(pmt::PMT_T)); - BOOST_CHECK(pmt::is_uint64(p1)); - BOOST_CHECK(pmt::is_uint64(m1)); - BOOST_CHECK_THROW(pmt::to_uint64(pmt::PMT_T), pmt::wrong_type); - BOOST_CHECK_EQUAL((uint64_t)8589934592ULL, (uint64_t)pmt::to_uint64(m1)); - BOOST_CHECK_EQUAL((uint64_t)1ULL, (uint64_t)pmt::to_uint64(p1)); +BOOST_AUTO_TEST_CASE(test_uint64s) +{ + pmt::pmt_t p1 = pmt::from_uint64((uint64_t)1); + pmt::pmt_t m1 = pmt::from_uint64((uint64_t)8589934592ULL); + BOOST_CHECK(!pmt::is_uint64(pmt::PMT_T)); + BOOST_CHECK(pmt::is_uint64(p1)); + BOOST_CHECK(pmt::is_uint64(m1)); + BOOST_CHECK_THROW(pmt::to_uint64(pmt::PMT_T), pmt::wrong_type); + BOOST_CHECK_EQUAL((uint64_t)8589934592ULL, (uint64_t)pmt::to_uint64(m1)); + BOOST_CHECK_EQUAL((uint64_t)1ULL, (uint64_t)pmt::to_uint64(p1)); } -BOOST_AUTO_TEST_CASE(test_reals) { - pmt::pmt_t p1 = pmt::from_double(1); - pmt::pmt_t m1 = pmt::from_double(-1); - BOOST_CHECK(!pmt::is_real(pmt::PMT_T)); - BOOST_CHECK(pmt::is_real(p1)); - BOOST_CHECK(pmt::is_real(m1)); - BOOST_CHECK_THROW(pmt::to_double(pmt::PMT_T), pmt::wrong_type); - BOOST_CHECK_EQUAL(-1.0, pmt::to_double(m1)); - BOOST_CHECK_EQUAL(1.0, pmt::to_double(p1)); - BOOST_CHECK_EQUAL(1.0, pmt::to_double(pmt::from_long(1))); - - pmt::pmt_t p2 = pmt::from_float(1); - pmt::pmt_t m2 = pmt::from_float(-1); - BOOST_CHECK(pmt::is_real(p2)); - BOOST_CHECK(pmt::is_real(m2)); - BOOST_CHECK_THROW(pmt::to_float(pmt::PMT_T), pmt::wrong_type); - BOOST_CHECK_EQUAL(float(-1.0), pmt::to_float(m2)); - BOOST_CHECK_EQUAL(float(1.0), pmt::to_float(p2)); - BOOST_CHECK_EQUAL(float(1.0), pmt::to_float(pmt::from_long(1))); +BOOST_AUTO_TEST_CASE(test_reals) +{ + pmt::pmt_t p1 = pmt::from_double(1); + pmt::pmt_t m1 = pmt::from_double(-1); + BOOST_CHECK(!pmt::is_real(pmt::PMT_T)); + BOOST_CHECK(pmt::is_real(p1)); + BOOST_CHECK(pmt::is_real(m1)); + BOOST_CHECK_THROW(pmt::to_double(pmt::PMT_T), pmt::wrong_type); + BOOST_CHECK_EQUAL(-1.0, pmt::to_double(m1)); + BOOST_CHECK_EQUAL(1.0, pmt::to_double(p1)); + BOOST_CHECK_EQUAL(1.0, pmt::to_double(pmt::from_long(1))); + + pmt::pmt_t p2 = pmt::from_float(1); + pmt::pmt_t m2 = pmt::from_float(-1); + BOOST_CHECK(pmt::is_real(p2)); + BOOST_CHECK(pmt::is_real(m2)); + BOOST_CHECK_THROW(pmt::to_float(pmt::PMT_T), pmt::wrong_type); + BOOST_CHECK_EQUAL(float(-1.0), pmt::to_float(m2)); + BOOST_CHECK_EQUAL(float(1.0), pmt::to_float(p2)); + BOOST_CHECK_EQUAL(float(1.0), pmt::to_float(pmt::from_long(1))); } -BOOST_AUTO_TEST_CASE(test_complexes) { - pmt::pmt_t p1 = pmt::make_rectangular(2, -3); - pmt::pmt_t m1 = pmt::make_rectangular(-3, 2); - pmt::pmt_t p2 = pmt::from_complex(2, -3); - pmt::pmt_t m2 = pmt::from_complex(-3, 2); - pmt::pmt_t p3 = pmt::from_complex(std::complex<double>(2, -3)); - pmt::pmt_t m3 = pmt::from_complex(std::complex<double>(-3, 2)); - BOOST_CHECK(!pmt::is_complex(pmt::PMT_T)); - BOOST_CHECK(pmt::is_complex(p1)); - BOOST_CHECK(pmt::is_complex(m1)); - BOOST_CHECK(pmt::is_complex(p2)); - BOOST_CHECK(pmt::is_complex(m2)); - BOOST_CHECK(pmt::is_complex(p3)); - BOOST_CHECK(pmt::is_complex(m3)); - BOOST_CHECK_THROW(pmt::to_complex(pmt::PMT_T), pmt::wrong_type); - BOOST_CHECK_EQUAL(std::complex<double>(2, -3), pmt::to_complex(p1)); - BOOST_CHECK_EQUAL(std::complex<double>(-3, 2), pmt::to_complex(m1)); - BOOST_CHECK_EQUAL(std::complex<double>(2, -3), pmt::to_complex(p2)); - BOOST_CHECK_EQUAL(std::complex<double>(-3, 2), pmt::to_complex(m2)); - BOOST_CHECK_EQUAL(std::complex<double>(2, -3), pmt::to_complex(p3)); - BOOST_CHECK_EQUAL(std::complex<double>(-3, 2), pmt::to_complex(m3)); - BOOST_CHECK_EQUAL(std::complex<double>(1.0, 0), pmt::to_complex(pmt::from_long(1))); - BOOST_CHECK_EQUAL(std::complex<double>(1.0, 0), pmt::to_complex(pmt::from_double(1.0))); +BOOST_AUTO_TEST_CASE(test_complexes) +{ + pmt::pmt_t p1 = pmt::make_rectangular(2, -3); + pmt::pmt_t m1 = pmt::make_rectangular(-3, 2); + pmt::pmt_t p2 = pmt::from_complex(2, -3); + pmt::pmt_t m2 = pmt::from_complex(-3, 2); + pmt::pmt_t p3 = pmt::from_complex(std::complex<double>(2, -3)); + pmt::pmt_t m3 = pmt::from_complex(std::complex<double>(-3, 2)); + BOOST_CHECK(!pmt::is_complex(pmt::PMT_T)); + BOOST_CHECK(pmt::is_complex(p1)); + BOOST_CHECK(pmt::is_complex(m1)); + BOOST_CHECK(pmt::is_complex(p2)); + BOOST_CHECK(pmt::is_complex(m2)); + BOOST_CHECK(pmt::is_complex(p3)); + BOOST_CHECK(pmt::is_complex(m3)); + BOOST_CHECK_THROW(pmt::to_complex(pmt::PMT_T), pmt::wrong_type); + BOOST_CHECK_EQUAL(std::complex<double>(2, -3), pmt::to_complex(p1)); + BOOST_CHECK_EQUAL(std::complex<double>(-3, 2), pmt::to_complex(m1)); + BOOST_CHECK_EQUAL(std::complex<double>(2, -3), pmt::to_complex(p2)); + BOOST_CHECK_EQUAL(std::complex<double>(-3, 2), pmt::to_complex(m2)); + BOOST_CHECK_EQUAL(std::complex<double>(2, -3), pmt::to_complex(p3)); + BOOST_CHECK_EQUAL(std::complex<double>(-3, 2), pmt::to_complex(m3)); + BOOST_CHECK_EQUAL(std::complex<double>(1.0, 0), pmt::to_complex(pmt::from_long(1))); + BOOST_CHECK_EQUAL(std::complex<double>(1.0, 0), + pmt::to_complex(pmt::from_double(1.0))); } -BOOST_AUTO_TEST_CASE(test_pairs) { - BOOST_CHECK(pmt::is_null(pmt::PMT_NIL)); - BOOST_CHECK(!pmt::is_pair(pmt::PMT_NIL)); - pmt::pmt_t s1 = pmt::mp("s1"); - pmt::pmt_t s2 = pmt::mp("s2"); - pmt::pmt_t s3 = pmt::mp("s3"); - - - BOOST_CHECK_EQUAL((size_t)0, pmt::length(pmt::PMT_NIL)); - BOOST_CHECK_THROW(pmt::length(s1), pmt::wrong_type); - BOOST_CHECK_THROW(pmt::length(pmt::from_double(42)), pmt::wrong_type); - - pmt::pmt_t c1 = pmt::cons(s1, pmt::PMT_NIL); - BOOST_CHECK(pmt::is_pair(c1)); - BOOST_CHECK(!pmt::is_pair(s1)); - BOOST_CHECK_EQUAL(s1, pmt::car(c1)); - BOOST_CHECK_EQUAL(pmt::PMT_NIL, pmt::cdr(c1)); - BOOST_CHECK_EQUAL((size_t) 1, pmt::length(c1)); - - pmt::pmt_t c3 = pmt::cons(s3, pmt::PMT_NIL); - pmt::pmt_t c2 = pmt::cons(s2, c3); - pmt::set_cdr(c1, c2); - BOOST_CHECK_EQUAL(c2, pmt::cdr(c1)); - pmt::set_car(c1, s3); - BOOST_CHECK_EQUAL(s3, pmt::car(c1)); - BOOST_CHECK_EQUAL((size_t)1, pmt::length(c3)); - BOOST_CHECK_EQUAL((size_t)2, pmt::length(c2)); - - BOOST_CHECK_THROW(pmt::cdr(pmt::PMT_NIL), pmt::wrong_type); - BOOST_CHECK_THROW(pmt::car(pmt::PMT_NIL), pmt::wrong_type); - BOOST_CHECK_THROW(pmt::set_car(s1, pmt::PMT_NIL), pmt::wrong_type); - BOOST_CHECK_THROW(pmt::set_cdr(s1, pmt::PMT_NIL), pmt::wrong_type); +BOOST_AUTO_TEST_CASE(test_pairs) +{ + BOOST_CHECK(pmt::is_null(pmt::PMT_NIL)); + BOOST_CHECK(!pmt::is_pair(pmt::PMT_NIL)); + pmt::pmt_t s1 = pmt::mp("s1"); + pmt::pmt_t s2 = pmt::mp("s2"); + pmt::pmt_t s3 = pmt::mp("s3"); + + + BOOST_CHECK_EQUAL((size_t)0, pmt::length(pmt::PMT_NIL)); + BOOST_CHECK_THROW(pmt::length(s1), pmt::wrong_type); + BOOST_CHECK_THROW(pmt::length(pmt::from_double(42)), pmt::wrong_type); + + pmt::pmt_t c1 = pmt::cons(s1, pmt::PMT_NIL); + BOOST_CHECK(pmt::is_pair(c1)); + BOOST_CHECK(!pmt::is_pair(s1)); + BOOST_CHECK_EQUAL(s1, pmt::car(c1)); + BOOST_CHECK_EQUAL(pmt::PMT_NIL, pmt::cdr(c1)); + BOOST_CHECK_EQUAL((size_t)1, pmt::length(c1)); + + pmt::pmt_t c3 = pmt::cons(s3, pmt::PMT_NIL); + pmt::pmt_t c2 = pmt::cons(s2, c3); + pmt::set_cdr(c1, c2); + BOOST_CHECK_EQUAL(c2, pmt::cdr(c1)); + pmt::set_car(c1, s3); + BOOST_CHECK_EQUAL(s3, pmt::car(c1)); + BOOST_CHECK_EQUAL((size_t)1, pmt::length(c3)); + BOOST_CHECK_EQUAL((size_t)2, pmt::length(c2)); + + BOOST_CHECK_THROW(pmt::cdr(pmt::PMT_NIL), pmt::wrong_type); + BOOST_CHECK_THROW(pmt::car(pmt::PMT_NIL), pmt::wrong_type); + BOOST_CHECK_THROW(pmt::set_car(s1, pmt::PMT_NIL), pmt::wrong_type); + BOOST_CHECK_THROW(pmt::set_cdr(s1, pmt::PMT_NIL), pmt::wrong_type); } -BOOST_AUTO_TEST_CASE(test_vectors) { - static const size_t N = 3; - pmt::pmt_t v1 = pmt::make_vector(N, pmt::PMT_NIL); - BOOST_CHECK_EQUAL(N, pmt::length(v1)); - pmt::pmt_t s0 = pmt::mp("s0"); - pmt::pmt_t s1 = pmt::mp("s1"); - pmt::pmt_t s2 = pmt::mp("s2"); - - pmt::vector_set(v1, 0, s0); - pmt::vector_set(v1, 1, s1); - pmt::vector_set(v1, 2, s2); - - BOOST_CHECK_EQUAL(s0, pmt::vector_ref(v1, 0)); - BOOST_CHECK_EQUAL(s1, pmt::vector_ref(v1, 1)); - BOOST_CHECK_EQUAL(s2, pmt::vector_ref(v1, 2)); - - BOOST_CHECK_THROW(pmt::vector_ref(v1, N), pmt::out_of_range); - BOOST_CHECK_THROW(pmt::vector_set(v1, N, pmt::PMT_NIL), pmt::out_of_range); - - pmt::vector_fill(v1, s0); - for (size_t i = 0; i < N; i++) - BOOST_CHECK_EQUAL(s0, pmt::vector_ref(v1, i)); +BOOST_AUTO_TEST_CASE(test_vectors) +{ + static const size_t N = 3; + pmt::pmt_t v1 = pmt::make_vector(N, pmt::PMT_NIL); + BOOST_CHECK_EQUAL(N, pmt::length(v1)); + pmt::pmt_t s0 = pmt::mp("s0"); + pmt::pmt_t s1 = pmt::mp("s1"); + pmt::pmt_t s2 = pmt::mp("s2"); + + pmt::vector_set(v1, 0, s0); + pmt::vector_set(v1, 1, s1); + pmt::vector_set(v1, 2, s2); + + BOOST_CHECK_EQUAL(s0, pmt::vector_ref(v1, 0)); + BOOST_CHECK_EQUAL(s1, pmt::vector_ref(v1, 1)); + BOOST_CHECK_EQUAL(s2, pmt::vector_ref(v1, 2)); + + BOOST_CHECK_THROW(pmt::vector_ref(v1, N), pmt::out_of_range); + BOOST_CHECK_THROW(pmt::vector_set(v1, N, pmt::PMT_NIL), pmt::out_of_range); + + pmt::vector_fill(v1, s0); + for (size_t i = 0; i < N; i++) + BOOST_CHECK_EQUAL(s0, pmt::vector_ref(v1, i)); } -static void -check_tuple(size_t len, const std::vector<pmt::pmt_t> &s, pmt::pmt_t t) +static void check_tuple(size_t len, const std::vector<pmt::pmt_t>& s, pmt::pmt_t t) { - BOOST_CHECK_EQUAL(true, pmt::is_tuple(t)); - BOOST_CHECK_EQUAL(len, pmt::length(t)); - - for (size_t i = 0; i < len; i++) - BOOST_CHECK_EQUAL(s[i], pmt::tuple_ref(t, i)); + BOOST_CHECK_EQUAL(true, pmt::is_tuple(t)); + BOOST_CHECK_EQUAL(len, pmt::length(t)); + for (size_t i = 0; i < len; i++) + BOOST_CHECK_EQUAL(s[i], pmt::tuple_ref(t, i)); } -BOOST_AUTO_TEST_CASE(test_tuples) { - pmt::pmt_t v = pmt::make_vector(10, pmt::PMT_NIL); - std::vector<pmt::pmt_t> s(10); - for (size_t i = 0; i < 10; i++){ - std::ostringstream os; - os << "s" << i; - s[i] = pmt::mp(os.str()); - pmt::vector_set(v, i, s[i]); - } +BOOST_AUTO_TEST_CASE(test_tuples) +{ + pmt::pmt_t v = pmt::make_vector(10, pmt::PMT_NIL); + std::vector<pmt::pmt_t> s(10); + for (size_t i = 0; i < 10; i++) { + std::ostringstream os; + os << "s" << i; + s[i] = pmt::mp(os.str()); + pmt::vector_set(v, i, s[i]); + } - pmt::pmt_t t; + pmt::pmt_t t; - t = pmt::make_tuple(); - check_tuple(0, s, 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]); + check_tuple(1, s, t); - BOOST_CHECK(pmt::is_vector(v)); - BOOST_CHECK(!pmt::is_tuple(v)); - BOOST_CHECK(pmt::is_tuple(t)); - BOOST_CHECK(!pmt::is_vector(t)); + BOOST_CHECK(pmt::is_vector(v)); + BOOST_CHECK(!pmt::is_tuple(v)); + BOOST_CHECK(pmt::is_tuple(t)); + BOOST_CHECK(!pmt::is_vector(t)); - t = pmt::make_tuple(s[0], s[1]); - check_tuple(2, 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]); + 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]); + 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]); + 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]); + 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]); + 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]); + 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]); + 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], 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]); - BOOST_CHECK_THROW(pmt::tuple_ref(t, 3), pmt::out_of_range); - BOOST_CHECK_THROW(pmt::vector_ref(t, 0), pmt::wrong_type); - BOOST_CHECK_THROW(pmt::tuple_ref(v, 0), pmt::wrong_type); + t = pmt::make_tuple(s[0], s[1], s[2]); + BOOST_CHECK_THROW(pmt::tuple_ref(t, 3), pmt::out_of_range); + BOOST_CHECK_THROW(pmt::vector_ref(t, 0), pmt::wrong_type); + BOOST_CHECK_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]); - pmt::pmt_t t2 = pmt::to_tuple(v); - BOOST_CHECK_EQUAL(size_t(10), pmt::length(v)); - BOOST_CHECK(pmt::equal(t, t2)); - //std::cout << v << std::endl; - //std::cout << t2 << std::endl; + t = pmt::make_tuple(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9]); + pmt::pmt_t t2 = pmt::to_tuple(v); + BOOST_CHECK_EQUAL(size_t(10), pmt::length(v)); + BOOST_CHECK(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::pmt_t list0 = pmt::list3(s[0], s[1], s[2]); - BOOST_CHECK_EQUAL(size_t(3), pmt::length(list0)); - t2 = pmt::to_tuple(list0); - BOOST_CHECK_EQUAL(size_t(3), pmt::length(t2)); - BOOST_CHECK(pmt::equal(t, t2)); + t = pmt::make_tuple(s[0], s[1], s[2]); + pmt::pmt_t list0 = pmt::list3(s[0], s[1], s[2]); + BOOST_CHECK_EQUAL(size_t(3), pmt::length(list0)); + t2 = pmt::to_tuple(list0); + BOOST_CHECK_EQUAL(size_t(3), pmt::length(t2)); + BOOST_CHECK(pmt::equal(t, t2)); } -BOOST_AUTO_TEST_CASE(test_equivalence) { - pmt::pmt_t s0 = pmt::mp("s0"); - pmt::pmt_t s1 = pmt::mp("s1"); - pmt::pmt_t s2 = pmt::mp("s2"); - pmt::pmt_t list0 = pmt::cons(s0, pmt::cons(s1, pmt::cons(s2, pmt::PMT_NIL))); - pmt::pmt_t list1 = pmt::cons(s0, pmt::cons(s1, pmt::cons(s2, pmt::PMT_NIL))); - pmt::pmt_t i0 = pmt::from_long(42); - pmt::pmt_t i1 = pmt::from_long(42); - pmt::pmt_t r0 = pmt::from_double(42); - pmt::pmt_t r1 = pmt::from_double(42); - pmt::pmt_t r2 = pmt::from_double(43); - - BOOST_CHECK(pmt::eq(s0, s0)); - BOOST_CHECK(!pmt::eq(s0, s1)); - BOOST_CHECK(pmt::eqv(s0, s0)); - BOOST_CHECK(!pmt::eqv(s0, s1)); - - BOOST_CHECK(pmt::eqv(i0, i1)); - BOOST_CHECK(pmt::eqv(r0, r1)); - BOOST_CHECK(!pmt::eqv(r0, r2)); - BOOST_CHECK(!pmt::eqv(i0, r0)); - - BOOST_CHECK(!pmt::eq(list0, list1)); - BOOST_CHECK(!pmt::eqv(list0, list1)); - BOOST_CHECK(pmt::equal(list0, list1)); - - pmt::pmt_t v0 = pmt::make_vector(3, s0); - pmt::pmt_t v1 = pmt::make_vector(3, s0); - pmt::pmt_t v2 = pmt::make_vector(4, s0); - BOOST_CHECK(!pmt::eqv(v0, v1)); - BOOST_CHECK(pmt::equal(v0, v1)); - BOOST_CHECK(!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); - BOOST_CHECK(pmt::equal(v0, v1)); +BOOST_AUTO_TEST_CASE(test_equivalence) +{ + pmt::pmt_t s0 = pmt::mp("s0"); + pmt::pmt_t s1 = pmt::mp("s1"); + pmt::pmt_t s2 = pmt::mp("s2"); + pmt::pmt_t list0 = pmt::cons(s0, pmt::cons(s1, pmt::cons(s2, pmt::PMT_NIL))); + pmt::pmt_t list1 = pmt::cons(s0, pmt::cons(s1, pmt::cons(s2, pmt::PMT_NIL))); + pmt::pmt_t i0 = pmt::from_long(42); + pmt::pmt_t i1 = pmt::from_long(42); + pmt::pmt_t r0 = pmt::from_double(42); + pmt::pmt_t r1 = pmt::from_double(42); + pmt::pmt_t r2 = pmt::from_double(43); + + BOOST_CHECK(pmt::eq(s0, s0)); + BOOST_CHECK(!pmt::eq(s0, s1)); + BOOST_CHECK(pmt::eqv(s0, s0)); + BOOST_CHECK(!pmt::eqv(s0, s1)); + + BOOST_CHECK(pmt::eqv(i0, i1)); + BOOST_CHECK(pmt::eqv(r0, r1)); + BOOST_CHECK(!pmt::eqv(r0, r2)); + BOOST_CHECK(!pmt::eqv(i0, r0)); + + BOOST_CHECK(!pmt::eq(list0, list1)); + BOOST_CHECK(!pmt::eqv(list0, list1)); + BOOST_CHECK(pmt::equal(list0, list1)); + + pmt::pmt_t v0 = pmt::make_vector(3, s0); + pmt::pmt_t v1 = pmt::make_vector(3, s0); + pmt::pmt_t v2 = pmt::make_vector(4, s0); + BOOST_CHECK(!pmt::eqv(v0, v1)); + BOOST_CHECK(pmt::equal(v0, v1)); + BOOST_CHECK(!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); + BOOST_CHECK(pmt::equal(v0, v1)); } -BOOST_AUTO_TEST_CASE(test_misc) { - pmt::pmt_t k0 = pmt::mp("k0"); - pmt::pmt_t k1 = pmt::mp("k1"); - pmt::pmt_t k2 = pmt::mp("k2"); - pmt::pmt_t k3 = pmt::mp("k3"); - pmt::pmt_t v0 = pmt::mp("v0"); - pmt::pmt_t v1 = pmt::mp("v1"); - pmt::pmt_t v2 = pmt::mp("v2"); - pmt::pmt_t p0 = pmt::cons(k0, v0); - pmt::pmt_t p1 = pmt::cons(k1, v1); - pmt::pmt_t p2 = pmt::cons(k2, v2); - - pmt::pmt_t alist = pmt::cons(p0, pmt::cons(p1, pmt::cons(p2, pmt::PMT_NIL))); - BOOST_CHECK(pmt::eq(p1, pmt::assv(k1, alist))); - BOOST_CHECK(pmt::eq(pmt::PMT_F, pmt::assv(k3, alist))); - - pmt::pmt_t keys = pmt::cons(k0, pmt::cons(k1, pmt::cons(k2, pmt::PMT_NIL))); - pmt::pmt_t vals = pmt::cons(v0, pmt::cons(v1, pmt::cons(v2, pmt::PMT_NIL))); - BOOST_CHECK(pmt::equal(keys, pmt::map(pmt::car, alist))); - BOOST_CHECK(pmt::equal(vals, pmt::map(pmt::cdr, alist))); +BOOST_AUTO_TEST_CASE(test_misc) +{ + pmt::pmt_t k0 = pmt::mp("k0"); + pmt::pmt_t k1 = pmt::mp("k1"); + pmt::pmt_t k2 = pmt::mp("k2"); + pmt::pmt_t k3 = pmt::mp("k3"); + pmt::pmt_t v0 = pmt::mp("v0"); + pmt::pmt_t v1 = pmt::mp("v1"); + pmt::pmt_t v2 = pmt::mp("v2"); + pmt::pmt_t p0 = pmt::cons(k0, v0); + pmt::pmt_t p1 = pmt::cons(k1, v1); + pmt::pmt_t p2 = pmt::cons(k2, v2); + + pmt::pmt_t alist = pmt::cons(p0, pmt::cons(p1, pmt::cons(p2, pmt::PMT_NIL))); + BOOST_CHECK(pmt::eq(p1, pmt::assv(k1, alist))); + BOOST_CHECK(pmt::eq(pmt::PMT_F, pmt::assv(k3, alist))); + + pmt::pmt_t keys = pmt::cons(k0, pmt::cons(k1, pmt::cons(k2, pmt::PMT_NIL))); + pmt::pmt_t vals = pmt::cons(v0, pmt::cons(v1, pmt::cons(v2, pmt::PMT_NIL))); + BOOST_CHECK(pmt::equal(keys, pmt::map(pmt::car, alist))); + BOOST_CHECK(pmt::equal(vals, pmt::map(pmt::cdr, alist))); } -BOOST_AUTO_TEST_CASE(test_dict) { - pmt::pmt_t dict = pmt::make_dict(); - BOOST_CHECK(pmt::is_dict(dict)); - - pmt::pmt_t k0 = pmt::mp("k0"); - pmt::pmt_t k1 = pmt::mp("k1"); - pmt::pmt_t k2 = pmt::mp("k2"); - pmt::pmt_t k3 = pmt::mp("k3"); - pmt::pmt_t v0 = pmt::mp("v0"); - pmt::pmt_t v1 = pmt::mp("v1"); - pmt::pmt_t v2 = pmt::mp("v2"); - pmt::pmt_t v3 = pmt::mp("v3"); - pmt::pmt_t not_found = pmt::cons(pmt::PMT_NIL, pmt::PMT_NIL); - - BOOST_CHECK(!pmt::dict_has_key(dict, k0)); - dict = pmt::dict_add(dict, k0, v0); - BOOST_CHECK(pmt::dict_has_key(dict, k0)); - BOOST_CHECK(pmt::eqv(pmt::dict_ref(dict, k0, not_found), v0)); - BOOST_CHECK(pmt::eqv(pmt::dict_ref(dict, k1, not_found), not_found)); - dict = pmt::dict_add(dict, k1, v1); - dict = pmt::dict_add(dict, k2, v2); - BOOST_CHECK(pmt::eqv(pmt::dict_ref(dict, k1, not_found), v1)); - dict = pmt::dict_add(dict, k1, v3); - BOOST_CHECK(pmt::eqv(pmt::dict_ref(dict, k1, not_found), v3)); - - pmt::pmt_t keys = pmt::list3(k1, k2, k0); - pmt::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; - BOOST_CHECK(pmt::equal(keys, pmt::dict_keys(dict))); - BOOST_CHECK(pmt::equal(vals, pmt::dict_values(dict))); +BOOST_AUTO_TEST_CASE(test_dict) +{ + pmt::pmt_t dict = pmt::make_dict(); + BOOST_CHECK(pmt::is_dict(dict)); + + pmt::pmt_t k0 = pmt::mp("k0"); + pmt::pmt_t k1 = pmt::mp("k1"); + pmt::pmt_t k2 = pmt::mp("k2"); + pmt::pmt_t k3 = pmt::mp("k3"); + pmt::pmt_t v0 = pmt::mp("v0"); + pmt::pmt_t v1 = pmt::mp("v1"); + pmt::pmt_t v2 = pmt::mp("v2"); + pmt::pmt_t v3 = pmt::mp("v3"); + pmt::pmt_t not_found = pmt::cons(pmt::PMT_NIL, pmt::PMT_NIL); + + BOOST_CHECK(!pmt::dict_has_key(dict, k0)); + dict = pmt::dict_add(dict, k0, v0); + BOOST_CHECK(pmt::dict_has_key(dict, k0)); + BOOST_CHECK(pmt::eqv(pmt::dict_ref(dict, k0, not_found), v0)); + BOOST_CHECK(pmt::eqv(pmt::dict_ref(dict, k1, not_found), not_found)); + dict = pmt::dict_add(dict, k1, v1); + dict = pmt::dict_add(dict, k2, v2); + BOOST_CHECK(pmt::eqv(pmt::dict_ref(dict, k1, not_found), v1)); + dict = pmt::dict_add(dict, k1, v3); + BOOST_CHECK(pmt::eqv(pmt::dict_ref(dict, k1, not_found), v3)); + + pmt::pmt_t keys = pmt::list3(k1, k2, k0); + pmt::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; + BOOST_CHECK(pmt::equal(keys, pmt::dict_keys(dict))); + BOOST_CHECK(pmt::equal(vals, pmt::dict_values(dict))); } -BOOST_AUTO_TEST_CASE(test_io) { - pmt::pmt_t k0 = pmt::mp("k0"); - pmt::pmt_t k1 = pmt::mp("k1"); - pmt::pmt_t k2 = pmt::mp("k2"); - pmt::pmt_t k3 = pmt::mp("k3"); +BOOST_AUTO_TEST_CASE(test_io) +{ + pmt::pmt_t k0 = pmt::mp("k0"); + pmt::pmt_t k1 = pmt::mp("k1"); + pmt::pmt_t k2 = pmt::mp("k2"); + pmt::pmt_t k3 = pmt::mp("k3"); - BOOST_CHECK_EQUAL(std::string("k0"), pmt::write_string(k0)); + BOOST_CHECK_EQUAL(std::string("k0"), pmt::write_string(k0)); } -BOOST_AUTO_TEST_CASE(test_lists) { - pmt::pmt_t s0 = pmt::mp("s0"); - pmt::pmt_t s1 = pmt::mp("s1"); - pmt::pmt_t s2 = pmt::mp("s2"); - pmt::pmt_t s3 = pmt::mp("s3"); - - pmt::pmt_t l1 = pmt::list4(s0, s1, s2, s3); - pmt::pmt_t l2 = pmt::list3(s0, s1, s2); - pmt::pmt_t l3 = pmt::list_add(l2, s3); - BOOST_CHECK(pmt::equal(l1, l3)); +BOOST_AUTO_TEST_CASE(test_lists) +{ + pmt::pmt_t s0 = pmt::mp("s0"); + pmt::pmt_t s1 = pmt::mp("s1"); + pmt::pmt_t s2 = pmt::mp("s2"); + pmt::pmt_t s3 = pmt::mp("s3"); + + pmt::pmt_t l1 = pmt::list4(s0, s1, s2, s3); + pmt::pmt_t l2 = pmt::list3(s0, s1, s2); + pmt::pmt_t l3 = pmt::list_add(l2, s3); + BOOST_CHECK(pmt::equal(l1, l3)); } // ------------------------------------------------------------------------ @@ -414,45 +427,45 @@ BOOST_AUTO_TEST_CASE(test_lists) { // It can't be declared in the scope of test_any because of template // namespace problems. -class foo { +class foo +{ public: - double d_double; - int d_int; - foo(double d=0, int i=0) : d_double(d), d_int(i) {} + 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) +bool operator==(const foo& a, const foo& b) { - return a.d_double == b.d_double && a.d_int == b.d_int; + return a.d_double == b.d_double && a.d_int == b.d_int; } -std::ostream& operator<<(std::ostream &os, const foo obj) +std::ostream& operator<<(std::ostream& os, const foo obj) { - os << "<foo: " << obj.d_double << ", " << obj.d_int << ">"; - return os; + os << "<foo: " << obj.d_double << ", " << obj.d_int << ">"; + return os; } -BOOST_AUTO_TEST_CASE(test_any) { - boost::any a0; - boost::any a1; - boost::any a2; +BOOST_AUTO_TEST_CASE(test_any) +{ + boost::any a0; + boost::any a1; + boost::any a2; - a0 = std::string("Hello!"); - a1 = 42; - a2 = foo(3.250, 21); + a0 = std::string("Hello!"); + a1 = 42; + a2 = foo(3.250, 21); - pmt::pmt_t p0 = pmt::make_any(a0); - pmt::pmt_t p1 = pmt::make_any(a1); - pmt::pmt_t p2 = pmt::make_any(a2); + pmt::pmt_t p0 = pmt::make_any(a0); + pmt::pmt_t p1 = pmt::make_any(a1); + pmt::pmt_t p2 = pmt::make_any(a2); - BOOST_CHECK_EQUAL(std::string("Hello!"), - boost::any_cast<std::string>(pmt::any_ref(p0))); + BOOST_CHECK_EQUAL(std::string("Hello!"), + boost::any_cast<std::string>(pmt::any_ref(p0))); - BOOST_CHECK_EQUAL(42, - boost::any_cast<int>(pmt::any_ref(p1))); + BOOST_CHECK_EQUAL(42, boost::any_cast<int>(pmt::any_ref(p1))); - BOOST_CHECK_EQUAL(foo(3.250, 21), - boost::any_cast<foo>(pmt::any_ref(p2))); + BOOST_CHECK_EQUAL(foo(3.250, 21), boost::any_cast<foo>(pmt::any_ref(p2))); } // ------------------------------------------------------------------------ @@ -460,116 +473,117 @@ BOOST_AUTO_TEST_CASE(test_any) { class qa_pmt_msg_accepter_nop : public gr::messages::msg_accepter { public: - qa_pmt_msg_accepter_nop(){} - ~qa_pmt_msg_accepter_nop(); - void post(pmt::pmt_t,pmt::pmt_t){} + qa_pmt_msg_accepter_nop() {} + ~qa_pmt_msg_accepter_nop(); + void post(pmt::pmt_t, pmt::pmt_t) {} }; -qa_pmt_msg_accepter_nop::~qa_pmt_msg_accepter_nop(){} +qa_pmt_msg_accepter_nop::~qa_pmt_msg_accepter_nop() {} -BOOST_AUTO_TEST_CASE(test_msg_accepter) { - pmt::pmt_t sym = pmt::mp("my-symbol"); - - boost::any a0; - a0 = std::string("Hello!"); - pmt::pmt_t p0 = pmt::make_any(a0); +BOOST_AUTO_TEST_CASE(test_msg_accepter) +{ + pmt::pmt_t sym = pmt::mp("my-symbol"); - gr::messages::msg_accepter_sptr ma0 = \ - gr::messages::msg_accepter_sptr(new qa_pmt_msg_accepter_nop()); - pmt::pmt_t p1 = pmt::make_msg_accepter(ma0); + boost::any a0; + a0 = std::string("Hello!"); + pmt::pmt_t p0 = pmt::make_any(a0); - BOOST_CHECK_EQUAL(ma0.get(), pmt::msg_accepter_ref(p1).get()); + gr::messages::msg_accepter_sptr ma0 = + gr::messages::msg_accepter_sptr(new qa_pmt_msg_accepter_nop()); + pmt::pmt_t p1 = pmt::make_msg_accepter(ma0); - BOOST_CHECK_THROW(pmt::msg_accepter_ref(sym), pmt::wrong_type); - BOOST_CHECK_THROW(pmt::msg_accepter_ref(p0), pmt::wrong_type); + BOOST_CHECK_EQUAL(ma0.get(), pmt::msg_accepter_ref(p1).get()); - // just confirm interfaces on send are OK - pmt::pmt_t port(pmt::intern("port")); - gr::messages::send(ma0.get(), port, sym); - gr::messages::send(ma0, port, sym); - gr::messages::send(p1, port, sym); + BOOST_CHECK_THROW(pmt::msg_accepter_ref(sym), pmt::wrong_type); + BOOST_CHECK_THROW(pmt::msg_accepter_ref(p0), pmt::wrong_type); + // just confirm interfaces on send are OK + pmt::pmt_t port(pmt::intern("port")); + gr::messages::send(ma0.get(), port, sym); + gr::messages::send(ma0, port, sym); + gr::messages::send(p1, port, sym); } // ------------------------------------------------------------------------ -BOOST_AUTO_TEST_CASE(test_serialize) { - std::stringbuf sb; // fake channel - pmt::pmt_t a = pmt::mp("a"); - pmt::pmt_t b = pmt::mp("b"); - pmt::pmt_t c = pmt::mp("c"); - - sb.str(""); // reset channel to empty - - // write stuff to channel - - pmt::serialize(pmt::PMT_NIL, sb); - pmt::serialize(pmt::mp("foobarvia"), sb); - pmt::serialize(pmt::from_long(123456789), sb); - pmt::serialize(pmt::from_long(-123456789), sb); - pmt::serialize(pmt::cons(pmt::PMT_NIL, pmt::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::PMT_T, sb); - pmt::serialize(pmt::PMT_F, sb); - - // read it back - - BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::PMT_NIL)); - BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::mp("foobarvia"))); - BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::from_long(123456789))); - BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::from_long(-123456789))); - BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::cons(pmt::PMT_NIL, pmt::PMT_NIL))); - BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::cons(a, b))); - BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::list1(a))); - BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::list2(a, b))); - BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::list3(a, b, c))); - BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::list3(a, pmt::list3(c, b, a), c))); - BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::PMT_T)); - BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::PMT_F)); - - BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::PMT_EOF)); // last item - - - // FIXME add tests for real, complex, vector, uniform-vector, dict - // FIXME add tests for malformed input too. - +BOOST_AUTO_TEST_CASE(test_serialize) +{ + std::stringbuf sb; // fake channel + pmt::pmt_t a = pmt::mp("a"); + pmt::pmt_t b = pmt::mp("b"); + pmt::pmt_t c = pmt::mp("c"); + + sb.str(""); // reset channel to empty + + // write stuff to channel + + pmt::serialize(pmt::PMT_NIL, sb); + pmt::serialize(pmt::mp("foobarvia"), sb); + pmt::serialize(pmt::from_long(123456789), sb); + pmt::serialize(pmt::from_long(-123456789), sb); + pmt::serialize(pmt::cons(pmt::PMT_NIL, pmt::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::PMT_T, sb); + pmt::serialize(pmt::PMT_F, sb); + + // read it back + + BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::PMT_NIL)); + BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::mp("foobarvia"))); + BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::from_long(123456789))); + BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::from_long(-123456789))); + BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::cons(pmt::PMT_NIL, pmt::PMT_NIL))); + BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::cons(a, b))); + BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::list1(a))); + BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::list2(a, b))); + BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::list3(a, b, c))); + BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::list3(a, pmt::list3(c, b, a), c))); + BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::PMT_T)); + BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::PMT_F)); + + BOOST_CHECK(pmt::equal(pmt::deserialize(sb), pmt::PMT_EOF)); // last item + + + // FIXME add tests for real, complex, vector, uniform-vector, dict + // FIXME add tests for malformed input too. } -BOOST_AUTO_TEST_CASE(test_sets) { - pmt::pmt_t s1 = pmt::mp("s1"); - pmt::pmt_t s2 = pmt::mp("s2"); - pmt::pmt_t s3 = pmt::mp("s3"); - - pmt::pmt_t l1 = pmt::list1(s1); - pmt::pmt_t l2 = pmt::list2(s2,s3); - pmt::pmt_t l3 = pmt::list3(s1,s2,s3); - - BOOST_CHECK(pmt::is_pair(pmt::memq(s1,l1))); - BOOST_CHECK(pmt::is_false(pmt::memq(s3,l1))); - - BOOST_CHECK(pmt::subsetp(l1,l3)); - BOOST_CHECK(pmt::subsetp(l2,l3)); - BOOST_CHECK(!pmt::subsetp(l1,l2)); - BOOST_CHECK(!pmt::subsetp(l2,l1)); - BOOST_CHECK(!pmt::subsetp(l3,l2)); +BOOST_AUTO_TEST_CASE(test_sets) +{ + pmt::pmt_t s1 = pmt::mp("s1"); + pmt::pmt_t s2 = pmt::mp("s2"); + pmt::pmt_t s3 = pmt::mp("s3"); + + pmt::pmt_t l1 = pmt::list1(s1); + pmt::pmt_t l2 = pmt::list2(s2, s3); + pmt::pmt_t l3 = pmt::list3(s1, s2, s3); + + BOOST_CHECK(pmt::is_pair(pmt::memq(s1, l1))); + BOOST_CHECK(pmt::is_false(pmt::memq(s3, l1))); + + BOOST_CHECK(pmt::subsetp(l1, l3)); + BOOST_CHECK(pmt::subsetp(l2, l3)); + BOOST_CHECK(!pmt::subsetp(l1, l2)); + BOOST_CHECK(!pmt::subsetp(l2, l1)); + BOOST_CHECK(!pmt::subsetp(l3, l2)); } -BOOST_AUTO_TEST_CASE(test_sugar) { - BOOST_CHECK(pmt::is_symbol(pmt::mp("my-symbol"))); - BOOST_CHECK_EQUAL((long) 10, pmt::to_long(pmt::mp(10))); - BOOST_CHECK_EQUAL((double) 1e6, pmt::to_double(pmt::mp(1e6))); - BOOST_CHECK_EQUAL(std::complex<double>(2, 3), - pmt::to_complex(pmt::mp(std::complex<double>(2, 3)))); - - int buf[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - pmt::pmt_t blob = pmt::mp(buf, sizeof(buf)); - const void *data = pmt::blob_data(blob); - size_t nbytes = pmt::blob_length(blob); - BOOST_CHECK_EQUAL(sizeof(buf), nbytes); - BOOST_CHECK(memcmp(buf, data, nbytes) == 0); +BOOST_AUTO_TEST_CASE(test_sugar) +{ + BOOST_CHECK(pmt::is_symbol(pmt::mp("my-symbol"))); + BOOST_CHECK_EQUAL((long)10, pmt::to_long(pmt::mp(10))); + BOOST_CHECK_EQUAL((double)1e6, pmt::to_double(pmt::mp(1e6))); + BOOST_CHECK_EQUAL(std::complex<double>(2, 3), + pmt::to_complex(pmt::mp(std::complex<double>(2, 3)))); + + int buf[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + pmt::pmt_t blob = pmt::mp(buf, sizeof(buf)); + const void* data = pmt::blob_data(blob); + size_t nbytes = pmt::blob_length(blob); + BOOST_CHECK_EQUAL(sizeof(buf), nbytes); + BOOST_CHECK(memcmp(buf, data, nbytes) == 0); } - diff --git a/gnuradio-runtime/lib/pmt/qa_pmt_unv.cc b/gnuradio-runtime/lib/pmt/qa_pmt_unv.cc index 9cc2a35e17..9dd9452e5e 100644 --- a/gnuradio-runtime/lib/pmt/qa_pmt_unv.cc +++ b/gnuradio-runtime/lib/pmt/qa_pmt_unv.cc @@ -31,399 +31,413 @@ using namespace pmt; -BOOST_AUTO_TEST_CASE(test_u8vector) { - static const size_t N = 3; - pmt::pmt_t v1 = pmt::make_u8vector(N, 0); - BOOST_CHECK_EQUAL(N, pmt::length(v1)); - uint8_t s0 = uint8_t(10); - uint8_t s1 = uint8_t(20); - uint8_t s2 = uint8_t(30); - - pmt::u8vector_set(v1, 0, s0); - pmt::u8vector_set(v1, 1, s1); - pmt::u8vector_set(v1, 2, s2); - - BOOST_CHECK_EQUAL(s0, pmt::u8vector_ref(v1, 0)); - BOOST_CHECK_EQUAL(s1, pmt::u8vector_ref(v1, 1)); - BOOST_CHECK_EQUAL(s2, pmt::u8vector_ref(v1, 2)); - - BOOST_CHECK_THROW(pmt::u8vector_ref(v1, N), pmt::out_of_range); - BOOST_CHECK_THROW(pmt::u8vector_set(v1, N, uint8_t(0)), pmt::out_of_range); - - size_t len; - const uint8_t *rd = pmt::u8vector_elements(v1, len); - BOOST_CHECK_EQUAL(len, N); - BOOST_CHECK_EQUAL(s0, rd[0]); - BOOST_CHECK_EQUAL(s1, rd[1]); - BOOST_CHECK_EQUAL(s2, rd[2]); - - uint8_t *wr = pmt::u8vector_writable_elements(v1, len); - BOOST_CHECK_EQUAL(len, N); - wr[0] = uint8_t(0); - BOOST_CHECK_EQUAL(uint8_t(0), wr[0]); - BOOST_CHECK_EQUAL(s1, wr[1]); - BOOST_CHECK_EQUAL(s2, wr[2]); +BOOST_AUTO_TEST_CASE(test_u8vector) +{ + static const size_t N = 3; + pmt::pmt_t v1 = pmt::make_u8vector(N, 0); + BOOST_CHECK_EQUAL(N, pmt::length(v1)); + uint8_t s0 = uint8_t(10); + uint8_t s1 = uint8_t(20); + uint8_t s2 = uint8_t(30); + + pmt::u8vector_set(v1, 0, s0); + pmt::u8vector_set(v1, 1, s1); + pmt::u8vector_set(v1, 2, s2); + + BOOST_CHECK_EQUAL(s0, pmt::u8vector_ref(v1, 0)); + BOOST_CHECK_EQUAL(s1, pmt::u8vector_ref(v1, 1)); + BOOST_CHECK_EQUAL(s2, pmt::u8vector_ref(v1, 2)); + + BOOST_CHECK_THROW(pmt::u8vector_ref(v1, N), pmt::out_of_range); + BOOST_CHECK_THROW(pmt::u8vector_set(v1, N, uint8_t(0)), pmt::out_of_range); + + size_t len; + const uint8_t* rd = pmt::u8vector_elements(v1, len); + BOOST_CHECK_EQUAL(len, N); + BOOST_CHECK_EQUAL(s0, rd[0]); + BOOST_CHECK_EQUAL(s1, rd[1]); + BOOST_CHECK_EQUAL(s2, rd[2]); + + uint8_t* wr = pmt::u8vector_writable_elements(v1, len); + BOOST_CHECK_EQUAL(len, N); + wr[0] = uint8_t(0); + BOOST_CHECK_EQUAL(uint8_t(0), wr[0]); + BOOST_CHECK_EQUAL(s1, wr[1]); + BOOST_CHECK_EQUAL(s2, wr[2]); } -BOOST_AUTO_TEST_CASE(test_s8vector) { - static const size_t N = 3; - pmt::pmt_t v1 = pmt::make_s8vector(N, 0); - BOOST_CHECK_EQUAL(N, pmt::length(v1)); - int8_t s0 = int8_t(10); - int8_t s1 = int8_t(20); - int8_t s2 = int8_t(30); - - pmt::s8vector_set(v1, 0, s0); - pmt::s8vector_set(v1, 1, s1); - pmt::s8vector_set(v1, 2, s2); - - BOOST_CHECK_EQUAL(s0, pmt::s8vector_ref(v1, 0)); - BOOST_CHECK_EQUAL(s1, pmt::s8vector_ref(v1, 1)); - BOOST_CHECK_EQUAL(s2, pmt::s8vector_ref(v1, 2)); - - BOOST_CHECK_THROW(pmt::s8vector_ref(v1, N), pmt::out_of_range); - BOOST_CHECK_THROW(pmt::s8vector_set(v1, N, int8_t(0)), pmt::out_of_range); - - size_t len; - const int8_t *rd = pmt::s8vector_elements(v1, len); - BOOST_CHECK_EQUAL(len, N); - BOOST_CHECK_EQUAL(s0, rd[0]); - BOOST_CHECK_EQUAL(s1, rd[1]); - BOOST_CHECK_EQUAL(s2, rd[2]); - - int8_t *wr = pmt::s8vector_writable_elements(v1, len); - BOOST_CHECK_EQUAL(len, N); - wr[0] = int8_t(0); - BOOST_CHECK_EQUAL(int8_t(0), wr[0]); - BOOST_CHECK_EQUAL(s1, wr[1]); - BOOST_CHECK_EQUAL(s2, wr[2]); +BOOST_AUTO_TEST_CASE(test_s8vector) +{ + static const size_t N = 3; + pmt::pmt_t v1 = pmt::make_s8vector(N, 0); + BOOST_CHECK_EQUAL(N, pmt::length(v1)); + int8_t s0 = int8_t(10); + int8_t s1 = int8_t(20); + int8_t s2 = int8_t(30); + + pmt::s8vector_set(v1, 0, s0); + pmt::s8vector_set(v1, 1, s1); + pmt::s8vector_set(v1, 2, s2); + + BOOST_CHECK_EQUAL(s0, pmt::s8vector_ref(v1, 0)); + BOOST_CHECK_EQUAL(s1, pmt::s8vector_ref(v1, 1)); + BOOST_CHECK_EQUAL(s2, pmt::s8vector_ref(v1, 2)); + + BOOST_CHECK_THROW(pmt::s8vector_ref(v1, N), pmt::out_of_range); + BOOST_CHECK_THROW(pmt::s8vector_set(v1, N, int8_t(0)), pmt::out_of_range); + + size_t len; + const int8_t* rd = pmt::s8vector_elements(v1, len); + BOOST_CHECK_EQUAL(len, N); + BOOST_CHECK_EQUAL(s0, rd[0]); + BOOST_CHECK_EQUAL(s1, rd[1]); + BOOST_CHECK_EQUAL(s2, rd[2]); + + int8_t* wr = pmt::s8vector_writable_elements(v1, len); + BOOST_CHECK_EQUAL(len, N); + wr[0] = int8_t(0); + BOOST_CHECK_EQUAL(int8_t(0), wr[0]); + BOOST_CHECK_EQUAL(s1, wr[1]); + BOOST_CHECK_EQUAL(s2, wr[2]); } -BOOST_AUTO_TEST_CASE(test_u16vector) { - static const size_t N = 3; - pmt::pmt_t v1 = pmt::make_u16vector(N, 0); - BOOST_CHECK_EQUAL(N, pmt::length(v1)); - uint16_t s0 = uint16_t(10); - uint16_t s1 = uint16_t(20); - uint16_t s2 = uint16_t(30); - - pmt::u16vector_set(v1, 0, s0); - pmt::u16vector_set(v1, 1, s1); - pmt::u16vector_set(v1, 2, s2); - - BOOST_CHECK_EQUAL(s0, pmt::u16vector_ref(v1, 0)); - BOOST_CHECK_EQUAL(s1, pmt::u16vector_ref(v1, 1)); - BOOST_CHECK_EQUAL(s2, pmt::u16vector_ref(v1, 2)); - - BOOST_CHECK_THROW(pmt::u16vector_ref(v1, N), pmt::out_of_range); - BOOST_CHECK_THROW(pmt::u16vector_set(v1, N, uint16_t(0)), pmt::out_of_range); - - size_t len; - const uint16_t *rd = pmt::u16vector_elements(v1, len); - BOOST_CHECK_EQUAL(len, N); - BOOST_CHECK_EQUAL(s0, rd[0]); - BOOST_CHECK_EQUAL(s1, rd[1]); - BOOST_CHECK_EQUAL(s2, rd[2]); - - uint16_t *wr = pmt::u16vector_writable_elements(v1, len); - BOOST_CHECK_EQUAL(len, N); - wr[0] = uint16_t(0); - BOOST_CHECK_EQUAL(uint16_t(0), wr[0]); - BOOST_CHECK_EQUAL(s1, wr[1]); - BOOST_CHECK_EQUAL(s2, wr[2]); +BOOST_AUTO_TEST_CASE(test_u16vector) +{ + static const size_t N = 3; + pmt::pmt_t v1 = pmt::make_u16vector(N, 0); + BOOST_CHECK_EQUAL(N, pmt::length(v1)); + uint16_t s0 = uint16_t(10); + uint16_t s1 = uint16_t(20); + uint16_t s2 = uint16_t(30); + + pmt::u16vector_set(v1, 0, s0); + pmt::u16vector_set(v1, 1, s1); + pmt::u16vector_set(v1, 2, s2); + + BOOST_CHECK_EQUAL(s0, pmt::u16vector_ref(v1, 0)); + BOOST_CHECK_EQUAL(s1, pmt::u16vector_ref(v1, 1)); + BOOST_CHECK_EQUAL(s2, pmt::u16vector_ref(v1, 2)); + + BOOST_CHECK_THROW(pmt::u16vector_ref(v1, N), pmt::out_of_range); + BOOST_CHECK_THROW(pmt::u16vector_set(v1, N, uint16_t(0)), pmt::out_of_range); + + size_t len; + const uint16_t* rd = pmt::u16vector_elements(v1, len); + BOOST_CHECK_EQUAL(len, N); + BOOST_CHECK_EQUAL(s0, rd[0]); + BOOST_CHECK_EQUAL(s1, rd[1]); + BOOST_CHECK_EQUAL(s2, rd[2]); + + uint16_t* wr = pmt::u16vector_writable_elements(v1, len); + BOOST_CHECK_EQUAL(len, N); + wr[0] = uint16_t(0); + BOOST_CHECK_EQUAL(uint16_t(0), wr[0]); + BOOST_CHECK_EQUAL(s1, wr[1]); + BOOST_CHECK_EQUAL(s2, wr[2]); } -BOOST_AUTO_TEST_CASE(test_s16vector) { - static const size_t N = 3; - pmt::pmt_t v1 = pmt::make_s16vector(N, 0); - BOOST_CHECK_EQUAL(N, pmt::length(v1)); - int16_t s0 = int16_t(10); - int16_t s1 = int16_t(20); - int16_t s2 = int16_t(30); - - pmt::s16vector_set(v1, 0, s0); - pmt::s16vector_set(v1, 1, s1); - pmt::s16vector_set(v1, 2, s2); - - BOOST_CHECK_EQUAL(s0, pmt::s16vector_ref(v1, 0)); - BOOST_CHECK_EQUAL(s1, pmt::s16vector_ref(v1, 1)); - BOOST_CHECK_EQUAL(s2, pmt::s16vector_ref(v1, 2)); - - BOOST_CHECK_THROW(pmt::s16vector_ref(v1, N), pmt::out_of_range); - BOOST_CHECK_THROW(pmt::s16vector_set(v1, N, int16_t(0)), pmt::out_of_range); - - size_t len; - const int16_t *rd = pmt::s16vector_elements(v1, len); - BOOST_CHECK_EQUAL(len, N); - BOOST_CHECK_EQUAL(s0, rd[0]); - BOOST_CHECK_EQUAL(s1, rd[1]); - BOOST_CHECK_EQUAL(s2, rd[2]); - - int16_t *wr = pmt::s16vector_writable_elements(v1, len); - BOOST_CHECK_EQUAL(len, N); - wr[0] = int16_t(0); - BOOST_CHECK_EQUAL(int16_t(0), wr[0]); - BOOST_CHECK_EQUAL(s1, wr[1]); - BOOST_CHECK_EQUAL(s2, wr[2]); +BOOST_AUTO_TEST_CASE(test_s16vector) +{ + static const size_t N = 3; + pmt::pmt_t v1 = pmt::make_s16vector(N, 0); + BOOST_CHECK_EQUAL(N, pmt::length(v1)); + int16_t s0 = int16_t(10); + int16_t s1 = int16_t(20); + int16_t s2 = int16_t(30); + + pmt::s16vector_set(v1, 0, s0); + pmt::s16vector_set(v1, 1, s1); + pmt::s16vector_set(v1, 2, s2); + + BOOST_CHECK_EQUAL(s0, pmt::s16vector_ref(v1, 0)); + BOOST_CHECK_EQUAL(s1, pmt::s16vector_ref(v1, 1)); + BOOST_CHECK_EQUAL(s2, pmt::s16vector_ref(v1, 2)); + + BOOST_CHECK_THROW(pmt::s16vector_ref(v1, N), pmt::out_of_range); + BOOST_CHECK_THROW(pmt::s16vector_set(v1, N, int16_t(0)), pmt::out_of_range); + + size_t len; + const int16_t* rd = pmt::s16vector_elements(v1, len); + BOOST_CHECK_EQUAL(len, N); + BOOST_CHECK_EQUAL(s0, rd[0]); + BOOST_CHECK_EQUAL(s1, rd[1]); + BOOST_CHECK_EQUAL(s2, rd[2]); + + int16_t* wr = pmt::s16vector_writable_elements(v1, len); + BOOST_CHECK_EQUAL(len, N); + wr[0] = int16_t(0); + BOOST_CHECK_EQUAL(int16_t(0), wr[0]); + BOOST_CHECK_EQUAL(s1, wr[1]); + BOOST_CHECK_EQUAL(s2, wr[2]); } -BOOST_AUTO_TEST_CASE(test_u32vector) { - static const size_t N = 3; - pmt::pmt_t v1 = pmt::make_u32vector(N, 0); - BOOST_CHECK_EQUAL(N, pmt::length(v1)); - uint32_t s0 = uint32_t(10); - uint32_t s1 = uint32_t(20); - uint32_t s2 = uint32_t(30); - - pmt::u32vector_set(v1, 0, s0); - pmt::u32vector_set(v1, 1, s1); - pmt::u32vector_set(v1, 2, s2); - - BOOST_CHECK_EQUAL(s0, pmt::u32vector_ref(v1, 0)); - BOOST_CHECK_EQUAL(s1, pmt::u32vector_ref(v1, 1)); - BOOST_CHECK_EQUAL(s2, pmt::u32vector_ref(v1, 2)); - - BOOST_CHECK_THROW(pmt::u32vector_ref(v1, N), pmt::out_of_range); - BOOST_CHECK_THROW(pmt::u32vector_set(v1, N, uint32_t(0)), pmt::out_of_range); - - size_t len; - const uint32_t *rd = pmt::u32vector_elements(v1, len); - BOOST_CHECK_EQUAL(len, N); - BOOST_CHECK_EQUAL(s0, rd[0]); - BOOST_CHECK_EQUAL(s1, rd[1]); - BOOST_CHECK_EQUAL(s2, rd[2]); - - uint32_t *wr = pmt::u32vector_writable_elements(v1, len); - BOOST_CHECK_EQUAL(len, N); - wr[0] = uint32_t(0); - BOOST_CHECK_EQUAL(uint32_t(0), wr[0]); - BOOST_CHECK_EQUAL(s1, wr[1]); - BOOST_CHECK_EQUAL(s2, wr[2]); +BOOST_AUTO_TEST_CASE(test_u32vector) +{ + static const size_t N = 3; + pmt::pmt_t v1 = pmt::make_u32vector(N, 0); + BOOST_CHECK_EQUAL(N, pmt::length(v1)); + uint32_t s0 = uint32_t(10); + uint32_t s1 = uint32_t(20); + uint32_t s2 = uint32_t(30); + + pmt::u32vector_set(v1, 0, s0); + pmt::u32vector_set(v1, 1, s1); + pmt::u32vector_set(v1, 2, s2); + + BOOST_CHECK_EQUAL(s0, pmt::u32vector_ref(v1, 0)); + BOOST_CHECK_EQUAL(s1, pmt::u32vector_ref(v1, 1)); + BOOST_CHECK_EQUAL(s2, pmt::u32vector_ref(v1, 2)); + + BOOST_CHECK_THROW(pmt::u32vector_ref(v1, N), pmt::out_of_range); + BOOST_CHECK_THROW(pmt::u32vector_set(v1, N, uint32_t(0)), pmt::out_of_range); + + size_t len; + const uint32_t* rd = pmt::u32vector_elements(v1, len); + BOOST_CHECK_EQUAL(len, N); + BOOST_CHECK_EQUAL(s0, rd[0]); + BOOST_CHECK_EQUAL(s1, rd[1]); + BOOST_CHECK_EQUAL(s2, rd[2]); + + uint32_t* wr = pmt::u32vector_writable_elements(v1, len); + BOOST_CHECK_EQUAL(len, N); + wr[0] = uint32_t(0); + BOOST_CHECK_EQUAL(uint32_t(0), wr[0]); + BOOST_CHECK_EQUAL(s1, wr[1]); + BOOST_CHECK_EQUAL(s2, wr[2]); } -BOOST_AUTO_TEST_CASE(test_s32vector) { - static const size_t N = 3; - pmt::pmt_t v1 = pmt::make_s32vector(N, 0); - BOOST_CHECK_EQUAL(N, pmt::length(v1)); - int32_t s0 = int32_t(10); - int32_t s1 = int32_t(20); - int32_t s2 = int32_t(30); - - pmt::s32vector_set(v1, 0, s0); - pmt::s32vector_set(v1, 1, s1); - pmt::s32vector_set(v1, 2, s2); - - BOOST_CHECK_EQUAL(s0, pmt::s32vector_ref(v1, 0)); - BOOST_CHECK_EQUAL(s1, pmt::s32vector_ref(v1, 1)); - BOOST_CHECK_EQUAL(s2, pmt::s32vector_ref(v1, 2)); - - BOOST_CHECK_THROW(pmt::s32vector_ref(v1, N), pmt::out_of_range); - BOOST_CHECK_THROW(pmt::s32vector_set(v1, N, int32_t(0)), pmt::out_of_range); - - size_t len; - const int32_t *rd = pmt::s32vector_elements(v1, len); - BOOST_CHECK_EQUAL(len, N); - BOOST_CHECK_EQUAL(s0, rd[0]); - BOOST_CHECK_EQUAL(s1, rd[1]); - BOOST_CHECK_EQUAL(s2, rd[2]); - - int32_t *wr = pmt::s32vector_writable_elements(v1, len); - BOOST_CHECK_EQUAL(len, N); - wr[0] = int32_t(0); - BOOST_CHECK_EQUAL(int32_t(0), wr[0]); - BOOST_CHECK_EQUAL(s1, wr[1]); - BOOST_CHECK_EQUAL(s2, wr[2]); +BOOST_AUTO_TEST_CASE(test_s32vector) +{ + static const size_t N = 3; + pmt::pmt_t v1 = pmt::make_s32vector(N, 0); + BOOST_CHECK_EQUAL(N, pmt::length(v1)); + int32_t s0 = int32_t(10); + int32_t s1 = int32_t(20); + int32_t s2 = int32_t(30); + + pmt::s32vector_set(v1, 0, s0); + pmt::s32vector_set(v1, 1, s1); + pmt::s32vector_set(v1, 2, s2); + + BOOST_CHECK_EQUAL(s0, pmt::s32vector_ref(v1, 0)); + BOOST_CHECK_EQUAL(s1, pmt::s32vector_ref(v1, 1)); + BOOST_CHECK_EQUAL(s2, pmt::s32vector_ref(v1, 2)); + + BOOST_CHECK_THROW(pmt::s32vector_ref(v1, N), pmt::out_of_range); + BOOST_CHECK_THROW(pmt::s32vector_set(v1, N, int32_t(0)), pmt::out_of_range); + + size_t len; + const int32_t* rd = pmt::s32vector_elements(v1, len); + BOOST_CHECK_EQUAL(len, N); + BOOST_CHECK_EQUAL(s0, rd[0]); + BOOST_CHECK_EQUAL(s1, rd[1]); + BOOST_CHECK_EQUAL(s2, rd[2]); + + int32_t* wr = pmt::s32vector_writable_elements(v1, len); + BOOST_CHECK_EQUAL(len, N); + wr[0] = int32_t(0); + BOOST_CHECK_EQUAL(int32_t(0), wr[0]); + BOOST_CHECK_EQUAL(s1, wr[1]); + BOOST_CHECK_EQUAL(s2, wr[2]); } -BOOST_AUTO_TEST_CASE(test_u64vector) { - static const size_t N = 3; - pmt::pmt_t v1 = pmt::make_u64vector(N, 0); - BOOST_CHECK_EQUAL(N, pmt::length(v1)); - uint64_t s0 = uint64_t(10); - uint64_t s1 = uint64_t(20); - uint64_t s2 = uint64_t(30); - - pmt::u64vector_set(v1, 0, s0); - pmt::u64vector_set(v1, 1, s1); - pmt::u64vector_set(v1, 2, s2); - - BOOST_CHECK_EQUAL(s0, pmt::u64vector_ref(v1, 0)); - BOOST_CHECK_EQUAL(s1, pmt::u64vector_ref(v1, 1)); - BOOST_CHECK_EQUAL(s2, pmt::u64vector_ref(v1, 2)); - - BOOST_CHECK_THROW(pmt::u64vector_ref(v1, N), pmt::out_of_range); - BOOST_CHECK_THROW(pmt::u64vector_set(v1, N, uint64_t(0)), pmt::out_of_range); - - size_t len; - const uint64_t *rd = pmt::u64vector_elements(v1, len); - BOOST_CHECK_EQUAL(len, N); - BOOST_CHECK_EQUAL(s0, rd[0]); - BOOST_CHECK_EQUAL(s1, rd[1]); - BOOST_CHECK_EQUAL(s2, rd[2]); - - uint64_t *wr = pmt::u64vector_writable_elements(v1, len); - BOOST_CHECK_EQUAL(len, N); - wr[0] = uint64_t(0); - BOOST_CHECK_EQUAL(uint64_t(0), wr[0]); - BOOST_CHECK_EQUAL(s1, wr[1]); - BOOST_CHECK_EQUAL(s2, wr[2]); +BOOST_AUTO_TEST_CASE(test_u64vector) +{ + static const size_t N = 3; + pmt::pmt_t v1 = pmt::make_u64vector(N, 0); + BOOST_CHECK_EQUAL(N, pmt::length(v1)); + uint64_t s0 = uint64_t(10); + uint64_t s1 = uint64_t(20); + uint64_t s2 = uint64_t(30); + + pmt::u64vector_set(v1, 0, s0); + pmt::u64vector_set(v1, 1, s1); + pmt::u64vector_set(v1, 2, s2); + + BOOST_CHECK_EQUAL(s0, pmt::u64vector_ref(v1, 0)); + BOOST_CHECK_EQUAL(s1, pmt::u64vector_ref(v1, 1)); + BOOST_CHECK_EQUAL(s2, pmt::u64vector_ref(v1, 2)); + + BOOST_CHECK_THROW(pmt::u64vector_ref(v1, N), pmt::out_of_range); + BOOST_CHECK_THROW(pmt::u64vector_set(v1, N, uint64_t(0)), pmt::out_of_range); + + size_t len; + const uint64_t* rd = pmt::u64vector_elements(v1, len); + BOOST_CHECK_EQUAL(len, N); + BOOST_CHECK_EQUAL(s0, rd[0]); + BOOST_CHECK_EQUAL(s1, rd[1]); + BOOST_CHECK_EQUAL(s2, rd[2]); + + uint64_t* wr = pmt::u64vector_writable_elements(v1, len); + BOOST_CHECK_EQUAL(len, N); + wr[0] = uint64_t(0); + BOOST_CHECK_EQUAL(uint64_t(0), wr[0]); + BOOST_CHECK_EQUAL(s1, wr[1]); + BOOST_CHECK_EQUAL(s2, wr[2]); } -BOOST_AUTO_TEST_CASE(test_s64vector) { - static const size_t N = 3; - pmt::pmt_t v1 = pmt::make_s64vector(N, 0); - BOOST_CHECK_EQUAL(N, pmt::length(v1)); - int64_t s0 = int64_t(10); - int64_t s1 = int64_t(20); - int64_t s2 = int64_t(30); - - pmt::s64vector_set(v1, 0, s0); - pmt::s64vector_set(v1, 1, s1); - pmt::s64vector_set(v1, 2, s2); - - BOOST_CHECK_EQUAL(s0, pmt::s64vector_ref(v1, 0)); - BOOST_CHECK_EQUAL(s1, pmt::s64vector_ref(v1, 1)); - BOOST_CHECK_EQUAL(s2, pmt::s64vector_ref(v1, 2)); - - BOOST_CHECK_THROW(pmt::s64vector_ref(v1, N), pmt::out_of_range); - BOOST_CHECK_THROW(pmt::s64vector_set(v1, N, int64_t(0)), pmt::out_of_range); - - size_t len; - const int64_t *rd = pmt::s64vector_elements(v1, len); - BOOST_CHECK_EQUAL(len, N); - BOOST_CHECK_EQUAL(s0, rd[0]); - BOOST_CHECK_EQUAL(s1, rd[1]); - BOOST_CHECK_EQUAL(s2, rd[2]); - - int64_t *wr = pmt::s64vector_writable_elements(v1, len); - BOOST_CHECK_EQUAL(len, N); - wr[0] = int64_t(0); - BOOST_CHECK_EQUAL(int64_t(0), wr[0]); - BOOST_CHECK_EQUAL(s1, wr[1]); - BOOST_CHECK_EQUAL(s2, wr[2]); +BOOST_AUTO_TEST_CASE(test_s64vector) +{ + static const size_t N = 3; + pmt::pmt_t v1 = pmt::make_s64vector(N, 0); + BOOST_CHECK_EQUAL(N, pmt::length(v1)); + int64_t s0 = int64_t(10); + int64_t s1 = int64_t(20); + int64_t s2 = int64_t(30); + + pmt::s64vector_set(v1, 0, s0); + pmt::s64vector_set(v1, 1, s1); + pmt::s64vector_set(v1, 2, s2); + + BOOST_CHECK_EQUAL(s0, pmt::s64vector_ref(v1, 0)); + BOOST_CHECK_EQUAL(s1, pmt::s64vector_ref(v1, 1)); + BOOST_CHECK_EQUAL(s2, pmt::s64vector_ref(v1, 2)); + + BOOST_CHECK_THROW(pmt::s64vector_ref(v1, N), pmt::out_of_range); + BOOST_CHECK_THROW(pmt::s64vector_set(v1, N, int64_t(0)), pmt::out_of_range); + + size_t len; + const int64_t* rd = pmt::s64vector_elements(v1, len); + BOOST_CHECK_EQUAL(len, N); + BOOST_CHECK_EQUAL(s0, rd[0]); + BOOST_CHECK_EQUAL(s1, rd[1]); + BOOST_CHECK_EQUAL(s2, rd[2]); + + int64_t* wr = pmt::s64vector_writable_elements(v1, len); + BOOST_CHECK_EQUAL(len, N); + wr[0] = int64_t(0); + BOOST_CHECK_EQUAL(int64_t(0), wr[0]); + BOOST_CHECK_EQUAL(s1, wr[1]); + BOOST_CHECK_EQUAL(s2, wr[2]); } -BOOST_AUTO_TEST_CASE(test_f32vector) { - static const size_t N = 3; - pmt::pmt_t v1 = pmt::make_f32vector(N, 0); - BOOST_CHECK_EQUAL(N, pmt::length(v1)); - float s0 = float(10); - float s1 = float(20); - float s2 = float(30); - - pmt::f32vector_set(v1, 0, s0); - pmt::f32vector_set(v1, 1, s1); - pmt::f32vector_set(v1, 2, s2); - - BOOST_CHECK_EQUAL(s0, pmt::f32vector_ref(v1, 0)); - BOOST_CHECK_EQUAL(s1, pmt::f32vector_ref(v1, 1)); - BOOST_CHECK_EQUAL(s2, pmt::f32vector_ref(v1, 2)); - - BOOST_CHECK_THROW(pmt::f32vector_ref(v1, N), pmt::out_of_range); - BOOST_CHECK_THROW(pmt::f32vector_set(v1, N, float(0)), pmt::out_of_range); - - size_t len; - const float *rd = pmt::f32vector_elements(v1, len); - BOOST_CHECK_EQUAL(len, N); - BOOST_CHECK_EQUAL(s0, rd[0]); - BOOST_CHECK_EQUAL(s1, rd[1]); - BOOST_CHECK_EQUAL(s2, rd[2]); - - float *wr = pmt::f32vector_writable_elements(v1, len); - BOOST_CHECK_EQUAL(len, N); - wr[0] = float(0); - BOOST_CHECK_EQUAL(float(0), wr[0]); - BOOST_CHECK_EQUAL(s1, wr[1]); - BOOST_CHECK_EQUAL(s2, wr[2]); +BOOST_AUTO_TEST_CASE(test_f32vector) +{ + static const size_t N = 3; + pmt::pmt_t v1 = pmt::make_f32vector(N, 0); + BOOST_CHECK_EQUAL(N, pmt::length(v1)); + float s0 = float(10); + float s1 = float(20); + float s2 = float(30); + + pmt::f32vector_set(v1, 0, s0); + pmt::f32vector_set(v1, 1, s1); + pmt::f32vector_set(v1, 2, s2); + + BOOST_CHECK_EQUAL(s0, pmt::f32vector_ref(v1, 0)); + BOOST_CHECK_EQUAL(s1, pmt::f32vector_ref(v1, 1)); + BOOST_CHECK_EQUAL(s2, pmt::f32vector_ref(v1, 2)); + + BOOST_CHECK_THROW(pmt::f32vector_ref(v1, N), pmt::out_of_range); + BOOST_CHECK_THROW(pmt::f32vector_set(v1, N, float(0)), pmt::out_of_range); + + size_t len; + const float* rd = pmt::f32vector_elements(v1, len); + BOOST_CHECK_EQUAL(len, N); + BOOST_CHECK_EQUAL(s0, rd[0]); + BOOST_CHECK_EQUAL(s1, rd[1]); + BOOST_CHECK_EQUAL(s2, rd[2]); + + float* wr = pmt::f32vector_writable_elements(v1, len); + BOOST_CHECK_EQUAL(len, N); + wr[0] = float(0); + BOOST_CHECK_EQUAL(float(0), wr[0]); + BOOST_CHECK_EQUAL(s1, wr[1]); + BOOST_CHECK_EQUAL(s2, wr[2]); } -BOOST_AUTO_TEST_CASE(test_f64vector) { - static const size_t N = 3; - pmt::pmt_t v1 = pmt::make_f64vector(N, 0); - BOOST_CHECK_EQUAL(N, pmt::length(v1)); - double s0 = double(10); - double s1 = double(20); - double s2 = double(30); - - pmt::f64vector_set(v1, 0, s0); - pmt::f64vector_set(v1, 1, s1); - pmt::f64vector_set(v1, 2, s2); - - BOOST_CHECK_EQUAL(s0, pmt::f64vector_ref(v1, 0)); - BOOST_CHECK_EQUAL(s1, pmt::f64vector_ref(v1, 1)); - BOOST_CHECK_EQUAL(s2, pmt::f64vector_ref(v1, 2)); - - BOOST_CHECK_THROW(pmt::f64vector_ref(v1, N), pmt::out_of_range); - BOOST_CHECK_THROW(pmt::f64vector_set(v1, N, double(0)), pmt::out_of_range); - - size_t len; - const double *rd = pmt::f64vector_elements(v1, len); - BOOST_CHECK_EQUAL(len, N); - BOOST_CHECK_EQUAL(s0, rd[0]); - BOOST_CHECK_EQUAL(s1, rd[1]); - BOOST_CHECK_EQUAL(s2, rd[2]); - - double *wr = pmt::f64vector_writable_elements(v1, len); - BOOST_CHECK_EQUAL(len, N); - wr[0] = double(0); - BOOST_CHECK_EQUAL(double(0), wr[0]); - BOOST_CHECK_EQUAL(s1, wr[1]); - BOOST_CHECK_EQUAL(s2, wr[2]); +BOOST_AUTO_TEST_CASE(test_f64vector) +{ + static const size_t N = 3; + pmt::pmt_t v1 = pmt::make_f64vector(N, 0); + BOOST_CHECK_EQUAL(N, pmt::length(v1)); + double s0 = double(10); + double s1 = double(20); + double s2 = double(30); + + pmt::f64vector_set(v1, 0, s0); + pmt::f64vector_set(v1, 1, s1); + pmt::f64vector_set(v1, 2, s2); + + BOOST_CHECK_EQUAL(s0, pmt::f64vector_ref(v1, 0)); + BOOST_CHECK_EQUAL(s1, pmt::f64vector_ref(v1, 1)); + BOOST_CHECK_EQUAL(s2, pmt::f64vector_ref(v1, 2)); + + BOOST_CHECK_THROW(pmt::f64vector_ref(v1, N), pmt::out_of_range); + BOOST_CHECK_THROW(pmt::f64vector_set(v1, N, double(0)), pmt::out_of_range); + + size_t len; + const double* rd = pmt::f64vector_elements(v1, len); + BOOST_CHECK_EQUAL(len, N); + BOOST_CHECK_EQUAL(s0, rd[0]); + BOOST_CHECK_EQUAL(s1, rd[1]); + BOOST_CHECK_EQUAL(s2, rd[2]); + + double* wr = pmt::f64vector_writable_elements(v1, len); + BOOST_CHECK_EQUAL(len, N); + wr[0] = double(0); + BOOST_CHECK_EQUAL(double(0), wr[0]); + BOOST_CHECK_EQUAL(s1, wr[1]); + BOOST_CHECK_EQUAL(s2, wr[2]); } -BOOST_AUTO_TEST_CASE(test_c32vector) { - static const size_t N = 3; - pmt::pmt_t v1 = pmt::make_c32vector(N, 0); - BOOST_CHECK_EQUAL(N, pmt::length(v1)); - std::complex<float> s0 = std::complex<float>(10); - std::complex<float> s1 = std::complex<float>(20); - std::complex<float> s2 = std::complex<float>(30); - - pmt::c32vector_set(v1, 0, s0); - pmt::c32vector_set(v1, 1, s1); - pmt::c32vector_set(v1, 2, s2); - - BOOST_CHECK_EQUAL(s0, pmt::c32vector_ref(v1, 0)); - BOOST_CHECK_EQUAL(s1, pmt::c32vector_ref(v1, 1)); - BOOST_CHECK_EQUAL(s2, pmt::c32vector_ref(v1, 2)); - - BOOST_CHECK_THROW(pmt::c32vector_ref(v1, N), pmt::out_of_range); - BOOST_CHECK_THROW(pmt::c32vector_set(v1, N, std::complex<float>(0)), pmt::out_of_range); - - size_t len; - const std::complex<float> *rd = pmt::c32vector_elements(v1, len); - BOOST_CHECK_EQUAL(len, N); - BOOST_CHECK_EQUAL(s0, rd[0]); - BOOST_CHECK_EQUAL(s1, rd[1]); - BOOST_CHECK_EQUAL(s2, rd[2]); - - std::complex<float> *wr = pmt::c32vector_writable_elements(v1, len); - BOOST_CHECK_EQUAL(len, N); - wr[0] = std::complex<float>(0); - BOOST_CHECK_EQUAL(std::complex<float>(0), wr[0]); - BOOST_CHECK_EQUAL(s1, wr[1]); - BOOST_CHECK_EQUAL(s2, wr[2]); +BOOST_AUTO_TEST_CASE(test_c32vector) +{ + static const size_t N = 3; + pmt::pmt_t v1 = pmt::make_c32vector(N, 0); + BOOST_CHECK_EQUAL(N, pmt::length(v1)); + std::complex<float> s0 = std::complex<float>(10); + std::complex<float> s1 = std::complex<float>(20); + std::complex<float> s2 = std::complex<float>(30); + + pmt::c32vector_set(v1, 0, s0); + pmt::c32vector_set(v1, 1, s1); + pmt::c32vector_set(v1, 2, s2); + + BOOST_CHECK_EQUAL(s0, pmt::c32vector_ref(v1, 0)); + BOOST_CHECK_EQUAL(s1, pmt::c32vector_ref(v1, 1)); + BOOST_CHECK_EQUAL(s2, pmt::c32vector_ref(v1, 2)); + + BOOST_CHECK_THROW(pmt::c32vector_ref(v1, N), pmt::out_of_range); + BOOST_CHECK_THROW(pmt::c32vector_set(v1, N, std::complex<float>(0)), + pmt::out_of_range); + + size_t len; + const std::complex<float>* rd = pmt::c32vector_elements(v1, len); + BOOST_CHECK_EQUAL(len, N); + BOOST_CHECK_EQUAL(s0, rd[0]); + BOOST_CHECK_EQUAL(s1, rd[1]); + BOOST_CHECK_EQUAL(s2, rd[2]); + + std::complex<float>* wr = pmt::c32vector_writable_elements(v1, len); + BOOST_CHECK_EQUAL(len, N); + wr[0] = std::complex<float>(0); + BOOST_CHECK_EQUAL(std::complex<float>(0), wr[0]); + BOOST_CHECK_EQUAL(s1, wr[1]); + BOOST_CHECK_EQUAL(s2, wr[2]); } -BOOST_AUTO_TEST_CASE(test_c64vector) { - static const size_t N = 3; - pmt::pmt_t v1 = pmt::make_c64vector(N, 0); - BOOST_CHECK_EQUAL(N, pmt::length(v1)); - std::complex<double> s0 = std::complex<double>(10); - std::complex<double> s1 = std::complex<double>(20); - std::complex<double> s2 = std::complex<double>(30); - - pmt::c64vector_set(v1, 0, s0); - pmt::c64vector_set(v1, 1, s1); - pmt::c64vector_set(v1, 2, s2); - - BOOST_CHECK_EQUAL(s0, pmt::c64vector_ref(v1, 0)); - BOOST_CHECK_EQUAL(s1, pmt::c64vector_ref(v1, 1)); - BOOST_CHECK_EQUAL(s2, pmt::c64vector_ref(v1, 2)); - - BOOST_CHECK_THROW(pmt::c64vector_ref(v1, N), pmt::out_of_range); - BOOST_CHECK_THROW(pmt::c64vector_set(v1, N, std::complex<double>(0)), pmt::out_of_range); - - size_t len; - const std::complex<double> *rd = pmt::c64vector_elements(v1, len); - BOOST_CHECK_EQUAL(len, N); - BOOST_CHECK_EQUAL(s0, rd[0]); - BOOST_CHECK_EQUAL(s1, rd[1]); - BOOST_CHECK_EQUAL(s2, rd[2]); - - std::complex<double> *wr = pmt::c64vector_writable_elements(v1, len); - BOOST_CHECK_EQUAL(len, N); - wr[0] = std::complex<double>(0); - BOOST_CHECK_EQUAL(std::complex<double>(0), wr[0]); - BOOST_CHECK_EQUAL(s1, wr[1]); - BOOST_CHECK_EQUAL(s2, wr[2]); +BOOST_AUTO_TEST_CASE(test_c64vector) +{ + static const size_t N = 3; + pmt::pmt_t v1 = pmt::make_c64vector(N, 0); + BOOST_CHECK_EQUAL(N, pmt::length(v1)); + std::complex<double> s0 = std::complex<double>(10); + std::complex<double> s1 = std::complex<double>(20); + std::complex<double> s2 = std::complex<double>(30); + + pmt::c64vector_set(v1, 0, s0); + pmt::c64vector_set(v1, 1, s1); + pmt::c64vector_set(v1, 2, s2); + + BOOST_CHECK_EQUAL(s0, pmt::c64vector_ref(v1, 0)); + BOOST_CHECK_EQUAL(s1, pmt::c64vector_ref(v1, 1)); + BOOST_CHECK_EQUAL(s2, pmt::c64vector_ref(v1, 2)); + + BOOST_CHECK_THROW(pmt::c64vector_ref(v1, N), pmt::out_of_range); + BOOST_CHECK_THROW(pmt::c64vector_set(v1, N, std::complex<double>(0)), + pmt::out_of_range); + + size_t len; + const std::complex<double>* rd = pmt::c64vector_elements(v1, len); + BOOST_CHECK_EQUAL(len, N); + BOOST_CHECK_EQUAL(s0, rd[0]); + BOOST_CHECK_EQUAL(s1, rd[1]); + BOOST_CHECK_EQUAL(s2, rd[2]); + + std::complex<double>* wr = pmt::c64vector_writable_elements(v1, len); + BOOST_CHECK_EQUAL(len, N); + wr[0] = std::complex<double>(0); + BOOST_CHECK_EQUAL(std::complex<double>(0), wr[0]); + BOOST_CHECK_EQUAL(s1, wr[1]); + BOOST_CHECK_EQUAL(s2, wr[2]); } diff --git a/gnuradio-runtime/lib/prefs.cc b/gnuradio-runtime/lib/prefs.cc index 426fbd33c2..218926d312 100644 --- a/gnuradio-runtime/lib/prefs.cc +++ b/gnuradio-runtime/lib/prefs.cc @@ -43,195 +43,187 @@ typedef std::ifstream::char_type char_t; namespace gr { - prefs * - prefs::singleton() - { +prefs* prefs::singleton() +{ static prefs instance; // Guaranteed to be destroyed. - // Instantiated on first use. + // Instantiated on first use. return &instance; - } +} - prefs::prefs() - { - _read_files(_sys_prefs_filenames()); - } +prefs::prefs() { _read_files(_sys_prefs_filenames()); } - prefs::~prefs() - { +prefs::~prefs() +{ // nop - } +} - std::vector<std::string> - prefs::_sys_prefs_filenames() - { +std::vector<std::string> prefs::_sys_prefs_filenames() +{ std::vector<std::string> fnames; fs::path dir = prefsdir(); - if(fs::is_directory(dir)) { - fs::directory_iterator diritr(dir); - while(diritr != fs::directory_iterator()) { - fs::path p = *diritr++; - if(p.extension() == ".conf") - fnames.push_back(p.string()); - } - std::sort(fnames.begin(), fnames.end()); + if (fs::is_directory(dir)) { + fs::directory_iterator diritr(dir); + while (diritr != fs::directory_iterator()) { + fs::path p = *diritr++; + if (p.extension() == ".conf") + fnames.push_back(p.string()); + } + std::sort(fnames.begin(), fnames.end()); } // Find if there is a ~/.gnuradio/config.conf file and add this to // the end of the file list to override any preferences in the // installed path config files. fs::path userconf = fs::path(gr::userconf_path()) / "config.conf"; - if(fs::exists(userconf)) { - fnames.push_back(userconf.string()); + if (fs::exists(userconf)) { + fnames.push_back(userconf.string()); } return fnames; - } - - void - prefs::_read_files(const std::vector<std::string> &filenames) - { - BOOST_FOREACH( std::string fname, filenames) { - std::ifstream infile(fname.c_str()); - if(infile.good()) { - try { - po::basic_parsed_options<char_t> parsed = po::parse_config_file(infile, po::options_description(), true); - BOOST_FOREACH(po::basic_option<char_t> o, (parsed.options) ){ - std::string okey = o.string_key; - size_t pos = okey.find("."); - std::string section, key; - if(pos != std::string::npos) { - section = okey.substr(0,pos); - key = okey.substr(pos+1); - } else { - section = "default"; - key = okey; +} + +void prefs::_read_files(const std::vector<std::string>& filenames) +{ + BOOST_FOREACH (std::string fname, filenames) { + std::ifstream infile(fname.c_str()); + if (infile.good()) { + try { + po::basic_parsed_options<char_t> parsed = + po::parse_config_file(infile, po::options_description(), true); + BOOST_FOREACH (po::basic_option<char_t> o, (parsed.options)) { + std::string okey = o.string_key; + size_t pos = okey.find("."); + std::string section, key; + if (pos != std::string::npos) { + section = okey.substr(0, pos); + key = okey.substr(pos + 1); + } else { + section = "default"; + key = okey; + } + std::transform( + section.begin(), section.end(), section.begin(), ::tolower); + std::transform(key.begin(), key.end(), key.begin(), ::tolower); + // value of a basic_option is always a std::vector<string>; we only + // allow single values, so: + std::string value = o.value[0]; + d_config_map[section][key] = value; + } + } catch (std::exception e) { + std::cerr << "WARNING: Config file '" << fname + << "' failed to parse:" << std::endl; + std::cerr << e.what() << std::endl; + std::cerr << "Skipping it" << std::endl; } - std::transform(section.begin(), section.end(), section.begin(), ::tolower); - std::transform(key.begin(), key.end(), key.begin(), ::tolower); - // value of a basic_option is always a std::vector<string>; we only allow single values, so: - std::string value = o.value[0]; - d_config_map[section][key] = value; - } - } catch(std::exception e) { - std::cerr << "WARNING: Config file '" << fname << "' failed to parse:" << std::endl; - std::cerr << e.what() << std::endl; - std::cerr << "Skipping it" << std::endl; + } else { // infile.good(); + std::cerr << "WARNING: Config file '" << fname + << "' could not be opened for reading." << std::endl; } - } else { // infile.good(); - std::cerr << "WARNING: Config file '" << fname << "' could not be opened for reading." << std::endl; - } } - } +} - void - prefs::add_config_file(const std::string &configfile) - { +void prefs::add_config_file(const std::string& configfile) +{ std::vector<std::string> filenames; filenames.push_back(configfile); _read_files(filenames); - } +} - std::string - prefs::to_string() - { +std::string prefs::to_string() +{ config_map_itr sections; config_map_elem_itr options; std::stringstream s; - for(sections = d_config_map.begin(); sections != d_config_map.end(); sections++) { - s << "[" << sections->first << "]" << std::endl; - for(options = sections->second.begin(); options != sections->second.end(); options++) { - s << options->first << " = " << options->second << std::endl; - } - s << std::endl; + for (sections = d_config_map.begin(); sections != d_config_map.end(); sections++) { + s << "[" << sections->first << "]" << std::endl; + for (options = sections->second.begin(); options != sections->second.end(); + options++) { + s << options->first << " = " << options->second << std::endl; + } + s << std::endl; } return s.str(); - } +} - void - prefs::save() - { +void prefs::save() +{ std::string conf = to_string(); fs::path userconf = fs::path(gr::userconf_path()) / "config.conf"; fs::ofstream fout(userconf); fout << conf; fout.close(); - } +} - char * - prefs::option_to_env(std::string section, std::string option) - { +char* prefs::option_to_env(std::string section, std::string option) +{ std::stringstream envname; - std::string secname=section, optname=option; + std::string secname = section, optname = option; std::transform(section.begin(), section.end(), secname.begin(), ::toupper); std::transform(option.begin(), option.end(), optname.begin(), ::toupper); envname << "GR_CONF_" << secname << "_" << optname; return getenv(envname.str().c_str()); - } +} - bool - prefs::has_section(const std::string §ion) - { +bool prefs::has_section(const std::string& section) +{ std::string s = section; std::transform(section.begin(), section.end(), s.begin(), ::tolower); return d_config_map.count(s) > 0; - } +} - bool - prefs::has_option(const std::string §ion, const std::string &option) - { - if(option_to_env(section, option)) - return true; +bool prefs::has_option(const std::string& section, const std::string& option) +{ + if (option_to_env(section, option)) + return true; - if(has_section(section)) { - std::string s = section; - std::transform(section.begin(), section.end(), s.begin(), ::tolower); + if (has_section(section)) { + std::string s = section; + std::transform(section.begin(), section.end(), s.begin(), ::tolower); - std::string o = option; - std::transform(option.begin(), option.end(), o.begin(), ::tolower); + std::string o = option; + std::transform(option.begin(), option.end(), o.begin(), ::tolower); - config_map_itr sec = d_config_map.find(s); - return sec->second.count(o) > 0; - } - else { - return false; - } - } - - const std::string - prefs::get_string(const std::string §ion, const std::string &option, - const std::string &default_val) - { - char *env = option_to_env(section, option); - if(env) - return std::string(env); - - if(has_option(section, option)) { - std::string s = section; - std::transform(section.begin(), section.end(), s.begin(), ::tolower); - - std::string o = option; - std::transform(option.begin(), option.end(), o.begin(), ::tolower); - - config_map_itr sec = d_config_map.find(s); - config_map_elem_itr opt = sec->second.find(o); - return opt->second; + config_map_itr sec = d_config_map.find(s); + return sec->second.count(o) > 0; + } else { + return false; } - else { - return default_val; +} + +const std::string prefs::get_string(const std::string& section, + const std::string& option, + const std::string& default_val) +{ + char* env = option_to_env(section, option); + if (env) + return std::string(env); + + if (has_option(section, option)) { + std::string s = section; + std::transform(section.begin(), section.end(), s.begin(), ::tolower); + + std::string o = option; + std::transform(option.begin(), option.end(), o.begin(), ::tolower); + + config_map_itr sec = d_config_map.find(s); + config_map_elem_itr opt = sec->second.find(o); + return opt->second; + } else { + return default_val; } - } +} - void - prefs::set_string(const std::string §ion, const std::string &option, - const std::string &val) - { +void prefs::set_string(const std::string& section, + const std::string& option, + const std::string& val) +{ std::string s = section; std::transform(section.begin(), section.end(), s.begin(), ::tolower); @@ -243,34 +235,31 @@ namespace gr { opt_map[o] = val; d_config_map[s] = opt_map; - } - - bool - prefs::get_bool(const std::string §ion, const std::string &option, - bool default_val) - { - if(has_option(section, option)) { - std::string str = get_string(section, option, ""); - if(str == "") { - return default_val; - } - std::transform(str.begin(), str.end(), str.begin(), ::tolower); - if((str == "true") || (str == "on") || (str == "1")) - return true; - else if((str == "false") || (str == "off") || (str == "0")) - return false; - else +} + +bool prefs::get_bool(const std::string& section, + const std::string& option, + bool default_val) +{ + if (has_option(section, option)) { + std::string str = get_string(section, option, ""); + if (str == "") { + return default_val; + } + std::transform(str.begin(), str.end(), str.begin(), ::tolower); + if ((str == "true") || (str == "on") || (str == "1")) + return true; + else if ((str == "false") || (str == "off") || (str == "0")) + return false; + else + return default_val; + } else { return default_val; } - else { - return default_val; - } - } +} - void - prefs::set_bool(const std::string §ion, const std::string &option, - bool val) - { +void prefs::set_bool(const std::string& section, const std::string& option, bool val) +{ std::string s = section; std::transform(section.begin(), section.end(), s.begin(), ::tolower); @@ -284,31 +273,28 @@ namespace gr { opt_map[o] = sstr.str(); d_config_map[s] = opt_map; - } - - long - prefs::get_long(const std::string §ion, const std::string &option, - long default_val) - { - if(has_option(section, option)) { - std::string str = get_string(section, option, ""); - if(str == "") { +} + +long prefs::get_long(const std::string& section, + const std::string& option, + long default_val) +{ + if (has_option(section, option)) { + std::string str = get_string(section, option, ""); + if (str == "") { + return default_val; + } + std::stringstream sstr(str); + long n; + sstr >> n; + return n; + } else { return default_val; - } - std::stringstream sstr(str); - long n; - sstr >> n; - return n; - } - else { - return default_val; } - } +} - void - prefs::set_long(const std::string §ion, const std::string &option, - long val) - { +void prefs::set_long(const std::string& section, const std::string& option, long val) +{ std::string s = section; std::transform(section.begin(), section.end(), s.begin(), ::tolower); @@ -322,31 +308,28 @@ namespace gr { opt_map[o] = sstr.str(); d_config_map[s] = opt_map; - } - - double - prefs::get_double(const std::string §ion, const std::string &option, - double default_val) - { - if(has_option(section, option)) { - std::string str = get_string(section, option, ""); - if(str == "") { +} + +double prefs::get_double(const std::string& section, + const std::string& option, + double default_val) +{ + if (has_option(section, option)) { + std::string str = get_string(section, option, ""); + if (str == "") { + return default_val; + } + std::stringstream sstr(str); + double n; + sstr >> n; + return n; + } else { return default_val; - } - std::stringstream sstr(str); - double n; - sstr >> n; - return n; - } - else { - return default_val; } - } +} - void - prefs::set_double(const std::string §ion, const std::string &option, - double val) - { +void prefs::set_double(const std::string& section, const std::string& option, double val) +{ std::string s = section; std::transform(section.begin(), section.end(), s.begin(), ::tolower); @@ -360,6 +343,6 @@ namespace gr { opt_map[o] = sstr.str(); d_config_map[s] = opt_map; - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/qa_buffer.cc b/gnuradio-runtime/lib/qa_buffer.cc index 89cb5eca59..64b1d0fc1f 100644 --- a/gnuradio-runtime/lib/qa_buffer.cc +++ b/gnuradio-runtime/lib/qa_buffer.cc @@ -31,19 +31,15 @@ #include <stdlib.h> -static void -leak_check(void f()) +static void leak_check(void f()) { - long buffer_count = gr::buffer_ncurrently_allocated(); - long buffer_reader_count = gr::buffer_reader_ncurrently_allocated(); + long buffer_count = gr::buffer_ncurrently_allocated(); + long buffer_reader_count = gr::buffer_reader_ncurrently_allocated(); - f(); + f(); - BOOST_CHECK_EQUAL( - buffer_reader_count, - gr::buffer_reader_ncurrently_allocated() - ); - BOOST_CHECK_EQUAL(buffer_count, gr::buffer_ncurrently_allocated()); + BOOST_CHECK_EQUAL(buffer_reader_count, gr::buffer_reader_ncurrently_allocated()); + BOOST_CHECK_EQUAL(buffer_count, gr::buffer_ncurrently_allocated()); } @@ -51,239 +47,226 @@ leak_check(void f()) // test single writer, no readers... // -static void -t0_body() +static void t0_body() { - int nitems = 4000 / sizeof(int); - int counter = 0; + int nitems = 4000 / sizeof(int); + int counter = 0; - gr::buffer_sptr buf(gr::make_buffer(nitems, sizeof(int), gr::block_sptr())); + gr::buffer_sptr buf(gr::make_buffer(nitems, sizeof(int), gr::block_sptr())); - int last_sa; - int sa; + int last_sa; + int sa; - sa = buf->space_available(); - BOOST_CHECK(sa > 0); - last_sa = sa; - - for(int i = 0; i < 5; i++) { sa = buf->space_available(); - BOOST_CHECK_EQUAL(last_sa, sa); + BOOST_CHECK(sa > 0); last_sa = sa; - int *p = (int*)buf->write_pointer(); - BOOST_CHECK(p != 0); + for (int i = 0; i < 5; i++) { + sa = buf->space_available(); + BOOST_CHECK_EQUAL(last_sa, sa); + last_sa = sa; - for(int j = 0; j < sa; j++) - *p++ = counter++; + int* p = (int*)buf->write_pointer(); + BOOST_CHECK(p != 0); - buf->update_write_pointer(sa); - } + for (int j = 0; j < sa; j++) + *p++ = counter++; + + buf->update_write_pointer(sa); + } } // ---------------------------------------------------------------------------- // test single writer, single reader // -static void -t1_body() +static void t1_body() { - int nitems = 4000 / sizeof(int); - int write_counter = 0; - int read_counter = 0; + int nitems = 4000 / sizeof(int); + int write_counter = 0; + int read_counter = 0; - gr::buffer_sptr buf(gr::make_buffer(nitems, sizeof(int), gr::block_sptr())); - gr::buffer_reader_sptr r1(gr::buffer_add_reader(buf, 0, gr::block_sptr())); + gr::buffer_sptr buf(gr::make_buffer(nitems, sizeof(int), gr::block_sptr())); + gr::buffer_reader_sptr r1(gr::buffer_add_reader(buf, 0, gr::block_sptr())); - int sa; + int sa; - // write 1/3 of buffer + // write 1/3 of buffer - sa = buf->space_available(); - BOOST_CHECK(sa > 0); + sa = buf->space_available(); + BOOST_CHECK(sa > 0); - int *p = (int*)buf->write_pointer(); - BOOST_CHECK(p != 0); + int* p = (int*)buf->write_pointer(); + BOOST_CHECK(p != 0); - for(int j = 0; j < sa/3; j++) { - *p++ = write_counter++; - } - buf->update_write_pointer(sa/3); + for (int j = 0; j < sa / 3; j++) { + *p++ = write_counter++; + } + buf->update_write_pointer(sa / 3); - // write the next 1/3 (1/2 of what's left) + // write the next 1/3 (1/2 of what's left) - sa = buf->space_available(); - BOOST_CHECK(sa > 0); + sa = buf->space_available(); + BOOST_CHECK(sa > 0); - p = (int*)buf->write_pointer(); - BOOST_CHECK(p != 0); + p = (int*)buf->write_pointer(); + BOOST_CHECK(p != 0); - for(int j = 0; j < sa/2; j++) { - *p++ = write_counter++; - } - buf->update_write_pointer(sa/2); + for (int j = 0; j < sa / 2; j++) { + *p++ = write_counter++; + } + buf->update_write_pointer(sa / 2); - // check that we can read it OK + // check that we can read it OK - int ia = r1->items_available(); - BOOST_CHECK_EQUAL(write_counter, ia); + int ia = r1->items_available(); + BOOST_CHECK_EQUAL(write_counter, ia); - int *rp = (int*)r1->read_pointer(); - BOOST_CHECK(rp != 0); + int* rp = (int*)r1->read_pointer(); + BOOST_CHECK(rp != 0); - for(int i = 0; i < ia/2; i++) { - BOOST_CHECK_EQUAL(read_counter, *rp); - read_counter++; - rp++; - } - r1->update_read_pointer(ia/2); + for (int i = 0; i < ia / 2; i++) { + BOOST_CHECK_EQUAL(read_counter, *rp); + read_counter++; + rp++; + } + r1->update_read_pointer(ia / 2); - // read the rest + // read the rest - ia = r1->items_available(); - rp = (int *) r1->read_pointer(); - BOOST_CHECK(rp != 0); + ia = r1->items_available(); + rp = (int*)r1->read_pointer(); + BOOST_CHECK(rp != 0); - for(int i = 0; i < ia; i++) { - BOOST_CHECK_EQUAL(read_counter, *rp); - read_counter++; - rp++; - } - r1->update_read_pointer(ia); + for (int i = 0; i < ia; i++) { + BOOST_CHECK_EQUAL(read_counter, *rp); + read_counter++; + rp++; + } + r1->update_read_pointer(ia); } // ---------------------------------------------------------------------------- // single writer, single reader: check wrap-around // -static void -t2_body() +static void t2_body() { - // 64K is the largest granularity we've seen so far (MS windows file mapping). - // This allows a bit of "white box testing" + // 64K is the largest granularity we've seen so far (MS windows file mapping). + // This allows a bit of "white box testing" - int nitems = (64 * (1L << 10)) / sizeof(int); // 64K worth of ints + int nitems = (64 * (1L << 10)) / sizeof(int); // 64K worth of ints - gr::buffer_sptr buf(gr::make_buffer(nitems, sizeof(int), gr::block_sptr())); - gr::buffer_reader_sptr r1(gr::buffer_add_reader(buf, 0, gr::block_sptr())); + gr::buffer_sptr buf(gr::make_buffer(nitems, sizeof(int), gr::block_sptr())); + gr::buffer_reader_sptr r1(gr::buffer_add_reader(buf, 0, gr::block_sptr())); - int read_counter = 0; - int write_counter = 0; - int n; - int *wp = 0; - int *rp = 0; + int read_counter = 0; + int write_counter = 0; + int n; + int* wp = 0; + int* rp = 0; - // Write 3/4 of buffer + // Write 3/4 of buffer - n = (int)(buf->space_available() * 0.75); - wp = (int*)buf->write_pointer(); + n = (int)(buf->space_available() * 0.75); + wp = (int*)buf->write_pointer(); - for(int i = 0; i < n; i++) - *wp++ = write_counter++; - buf->update_write_pointer(n); + for (int i = 0; i < n; i++) + *wp++ = write_counter++; + buf->update_write_pointer(n); - // Now read it all + // Now read it all - int m = r1->items_available(); - BOOST_CHECK_EQUAL(n, m); - rp = (int*)r1->read_pointer(); + int m = r1->items_available(); + BOOST_CHECK_EQUAL(n, m); + rp = (int*)r1->read_pointer(); - for(int i = 0; i < m; i++) { - BOOST_CHECK_EQUAL(read_counter, *rp); - read_counter++; - rp++; - } - r1->update_read_pointer(m); + for (int i = 0; i < m; i++) { + BOOST_CHECK_EQUAL(read_counter, *rp); + read_counter++; + rp++; + } + r1->update_read_pointer(m); - // Now write as much as we can. - // This will wrap around the buffer + // Now write as much as we can. + // This will wrap around the buffer - n = buf->space_available(); - BOOST_CHECK_EQUAL(nitems - 1, n); // white box test - wp = (int*)buf->write_pointer(); + n = buf->space_available(); + BOOST_CHECK_EQUAL(nitems - 1, n); // white box test + wp = (int*)buf->write_pointer(); - for(int i = 0; i < n; i++) - *wp++ = write_counter++; - buf->update_write_pointer(n); + for (int i = 0; i < n; i++) + *wp++ = write_counter++; + buf->update_write_pointer(n); - // now read it all + // now read it all - m = r1->items_available(); - BOOST_CHECK_EQUAL(n, m); - rp = (int*)r1->read_pointer(); + m = r1->items_available(); + BOOST_CHECK_EQUAL(n, m); + rp = (int*)r1->read_pointer(); - for(int i = 0; i < m; i++) { - BOOST_CHECK_EQUAL(read_counter, *rp); - read_counter++; - rp++; - } - r1->update_read_pointer(m); + for (int i = 0; i < m; i++) { + BOOST_CHECK_EQUAL(read_counter, *rp); + read_counter++; + rp++; + } + r1->update_read_pointer(m); } // ---------------------------------------------------------------------------- // single writer, N readers, randomized order and lengths // ---------------------------------------------------------------------------- -static void -t3_body() +static void t3_body() { - int nitems = (64 * (1L << 10)) / sizeof(int); - - static const int N = 5; - gr::buffer_sptr buf(gr::make_buffer(nitems, sizeof(int), gr::block_sptr())); - gr::buffer_reader_sptr reader[N]; - int read_counter[N]; - int write_counter = 0; - gr::random random; - - for(int i = 0; i < N; i++) { - read_counter[i] = 0; - reader[i] = buffer_add_reader(buf, 0, gr::block_sptr()); - } + int nitems = (64 * (1L << 10)) / sizeof(int); + + static const int N = 5; + gr::buffer_sptr buf(gr::make_buffer(nitems, sizeof(int), gr::block_sptr())); + gr::buffer_reader_sptr reader[N]; + int read_counter[N]; + int write_counter = 0; + gr::random random; + + for (int i = 0; i < N; i++) { + read_counter[i] = 0; + reader[i] = buffer_add_reader(buf, 0, gr::block_sptr()); + } - for(int lc = 0; lc < 1000; lc++) { + for (int lc = 0; lc < 1000; lc++) { - // write some + // write some - int n = (int)(buf->space_available() * random.ran1()); - int *wp = (int*)buf->write_pointer(); + int n = (int)(buf->space_available() * random.ran1()); + int* wp = (int*)buf->write_pointer(); - for(int i = 0; i < n; i++) - *wp++ = write_counter++; + for (int i = 0; i < n; i++) + *wp++ = write_counter++; - buf->update_write_pointer(n); + buf->update_write_pointer(n); - // pick a random reader and read some + // pick a random reader and read some - int r = (int)(N * random.ran1()); + int r = (int)(N * random.ran1()); - int m = reader[r]->items_available(); - int *rp = (int*)reader[r]->read_pointer(); + int m = reader[r]->items_available(); + int* rp = (int*)reader[r]->read_pointer(); - for(int i = 0; i < m; i++) { - BOOST_CHECK_EQUAL(read_counter[r], *rp); - read_counter[r]++; - rp++; + for (int i = 0; i < m; i++) { + BOOST_CHECK_EQUAL(read_counter[r], *rp); + read_counter[r]++; + rp++; + } + reader[r]->update_read_pointer(m); } - reader[r]->update_read_pointer (m); - } } // ---------------------------------------------------------------------------- -BOOST_AUTO_TEST_CASE(t0) { - leak_check(t0_body); -} - -BOOST_AUTO_TEST_CASE(t1) { - leak_check(t1_body); -} +BOOST_AUTO_TEST_CASE(t0) { leak_check(t0_body); } -BOOST_AUTO_TEST_CASE(t2) { - leak_check(t2_body); -} +BOOST_AUTO_TEST_CASE(t1) { leak_check(t1_body); } -BOOST_AUTO_TEST_CASE(t3) { - leak_check(t3_body); -} +BOOST_AUTO_TEST_CASE(t2) { leak_check(t2_body); } +BOOST_AUTO_TEST_CASE(t3) { leak_check(t3_body); } diff --git a/gnuradio-runtime/lib/qa_circular_file.cc b/gnuradio-runtime/lib/qa_circular_file.cc index 06599caaab..164650819d 100644 --- a/gnuradio-runtime/lib/qa_circular_file.cc +++ b/gnuradio-runtime/lib/qa_circular_file.cc @@ -28,40 +28,39 @@ #include <boost/test/unit_test.hpp> #include <unistd.h> -static const char *test_file = "qa_gr_circular_file.data"; +static const char* test_file = "qa_gr_circular_file.data"; static const int BUFFER_SIZE = 8192; static const int NWRITE = 8192 * 9 / 8; -BOOST_AUTO_TEST_CASE(t1) { +BOOST_AUTO_TEST_CASE(t1) +{ #ifdef HAVE_MMAP - gr::circular_file *cf_writer; - gr::circular_file *cf_reader; + gr::circular_file* cf_writer; + gr::circular_file* cf_reader; - // write the data... - cf_writer = new gr::circular_file(test_file, true, - BUFFER_SIZE * sizeof(short)); + // write the data... + cf_writer = new gr::circular_file(test_file, true, BUFFER_SIZE * sizeof(short)); - short sd; - for(int i = 0; i < NWRITE; i++) { - sd = i; - cf_writer->write(&sd, sizeof (sd)); - } + short sd; + for (int i = 0; i < NWRITE; i++) { + sd = i; + cf_writer->write(&sd, sizeof(sd)); + } - delete cf_writer; + delete cf_writer; - // now read it back... - cf_reader = new gr::circular_file(test_file); - for(int i = 0; i < BUFFER_SIZE; i++) { - int n = cf_reader->read (&sd, sizeof(sd)); - BOOST_CHECK_EQUAL((int) sizeof (sd), n); - BOOST_CHECK_EQUAL(NWRITE - BUFFER_SIZE + i, (int)sd); - } + // now read it back... + cf_reader = new gr::circular_file(test_file); + for (int i = 0; i < BUFFER_SIZE; i++) { + int n = cf_reader->read(&sd, sizeof(sd)); + BOOST_CHECK_EQUAL((int)sizeof(sd), n); + BOOST_CHECK_EQUAL(NWRITE - BUFFER_SIZE + i, (int)sd); + } - int n = cf_reader->read(&sd, sizeof(sd)); - BOOST_CHECK_EQUAL(0, n); + int n = cf_reader->read(&sd, sizeof(sd)); + BOOST_CHECK_EQUAL(0, n); - delete cf_reader; - unlink(test_file); + delete cf_reader; + unlink(test_file); #endif // HAVE_MMAP } - diff --git a/gnuradio-runtime/lib/qa_io_signature.cc b/gnuradio-runtime/lib/qa_io_signature.cc index d09188ed74..24502b2922 100644 --- a/gnuradio-runtime/lib/qa_io_signature.cc +++ b/gnuradio-runtime/lib/qa_io_signature.cc @@ -28,18 +28,15 @@ #include <boost/test/unit_test.hpp> #include <stdexcept> -BOOST_AUTO_TEST_CASE(t0) { - gr::io_signature::make(1, 1, sizeof(int)); -} +BOOST_AUTO_TEST_CASE(t0) { gr::io_signature::make(1, 1, sizeof(int)); } -BOOST_AUTO_TEST_CASE(t1) { - BOOST_REQUIRE_THROW( - gr::io_signature::make(3, 1, sizeof(int)), - std::invalid_argument - ); +BOOST_AUTO_TEST_CASE(t1) +{ + BOOST_REQUIRE_THROW(gr::io_signature::make(3, 1, sizeof(int)), std::invalid_argument); } -BOOST_AUTO_TEST_CASE(t2) { +BOOST_AUTO_TEST_CASE(t2) +{ gr::io_signature::sptr p = gr::io_signature::make(3, gr::io_signature::IO_INFINITE, sizeof(int)); @@ -47,7 +44,8 @@ BOOST_AUTO_TEST_CASE(t2) { BOOST_CHECK_EQUAL(p->sizeof_stream_item(0), (int)sizeof(int)); } -BOOST_AUTO_TEST_CASE(t3) { +BOOST_AUTO_TEST_CASE(t3) +{ gr::io_signature::sptr p = gr::io_signature::make3(0, 5, 1, 2, 3); BOOST_CHECK_EQUAL(p->min_streams(), 0); diff --git a/gnuradio-runtime/lib/qa_logger.cc b/gnuradio-runtime/lib/qa_logger.cc index dc47b53cef..ca322cb9ff 100644 --- a/gnuradio-runtime/lib/qa_logger.cc +++ b/gnuradio-runtime/lib/qa_logger.cc @@ -32,19 +32,20 @@ #include <gnuradio/logger.h> #include <boost/test/unit_test.hpp> -BOOST_AUTO_TEST_CASE(t1) { +BOOST_AUTO_TEST_CASE(t1) +{ #ifdef ENABLE_GR_LOG - // This doesn't really test anything, more just - // making sure nothing's gone horribly wrong. + // This doesn't really test anything, more just + // making sure nothing's gone horribly wrong. - GR_LOG_GETLOGGER(LOG,"main"); - GR_ADD_CONSOLE_APPENDER("main","cout","%d{%H:%M:%S} : %m%n"); - GR_LOG_NOTICE(LOG,"test from c++ NOTICE"); - GR_LOG_DEBUG(LOG,"test from c++ DEBUG"); - GR_LOG_INFO(LOG,"test from c++ INFO"); - GR_LOG_WARN(LOG,"test from c++ WARN"); - GR_LOG_ERROR(LOG,"test from c++ ERROR"); - GR_LOG_FATAL(LOG,"test from c++ FATAL"); - BOOST_CHECK(true); + GR_LOG_GETLOGGER(LOG, "main"); + GR_ADD_CONSOLE_APPENDER("main", "cout", "%d{%H:%M:%S} : %m%n"); + GR_LOG_NOTICE(LOG, "test from c++ NOTICE"); + GR_LOG_DEBUG(LOG, "test from c++ DEBUG"); + GR_LOG_INFO(LOG, "test from c++ INFO"); + GR_LOG_WARN(LOG, "test from c++ WARN"); + GR_LOG_ERROR(LOG, "test from c++ ERROR"); + GR_LOG_FATAL(LOG, "test from c++ FATAL"); + BOOST_CHECK(true); #endif } diff --git a/gnuradio-runtime/lib/qa_vmcircbuf.cc b/gnuradio-runtime/lib/qa_vmcircbuf.cc index 4b8b8273fb..7b418ac903 100644 --- a/gnuradio-runtime/lib/qa_vmcircbuf.cc +++ b/gnuradio-runtime/lib/qa_vmcircbuf.cc @@ -27,8 +27,9 @@ #include "vmcircbuf.h" #include <boost/test/unit_test.hpp> -BOOST_AUTO_TEST_CASE(test_all) { - int verbose = 1; // summary +BOOST_AUTO_TEST_CASE(test_all) +{ + int verbose = 1; // summary - BOOST_REQUIRE(gr::vmcircbuf_sysconfig::test_all_factories(verbose)); + BOOST_REQUIRE(gr::vmcircbuf_sysconfig::test_all_factories(verbose)); } diff --git a/gnuradio-runtime/lib/realtime.cc b/gnuradio-runtime/lib/realtime.cc index 603e97a2f1..d7a5462eeb 100644 --- a/gnuradio-runtime/lib/realtime.cc +++ b/gnuradio-runtime/lib/realtime.cc @@ -28,10 +28,9 @@ namespace gr { - rt_status_t - enable_realtime_scheduling() - { +rt_status_t enable_realtime_scheduling() +{ return gr::impl::enable_realtime_scheduling(); - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/realtime_impl.cc b/gnuradio-runtime/lib/realtime_impl.cc index 83afd9568d..de624f9ad7 100644 --- a/gnuradio-runtime/lib/realtime_impl.cc +++ b/gnuradio-runtime/lib/realtime_impl.cc @@ -42,25 +42,24 @@ #include <pthread.h> namespace gr { - namespace impl { - - /*! - * 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) - { - 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<int>(rint(y)); - return std::max(min_real_pri, std::min(max_real_pri, y_int)); - } +namespace impl { - } // namespace impl -} // namespace gr +/*! + * 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) +{ + 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<int>(rint(y)); + return std::max(min_real_pri, std::min(max_real_pri, y_int)); +} + +} // namespace impl +} // namespace gr #endif @@ -70,123 +69,117 @@ namespace gr { #include <windows.h> namespace gr { - namespace impl { +namespace impl { - 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) +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) + // 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; - } + // printf("SetPriorityClass + SetThreadPriority\n"); + return RT_OK; +} - } // namespace impl +} // namespace impl } // namespace gr #elif defined(HAVE_PTHREAD_SETSCHEDPARAM) namespace gr { - namespace impl { - - 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_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; - int result = pthread_setschedparam (pthread_self(), policy, ¶m); - if(result != 0) { - if(result == EPERM) // N.B., return value, not errno - return RT_NO_PRIVS; +namespace impl { + +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_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; + int result = pthread_setschedparam(pthread_self(), policy, ¶m); + if (result != 0) { + if (result == EPERM) // N.B., return value, not errno + return RT_NO_PRIVS; else { - fprintf(stderr, - "pthread_setschedparam: failed to set real time priority: %s\n", - strerror(result)); - return RT_OTHER_ERROR; + fprintf(stderr, + "pthread_setschedparam: failed to set real time priority: %s\n", + strerror(result)); + return RT_OTHER_ERROR; } - } - - //printf("SCHED_FIFO enabled with priority = %d\n", pri); - return RT_OK; } - } // namespace impl + // printf("SCHED_FIFO enabled with priority = %d\n", pri); + return RT_OK; +} + +} // namespace impl } // namespace gr #elif defined(HAVE_SCHED_SETSCHEDULER) namespace gr { - namespace impl { - - 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_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)); - param.sched_priority = pri; - int result = sched_setscheduler(pid, policy, ¶m); - if(result != 0){ - if(errno == EPERM) - return RT_NO_PRIVS; +namespace impl { + +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_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)); + 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; + 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 impl + // printf("SCHED_FIFO enabled with priority = %d\n", pri); + return RT_OK; +} + +} // namespace impl } // namespace gr #else namespace gr { - namespace impl { +namespace impl { - rt_status_t - enable_realtime_scheduling(rt_sched_param p) - { - return RT_NOT_IMPLEMENTED; - } +rt_status_t enable_realtime_scheduling(rt_sched_param p) { return RT_NOT_IMPLEMENTED; } - } // namespace impl +} // namespace impl } // namespace gr #endif diff --git a/gnuradio-runtime/lib/scheduler.cc b/gnuradio-runtime/lib/scheduler.cc index 38d95e6fb2..f054e4c753 100644 --- a/gnuradio-runtime/lib/scheduler.cc +++ b/gnuradio-runtime/lib/scheduler.cc @@ -27,13 +27,8 @@ namespace gr { - scheduler::scheduler(flat_flowgraph_sptr ffg, - int max_noutput_items) - { - } +scheduler::scheduler(flat_flowgraph_sptr ffg, int max_noutput_items) {} - scheduler::~scheduler() - { - } +scheduler::~scheduler() {} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/scheduler.h b/gnuradio-runtime/lib/scheduler.h index 0924808965..36bec12961 100644 --- a/gnuradio-runtime/lib/scheduler.h +++ b/gnuradio-runtime/lib/scheduler.h @@ -29,19 +29,19 @@ namespace gr { - class scheduler; - typedef boost::shared_ptr<scheduler> scheduler_sptr; +class scheduler; +typedef boost::shared_ptr<scheduler> scheduler_sptr; - /*! - * \brief Abstract scheduler that takes a flattened flow graph and - * runs it. - * - * Preconditions: details, buffers and buffer readers have been - * assigned. - */ - class GR_RUNTIME_API scheduler : boost::noncopyable - { - public: +/*! + * \brief Abstract scheduler that takes a flattened flow graph and + * runs it. + * + * Preconditions: details, buffers and buffer readers have been + * assigned. + */ +class GR_RUNTIME_API scheduler : boost::noncopyable +{ +public: /*! * \brief Construct a scheduler and begin evaluating the graph. * @@ -61,7 +61,7 @@ namespace gr { * \brief Block until the graph is done. */ virtual void wait() = 0; - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/lib/scheduler_tpb.cc b/gnuradio-runtime/lib/scheduler_tpb.cc index fe593670f8..a255aa4946 100644 --- a/gnuradio-runtime/lib/scheduler_tpb.cc +++ b/gnuradio-runtime/lib/scheduler_tpb.cc @@ -31,32 +31,34 @@ namespace gr { - class tpb_container - { +class tpb_container +{ block_sptr d_block; int d_max_noutput_items; thread::barrier_sptr d_start_sync; - public: - tpb_container(block_sptr block, int max_noutput_items, thread::barrier_sptr start_sync) - : d_block(block), d_max_noutput_items(max_noutput_items), d_start_sync(start_sync) {} +public: + tpb_container(block_sptr block, + int max_noutput_items, + thread::barrier_sptr start_sync) + : d_block(block), d_max_noutput_items(max_noutput_items), d_start_sync(start_sync) + { + } void operator()() { - tpb_thread_body body(d_block, d_start_sync, d_max_noutput_items); + tpb_thread_body body(d_block, d_start_sync, d_max_noutput_items); } - }; +}; - scheduler_sptr - scheduler_tpb::make(flat_flowgraph_sptr ffg, int max_noutput_items) - { +scheduler_sptr scheduler_tpb::make(flat_flowgraph_sptr ffg, int max_noutput_items) +{ return scheduler_sptr(new scheduler_tpb(ffg, max_noutput_items)); - } +} - scheduler_tpb::scheduler_tpb(flat_flowgraph_sptr ffg, - int max_noutput_items) +scheduler_tpb::scheduler_tpb(flat_flowgraph_sptr ffg, int max_noutput_items) : scheduler(ffg, max_noutput_items) - { +{ int block_max_noutput_items; // Get a topologically sorted vector of all the blocks in use. @@ -69,48 +71,35 @@ namespace gr { // Ensure that the done flag is clear on all blocks - for(size_t i = 0; i < blocks.size(); i++) { - blocks[i]->detail()->set_done(false); + for (size_t i = 0; i < blocks.size(); i++) { + blocks[i]->detail()->set_done(false); } thread::barrier_sptr start_sync = - boost::make_shared<thread::barrier>(blocks.size()+1); + boost::make_shared<thread::barrier>(blocks.size() + 1); // Fire off a thead for each block - for(size_t i = 0; i < blocks.size(); i++) { - std::stringstream name; - name << "thread-per-block[" << i << "]: " << blocks[i]; - - // If set, use internal value instead of global value - if(blocks[i]->is_set_max_noutput_items()) { - block_max_noutput_items = blocks[i]->max_noutput_items(); - } - else { - block_max_noutput_items = max_noutput_items; - } - d_threads.create_thread(thread::thread_body_wrapper<tpb_container>( - tpb_container(blocks[i], block_max_noutput_items, start_sync), - name.str())); + for (size_t i = 0; i < blocks.size(); i++) { + std::stringstream name; + name << "thread-per-block[" << i << "]: " << blocks[i]; + + // If set, use internal value instead of global value + if (blocks[i]->is_set_max_noutput_items()) { + block_max_noutput_items = blocks[i]->max_noutput_items(); + } else { + block_max_noutput_items = max_noutput_items; + } + d_threads.create_thread(thread::thread_body_wrapper<tpb_container>( + tpb_container(blocks[i], block_max_noutput_items, start_sync), name.str())); } start_sync->wait(); - } - - scheduler_tpb::~scheduler_tpb() - { - stop(); - } - - void - scheduler_tpb::stop() - { - d_threads.interrupt_all(); - } - - void - scheduler_tpb::wait() - { - d_threads.join_all(); - } +} + +scheduler_tpb::~scheduler_tpb() { stop(); } + +void scheduler_tpb::stop() { d_threads.interrupt_all(); } + +void scheduler_tpb::wait() { d_threads.join_all(); } } /* namespace gr */ diff --git a/gnuradio-runtime/lib/scheduler_tpb.h b/gnuradio-runtime/lib/scheduler_tpb.h index f5ab21f269..a353d1aae0 100644 --- a/gnuradio-runtime/lib/scheduler_tpb.h +++ b/gnuradio-runtime/lib/scheduler_tpb.h @@ -28,14 +28,14 @@ namespace gr { - /*! - * \brief Concrete scheduler that uses a kernel thread-per-block - */ - class GR_RUNTIME_API scheduler_tpb : public scheduler - { +/*! + * \brief Concrete scheduler that uses a kernel thread-per-block + */ +class GR_RUNTIME_API scheduler_tpb : public scheduler +{ gr::thread::thread_group d_threads; - protected: +protected: /*! * \brief Construct a scheduler and begin evaluating the graph. * @@ -44,9 +44,8 @@ namespace gr { */ scheduler_tpb(flat_flowgraph_sptr ffg, int max_noutput_items); - public: - static scheduler_sptr make(flat_flowgraph_sptr ffg, - int max_noutput_items=100000); +public: + static scheduler_sptr make(flat_flowgraph_sptr ffg, int max_noutput_items = 100000); ~scheduler_tpb(); @@ -59,7 +58,7 @@ namespace gr { * \brief Block until the graph is done. */ void wait(); - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/lib/sptr_magic.cc b/gnuradio-runtime/lib/sptr_magic.cc index bffef04756..03693cdc8f 100644 --- a/gnuradio-runtime/lib/sptr_magic.cc +++ b/gnuradio-runtime/lib/sptr_magic.cc @@ -32,61 +32,51 @@ namespace gnuradio { - static gr::thread::mutex s_mutex; - typedef std::map<gr::basic_block*, gr::basic_block_sptr> sptr_map; - static sptr_map s_map; +static gr::thread::mutex s_mutex; +typedef std::map<gr::basic_block*, gr::basic_block_sptr> sptr_map; +static sptr_map s_map; - struct disarmable_deleter - { +struct disarmable_deleter { bool armed; - disarmable_deleter() - { - armed = true; - } + disarmable_deleter() { armed = true; } - void operator()(void *p) const + void operator()(void* p) const { - if (armed) - delete static_cast<gr::basic_block *>(p); + if (armed) + delete static_cast<gr::basic_block*>(p); } - void disarm() - { - armed = false; - } - }; + void disarm() { armed = false; } +}; - void - detail::sptr_magic::create_and_stash_initial_sptr(gr::hier_block2 *p) - { +void detail::sptr_magic::create_and_stash_initial_sptr(gr::hier_block2* p) +{ gr::basic_block_sptr sptr(p, disarmable_deleter()); gr::thread::scoped_lock guard(s_mutex); - s_map.insert(sptr_map::value_type(static_cast<gr::basic_block *>(p), sptr)); - } + s_map.insert(sptr_map::value_type(static_cast<gr::basic_block*>(p), sptr)); +} - void - detail::sptr_magic::cancel_initial_sptr(gr::hier_block2 *p) - { +void detail::sptr_magic::cancel_initial_sptr(gr::hier_block2* p) +{ gr::thread::scoped_lock guard(s_mutex); - sptr_map::iterator pos = s_map.find(static_cast<gr::basic_block *>(p)); - if(pos == s_map.end()) - return; /* Not in the map, nothing to do */ + sptr_map::iterator pos = s_map.find(static_cast<gr::basic_block*>(p)); + if (pos == s_map.end()) + return; /* Not in the map, nothing to do */ gr::basic_block_sptr sptr = pos->second; s_map.erase(pos); boost::get_deleter<disarmable_deleter, gr::basic_block>(sptr)->disarm(); - } +} - gr::basic_block_sptr - detail::sptr_magic::fetch_initial_sptr(gr::basic_block *p) - { +gr::basic_block_sptr detail::sptr_magic::fetch_initial_sptr(gr::basic_block* p) +{ /* * If p isn't a subclass of gr::hier_block2, just create the * shared ptr and return it. */ - gr::hier_block2 *hb2 = dynamic_cast<gr::hier_block2 *>(p); - if(!hb2) { - return gr::basic_block_sptr(p); + gr::hier_block2* hb2 = dynamic_cast<gr::hier_block2*>(p); + if (!hb2) { + return gr::basic_block_sptr(p); } /* @@ -94,12 +84,12 @@ namespace gnuradio { * and stashed it away. Fish it out and return it. */ gr::thread::scoped_lock guard(s_mutex); - sptr_map::iterator pos = s_map.find(static_cast<gr::basic_block *>(p)); - if(pos == s_map.end()) - throw std::invalid_argument("sptr_magic: invalid pointer!"); + sptr_map::iterator pos = s_map.find(static_cast<gr::basic_block*>(p)); + if (pos == s_map.end()) + throw std::invalid_argument("sptr_magic: invalid pointer!"); gr::basic_block_sptr sptr = pos->second; s_map.erase(pos); return sptr; - } } +} // namespace gnuradio diff --git a/gnuradio-runtime/lib/sync_block.cc b/gnuradio-runtime/lib/sync_block.cc index e00b80c79e..8597b93b41 100644 --- a/gnuradio-runtime/lib/sync_block.cc +++ b/gnuradio-runtime/lib/sync_block.cc @@ -28,45 +28,40 @@ namespace gr { - sync_block::sync_block(const std::string &name, - io_signature::sptr input_signature, - io_signature::sptr output_signature) +sync_block::sync_block(const std::string& name, + io_signature::sptr input_signature, + io_signature::sptr output_signature) : block(name, input_signature, output_signature) - { +{ set_fixed_rate(true); - } +} - void - sync_block::forecast(int noutput_items, - gr_vector_int &ninput_items_required) - { +void sync_block::forecast(int noutput_items, gr_vector_int& ninput_items_required) +{ unsigned ninputs = ninput_items_required.size(); - for(unsigned i = 0; i < ninputs; i++) - ninput_items_required[i] = fixed_rate_noutput_to_ninput(noutput_items); - } + for (unsigned i = 0; i < ninputs; i++) + ninput_items_required[i] = fixed_rate_noutput_to_ninput(noutput_items); +} - int - sync_block::fixed_rate_noutput_to_ninput(int noutput_items) - { +int sync_block::fixed_rate_noutput_to_ninput(int noutput_items) +{ return noutput_items + history() - 1; - } +} - int - sync_block::fixed_rate_ninput_to_noutput(int ninput_items) - { +int sync_block::fixed_rate_ninput_to_noutput(int ninput_items) +{ return std::max(0, ninput_items - (int)history() + 1); - } +} - int - sync_block::general_work(int noutput_items, - gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) - { +int sync_block::general_work(int noutput_items, + gr_vector_int& ninput_items, + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items) +{ int r = work(noutput_items, input_items, output_items); - if(r > 0) - consume_each(r); + if (r > 0) + consume_each(r); return r; - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/sync_decimator.cc b/gnuradio-runtime/lib/sync_decimator.cc index a9c2d1eeff..2c15a982fd 100644 --- a/gnuradio-runtime/lib/sync_decimator.cc +++ b/gnuradio-runtime/lib/sync_decimator.cc @@ -28,45 +28,41 @@ namespace gr { - sync_decimator::sync_decimator(const std::string &name, - io_signature::sptr input_signature, - io_signature::sptr output_signature, - unsigned decimation) +sync_decimator::sync_decimator(const std::string& name, + io_signature::sptr input_signature, + io_signature::sptr output_signature, + unsigned decimation) : sync_block(name, input_signature, output_signature) - { +{ set_decimation(decimation); - } +} - void - sync_decimator::forecast(int noutput_items, gr_vector_int &ninput_items_required) - { +void sync_decimator::forecast(int noutput_items, gr_vector_int& ninput_items_required) +{ unsigned ninputs = ninput_items_required.size(); - for(unsigned i = 0; i < ninputs; i++) - ninput_items_required[i] = fixed_rate_noutput_to_ninput(noutput_items); - } + for (unsigned i = 0; i < ninputs; i++) + ninput_items_required[i] = fixed_rate_noutput_to_ninput(noutput_items); +} - int - sync_decimator::fixed_rate_noutput_to_ninput(int noutput_items) - { +int sync_decimator::fixed_rate_noutput_to_ninput(int noutput_items) +{ return noutput_items * decimation() + history() - 1; - } +} - int - sync_decimator::fixed_rate_ninput_to_noutput(int ninput_items) - { +int sync_decimator::fixed_rate_ninput_to_noutput(int ninput_items) +{ return std::max(0, ninput_items - (int)history() + 1) / decimation(); - } +} - int - sync_decimator::general_work(int noutput_items, - gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) - { +int sync_decimator::general_work(int noutput_items, + gr_vector_int& ninput_items, + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items) +{ int r = work(noutput_items, input_items, output_items); - if(r > 0) - consume_each(r * decimation ()); + if (r > 0) + consume_each(r * decimation()); return r; - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/sync_interpolator.cc b/gnuradio-runtime/lib/sync_interpolator.cc index 5721f24f0f..d3c7ac6ef7 100644 --- a/gnuradio-runtime/lib/sync_interpolator.cc +++ b/gnuradio-runtime/lib/sync_interpolator.cc @@ -28,46 +28,41 @@ namespace gr { - sync_interpolator::sync_interpolator(const std::string &name, - io_signature::sptr input_signature, - io_signature::sptr output_signature, - unsigned interpolation) +sync_interpolator::sync_interpolator(const std::string& name, + io_signature::sptr input_signature, + io_signature::sptr output_signature, + unsigned interpolation) : sync_block(name, input_signature, output_signature) - { +{ set_interpolation(interpolation); - } +} - void - sync_interpolator::forecast(int noutput_items, - gr_vector_int &ninput_items_required) - { +void sync_interpolator::forecast(int noutput_items, gr_vector_int& ninput_items_required) +{ unsigned ninputs = ninput_items_required.size(); - for(unsigned i = 0; i < ninputs; i++) - ninput_items_required[i] = fixed_rate_noutput_to_ninput(noutput_items); - } + for (unsigned i = 0; i < ninputs; i++) + ninput_items_required[i] = fixed_rate_noutput_to_ninput(noutput_items); +} - int - sync_interpolator::fixed_rate_noutput_to_ninput(int noutput_items) - { +int sync_interpolator::fixed_rate_noutput_to_ninput(int noutput_items) +{ return noutput_items / interpolation() + history() - 1; - } +} - int - sync_interpolator::fixed_rate_ninput_to_noutput(int ninput_items) - { +int sync_interpolator::fixed_rate_ninput_to_noutput(int ninput_items) +{ return std::max(0, ninput_items - (int)history() + 1) * interpolation(); - } +} - int - sync_interpolator::general_work(int noutput_items, - gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) - { +int sync_interpolator::general_work(int noutput_items, + gr_vector_int& ninput_items, + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items) +{ int r = work(noutput_items, input_items, output_items); - if(r > 0) - consume_each(r / interpolation()); + if (r > 0) + consume_each(r / interpolation()); return r; - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/sys_paths.cc b/gnuradio-runtime/lib/sys_paths.cc index f63d7730e4..068a38a51d 100644 --- a/gnuradio-runtime/lib/sys_paths.cc +++ b/gnuradio-runtime/lib/sys_paths.cc @@ -27,54 +27,54 @@ namespace gr { - const char *tmp_path() - { - const char *path; +const char* tmp_path() +{ + const char* path; - //first case, try TMP environment variable + // first case, try TMP environment variable path = getenv("TMP"); - if(path) - return path; + if (path) + return path; - //second case, try P_tmpdir when its defined - #ifdef P_tmpdir - if(P_tmpdir) - return P_tmpdir; - #endif /*P_tmpdir*/ +// second case, try P_tmpdir when its defined +#ifdef P_tmpdir + if (P_tmpdir) + return P_tmpdir; +#endif /*P_tmpdir*/ - //fall-through case, nothing worked + // fall-through case, nothing worked return "/tmp"; - } +} - const char *appdata_path() - { - const char *path; +const char* appdata_path() +{ + const char* path; - //first case, try HOME environment variable (unix) + // first case, try HOME environment variable (unix) path = getenv("HOME"); - if(path) - return path; + if (path) + return path; - //second case, try APPDATA environment variable (windows) + // second case, try APPDATA environment variable (windows) path = getenv("APPDATA"); - if(path) - return path; + if (path) + return path; - //fall-through case, nothing worked + // fall-through case, nothing worked return tmp_path(); - } +} - std::string __userconf_path() - { +std::string __userconf_path() +{ boost::filesystem::path p(appdata_path()); p = p / ".gnuradio"; return p.string(); - } +} - const char *userconf_path() - { +const char* userconf_path() +{ static std::string p(__userconf_path()); return p.c_str(); - } +} -} /* namespace gr */ +} /* namespace gr */ diff --git a/gnuradio-runtime/lib/tagged_stream_block.cc b/gnuradio-runtime/lib/tagged_stream_block.cc index 252a235fbf..1617bb3698 100644 --- a/gnuradio-runtime/lib/tagged_stream_block.cc +++ b/gnuradio-runtime/lib/tagged_stream_block.cc @@ -29,108 +29,104 @@ namespace gr { - tagged_stream_block::tagged_stream_block(const std::string &name, - io_signature::sptr input_signature, - io_signature::sptr output_signature, - const std::string &length_tag_key) +tagged_stream_block::tagged_stream_block(const std::string& name, + io_signature::sptr input_signature, + io_signature::sptr output_signature, + const std::string& length_tag_key) : block(name, input_signature, output_signature), d_length_tag_key(pmt::string_to_symbol(length_tag_key)), d_n_input_items_reqd(input_signature->min_streams(), 0), d_length_tag_key_str(length_tag_key) - { - } - - // This is evil hackery: We trick the scheduler into creating the right number of input items - void - tagged_stream_block::forecast(int noutput_items, - gr_vector_int &ninput_items_required) - { +{ +} + +// This is evil hackery: We trick the scheduler into creating the right number of input +// items +void tagged_stream_block::forecast(int noutput_items, + gr_vector_int& ninput_items_required) +{ unsigned ninputs = ninput_items_required.size(); - for(unsigned i = 0; i < ninputs; i++) { - if (i < d_n_input_items_reqd.size() && d_n_input_items_reqd[i] != 0) { - ninput_items_required[i] = d_n_input_items_reqd[i]; - } - else { - // If there's no item, there's no tag--so there must at least be one! - ninput_items_required[i] = std::max(1, (int)std::floor((double) noutput_items / relative_rate() + 0.5)); - } + for (unsigned i = 0; i < ninputs; i++) { + if (i < d_n_input_items_reqd.size() && d_n_input_items_reqd[i] != 0) { + ninput_items_required[i] = d_n_input_items_reqd[i]; + } else { + // If there's no item, there's no tag--so there must at least be one! + ninput_items_required[i] = std::max( + 1, (int)std::floor((double)noutput_items / relative_rate() + 0.5)); + } } - } - - void - tagged_stream_block::parse_length_tags(const std::vector<std::vector<tag_t> > &tags, - gr_vector_int &n_input_items_reqd) - { - for(unsigned i = 0; i < tags.size(); i++) { - for(unsigned k = 0; k < tags[i].size(); k++) { - if(tags[i][k].key == d_length_tag_key) { - n_input_items_reqd[i] = pmt::to_long(tags[i][k].value); - remove_item_tag(i, tags[i][k]); +} + +void tagged_stream_block::parse_length_tags(const std::vector<std::vector<tag_t>>& tags, + gr_vector_int& n_input_items_reqd) +{ + for (unsigned i = 0; i < tags.size(); i++) { + for (unsigned k = 0; k < tags[i].size(); k++) { + if (tags[i][k].key == d_length_tag_key) { + n_input_items_reqd[i] = pmt::to_long(tags[i][k].value); + remove_item_tag(i, tags[i][k]); + } } - } } - } +} - int - tagged_stream_block::calculate_output_stream_length(const gr_vector_int &ninput_items) - { +int tagged_stream_block::calculate_output_stream_length(const gr_vector_int& ninput_items) +{ int noutput_items = *std::max_element(ninput_items.begin(), ninput_items.end()); return (int)std::floor(relative_rate() * noutput_items + 0.5); - } - - void - tagged_stream_block::update_length_tags(int n_produced, int n_ports) - { - for(int i = 0; i < n_ports; i++) { - add_item_tag(i, nitems_written(i), - d_length_tag_key, - pmt::from_long(n_produced)); +} + +void tagged_stream_block::update_length_tags(int n_produced, int n_ports) +{ + for (int i = 0; i < n_ports; i++) { + add_item_tag(i, nitems_written(i), d_length_tag_key, pmt::from_long(n_produced)); } return; - } +} - bool - tagged_stream_block::check_topology(int ninputs, int /* noutputs */) - { +bool tagged_stream_block::check_topology(int ninputs, int /* noutputs */) +{ d_n_input_items_reqd.resize(ninputs, 0); return true; - } +} - int - tagged_stream_block::general_work(int noutput_items, - gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) - { - if(d_length_tag_key_str.empty()) { - return work(noutput_items, ninput_items, input_items, output_items); +int tagged_stream_block::general_work(int noutput_items, + gr_vector_int& ninput_items, + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items) +{ + if (d_length_tag_key_str.empty()) { + return work(noutput_items, ninput_items, input_items, output_items); } // Read TSB tags, unless we... // ...don't have inputs or ... ... we already set it in a previous run. - if(!d_n_input_items_reqd.empty() && d_n_input_items_reqd[0] == 0) { - std::vector<std::vector<tag_t> > tags(input_items.size(), std::vector<tag_t>()); - for(unsigned i = 0; i < input_items.size(); i++) { - get_tags_in_range(tags[i], i, nitems_read(i), nitems_read(i)+1); - } - d_n_input_items_reqd.assign(input_items.size(), -1); - parse_length_tags(tags, d_n_input_items_reqd); + if (!d_n_input_items_reqd.empty() && d_n_input_items_reqd[0] == 0) { + std::vector<std::vector<tag_t>> tags(input_items.size(), std::vector<tag_t>()); + for (unsigned i = 0; i < input_items.size(); i++) { + get_tags_in_range(tags[i], i, nitems_read(i), nitems_read(i) + 1); + } + d_n_input_items_reqd.assign(input_items.size(), -1); + parse_length_tags(tags, d_n_input_items_reqd); } - for(unsigned i = 0; i < input_items.size(); i++) { - if(d_n_input_items_reqd[i] == -1) { - GR_LOG_FATAL(d_logger, boost::format("Missing a required length tag on port %1% at item #%2%") % i % nitems_read(i)); - throw std::runtime_error("Missing length tag."); - } - if(d_n_input_items_reqd[i] > ninput_items[i]) { - return 0; - } + for (unsigned i = 0; i < input_items.size(); i++) { + if (d_n_input_items_reqd[i] == -1) { + GR_LOG_FATAL( + d_logger, + boost::format("Missing a required length tag on port %1% at item #%2%") % + i % nitems_read(i)); + throw std::runtime_error("Missing length tag."); + } + if (d_n_input_items_reqd[i] > ninput_items[i]) { + return 0; + } } int min_output_size = calculate_output_stream_length(d_n_input_items_reqd); - if(noutput_items < min_output_size) { - set_min_noutput_items(min_output_size); - return 0; + if (noutput_items < min_output_size) { + set_min_noutput_items(min_output_size); + return 0; } set_min_noutput_items(1); @@ -138,19 +134,19 @@ namespace gr { int n_produced = work(noutput_items, d_n_input_items_reqd, input_items, output_items); ////////////////////// - if(n_produced == WORK_DONE) { - return n_produced; + if (n_produced == WORK_DONE) { + return n_produced; } - for(int i = 0; i < (int) d_n_input_items_reqd.size(); i++) { - consume(i, d_n_input_items_reqd[i]); + for (int i = 0; i < (int)d_n_input_items_reqd.size(); i++) { + consume(i, d_n_input_items_reqd[i]); } if (n_produced > 0) { - update_length_tags(n_produced, output_items.size()); + update_length_tags(n_produced, output_items.size()); } d_n_input_items_reqd.assign(input_items.size(), 0); return n_produced; - } +} -} /* namespace gr */ +} /* namespace gr */ diff --git a/gnuradio-runtime/lib/test.cc b/gnuradio-runtime/lib/test.cc index 37da40e641..04fe8a30d6 100644 --- a/gnuradio-runtime/lib/test.cc +++ b/gnuradio-runtime/lib/test.cc @@ -32,150 +32,169 @@ namespace gr { - test_sptr - make_test(const std::string &name, - int min_inputs, int max_inputs, unsigned int sizeof_input_item, - int min_outputs, int max_outputs, unsigned int sizeof_output_item, - unsigned int history, unsigned int output_multiple, double relative_rate, - bool fixed_rate, consume_type_t cons_type, produce_type_t prod_type) - { - return gnuradio::get_initial_sptr - (new test(name, min_inputs, max_inputs, sizeof_input_item, - min_outputs, max_outputs, sizeof_output_item, - history, output_multiple, relative_rate, - fixed_rate,cons_type, prod_type)); - } +test_sptr make_test(const std::string& name, + int min_inputs, + int max_inputs, + unsigned int sizeof_input_item, + int min_outputs, + int max_outputs, + unsigned int sizeof_output_item, + unsigned int history, + unsigned int output_multiple, + double relative_rate, + bool fixed_rate, + consume_type_t cons_type, + produce_type_t prod_type) +{ + return gnuradio::get_initial_sptr(new test(name, + min_inputs, + max_inputs, + sizeof_input_item, + min_outputs, + max_outputs, + sizeof_output_item, + history, + output_multiple, + relative_rate, + fixed_rate, + cons_type, + prod_type)); +} - test::test(const std::string &name, - int min_inputs, int max_inputs, - unsigned int sizeof_input_item, - int min_outputs, int max_outputs, - unsigned int sizeof_output_item, - unsigned int history, - unsigned int output_multiple, - double relative_rate, - bool fixed_rate, - consume_type_t cons_type, produce_type_t prod_type) - : block (name, - io_signature::make(min_inputs, max_inputs, sizeof_input_item), - io_signature::make(min_outputs, max_outputs, sizeof_output_item)), - d_sizeof_input_item(sizeof_input_item), - d_sizeof_output_item(sizeof_output_item), - d_check_topology(true), - d_consume_type(cons_type), - d_min_consume(0), - d_max_consume(0), - d_produce_type(prod_type), - d_min_produce(0), - d_max_produce(0) - { +test::test(const std::string& name, + int min_inputs, + int max_inputs, + unsigned int sizeof_input_item, + int min_outputs, + int max_outputs, + unsigned int sizeof_output_item, + unsigned int history, + unsigned int output_multiple, + double relative_rate, + bool fixed_rate, + consume_type_t cons_type, + produce_type_t prod_type) + : block(name, + io_signature::make(min_inputs, max_inputs, sizeof_input_item), + io_signature::make(min_outputs, max_outputs, sizeof_output_item)), + d_sizeof_input_item(sizeof_input_item), + d_sizeof_output_item(sizeof_output_item), + d_check_topology(true), + d_consume_type(cons_type), + d_min_consume(0), + d_max_consume(0), + d_produce_type(prod_type), + d_min_produce(0), + d_max_produce(0) +{ set_history(history); set_output_multiple(output_multiple); set_relative_rate(relative_rate); set_fixed_rate(fixed_rate); - } +} - int - test::general_work(int noutput_items, - gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) - { - //touch all inputs and outputs to detect segfaults - unsigned ninputs = input_items.size (); - unsigned noutputs= output_items.size(); - for(unsigned i = 0; i < ninputs; i++) { - char * in=(char *)input_items[i]; - if(ninput_items[i]< (int)(noutput_items+history())) { - std::cerr << "ERROR: ninput_items[" << i << "] < noutput_items+history()" << std::endl; - std::cerr << "ninput_items[" << i << "] = " << ninput_items[i] << std::endl; - std::cerr << "noutput_items+history() = " << noutput_items+history() << std::endl; - std::cerr << "noutput_items = " << noutput_items << std::endl; - std::cerr << "history() = " << history() << std::endl; - throw std::runtime_error ("test"); - } - else { - for (int j = 0; j < ninput_items[i]; j++) { - //Touch every available input_item - //We use a class variable to avoid the compiler to optimize this away - for(unsigned int k = 0; k < d_sizeof_input_item; k++) - d_temp= in[j*d_sizeof_input_item+k]; +int test::general_work(int noutput_items, + gr_vector_int& ninput_items, + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items) +{ + // touch all inputs and outputs to detect segfaults + unsigned ninputs = input_items.size(); + unsigned noutputs = output_items.size(); + for (unsigned i = 0; i < ninputs; i++) { + char* in = (char*)input_items[i]; + if (ninput_items[i] < (int)(noutput_items + history())) { + std::cerr << "ERROR: ninput_items[" << i << "] < noutput_items+history()" + << std::endl; + std::cerr << "ninput_items[" << i << "] = " << ninput_items[i] << std::endl; + std::cerr << "noutput_items+history() = " << noutput_items + history() + << std::endl; + std::cerr << "noutput_items = " << noutput_items << std::endl; + std::cerr << "history() = " << history() << std::endl; + throw std::runtime_error("test"); + } else { + for (int j = 0; j < ninput_items[i]; j++) { + // Touch every available input_item + // We use a class variable to avoid the compiler to optimize this away + for (unsigned int k = 0; k < d_sizeof_input_item; k++) + d_temp = in[j * d_sizeof_input_item + k]; + } + switch (d_consume_type) { + case CONSUME_NOUTPUT_ITEMS: + consume(i, noutput_items); + break; + case CONSUME_NOUTPUT_ITEMS_LIMIT_MAX: + consume(i, std::min(noutput_items, d_max_consume)); + break; + case CONSUME_NOUTPUT_ITEMS_LIMIT_MIN: + consume( + i, std::min(std::max(noutput_items, d_min_consume), ninput_items[i])); + break; + case CONSUME_ALL_AVAILABLE: + consume(i, ninput_items[i]); + break; + case CONSUME_ALL_AVAILABLE_LIMIT_MAX: + consume(i, std::min(ninput_items[i], d_max_consume)); + break; + /* //This could result in segfault, uncomment if you want to test + this case CONSUME_ALL_AVAILABLE_LIMIT_MIN: + consume(i,std::max(ninput_items[i],d_max_consume)); + break;*/ + case CONSUME_ZERO: + consume(i, 0); + break; + case CONSUME_ONE: + consume(i, 1); + break; + case CONSUME_MINUS_ONE: + consume(i, -1); + break; + default: + consume(i, noutput_items); + } } - switch(d_consume_type){ - case CONSUME_NOUTPUT_ITEMS: - consume(i,noutput_items); - break; - case CONSUME_NOUTPUT_ITEMS_LIMIT_MAX: - consume(i,std::min(noutput_items,d_max_consume)); - break; - case CONSUME_NOUTPUT_ITEMS_LIMIT_MIN: - consume(i,std::min(std::max(noutput_items,d_min_consume),ninput_items[i])); - break; - case CONSUME_ALL_AVAILABLE: - consume(i,ninput_items[i]); - break; - case CONSUME_ALL_AVAILABLE_LIMIT_MAX: - consume(i,std::min(ninput_items[i],d_max_consume)); - break; -/* //This could result in segfault, uncomment if you want to test this - case CONSUME_ALL_AVAILABLE_LIMIT_MIN: - consume(i,std::max(ninput_items[i],d_max_consume)); - break;*/ - case CONSUME_ZERO: - consume(i,0); - break; - case CONSUME_ONE: - consume(i,1); - break; - case CONSUME_MINUS_ONE: - consume(i,-1); - break; - default: - consume(i,noutput_items); - } - } } - for(unsigned i = 0; i < noutputs; i++) { - char * out=(char *)output_items[i]; - { - for(int j=0;j<noutput_items;j++) { - //Touch every available output_item - for(unsigned int k=0;k<d_sizeof_output_item;k++) - out[j*d_sizeof_input_item+k]=0; + for (unsigned i = 0; i < noutputs; i++) { + char* out = (char*)output_items[i]; + { + for (int j = 0; j < noutput_items; j++) { + // Touch every available output_item + for (unsigned int k = 0; k < d_sizeof_output_item; k++) + out[j * d_sizeof_input_item + k] = 0; + } } - } } - //Now copy input to output until max ninputs or max noutputs is reached - int common_nports=std::min(ninputs,noutputs); - if(d_sizeof_output_item==d_sizeof_input_item) - for(int i = 0; i < common_nports; i++) { - memcpy(output_items[i],input_items[i],noutput_items*d_sizeof_input_item); - } - int noutput_items_produced=0; - switch(d_produce_type) { + // Now copy input to output until max ninputs or max noutputs is reached + int common_nports = std::min(ninputs, noutputs); + if (d_sizeof_output_item == d_sizeof_input_item) + for (int i = 0; i < common_nports; i++) { + memcpy(output_items[i], input_items[i], noutput_items * d_sizeof_input_item); + } + int noutput_items_produced = 0; + switch (d_produce_type) { case PRODUCE_NOUTPUT_ITEMS: - noutput_items_produced=noutput_items; - break; + noutput_items_produced = noutput_items; + break; case PRODUCE_NOUTPUT_ITEMS_LIMIT_MAX: - noutput_items_produced=std::min(noutput_items,d_max_produce); - break; -/* //This could result in segfault, uncomment if you want to test this - case PRODUCE_NOUTPUT_ITEMS_LIMIT_MIN: - noutput_items_produced=std::max(noutput_items,d_min_produce); - break;*/ + noutput_items_produced = std::min(noutput_items, d_max_produce); + break; + /* //This could result in segfault, uncomment if you want to test this + case PRODUCE_NOUTPUT_ITEMS_LIMIT_MIN: + noutput_items_produced=std::max(noutput_items,d_min_produce); + break;*/ case PRODUCE_ZERO: - noutput_items_produced=0; - break; + noutput_items_produced = 0; + break; case PRODUCE_ONE: - noutput_items_produced=1; - break; + noutput_items_produced = 1; + break; case PRODUCE_MINUS_ONE: - noutput_items_produced=-1; - break; + noutput_items_produced = -1; + break; default: - noutput_items_produced=noutput_items; + noutput_items_produced = noutput_items; } return noutput_items_produced; - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/test.h b/gnuradio-runtime/lib/test.h index a8019bc3b7..51e17ac49a 100644 --- a/gnuradio-runtime/lib/test.h +++ b/gnuradio-runtime/lib/test.h @@ -30,41 +30,47 @@ namespace gr { - class test; - typedef boost::shared_ptr<test> test_sptr; - - // public constructor - GR_RUNTIME_API test_sptr - make_test(const std::string &name=std::string("test"), - int min_inputs=1, int max_inputs=1, unsigned int sizeof_input_item=1, - int min_outputs=1, int max_outputs=1, unsigned int sizeof_output_item=1, - unsigned int history=1,unsigned int output_multiple=1,double relative_rate=1.0, - bool fixed_rate=true,consume_type_t cons_type=CONSUME_NOUTPUT_ITEMS, - produce_type_t prod_type=PRODUCE_NOUTPUT_ITEMS); - - /*! - * \brief Test class for testing runtime system (setting up buffers and such.) - * \ingroup misc - * - * This block does not do any useful actual data processing. It - * just exposes setting all standard block parameters using the - * constructor or public methods. - * - * This block can be useful when testing the runtime system. - * You can force this block to have a large history, decimation - * factor and/or large output_multiple. - * The runtime system should detect this and create large enough buffers - * all through the signal chain. - */ - class GR_RUNTIME_API test : public block - { - public: +class test; +typedef boost::shared_ptr<test> test_sptr; + +// public constructor +GR_RUNTIME_API test_sptr make_test(const std::string& name = std::string("test"), + int min_inputs = 1, + int max_inputs = 1, + unsigned int sizeof_input_item = 1, + int min_outputs = 1, + int max_outputs = 1, + unsigned int sizeof_output_item = 1, + unsigned int history = 1, + unsigned int output_multiple = 1, + double relative_rate = 1.0, + bool fixed_rate = true, + consume_type_t cons_type = CONSUME_NOUTPUT_ITEMS, + produce_type_t prod_type = PRODUCE_NOUTPUT_ITEMS); + +/*! + * \brief Test class for testing runtime system (setting up buffers and such.) + * \ingroup misc + * + * This block does not do any useful actual data processing. It + * just exposes setting all standard block parameters using the + * constructor or public methods. + * + * This block can be useful when testing the runtime system. + * You can force this block to have a large history, decimation + * factor and/or large output_multiple. + * The runtime system should detect this and create large enough buffers + * all through the signal chain. + */ +class GR_RUNTIME_API test : public block +{ +public: ~test() {} int general_work(int noutput_items, - gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items); + gr_vector_int& ninput_items, + gr_vector_const_void_star& input_items, + gr_vector_void_star& output_items); // ---------------------------------------------------------------- // override these to define your behavior @@ -80,12 +86,12 @@ namespace gr { * number of data items required on each input stream. The * estimate doesn't have to be exact, but should be close. */ - void forecast(int noutput_items, - gr_vector_int &ninput_items_required) + void forecast(int noutput_items, gr_vector_int& ninput_items_required) { - unsigned ninputs = ninput_items_required.size(); - for(unsigned i = 0; i < ninputs; i++) - ninput_items_required[i] = (int)((double)noutput_items / relative_rate()) + (int)history(); + unsigned ninputs = ninput_items_required.size(); + for (unsigned i = 0; i < ninputs; i++) + ninput_items_required[i] = + (int)((double)noutput_items / relative_rate()) + (int)history(); } /*! @@ -94,9 +100,7 @@ namespace gr { * \param check_topology value to return when check_topology is * called (true or false) default check_topology returns true */ - void set_check_topology(bool check_topology) { - d_check_topology=check_topology; - } + void set_check_topology(bool check_topology) { d_check_topology = check_topology; } /*! * \brief Confirm that ninputs and noutputs is an acceptable combination. @@ -111,9 +115,7 @@ namespace gr { * This check is in addition to the constraints specified by the * input and output gr::io_signatures. */ - bool check_topology(int ninputs, int noutputs) { - return d_check_topology; - } + bool check_topology(int ninputs, int noutputs) { return d_check_topology; } // ---------------------------------------------------------------- /* @@ -129,8 +131,9 @@ namespace gr { * returns true. Generally speaking, you don't need to override * this. */ - int fixed_rate_ninput_to_noutput(int ninput) { - return (int)((double)ninput/relative_rate()); + int fixed_rate_ninput_to_noutput(int ninput) + { + return (int)((double)ninput / relative_rate()); } /*! @@ -138,26 +141,23 @@ namespace gr { * required to produce noutput. N.B. this is only defined if * fixed_rate returns true. */ - int fixed_rate_noutput_to_ninput(int noutput) { - return (int)((double)noutput*relative_rate()); + int fixed_rate_noutput_to_ninput(int noutput) + { + return (int)((double)noutput * relative_rate()); } /*! * \brief Set if fixed rate should return true. * N.B. This is normally a private method but we make it available here as public. */ - void set_fixed_rate_public(bool fixed_rate) { - set_fixed_rate(fixed_rate); - } + void set_fixed_rate_public(bool fixed_rate) { set_fixed_rate(fixed_rate); } /*! * \brief Set the consume pattern. * * \param cons_type which consume pattern to use */ - void set_consume_type(consume_type_t cons_type) { - d_consume_type=cons_type; - } + void set_consume_type(consume_type_t cons_type) { d_consume_type = cons_type; } /*! * \brief Set the consume limit. @@ -165,8 +165,10 @@ namespace gr { * \param limit min or maximum items to consume (depending on * consume_type) */ - void set_consume_limit(unsigned int limit) { - d_min_consume=limit; d_max_consume=limit; + void set_consume_limit(unsigned int limit) + { + d_min_consume = limit; + d_max_consume = limit; } /*! @@ -174,9 +176,7 @@ namespace gr { * * \param prod_type which produce pattern to use */ - void set_produce_type(produce_type_t prod_type) { - d_produce_type=prod_type; - } + void set_produce_type(produce_type_t prod_type) { d_produce_type = prod_type; } /*! * \brief Set the produce limit. @@ -184,13 +184,15 @@ namespace gr { * \param limit min or maximum items to produce (depending on * produce_type) */ - void set_produce_limit(unsigned int limit) { - d_min_produce=limit; d_max_produce=limit; + void set_produce_limit(unsigned int limit) + { + d_min_produce = limit; + d_max_produce = limit; } // ---------------------------------------------------------------------------- - protected: +protected: unsigned int d_sizeof_input_item; unsigned int d_sizeof_output_item; bool d_check_topology; @@ -201,16 +203,26 @@ namespace gr { produce_type_t d_produce_type; int d_min_produce; int d_max_produce; - test(const std::string &name,int min_inputs, int max_inputs, + test(const std::string& name, + int min_inputs, + int max_inputs, unsigned int sizeof_input_item, - int min_outputs, int max_outputs, unsigned int sizeof_output_item, - unsigned int history, unsigned int output_multiple, double relative_rate, - bool fixed_rate, consume_type_t cons_type, produce_type_t prod_type); - - friend GR_RUNTIME_API test_sptr make_test(const std::string &name, - int min_inputs, int max_inputs, + int min_outputs, + int max_outputs, + unsigned int sizeof_output_item, + unsigned int history, + unsigned int output_multiple, + double relative_rate, + bool fixed_rate, + consume_type_t cons_type, + produce_type_t prod_type); + + friend GR_RUNTIME_API test_sptr make_test(const std::string& name, + int min_inputs, + int max_inputs, unsigned int sizeof_input_item, - int min_outputs, int max_outputs, + int min_outputs, + int max_outputs, unsigned int sizeof_output_item, unsigned int history, unsigned int output_multiple, @@ -218,7 +230,7 @@ namespace gr { bool fixed_rate, consume_type_t cons_type, produce_type_t prod_type); - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/lib/test_types.h b/gnuradio-runtime/lib/test_types.h index 868a9e62a3..5b59fde8f3 100644 --- a/gnuradio-runtime/lib/test_types.h +++ b/gnuradio-runtime/lib/test_types.h @@ -25,26 +25,26 @@ namespace gr { - typedef enum { - CONSUME_NOUTPUT_ITEMS=0, - CONSUME_NOUTPUT_ITEMS_LIMIT_MAX=1, - CONSUME_NOUTPUT_ITEMS_LIMIT_MIN=2, - CONSUME_ALL_AVAILABLE=3, - CONSUME_ALL_AVAILABLE_LIMIT_MAX=4, +typedef enum { + CONSUME_NOUTPUT_ITEMS = 0, + CONSUME_NOUTPUT_ITEMS_LIMIT_MAX = 1, + CONSUME_NOUTPUT_ITEMS_LIMIT_MIN = 2, + CONSUME_ALL_AVAILABLE = 3, + CONSUME_ALL_AVAILABLE_LIMIT_MAX = 4, /*CONSUME_ALL_AVAILABLE_LIMIT_MIN=5,*/ - CONSUME_ZERO=6, - CONSUME_ONE=7, - CONSUME_MINUS_ONE=8 - } consume_type_t; + CONSUME_ZERO = 6, + CONSUME_ONE = 7, + CONSUME_MINUS_ONE = 8 +} consume_type_t; - typedef enum { - PRODUCE_NOUTPUT_ITEMS=0, - PRODUCE_NOUTPUT_ITEMS_LIMIT_MAX=1, +typedef enum { + PRODUCE_NOUTPUT_ITEMS = 0, + PRODUCE_NOUTPUT_ITEMS_LIMIT_MAX = 1, /*PRODUCE_NOUTPUT_ITEMS_LIMIT_MIN=2,*/ - PRODUCE_ZERO=6, - PRODUCE_ONE=7, - PRODUCE_MINUS_ONE=8 - } produce_type_t; + PRODUCE_ZERO = 6, + PRODUCE_ONE = 7, + PRODUCE_MINUS_ONE = 8 +} produce_type_t; } /* namespace gr */ diff --git a/gnuradio-runtime/lib/thread/thread.cc b/gnuradio-runtime/lib/thread/thread.cc index 2a5f3f7c02..85240cbee1 100644 --- a/gnuradio-runtime/lib/thread/thread.cc +++ b/gnuradio-runtime/lib/thread/thread.cc @@ -31,219 +31,189 @@ #include <windows.h> namespace gr { - namespace thread { - - gr_thread_t - get_current_thread_id() - { - return GetCurrentThread(); - } - - void - thread_bind_to_processor(int n) - { - std::vector<int> mask(1, n); - thread_bind_to_processor(get_current_thread_id(), mask); - } - - void - thread_bind_to_processor(const std::vector<int> &mask) - { - thread_bind_to_processor(get_current_thread_id(), mask); - } - - void - thread_bind_to_processor(gr_thread_t thread, int n) - { - std::vector<int> mask(1, n); - thread_bind_to_processor(thread, mask); - } - - void - thread_bind_to_processor(gr_thread_t thread, const std::vector<int> &mask) - { - //DWORD_PTR mask = (1 << n); - DWORD_PTR dword_mask = 0; - - std::vector<int> _mask = mask; - std::vector<int>::iterator itr; - for(itr = _mask.begin(); itr != _mask.end(); itr++) +namespace thread { + +gr_thread_t get_current_thread_id() { return GetCurrentThread(); } + +void thread_bind_to_processor(int n) +{ + std::vector<int> mask(1, n); + thread_bind_to_processor(get_current_thread_id(), mask); +} + +void thread_bind_to_processor(const std::vector<int>& mask) +{ + thread_bind_to_processor(get_current_thread_id(), mask); +} + +void thread_bind_to_processor(gr_thread_t thread, int n) +{ + std::vector<int> mask(1, n); + thread_bind_to_processor(thread, mask); +} + +void thread_bind_to_processor(gr_thread_t thread, const std::vector<int>& mask) +{ + // DWORD_PTR mask = (1 << n); + DWORD_PTR dword_mask = 0; + + std::vector<int> _mask = mask; + std::vector<int>::iterator itr; + for (itr = _mask.begin(); itr != _mask.end(); itr++) dword_mask |= (1 << (*itr)); - DWORD_PTR ret = SetThreadAffinityMask(thread, dword_mask); - if(ret == 0) { + DWORD_PTR ret = SetThreadAffinityMask(thread, dword_mask); + if (ret == 0) { std::stringstream s; - s << "thread_bind_to_processor failed with error: " - << GetLastError() << std::endl; + s << "thread_bind_to_processor failed with error: " << GetLastError() + << std::endl; throw std::runtime_error(s.str()); - } } +} - void - thread_unbind() - { - thread_unbind(get_current_thread_id()); - } +void thread_unbind() { thread_unbind(get_current_thread_id()); } - void - thread_unbind(gr_thread_t thread) - { - DWORD_PTR dword_mask = sizeof(DWORD_PTR) - 1; - DWORD_PTR ret = SetThreadAffinityMask(thread, dword_mask); - if(ret == 0) { +void thread_unbind(gr_thread_t thread) +{ + 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; + s << "thread_unbind failed with error: " << GetLastError() << std::endl; throw std::runtime_error(s.str()); - } } +} - int - thread_priority(gr_thread_t thread) - { - // Not implemented on Windows - return -1; - } +int thread_priority(gr_thread_t thread) +{ + // Not implemented on Windows + return -1; +} - int - set_thread_priority(gr_thread_t thread, int priority) - { - // Not implemented on Windows - return -1; - } +int set_thread_priority(gr_thread_t thread, int priority) +{ + // Not implemented on Windows + return -1; +} #ifndef __MINGW32__ -#pragma pack(push,8) - typedef struct tagTHREADNAME_INFO - { - DWORD dwType; // Must be 0x1000 - LPCSTR szName; // Pointer to name (in user addr space) - DWORD dwThreadID; // Thread ID (-1 = caller thread) - DWORD dwFlags; // Reserved for future use, must be zero - } THREADNAME_INFO; +#pragma pack(push, 8) +typedef struct tagTHREADNAME_INFO { + DWORD dwType; // Must be 0x1000 + LPCSTR szName; // Pointer to name (in user addr space) + DWORD dwThreadID; // Thread ID (-1 = caller thread) + DWORD dwFlags; // Reserved for future use, must be zero +} THREADNAME_INFO; #pragma pack(pop) - static void - _set_thread_name(gr_thread_t thread, const char* name, DWORD dwThreadId) - { - const DWORD SET_THREAD_NAME_EXCEPTION = 0x406D1388; - - THREADNAME_INFO info; - info.dwType = 0x1000; - info.szName = name; - info.dwThreadID = dwThreadId; - info.dwFlags = 0; - - __try - { - RaiseException(SET_THREAD_NAME_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info); - } - __except(EXCEPTION_EXECUTE_HANDLER) - { - } - } - - void - set_thread_name(gr_thread_t thread, std::string name) - { - DWORD dwThreadId = GetThreadId(thread); - if (dwThreadId == 0) +static void _set_thread_name(gr_thread_t thread, const char* name, DWORD dwThreadId) +{ + const DWORD SET_THREAD_NAME_EXCEPTION = 0x406D1388; + + THREADNAME_INFO info; + info.dwType = 0x1000; + info.szName = name; + info.dwThreadID = dwThreadId; + info.dwFlags = 0; + + __try { + RaiseException(SET_THREAD_NAME_EXCEPTION, + 0, + sizeof(info) / sizeof(ULONG_PTR), + (ULONG_PTR*)&info); + } __except (EXCEPTION_EXECUTE_HANDLER) { + } +} + +void set_thread_name(gr_thread_t thread, std::string name) +{ + DWORD dwThreadId = GetThreadId(thread); + if (dwThreadId == 0) return; - if (name.empty()) + if (name.empty()) name = boost::str(boost::format("thread %lu") % dwThreadId); - _set_thread_name(thread, name.c_str(), dwThreadId); - } + _set_thread_name(thread, name.c_str(), dwThreadId); +} #else - void - set_thread_name(gr_thread_t thread, std::string name) - { - /* Not implemented on mingw-w64 */ - } +void set_thread_name(gr_thread_t thread, std::string name) +{ + /* Not implemented on mingw-w64 */ +} #endif /* !__MINGW32__ */ - } /* namespace thread */ +} /* namespace thread */ } /* namespace gr */ -#elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) || \ - defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__GNU__) || \ - defined(__NetBSD__) +#elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) || \ + defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__GNU__) || \ + defined(__NetBSD__) namespace gr { - namespace thread { - - gr_thread_t - get_current_thread_id() - { - // Not implemented on OSX - return NULL; - } - - void - thread_bind_to_processor(int n) - { - // Not implemented on OSX - } - - void - thread_bind_to_processor(gr_thread_t thread, int n) - { - // Not implemented on OSX - } - - void - thread_bind_to_processor(const std::vector<int> &mask) - { - // Not implemented on OSX - } - - void - thread_bind_to_processor(gr_thread_t thread, const std::vector<int> &mask) - { - // Not implemented on OSX - } - - void - thread_unbind() - { - // Not implemented on OSX - } - - void - thread_unbind(gr_thread_t thread) - { - // Not implemented on OSX - } - - int - thread_priority(gr_thread_t thread) - { - sched_param param; - int priority; - int policy; - int ret; - ret = pthread_getschedparam (thread, &policy, ¶m); - priority = param.sched_priority; - return (ret==0)?priority:ret; - } - - int - set_thread_priority(gr_thread_t thread, int priority) - { - int policy; - struct sched_param param; - pthread_getschedparam (thread, &policy, ¶m); - param.sched_priority = priority; - return pthread_setschedparam(thread, policy, ¶m); - } - - void - set_thread_name(gr_thread_t thread, std::string name) - { - // Not implemented on OSX - } - - } /* namespace thread */ +namespace thread { + +gr_thread_t get_current_thread_id() +{ + // Not implemented on OSX + return NULL; +} + +void thread_bind_to_processor(int n) +{ + // Not implemented on OSX +} + +void thread_bind_to_processor(gr_thread_t thread, int n) +{ + // Not implemented on OSX +} + +void thread_bind_to_processor(const std::vector<int>& mask) +{ + // Not implemented on OSX +} + +void thread_bind_to_processor(gr_thread_t thread, const std::vector<int>& mask) +{ + // Not implemented on OSX +} + +void thread_unbind() +{ + // Not implemented on OSX +} + +void thread_unbind(gr_thread_t thread) +{ + // Not implemented on OSX +} + +int thread_priority(gr_thread_t thread) +{ + sched_param param; + int priority; + int policy; + int ret; + ret = pthread_getschedparam(thread, &policy, ¶m); + priority = param.sched_priority; + return (ret == 0) ? priority : ret; +} + +int set_thread_priority(gr_thread_t thread, int priority) +{ + int policy; + struct sched_param param; + pthread_getschedparam(thread, &policy, ¶m); + param.sched_priority = priority; + return pthread_setschedparam(thread, policy, ¶m); +} + +void set_thread_name(gr_thread_t thread, std::string name) +{ + // Not implemented on OSX +} + +} /* namespace thread */ } /* namespace gr */ #else @@ -254,131 +224,116 @@ namespace gr { #include <sys/prctl.h> namespace gr { - namespace thread { - - gr_thread_t - get_current_thread_id() - { - return pthread_self(); - } - - void - thread_bind_to_processor(int n) - { - std::vector<int> mask(1, n); - thread_bind_to_processor(get_current_thread_id(), mask); - } - - void - thread_bind_to_processor(const std::vector<int> &mask) - { - thread_bind_to_processor(get_current_thread_id(), mask); - } - - void - thread_bind_to_processor(gr_thread_t thread, int n) - { - std::vector<int> mask(1, n); - thread_bind_to_processor(thread, mask); - } - - void - thread_bind_to_processor(gr_thread_t thread, const std::vector<int> &mask) - { - cpu_set_t set; - size_t len = sizeof(cpu_set_t); - std::vector<int> _mask = mask; - std::vector<int>::iterator itr; - - CPU_ZERO(&set); - for(itr = _mask.begin(); itr != _mask.end(); itr++) +namespace thread { + +gr_thread_t get_current_thread_id() { return pthread_self(); } + +void thread_bind_to_processor(int n) +{ + std::vector<int> mask(1, n); + thread_bind_to_processor(get_current_thread_id(), mask); +} + +void thread_bind_to_processor(const std::vector<int>& mask) +{ + thread_bind_to_processor(get_current_thread_id(), mask); +} + +void thread_bind_to_processor(gr_thread_t thread, int n) +{ + std::vector<int> mask(1, n); + thread_bind_to_processor(thread, mask); +} + +void thread_bind_to_processor(gr_thread_t thread, const std::vector<int>& mask) +{ + cpu_set_t set; + size_t len = sizeof(cpu_set_t); + std::vector<int> _mask = mask; + std::vector<int>::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) { + 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() { thread_unbind(get_current_thread_id()); } - void - thread_unbind(gr_thread_t thread) - { - cpu_set_t set; - size_t len = sizeof(cpu_set_t); +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_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) { + 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()); - } } - - int - thread_priority(gr_thread_t thread) - { - sched_param param; - int priority; - int policy; - int ret; - ret = pthread_getschedparam (thread, &policy, ¶m); - priority = param.sched_priority; - return (ret==0)?priority:ret; - } - - int - set_thread_priority(gr_thread_t thread, int priority) - { - int policy; - struct sched_param param; - pthread_getschedparam (thread, &policy, ¶m); - param.sched_priority = priority; - return pthread_setschedparam(thread, policy, ¶m); - } - - void - set_thread_name(gr_thread_t thread, std::string name) - { - if (thread != pthread_self()) // Naming another thread is not supported +} + +int thread_priority(gr_thread_t thread) +{ + sched_param param; + int priority; + int policy; + int ret; + ret = pthread_getschedparam(thread, &policy, ¶m); + priority = param.sched_priority; + return (ret == 0) ? priority : ret; +} + +int set_thread_priority(gr_thread_t thread, int priority) +{ + int policy; + struct sched_param param; + pthread_getschedparam(thread, &policy, ¶m); + param.sched_priority = priority; + return pthread_setschedparam(thread, policy, ¶m); +} + +void set_thread_name(gr_thread_t thread, std::string name) +{ + if (thread != pthread_self()) // Naming another thread is not supported return; - if (name.empty()) + if (name.empty()) name = boost::str(boost::format("thread %llu") % ((unsigned long long)thread)); - const int max_len = 16; // Maximum accepted by PR_SET_NAME + const int max_len = 16; // Maximum accepted by PR_SET_NAME - if ((int)name.size() > max_len) // Shorten the name if necessary by taking as many characters from the front - { // so that the unique_id can still fit on the end + if ((int)name.size() > max_len) // Shorten the name if necessary by taking as many + // characters from the front + { // so that the unique_id can still fit on the end int i = name.size() - 1; - for (; i >= 0; --i) - { - std::string s = name.substr(i, 1); - int n = atoi(s.c_str()); - if ((n == 0) && (s != "0")) - break; + for (; i >= 0; --i) { + std::string s = name.substr(i, 1); + int n = atoi(s.c_str()); + if ((n == 0) && (s != "0")) + break; } - name = name.substr(0, std::max(0, max_len - ((int)name.size() - (i + 1)))) + name.substr(i + 1); - } - - prctl(PR_SET_NAME, name.c_str(), 0, 0, 0); + name = name.substr(0, std::max(0, max_len - ((int)name.size() - (i + 1)))) + + name.substr(i + 1); } - } /* namespace thread */ + prctl(PR_SET_NAME, name.c_str(), 0, 0, 0); +} + +} /* namespace thread */ } /* namespace gr */ #endif diff --git a/gnuradio-runtime/lib/thread/thread_body_wrapper.cc b/gnuradio-runtime/lib/thread/thread_body_wrapper.cc index fffa7e4c44..c820414853 100644 --- a/gnuradio-runtime/lib/thread/thread_body_wrapper.cc +++ b/gnuradio-runtime/lib/thread/thread_body_wrapper.cc @@ -32,60 +32,57 @@ #include <stdio.h> namespace gr { - namespace thread { +namespace thread { #if defined(HAVE_PTHREAD_SIGMASK) && defined(HAVE_SIGNAL_H) && !defined(__MINGW32__) - void mask_signals() - { - sigset_t new_set; - int r; +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); + 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); + sigaddset(&new_set, SIGPOLL); #endif #ifdef SIGPROF - sigaddset(&new_set, SIGPROF); + sigaddset(&new_set, SIGPROF); #endif #ifdef SIGSYS - sigaddset(&new_set, SIGSYS); + sigaddset(&new_set, SIGSYS); #endif #ifdef SIGTRAP - sigaddset(&new_set, SIGTRAP); + sigaddset(&new_set, SIGTRAP); #endif #ifdef SIGURG - sigaddset(&new_set, SIGURG); + sigaddset(&new_set, SIGURG); #endif #ifdef SIGVTALRM - sigaddset(&new_set, SIGVTALRM); + sigaddset(&new_set, SIGVTALRM); #endif #ifdef SIGXCPU - sigaddset(&new_set, SIGXCPU); + sigaddset(&new_set, SIGXCPU); #endif #ifdef SIGXFSZ - sigaddset(&new_set, SIGXFSZ); + sigaddset(&new_set, SIGXFSZ); #endif - r = pthread_sigmask(SIG_BLOCK, &new_set, 0); - if(r != 0) + r = pthread_sigmask(SIG_BLOCK, &new_set, 0); + if (r != 0) perror("pthread_sigmask"); - } +} #else - void mask_signals() - { - } +void mask_signals() {} #endif - } /* namespace thread */ +} /* namespace thread */ } /* namespace gr */ - diff --git a/gnuradio-runtime/lib/thread/thread_group.cc b/gnuradio-runtime/lib/thread/thread_group.cc index 637525e19e..1d9b8c846c 100644 --- a/gnuradio-runtime/lib/thread/thread_group.cc +++ b/gnuradio-runtime/lib/thread/thread_group.cc @@ -15,84 +15,86 @@ #include <gnuradio/thread/thread_group.h> namespace gr { - namespace thread { +namespace thread { - thread_group::thread_group() - { - } +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<boost::thread*>::iterator it = m_threads.begin(); - it != m_threads.end(); ++it) { +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<boost::thread*>::iterator it = m_threads.begin(); + it != m_threads.end(); + ++it) { delete (*it); - } } +} - boost::thread* thread_group::create_thread(const boost::function0<void>& threadfunc) - { - // No scoped_lock required here since the only "shared data" that's - // modified here occurs inside add_thread which does scoped_lock. - std::unique_ptr<boost::thread> thrd(new boost::thread(threadfunc)); - add_thread(thrd.get()); - return thrd.release(); - } +boost::thread* thread_group::create_thread(const boost::function0<void>& threadfunc) +{ + // No scoped_lock required here since the only "shared data" that's + // modified here occurs inside add_thread which does scoped_lock. + std::unique_ptr<boost::thread> thrd(new boost::thread(threadfunc)); + add_thread(thrd.get()); + return thrd.release(); +} - void thread_group::add_thread(boost::thread* thrd) - { - boost::lock_guard<boost::shared_mutex> guard(m_mutex); +void thread_group::add_thread(boost::thread* thrd) +{ + boost::lock_guard<boost::shared_mutex> 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<boost::thread*>::iterator it = std::find(m_threads.begin(), - m_threads.end(), thrd); - BOOST_ASSERT(it == m_threads.end()); - if(it == m_threads.end()) + // 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<boost::thread*>::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<boost::shared_mutex> guard(m_mutex); +void thread_group::remove_thread(boost::thread* thrd) +{ + boost::lock_guard<boost::shared_mutex> 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<boost::thread*>::iterator it = std::find(m_threads.begin(), - m_threads.end(), thrd); - BOOST_ASSERT(it != m_threads.end()); - if(it != m_threads.end()) + // 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<boost::thread*>::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<boost::shared_mutex> guard(m_mutex); - for(std::list<boost::thread*>::iterator it = m_threads.begin(); - it != m_threads.end(); ++it) { - (*it)->join(); - } +void thread_group::join_all() +{ + boost::shared_lock<boost::shared_mutex> guard(m_mutex); + for (std::list<boost::thread*>::iterator it = m_threads.begin(); + it != m_threads.end(); + ++it) { + (*it)->join(); } +} - void thread_group::interrupt_all() - { - boost::shared_lock<boost::shared_mutex> guard(m_mutex); - for(std::list<boost::thread*>::iterator it=m_threads.begin(),end=m_threads.end(); - it!=end; ++it) { - (*it)->interrupt(); - } +void thread_group::interrupt_all() +{ + boost::shared_lock<boost::shared_mutex> guard(m_mutex); + for (std::list<boost::thread*>::iterator it = m_threads.begin(), + end = m_threads.end(); + it != end; + ++it) { + (*it)->interrupt(); } +} - size_t thread_group::size() const - { - boost::shared_lock<boost::shared_mutex> guard(m_mutex); - return m_threads.size(); - } +size_t thread_group::size() const +{ + boost::shared_lock<boost::shared_mutex> guard(m_mutex); + return m_threads.size(); +} - } /* namespace thread */ +} /* namespace thread */ } /* namespace gr */ diff --git a/gnuradio-runtime/lib/top_block.cc b/gnuradio-runtime/lib/top_block.cc index 7d135083dd..fa3902c735 100644 --- a/gnuradio-runtime/lib/top_block.cc +++ b/gnuradio-runtime/lib/top_block.cc @@ -33,37 +33,33 @@ #include <iostream> namespace gr { - top_block_sptr - make_top_block(const std::string &name) - { - return gnuradio::get_initial_sptr - (new top_block(name)); - } - - top_block::top_block(const std::string &name) - : hier_block2(name, - io_signature::make(0,0,0), - io_signature::make(0,0,0)) - { +top_block_sptr make_top_block(const std::string& name) +{ + return gnuradio::get_initial_sptr(new top_block(name)); +} + +top_block::top_block(const std::string& name) + : hier_block2(name, io_signature::make(0, 0, 0), io_signature::make(0, 0, 0)) +{ d_impl = new top_block_impl(this); - } +} - top_block::~top_block() - { +top_block::~top_block() +{ stop(); wait(); delete d_impl; - } +} - void - top_block::start(int max_noutput_items) - { +void top_block::start(int max_noutput_items) +{ #ifdef GNURADIO_HRT_USE_CLOCK_GETTIME - std::string initial_clock = prefs::singleton()->get_string("PerfCounters", "clock", "thread"); - if(initial_clock.compare("thread") == 0){ + std::string initial_clock = + prefs::singleton()->get_string("PerfCounters", "clock", "thread"); + if (initial_clock.compare("thread") == 0) { gr::high_res_timer_source = CLOCK_THREAD_CPUTIME_ID; - } else if(initial_clock.compare("monotonic") == 0){ + } else if (initial_clock.compare("monotonic") == 0) { gr::high_res_timer_source = CLOCK_MONOTONIC; } else { throw std::runtime_error("bad argument for PerfCounters.clock!"); @@ -72,150 +68,125 @@ namespace gr { d_impl->start(max_noutput_items); - if(prefs::singleton()->get_bool("ControlPort", "on", false)) { - setup_rpc(); + if (prefs::singleton()->get_bool("ControlPort", "on", false)) { + setup_rpc(); } - } - - void - top_block::stop() - { - d_impl->stop(); - } - - void - top_block::wait() - { - d_impl->wait(); - } - - void - top_block::run(int max_noutput_items) - { +} + +void top_block::stop() { d_impl->stop(); } + +void top_block::wait() { d_impl->wait(); } + +void top_block::run(int max_noutput_items) +{ start(max_noutput_items); wait(); - } - - void - top_block::lock() - { - d_impl->lock(); - } - - void - top_block::unlock() - { - d_impl->unlock(); - } - - std::string - top_block::edge_list() - { - return d_impl->edge_list(); - } - - std::string - top_block::msg_edge_list() - { - return d_impl->msg_edge_list(); - } - - void - top_block::dump() - { - d_impl->dump(); - } - - int - top_block::max_noutput_items() - { - return d_impl->max_noutput_items(); - } - - void - top_block::set_max_noutput_items(int nmax) - { - d_impl->set_max_noutput_items(nmax); - } - - top_block_sptr - top_block::to_top_block() - { +} + +void top_block::lock() { d_impl->lock(); } + +void top_block::unlock() { d_impl->unlock(); } + +std::string top_block::edge_list() { return d_impl->edge_list(); } + +std::string top_block::msg_edge_list() { return d_impl->msg_edge_list(); } + +void top_block::dump() { d_impl->dump(); } + +int top_block::max_noutput_items() { return d_impl->max_noutput_items(); } + +void top_block::set_max_noutput_items(int nmax) { d_impl->set_max_noutput_items(nmax); } + +top_block_sptr top_block::to_top_block() +{ return cast_to_top_block_sptr(shared_from_this()); - } +} - void - top_block::setup_rpc() - { +void top_block::setup_rpc() +{ #ifdef GR_CTRLPORT - if(is_rpc_set()) - return; + if (is_rpc_set()) + return; // Triggers - d_rpc_vars.push_back( - rpcbasic_sptr(new rpcbasic_register_trigger<top_block>( - alias(), "stop", &top_block::stop, - "Stop the flowgraph", RPC_PRIVLVL_MIN))); + d_rpc_vars.push_back(rpcbasic_sptr(new rpcbasic_register_trigger<top_block>( + alias(), "stop", &top_block::stop, "Stop the flowgraph", RPC_PRIVLVL_MIN))); - d_rpc_vars.push_back( - rpcbasic_sptr(new rpcbasic_register_trigger<top_block>( - alias(), "lock", &top_block::lock, - "Lock the flowgraph", RPC_PRIVLVL_MIN))); + d_rpc_vars.push_back(rpcbasic_sptr(new rpcbasic_register_trigger<top_block>( + alias(), "lock", &top_block::lock, "Lock the flowgraph", RPC_PRIVLVL_MIN))); - d_rpc_vars.push_back( - rpcbasic_sptr(new rpcbasic_register_trigger<top_block>( - alias(), "unlock", &top_block::unlock, - "Unock the flowgraph", RPC_PRIVLVL_MIN))); + d_rpc_vars.push_back(rpcbasic_sptr(new rpcbasic_register_trigger<top_block>( + alias(), "unlock", &top_block::unlock, "Unock the flowgraph", RPC_PRIVLVL_MIN))); // Getters - add_rpc_variable( - rpcbasic_sptr(new rpcbasic_register_get<top_block, int>( - alias(), "max noutput_items", - &top_block::max_noutput_items, - pmt::mp(0), pmt::mp(8192), pmt::mp(8192), - "items", "Max number of output items", - RPC_PRIVLVL_MIN, DISPNULL))); - - if(prefs::singleton()->get_bool("ControlPort", "edges_list", false)) { - add_rpc_variable( - rpcbasic_sptr(new rpcbasic_register_get<top_block, std::string>( - alias(), "edge list", - &top_block::edge_list, - pmt::mp(""), pmt::mp(""), pmt::mp(""), - "edges", "List of edges in the graph", - RPC_PRIVLVL_MIN, DISPNULL))); + add_rpc_variable(rpcbasic_sptr( + new rpcbasic_register_get<top_block, int>(alias(), + "max noutput_items", + &top_block::max_noutput_items, + pmt::mp(0), + pmt::mp(8192), + pmt::mp(8192), + "items", + "Max number of output items", + RPC_PRIVLVL_MIN, + DISPNULL))); + + if (prefs::singleton()->get_bool("ControlPort", "edges_list", false)) { + add_rpc_variable(rpcbasic_sptr(new rpcbasic_register_get<top_block, std::string>( + alias(), + "edge list", + &top_block::edge_list, + pmt::mp(""), + pmt::mp(""), + pmt::mp(""), + "edges", + "List of edges in the graph", + RPC_PRIVLVL_MIN, + DISPNULL))); } - if(prefs::singleton()->get_bool("ControlPort", "edges_list", false)) { - add_rpc_variable( - rpcbasic_sptr(new rpcbasic_register_get<top_block, std::string>( - alias(), "msg edges list", - &top_block::msg_edge_list, - pmt::mp(""), pmt::mp(""), pmt::mp(""), - "msg_edges", "List of msg edges in the graph", - RPC_PRIVLVL_MIN, DISPNULL))); + if (prefs::singleton()->get_bool("ControlPort", "edges_list", false)) { + add_rpc_variable(rpcbasic_sptr(new rpcbasic_register_get<top_block, std::string>( + alias(), + "msg edges list", + &top_block::msg_edge_list, + pmt::mp(""), + pmt::mp(""), + pmt::mp(""), + "msg_edges", + "List of msg edges in the graph", + RPC_PRIVLVL_MIN, + DISPNULL))); } #ifdef GNURADIO_HRT_USE_CLOCK_GETTIME - add_rpc_variable( - rpcbasic_sptr(new rpcbasic_register_variable_rw<int>( - alias(), "perfcounter_clock", - (int*)&gr::high_res_timer_source, - pmt::mp(0), pmt::mp(2), pmt::mp(2), - "clock", "Performance Counters Realtime Clock Type", - RPC_PRIVLVL_MIN, DISPNULL))); + add_rpc_variable(rpcbasic_sptr( + new rpcbasic_register_variable_rw<int>(alias(), + "perfcounter_clock", + (int*)&gr::high_res_timer_source, + pmt::mp(0), + pmt::mp(2), + pmt::mp(2), + "clock", + "Performance Counters Realtime Clock Type", + RPC_PRIVLVL_MIN, + DISPNULL))); #endif // Setters - add_rpc_variable( - rpcbasic_sptr(new rpcbasic_register_set<top_block, int>( - alias(), "max noutput_items", - &top_block::set_max_noutput_items, - pmt::mp(0), pmt::mp(8192), pmt::mp(8192), - "items", "Max number of output items", - RPC_PRIVLVL_MIN, DISPNULL))); + add_rpc_variable(rpcbasic_sptr( + new rpcbasic_register_set<top_block, int>(alias(), + "max noutput_items", + &top_block::set_max_noutput_items, + pmt::mp(0), + pmt::mp(8192), + pmt::mp(8192), + "items", + "Max number of output items", + RPC_PRIVLVL_MIN, + DISPNULL))); rpc_set(); #endif /* GR_CTRLPORT */ - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/top_block_impl.cc b/gnuradio-runtime/lib/top_block_impl.cc index d2a07e89ef..70b1e3e87c 100644 --- a/gnuradio-runtime/lib/top_block_impl.cc +++ b/gnuradio-runtime/lib/top_block_impl.cc @@ -40,68 +40,66 @@ namespace gr { #define GR_TOP_BLOCK_IMPL_DEBUG 0 - typedef scheduler_sptr(*scheduler_maker)(flat_flowgraph_sptr ffg, - int max_noutput_items); +typedef scheduler_sptr (*scheduler_maker)(flat_flowgraph_sptr ffg, int max_noutput_items); - static struct scheduler_table { - const char *name; +static struct scheduler_table { + const char* name; scheduler_maker f; - } scheduler_table[] = { - { "TPB", scheduler_tpb::make } // first entry is default - }; +} scheduler_table[] = { + { "TPB", scheduler_tpb::make } // first entry is default +}; - static scheduler_sptr - make_scheduler(flat_flowgraph_sptr ffg, int max_noutput_items) - { +static scheduler_sptr make_scheduler(flat_flowgraph_sptr ffg, int max_noutput_items) +{ static scheduler_maker factory = 0; - if(factory == 0) { - char *v = getenv("GR_SCHEDULER"); - if(!v) - factory = scheduler_table[0].f; // use default - else { - for(size_t i = 0; i < sizeof(scheduler_table)/sizeof(scheduler_table[0]); i++) { - if(strcmp(v, scheduler_table[i].name) == 0) { - factory = scheduler_table[i].f; - break; - } + if (factory == 0) { + char* v = getenv("GR_SCHEDULER"); + if (!v) + factory = scheduler_table[0].f; // use default + else { + for (size_t i = 0; i < sizeof(scheduler_table) / sizeof(scheduler_table[0]); + i++) { + if (strcmp(v, scheduler_table[i].name) == 0) { + factory = scheduler_table[i].f; + break; + } + } + if (factory == 0) { + std::cerr << "warning: Invalid GR_SCHEDULER environment variable value \"" + << v << "\". Using \"" << scheduler_table[0].name << "\"\n"; + factory = scheduler_table[0].f; + } } - if(factory == 0) { - std::cerr << "warning: Invalid GR_SCHEDULER environment variable value \"" - << v << "\". Using \"" << scheduler_table[0].name << "\"\n"; - factory = scheduler_table[0].f; - } - } } return factory(ffg, max_noutput_items); - } +} - top_block_impl::top_block_impl(top_block *owner) - : d_owner(owner), d_ffg(), - d_state(IDLE), d_lock_count(0), d_retry_wait(false) - { - } +top_block_impl::top_block_impl(top_block* owner) + : d_owner(owner), d_ffg(), d_state(IDLE), d_lock_count(0), d_retry_wait(false) +{ +} - top_block_impl::~top_block_impl() - { +top_block_impl::~top_block_impl() +{ if (d_lock_count) { - std::cerr << "error: destroying locked block." << std::endl; + std::cerr << "error: destroying locked block." << std::endl; } d_owner = 0; - } +} - void - top_block_impl::start(int max_noutput_items) - { +void top_block_impl::start(int max_noutput_items) +{ gr::thread::scoped_lock l(d_mutex); d_max_noutput_items = max_noutput_items; - if(d_state != IDLE) - throw std::runtime_error("top_block::start: top block already running or wait() not called after previous stop()"); + if (d_state != IDLE) + throw std::runtime_error("top_block::start: top block already running or wait() " + "not called after previous stop()"); - if(d_lock_count > 0) - throw std::runtime_error("top_block::start: can't start with flow graph locked"); + if (d_lock_count > 0) + throw std::runtime_error("top_block::start: can't start with flow graph locked"); // Create new flat flow graph by flattening hierarchy d_ffg = d_owner->flatten(); @@ -112,135 +110,119 @@ namespace gr { // Only export perf. counters if ControlPort config param is // enabled and if the PerfCounter option 'export' is turned on. - prefs *p = prefs::singleton(); - if(p->get_bool("ControlPort", "on", false) && p->get_bool("PerfCounters", "export", false)) - d_ffg->enable_pc_rpc(); + prefs* p = prefs::singleton(); + if (p->get_bool("ControlPort", "on", false) && + p->get_bool("PerfCounters", "export", false)) + d_ffg->enable_pc_rpc(); d_scheduler = make_scheduler(d_ffg, d_max_noutput_items); d_state = RUNNING; - } +} - void - top_block_impl::stop() - { +void top_block_impl::stop() +{ gr::thread::scoped_lock lock(d_mutex); - if(d_scheduler) - d_scheduler->stop(); + if (d_scheduler) + d_scheduler->stop(); d_state = IDLE; - } +} - void - top_block_impl::wait() - { +void top_block_impl::wait() +{ do { - wait_for_jobs(); - { - gr::thread::scoped_lock lock(d_mutex); - if (!d_lock_count) { - if(d_retry_wait) { - d_retry_wait = false; - continue; - } - d_state = IDLE; - break; + wait_for_jobs(); + { + gr::thread::scoped_lock lock(d_mutex); + if (!d_lock_count) { + if (d_retry_wait) { + d_retry_wait = false; + continue; + } + d_state = IDLE; + break; + } + d_lock_cond.wait(lock); } - d_lock_cond.wait(lock); - } - } while(true); - } - - void - top_block_impl::wait_for_jobs() - { - if(d_scheduler) - d_scheduler->wait(); - } - - // N.B. lock() and unlock() cannot be called from a flow graph - // thread or deadlock will occur when reconfiguration happens - void - top_block_impl::lock() - { + } while (true); +} + +void top_block_impl::wait_for_jobs() +{ + if (d_scheduler) + d_scheduler->wait(); +} + +// N.B. lock() and unlock() cannot be called from a flow graph +// thread or deadlock will occur when reconfiguration happens +void top_block_impl::lock() +{ gr::thread::scoped_lock lock(d_mutex); - if(d_scheduler) - d_scheduler->stop(); + if (d_scheduler) + d_scheduler->stop(); d_lock_count++; - } +} - void - top_block_impl::unlock() - { +void top_block_impl::unlock() +{ gr::thread::scoped_lock lock(d_mutex); - if(d_lock_count <= 0) { - d_lock_count = 0; // fix it, then complain - throw std::runtime_error("unpaired unlock() call"); + if (d_lock_count <= 0) { + d_lock_count = 0; // fix it, then complain + throw std::runtime_error("unpaired unlock() call"); } d_lock_count--; - if(d_lock_count > 0 || d_state == IDLE) // nothing to do - return; + if (d_lock_count > 0 || d_state == IDLE) // nothing to do + return; restart(); d_lock_cond.notify_all(); - } - - /* - * restart is called with d_mutex held - */ - void - top_block_impl::restart() - { +} + +/* + * restart is called with d_mutex held + */ +void top_block_impl::restart() +{ wait_for_jobs(); // Create new simple flow graph flat_flowgraph_sptr new_ffg = d_owner->flatten(); - new_ffg->validate(); // check consistency, sanity, etc - new_ffg->merge_connections(d_ffg); // reuse buffers, etc + new_ffg->validate(); // check consistency, sanity, etc + new_ffg->merge_connections(d_ffg); // reuse buffers, etc d_ffg = new_ffg; // Create a new scheduler to execute it d_scheduler = make_scheduler(d_ffg, d_max_noutput_items); d_retry_wait = true; - } +} - std::string - top_block_impl::edge_list() - { - if(d_ffg) - return d_ffg->edge_list(); +std::string top_block_impl::edge_list() +{ + if (d_ffg) + return d_ffg->edge_list(); else - return ""; - } - - std::string - top_block_impl::msg_edge_list() - { - if(d_ffg) - return d_ffg->msg_edge_list(); + return ""; +} + +std::string top_block_impl::msg_edge_list() +{ + if (d_ffg) + return d_ffg->msg_edge_list(); else - return ""; - } - - void - top_block_impl::dump() - { - if(d_ffg) - d_ffg->dump(); - } - - int - top_block_impl::max_noutput_items() - { - return d_max_noutput_items; - } - - void - top_block_impl::set_max_noutput_items(int nmax) - { - d_max_noutput_items = nmax; - } + return ""; +} + +void top_block_impl::dump() +{ + if (d_ffg) + d_ffg->dump(); +} + +int top_block_impl::max_noutput_items() { return d_max_noutput_items; } + +void top_block_impl::set_max_noutput_items(int nmax) { d_max_noutput_items = nmax; } } /* namespace gr */ diff --git a/gnuradio-runtime/lib/top_block_impl.h b/gnuradio-runtime/lib/top_block_impl.h index de0a67b4c1..d31be2fac2 100644 --- a/gnuradio-runtime/lib/top_block_impl.h +++ b/gnuradio-runtime/lib/top_block_impl.h @@ -29,21 +29,21 @@ namespace gr { - /*! - *\brief Abstract implementation details of top_block - * \ingroup internal - * - * The actual implementation of top_block. Separate class allows - * decoupling of changes from dependent classes. - */ - class GR_RUNTIME_API top_block_impl - { - public: - top_block_impl(top_block *owner); +/*! + *\brief Abstract implementation details of top_block + * \ingroup internal + * + * The actual implementation of top_block. Separate class allows + * decoupling of changes from dependent classes. + */ +class GR_RUNTIME_API top_block_impl +{ +public: + top_block_impl(top_block* owner); ~top_block_impl(); // Create and start scheduler threads - void start(int max_noutput_items=100000000); + void start(int max_noutput_items = 100000000); // Signal scheduler threads to stop void stop(); @@ -72,24 +72,24 @@ namespace gr { // Set the maximum number of noutput_items in the flowgraph void set_max_noutput_items(int nmax); - protected: +protected: enum tb_state { IDLE, RUNNING }; - top_block *d_owner; + top_block* d_owner; flat_flowgraph_sptr d_ffg; scheduler_sptr d_scheduler; - gr::thread::mutex d_mutex; // protects d_state and d_lock_count + gr::thread::mutex d_mutex; // protects d_state and d_lock_count tb_state d_state; int d_lock_count; bool d_retry_wait; boost::condition_variable d_lock_cond; int d_max_noutput_items; - private: +private: void restart(); void wait_for_jobs(); - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/lib/tpb_detail.cc b/gnuradio-runtime/lib/tpb_detail.cc index cf05c2b102..f5963fc491 100644 --- a/gnuradio-runtime/lib/tpb_detail.cc +++ b/gnuradio-runtime/lib/tpb_detail.cc @@ -30,42 +30,39 @@ namespace gr { - /* - * We assume that no worker threads are ever running when the graph - * structure is being manipulated, thus it's safe for us to poke - * around in our neighbors w/o holding any locks. - */ - void - tpb_detail::notify_upstream(block_detail *d) - { +/* + * We assume that no worker threads are ever running when the graph + * structure is being manipulated, thus it's safe for us to poke + * around in our neighbors w/o holding any locks. + */ +void tpb_detail::notify_upstream(block_detail* d) +{ // For each of our inputs, tell the guy upstream that we've // consumed some input, and that he most likely has more output // buffer space available. - for(size_t i = 0; i < d->d_input.size(); i++) { - // Can you say, "pointer chasing?" - d->d_input[i]->buffer()->link()->detail()->d_tpb.set_output_changed(); + for (size_t i = 0; i < d->d_input.size(); i++) { + // Can you say, "pointer chasing?" + d->d_input[i]->buffer()->link()->detail()->d_tpb.set_output_changed(); } - } +} - void - tpb_detail::notify_downstream(block_detail *d) - { +void tpb_detail::notify_downstream(block_detail* d) +{ // For each of our outputs, tell the guys downstream that they // have new input available. - for(size_t i = 0; i < d->d_output.size(); i++) { - buffer_sptr buf = d->d_output[i]; - for(size_t j = 0, k = buf->nreaders(); j < k; j++) - buf->reader(j)->link()->detail()->d_tpb.set_input_changed(); + for (size_t i = 0; i < d->d_output.size(); i++) { + buffer_sptr buf = d->d_output[i]; + for (size_t j = 0, k = buf->nreaders(); j < k; j++) + buf->reader(j)->link()->detail()->d_tpb.set_input_changed(); } - } +} - void - tpb_detail::notify_neighbors(block_detail *d) - { +void tpb_detail::notify_neighbors(block_detail* d) +{ notify_downstream(d); notify_upstream(d); - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/tpb_thread_body.cc b/gnuradio-runtime/lib/tpb_thread_body.cc index fa9de60ae3..e40c6df16b 100644 --- a/gnuradio-runtime/lib/tpb_thread_body.cc +++ b/gnuradio-runtime/lib/tpb_thread_body.cc @@ -32,150 +32,150 @@ namespace gr { - tpb_thread_body::tpb_thread_body(block_sptr block, gr::thread::barrier_sptr start_sync, int max_noutput_items) +tpb_thread_body::tpb_thread_body(block_sptr block, + gr::thread::barrier_sptr start_sync, + int max_noutput_items) : d_exec(block, max_noutput_items) - { - //std::cerr << "tpb_thread_body: " << block << std::endl; +{ + // std::cerr << "tpb_thread_body: " << block << std::endl; #if defined(_MSC_VER) || defined(__MINGW32__) - #include <windows.h> - thread::set_thread_name(GetCurrentThread(), boost::str(boost::format("%s%d") % block->name() % block->unique_id())); +#include <windows.h> + thread::set_thread_name( + GetCurrentThread(), + boost::str(boost::format("%s%d") % block->name() % block->unique_id())); #else - thread::set_thread_name(pthread_self(), boost::str(boost::format("%s%d") % block->name() % block->unique_id())); + thread::set_thread_name( + pthread_self(), + boost::str(boost::format("%s%d") % block->name() % block->unique_id())); #endif - block_detail *d = block->detail().get(); + block_detail* d = block->detail().get(); block_executor::state s; pmt::pmt_t msg; d->threaded = true; d->thread = gr::thread::get_current_thread_id(); - prefs *p = prefs::singleton(); + prefs* p = prefs::singleton(); size_t max_nmsgs = static_cast<size_t>(p->get_long("DEFAULT", "max_messages", 100)); - // Setup the logger for the scheduler - #undef LOG +// Setup the logger for the scheduler +#undef LOG std::string config_file = p->get_string("LOG", "log_config", ""); std::string log_level = p->get_string("LOG", "log_level", "off"); std::string log_file = p->get_string("LOG", "log_file", ""); GR_LOG_GETLOGGER(LOG, "gr_log.tpb_thread_body"); GR_LOG_SET_LEVEL(LOG, log_level); GR_CONFIG_LOGGER(config_file); - if(log_file.size() > 0) { - if(log_file == "stdout") { - GR_LOG_SET_CONSOLE_APPENDER(LOG, "stdout","gr::log :%p: %c{1} - %m%n"); - } - else if(log_file == "stderr") { - GR_LOG_SET_CONSOLE_APPENDER(LOG, "stderr","gr::log :%p: %c{1} - %m%n"); - } - else { - GR_LOG_SET_FILE_APPENDER(LOG, log_file , true,"%r :%p: %c{1} - %m%n"); - } + if (log_file.size() > 0) { + if (log_file == "stdout") { + GR_LOG_SET_CONSOLE_APPENDER(LOG, "stdout", "gr::log :%p: %c{1} - %m%n"); + } else if (log_file == "stderr") { + GR_LOG_SET_CONSOLE_APPENDER(LOG, "stderr", "gr::log :%p: %c{1} - %m%n"); + } else { + GR_LOG_SET_FILE_APPENDER(LOG, log_file, true, "%r :%p: %c{1} - %m%n"); + } } // Set thread affinity if it was set before fg was started. - if(block->processor_affinity().size() > 0) { - gr::thread::thread_bind_to_processor(d->thread, block->processor_affinity()); + if (block->processor_affinity().size() > 0) { + gr::thread::thread_bind_to_processor(d->thread, block->processor_affinity()); } // Set thread priority if it was set before fg was started - if(block->thread_priority() > 0) { - gr::thread::set_thread_priority(d->thread, block->thread_priority()); + if (block->thread_priority() > 0) { + gr::thread::set_thread_priority(d->thread, block->thread_priority()); } // make sure our block isnt finished block->clear_finished(); start_sync->wait(); - while(1) { - boost::this_thread::interruption_point(); - - d->d_tpb.clear_changed(); - - // handle any queued up messages - BOOST_FOREACH(basic_block::msg_queue_map_t::value_type &i, block->msg_queue) { - // Check if we have a message handler attached before getting - // any messages. This is mostly a protection for the unknown - // startup sequence of the threads. - if(block->has_msg_handler(i.first)) { - while((msg = block->delete_head_nowait(i.first))) { - block->dispatch_msg(i.first,msg); - } - } - else { - // If we don't have a handler but are building up messages, - // prune the queue from the front to keep memory in check. - if(block->nmsgs(i.first) > max_nmsgs){ - GR_LOG_WARN(LOG,"asynchronous message buffer overflowing, dropping message"); - msg = block->delete_head_nowait(i.first); - } + while (1) { + boost::this_thread::interruption_point(); + + d->d_tpb.clear_changed(); + + // handle any queued up messages + BOOST_FOREACH (basic_block::msg_queue_map_t::value_type& i, block->msg_queue) { + // Check if we have a message handler attached before getting + // any messages. This is mostly a protection for the unknown + // startup sequence of the threads. + if (block->has_msg_handler(i.first)) { + while ((msg = block->delete_head_nowait(i.first))) { + block->dispatch_msg(i.first, msg); + } + } else { + // If we don't have a handler but are building up messages, + // prune the queue from the front to keep memory in check. + if (block->nmsgs(i.first) > max_nmsgs) { + GR_LOG_WARN( + LOG, "asynchronous message buffer overflowing, dropping message"); + msg = block->delete_head_nowait(i.first); + } + } } - } - - // run one iteration if we are a connected stream block - if(d->noutputs() >0 || d->ninputs()>0){ - s = d_exec.run_one_iteration(); - } - else { - s = block_executor::BLKD_IN; - // a msg port only block wants to shutdown - if(block->finished()) { - s = block_executor::DONE; + + // run one iteration if we are a connected stream block + if (d->noutputs() > 0 || d->ninputs() > 0) { + s = d_exec.run_one_iteration(); + } else { + s = block_executor::BLKD_IN; + // a msg port only block wants to shutdown + if (block->finished()) { + s = block_executor::DONE; + } } - } - - if(block->finished() && s == block_executor::READY_NO_OUTPUT) { - s = block_executor::DONE; - d->set_done(true); - } - - if(!d->ninputs() && s == block_executor::READY_NO_OUTPUT) { - s = block_executor::BLKD_IN; - } - - switch(s){ - case block_executor::READY: // Tell neighbors we made progress. - d->d_tpb.notify_neighbors(d); - break; - - case block_executor::READY_NO_OUTPUT: // Notify upstream only - d->d_tpb.notify_upstream(d); - break; - - case block_executor::DONE: // Game over. - block->notify_msg_neighbors(); - d->d_tpb.notify_neighbors(d); - return; - - case block_executor::BLKD_IN: // Wait for input. - { - gr::thread::scoped_lock guard(d->d_tpb.mutex); - - if(!d->d_tpb.input_changed) { - boost::system_time const timeout=boost::get_system_time()+ boost::posix_time::milliseconds(250); - d->d_tpb.input_cond.timed_wait(guard, timeout); + + if (block->finished() && s == block_executor::READY_NO_OUTPUT) { + s = block_executor::DONE; + d->set_done(true); } - } - break; - - case block_executor::BLKD_OUT: // Wait for output buffer space. - { - gr::thread::scoped_lock guard(d->d_tpb.mutex); - while(!d->d_tpb.output_changed) { - d->d_tpb.output_cond.wait(guard); + + if (!d->ninputs() && s == block_executor::READY_NO_OUTPUT) { + s = block_executor::BLKD_IN; } - } - break; - default: - throw std::runtime_error("possible memory corruption in scheduler"); - } + switch (s) { + case block_executor::READY: // Tell neighbors we made progress. + d->d_tpb.notify_neighbors(d); + break; + + case block_executor::READY_NO_OUTPUT: // Notify upstream only + d->d_tpb.notify_upstream(d); + break; + + case block_executor::DONE: // Game over. + block->notify_msg_neighbors(); + d->d_tpb.notify_neighbors(d); + return; + + case block_executor::BLKD_IN: // Wait for input. + { + gr::thread::scoped_lock guard(d->d_tpb.mutex); + + if (!d->d_tpb.input_changed) { + boost::system_time const timeout = + boost::get_system_time() + boost::posix_time::milliseconds(250); + d->d_tpb.input_cond.timed_wait(guard, timeout); + } + } break; + + case block_executor::BLKD_OUT: // Wait for output buffer space. + { + gr::thread::scoped_lock guard(d->d_tpb.mutex); + while (!d->d_tpb.output_changed) { + d->d_tpb.output_cond.wait(guard); + } + } break; + + default: + throw std::runtime_error("possible memory corruption in scheduler"); + } } - } +} - tpb_thread_body::~tpb_thread_body() - { - } +tpb_thread_body::~tpb_thread_body() {} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/tpb_thread_body.h b/gnuradio-runtime/lib/tpb_thread_body.h index c500582cf3..c919612281 100644 --- a/gnuradio-runtime/lib/tpb_thread_body.h +++ b/gnuradio-runtime/lib/tpb_thread_body.h @@ -29,21 +29,23 @@ namespace gr { - /*! - * \brief The body of each thread-per-block thread. - * - * One of these is instantiated in its own thread for each block. - * The constructor turns into the main loop which returns when the - * block is done or is interrupted. - */ - class GR_RUNTIME_API tpb_thread_body - { +/*! + * \brief The body of each thread-per-block thread. + * + * One of these is instantiated in its own thread for each block. + * The constructor turns into the main loop which returns when the + * block is done or is interrupted. + */ +class GR_RUNTIME_API tpb_thread_body +{ block_executor d_exec; - public: - tpb_thread_body(block_sptr block, thread::barrier_sptr start_sync, int max_noutput_items=100000); +public: + tpb_thread_body(block_sptr block, + thread::barrier_sptr start_sync, + int max_noutput_items = 100000); ~tpb_thread_body(); - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/lib/vmcircbuf.cc b/gnuradio-runtime/lib/vmcircbuf.cc index 05f08ceed4..59e6187b27 100644 --- a/gnuradio-runtime/lib/vmcircbuf.cc +++ b/gnuradio-runtime/lib/vmcircbuf.cc @@ -44,64 +44,59 @@ gr::thread::mutex s_vm_mutex; namespace gr { - static const char *FACTORY_PREF_KEY = "vmcircbuf_default_factory"; +static const char* FACTORY_PREF_KEY = "vmcircbuf_default_factory"; - vmcircbuf::~vmcircbuf() - { - } +vmcircbuf::~vmcircbuf() {} - vmcircbuf_factory::~vmcircbuf_factory() - { - } +vmcircbuf_factory::~vmcircbuf_factory() {} - // ---------------------------------------------------------------- +// ---------------------------------------------------------------- - static vmcircbuf_factory *s_default_factory = 0; +static vmcircbuf_factory* s_default_factory = 0; - vmcircbuf_factory * - vmcircbuf_sysconfig::get_default_factory() - { - if(s_default_factory) - return s_default_factory; +vmcircbuf_factory* vmcircbuf_sysconfig::get_default_factory() +{ + if (s_default_factory) + return s_default_factory; bool verbose = false; - std::vector<gr::vmcircbuf_factory *> all = all_factories (); + std::vector<gr::vmcircbuf_factory*> all = all_factories(); char name[1024]; if (gr::vmcircbuf_prefs::get(FACTORY_PREF_KEY, name, sizeof(name)) >= 0) { - for(unsigned int i = 0; i < all.size (); i++) { - if(strncmp(name, all[i]->name(), strlen(all[i]->name())) == 0) { - s_default_factory = all[i]; - if(verbose) - fprintf(stderr, "gr::vmcircbuf_sysconfig: using %s\n", - s_default_factory->name()); - return s_default_factory; + for (unsigned int i = 0; i < all.size(); i++) { + if (strncmp(name, all[i]->name(), strlen(all[i]->name())) == 0) { + s_default_factory = all[i]; + if (verbose) + fprintf(stderr, + "gr::vmcircbuf_sysconfig: using %s\n", + s_default_factory->name()); + return s_default_factory; + } } - } } // either we don't have a default, or the default named is not in our // list of factories. Find the first factory that works. - if(verbose) - fprintf(stderr, "gr::vmcircbuf_sysconfig: finding a working factory...\n"); + if (verbose) + fprintf(stderr, "gr::vmcircbuf_sysconfig: finding a working factory...\n"); - for(unsigned int i = 0; i < all.size (); i++) { - if(test_factory(all[i], verbose)) { - set_default_factory(all[i]); - return s_default_factory; - } + for (unsigned int i = 0; i < all.size(); i++) { + if (test_factory(all[i], verbose)) { + set_default_factory(all[i]); + return s_default_factory; + } } // We're screwed! fprintf(stderr, "gr::vmcircbuf_sysconfig: unable to find a working factory!\n"); throw std::runtime_error("gr::vmcircbuf_sysconfig"); - } +} - std::vector<vmcircbuf_factory *> - vmcircbuf_sysconfig::all_factories() - { +std::vector<vmcircbuf_factory*> vmcircbuf_sysconfig::all_factories() +{ std::vector<vmcircbuf_factory*> result; result.push_back(gr::vmcircbuf_createfilemapping_factory::singleton()); @@ -109,192 +104,189 @@ namespace gr { result.push_back(gr::vmcircbuf_sysv_shm_factory::singleton()); result.push_back(gr::vmcircbuf_mmap_shm_open_factory::singleton()); #endif - result.push_back (gr::vmcircbuf_mmap_tmpfile_factory::singleton()); + result.push_back(gr::vmcircbuf_mmap_tmpfile_factory::singleton()); return result; - } +} - void - vmcircbuf_sysconfig::set_default_factory(vmcircbuf_factory *f) - { +void vmcircbuf_sysconfig::set_default_factory(vmcircbuf_factory* f) +{ gr::vmcircbuf_prefs::set(FACTORY_PREF_KEY, f->name()); s_default_factory = f; - } +} - // ------------------------------------------------------------------------ - // test code for vmcircbuf factories - // ------------------------------------------------------------------------ +// ------------------------------------------------------------------------ +// test code for vmcircbuf factories +// ------------------------------------------------------------------------ - static void - init_buffer(vmcircbuf *c, int counter, int size) - { - unsigned int *p = (unsigned int*)c->pointer_to_first_copy(); - for(unsigned int i = 0; i < size / sizeof(int); i++) - p[i] = counter + i; - } +static void init_buffer(vmcircbuf* c, int counter, int size) +{ + unsigned int* p = (unsigned int*)c->pointer_to_first_copy(); + for (unsigned int i = 0; i < size / sizeof(int); i++) + p[i] = counter + i; +} - static bool - check_mapping(vmcircbuf *c, int counter, int size, const char *msg, bool verbose) - { +static bool +check_mapping(vmcircbuf* c, int counter, int size, const char* msg, bool verbose) +{ bool ok = true; - if(verbose) - fprintf(stderr, "... %s", msg); + if (verbose) + fprintf(stderr, "... %s", msg); - unsigned int *p1 = (unsigned int *)c->pointer_to_first_copy(); - unsigned int *p2 = (unsigned int *)c->pointer_to_second_copy(); + unsigned int* p1 = (unsigned int*)c->pointer_to_first_copy(); + unsigned int* p2 = (unsigned int*)c->pointer_to_second_copy(); // fprintf(stderr, "p1 = %p, p2 = %p\n", p1, p2); - for(unsigned int i = 0; i < size / sizeof (int); i++) { - if(p1[i] != counter + i) { - ok = false; - if(verbose) - fprintf(stderr, " p1[%d] == %u, expected %u\n", i, p1[i], counter + i); - break; - } - if(p2[i] != counter + i) { - if(verbose) - fprintf(stderr, " p2[%d] == %u, expected %u\n", i, p2[i], counter + i); - ok = false; - break; - } + for (unsigned int i = 0; i < size / sizeof(int); i++) { + if (p1[i] != counter + i) { + ok = false; + if (verbose) + fprintf(stderr, " p1[%d] == %u, expected %u\n", i, p1[i], counter + i); + break; + } + if (p2[i] != counter + i) { + if (verbose) + fprintf(stderr, " p2[%d] == %u, expected %u\n", i, p2[i], counter + i); + ok = false; + break; + } } - if(ok && verbose) { - fprintf(stderr, " OK\n"); + if (ok && verbose) { + fprintf(stderr, " OK\n"); } return ok; - } +} - static const char * - memsize(int size) - { +static const char* memsize(int size) +{ static std::string buf; - if(size >= (1 << 20)) { - buf = str(boost::format("%dMB") % (size / (1 << 20))); - } - else if(size >= (1 << 10)){ - buf = str(boost::format("%dKB") % (size / (1 << 10))); - } - else { - buf = str(boost::format("%d") % size); + if (size >= (1 << 20)) { + buf = str(boost::format("%dMB") % (size / (1 << 20))); + } else if (size >= (1 << 10)) { + buf = str(boost::format("%dKB") % (size / (1 << 10))); + } else { + buf = str(boost::format("%d") % size); } return buf.c_str(); - } +} - static bool - test_a_bunch(vmcircbuf_factory *factory, int n, int size, int *start_ptr, bool verbose) - { +static bool +test_a_bunch(vmcircbuf_factory* factory, int n, int size, int* start_ptr, bool verbose) +{ bool ok = true; std::vector<int> counter(n); std::vector<vmcircbuf*> c(n); int cum_size = 0; - for(int i = 0; i < n; i++) { - counter[i] = *start_ptr; - *start_ptr += size; - if((c[i] = factory->make (size)) == 0) { - if(verbose) - fprintf(stderr, - "Failed to allocate gr::vmcircbuf number %d of size %d (cum = %s)\n", - i + 1, size, memsize(cum_size)); - return false; - } - init_buffer(c[i], counter[i], size); - cum_size += size; + for (int i = 0; i < n; i++) { + counter[i] = *start_ptr; + *start_ptr += size; + if ((c[i] = factory->make(size)) == 0) { + if (verbose) + fprintf( + stderr, + "Failed to allocate gr::vmcircbuf number %d of size %d (cum = %s)\n", + i + 1, + size, + memsize(cum_size)); + return false; + } + init_buffer(c[i], counter[i], size); + cum_size += size; } - for(int i = 0; i < n; i++) { - std::string msg = str(boost::format("test_a_bunch_%dx%s[%d]") % n % memsize(size) % i); - ok &= check_mapping(c[i], counter[i], size, msg.c_str(), verbose); + for (int i = 0; i < n; i++) { + std::string msg = + str(boost::format("test_a_bunch_%dx%s[%d]") % n % memsize(size) % i); + ok &= check_mapping(c[i], counter[i], size, msg.c_str(), verbose); } - for(int i = 0; i < n; i++) { - delete c[i]; - c[i] = 0; + for (int i = 0; i < n; i++) { + delete c[i]; + c[i] = 0; } return ok; - } +} - static bool - standard_tests(vmcircbuf_factory *f, int verbose) - { - if(verbose >= 1) - fprintf(stderr, "Testing %s...\n", f->name()); +static bool standard_tests(vmcircbuf_factory* f, int verbose) +{ + if (verbose >= 1) + fprintf(stderr, "Testing %s...\n", f->name()); bool v = verbose >= 2; int granularity = f->granularity(); int start = 0; bool ok = true; - ok &= test_a_bunch(f, 1, 1 * granularity, &start, v); // 1 x 4KB = 4KB + ok &= test_a_bunch(f, 1, 1 * granularity, &start, v); // 1 x 4KB = 4KB - if(ok) { - ok &= test_a_bunch(f, 64, 4 * granularity, &start, v); // 64 x 16KB = 1MB - ok &= test_a_bunch(f, 4, 4 * (1L << 20), &start, v); // 4 x 4MB = 16MB - // ok &= test_a_bunch(f, 256, 256 * (1L << 10), &start, v); // 256 x 256KB = 64MB + if (ok) { + ok &= test_a_bunch(f, 64, 4 * granularity, &start, v); // 64 x 16KB = 1MB + ok &= test_a_bunch(f, 4, 4 * (1L << 20), &start, v); // 4 x 4MB = 16MB + // ok &= test_a_bunch(f, 256, 256 * (1L << 10), &start, v); // 256 x 256KB = + // 64MB } - if(verbose >= 1) - fprintf(stderr, "....... %s: %s", f->name(), ok ? "OK\n" : "Doesn't work\n"); + if (verbose >= 1) + fprintf(stderr, "....... %s: %s", f->name(), ok ? "OK\n" : "Doesn't work\n"); return ok; - } +} - bool - vmcircbuf_sysconfig::test_factory(vmcircbuf_factory *f, int verbose) - { +bool vmcircbuf_sysconfig::test_factory(vmcircbuf_factory* f, int verbose) +{ // Install local signal handlers for SIGSEGV and SIGBUS. // If something goes wrong, these signals may be invoked. #ifdef SIGSEGV - gr::local_sighandler sigsegv (SIGSEGV, gr::local_sighandler::throw_signal); + gr::local_sighandler sigsegv(SIGSEGV, gr::local_sighandler::throw_signal); #endif #ifdef SIGBUS - gr::local_sighandler sigbus (SIGBUS, gr::local_sighandler::throw_signal); + gr::local_sighandler sigbus(SIGBUS, gr::local_sighandler::throw_signal); #endif #ifdef SIGSYS - gr::local_sighandler sigsys (SIGSYS, gr::local_sighandler::throw_signal); + gr::local_sighandler sigsys(SIGSYS, gr::local_sighandler::throw_signal); #endif try { - return standard_tests (f, verbose); - } - catch(gr::signal &sig) { - if(verbose) { - fprintf(stderr, "....... %s: %s", f->name(), "Doesn't work\n"); - fprintf(stderr, - "gr::vmcircbuf_factory::test_factory (%s): caught %s\n", - f->name(), sig.name().c_str()); + return standard_tests(f, verbose); + } catch (gr::signal& sig) { + if (verbose) { + fprintf(stderr, "....... %s: %s", f->name(), "Doesn't work\n"); + fprintf(stderr, + "gr::vmcircbuf_factory::test_factory (%s): caught %s\n", + f->name(), + sig.name().c_str()); + return false; + } + } catch (...) { + if (verbose) { + fprintf(stderr, "....... %s: %s", f->name(), "Doesn't work\n"); + fprintf(stderr, + "gr::vmcircbuf_factory::test_factory (%s): some kind of uncaught " + "exception\n", + f->name()); + } return false; - } - } - catch (...) { - if(verbose) { - fprintf(stderr, "....... %s: %s", f->name(), "Doesn't work\n"); - fprintf(stderr, - "gr::vmcircbuf_factory::test_factory (%s): some kind of uncaught exception\n", - f->name()); - } - return false; } - return false; // never gets here. shut compiler up. - } + return false; // never gets here. shut compiler up. +} - bool - vmcircbuf_sysconfig::test_all_factories(int verbose) - { +bool vmcircbuf_sysconfig::test_all_factories(int verbose) +{ bool ok = false; - std::vector<vmcircbuf_factory *> all = all_factories(); + std::vector<vmcircbuf_factory*> all = all_factories(); - for(unsigned int i = 0; i < all.size (); i++) - ok |= test_factory(all[i], verbose); + for (unsigned int i = 0; i < all.size(); i++) + ok |= test_factory(all[i], verbose); return ok; - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/vmcircbuf.h b/gnuradio-runtime/lib/vmcircbuf.h index f9ed045168..5f3aade585 100644 --- a/gnuradio-runtime/lib/vmcircbuf.h +++ b/gnuradio-runtime/lib/vmcircbuf.h @@ -31,42 +31,41 @@ extern gr::thread::mutex s_vm_mutex; namespace gr { - /*! - * \brief abstract class to implement doubly mapped virtual memory circular buffers - * \ingroup internal - */ - class GR_RUNTIME_API vmcircbuf - { - protected: +/*! + * \brief abstract class to implement doubly mapped virtual memory circular buffers + * \ingroup internal + */ +class GR_RUNTIME_API vmcircbuf +{ +protected: int d_size; - char *d_base; + char* d_base; // CREATORS - vmcircbuf(int size) : d_size(size), d_base(0) {}; + vmcircbuf(int size) : d_size(size), d_base(0){}; - public: +public: virtual ~vmcircbuf(); // ACCESSORS - void *pointer_to_first_copy() const{ return d_base; } - void *pointer_to_second_copy() const{ return d_base + d_size; } - }; - - /*! - * \brief abstract factory for creating circular buffers - */ - class GR_RUNTIME_API vmcircbuf_factory - { - protected: - vmcircbuf_factory() {}; - virtual ~vmcircbuf_factory(); + void* pointer_to_first_copy() const { return d_base; } + void* pointer_to_second_copy() const { return d_base + d_size; } +}; - public: +/*! + * \brief abstract factory for creating circular buffers + */ +class GR_RUNTIME_API vmcircbuf_factory +{ +protected: + vmcircbuf_factory(){}; + virtual ~vmcircbuf_factory(); +public: /*! * \brief return name of this factory */ - virtual const char *name() const = 0; + virtual const char* name() const = 0; /*! * \brief return granularity of mapping, typically equal to page size @@ -78,32 +77,32 @@ namespace gr { * * Call this to create a doubly mapped circular buffer. */ - virtual vmcircbuf *make(int size) = 0; - }; - - /* - * \brief pulls together all implementations of gr::vmcircbuf - */ - class GR_RUNTIME_API vmcircbuf_sysconfig - { - public: + virtual vmcircbuf* make(int size) = 0; +}; + +/* + * \brief pulls together all implementations of gr::vmcircbuf + */ +class GR_RUNTIME_API vmcircbuf_sysconfig +{ +public: /* * \brief return the single instance of the default factory. * * returns the default factory to use if it's already defined, * else find the first working factory and use it. */ - static vmcircbuf_factory *get_default_factory(); + static vmcircbuf_factory* get_default_factory(); - static int granularity() { return get_default_factory()->granularity(); } - static vmcircbuf *make(int size) { return get_default_factory()->make(size); } + static int granularity() { return get_default_factory()->granularity(); } + static vmcircbuf* make(int size) { return get_default_factory()->make(size); } // N.B. not all factories are guaranteed to work. // It's too hard to check everything at config time, so we check at runtime static std::vector<vmcircbuf_factory*> all_factories(); // make this factory the default - static void set_default_factory(vmcircbuf_factory *f); + static void set_default_factory(vmcircbuf_factory* f); /*! * \brief Does this factory really work? @@ -112,7 +111,7 @@ namespace gr { * verbose = 1: names of factories tested and results * verbose = 2: all intermediate results */ - static bool test_factory(vmcircbuf_factory *f, int verbose); + static bool test_factory(vmcircbuf_factory* f, int verbose); /*! * \brief Test all factories, return true if at least one of them works @@ -121,7 +120,7 @@ namespace gr { * verbose = 2: all intermediate results */ static bool test_all_factories(int verbose); - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/lib/vmcircbuf_createfilemapping.cc b/gnuradio-runtime/lib/vmcircbuf_createfilemapping.cc index 8d4de28a13..b215fcfa6a 100644 --- a/gnuradio-runtime/lib/vmcircbuf_createfilemapping.cc +++ b/gnuradio-runtime/lib/vmcircbuf_createfilemapping.cc @@ -43,28 +43,26 @@ namespace gr { #ifdef HAVE_CREATEFILEMAPPING - // Print Windows error (could/should be global?) - static void - werror(char *where, DWORD last_error) - { +// Print Windows error (could/should be global?) +static void werror(char* where, DWORD last_error) +{ char buf[1024]; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, last_error, - 0, // default language + 0, // default language buf, - sizeof(buf)/sizeof(TCHAR), // buffer size + sizeof(buf) / sizeof(TCHAR), // buffer size NULL); fprintf(stderr, "%s: Error %d: %s", where, last_error, buf); return; - } +} #endif - vmcircbuf_createfilemapping::vmcircbuf_createfilemapping(int size) - : gr::vmcircbuf(size) - { +vmcircbuf_createfilemapping::vmcircbuf_createfilemapping(int size) : gr::vmcircbuf(size) +{ #if !defined(HAVE_CREATEFILEMAPPING) fprintf(stderr, "%s: createfilemapping is not available\n", __FUNCTION__); throw std::runtime_error("gr::vmcircbuf_createfilemapping"); @@ -73,136 +71,144 @@ namespace gr { static int s_seg_counter = 0; - if(size <= 0 || (size % gr::pagesize ()) != 0) { - fprintf(stderr, "gr::vmcircbuf_createfilemapping: invalid size = %d\n", size); - throw std::runtime_error ("gr::vmcircbuf_createfilemapping"); + if (size <= 0 || (size % gr::pagesize()) != 0) { + fprintf(stderr, "gr::vmcircbuf_createfilemapping: invalid size = %d\n", size); + throw std::runtime_error("gr::vmcircbuf_createfilemapping"); } - std::string seg_name = str(boost::format("/gnuradio-%d-%d") % getpid() % s_seg_counter); + std::string seg_name = + str(boost::format("/gnuradio-%d-%d") % getpid() % s_seg_counter); - d_handle = CreateFileMapping(INVALID_HANDLE_VALUE, // use paging file - NULL, // default security - PAGE_READWRITE, // read/write access - 0, // max. object size - size, // buffer size - seg_name.c_str()); // name of mapping object + d_handle = CreateFileMapping(INVALID_HANDLE_VALUE, // use paging file + NULL, // default security + PAGE_READWRITE, // read/write access + 0, // max. object size + size, // buffer size + seg_name.c_str()); // name of mapping object s_seg_counter++; - if(d_handle == NULL || d_handle == INVALID_HANDLE_VALUE) { - std::string msg = str(boost::format( - "gr::vmcircbuf_mmap_createfilemapping: CreateFileMapping [%s]") % - seg_name); - werror((char*)msg.c_str(), GetLastError()); - throw std::runtime_error("gr::vmcircbuf_mmap_createfilemapping"); + if (d_handle == NULL || d_handle == INVALID_HANDLE_VALUE) { + std::string msg = + str(boost::format( + "gr::vmcircbuf_mmap_createfilemapping: CreateFileMapping [%s]") % + seg_name); + werror((char*)msg.c_str(), GetLastError()); + throw std::runtime_error("gr::vmcircbuf_mmap_createfilemapping"); } // Allocate virtual memory of the needed size, then free it so we can use it LPVOID first_tmp; - first_tmp = VirtualAlloc( NULL, 2*size, MEM_RESERVE, PAGE_NOACCESS ); - if(first_tmp == NULL) { - werror("gr::vmcircbuf_mmap_createfilemapping: VirtualAlloc", GetLastError()); - CloseHandle(d_handle); // cleanup - throw std::runtime_error("gr::vmcircbuf_mmap_createfilemapping"); + first_tmp = VirtualAlloc(NULL, 2 * size, MEM_RESERVE, PAGE_NOACCESS); + if (first_tmp == NULL) { + werror("gr::vmcircbuf_mmap_createfilemapping: VirtualAlloc", GetLastError()); + CloseHandle(d_handle); // cleanup + throw std::runtime_error("gr::vmcircbuf_mmap_createfilemapping"); } - if(VirtualFree(first_tmp, 0, MEM_RELEASE) == 0) { - werror("gr::vmcircbuf_mmap_createfilemapping: VirtualFree", GetLastError()); - CloseHandle(d_handle); // cleanup - throw std::runtime_error("gr::vmcircbuf_mmap_createfilemapping"); + if (VirtualFree(first_tmp, 0, MEM_RELEASE) == 0) { + werror("gr::vmcircbuf_mmap_createfilemapping: VirtualFree", GetLastError()); + CloseHandle(d_handle); // cleanup + throw std::runtime_error("gr::vmcircbuf_mmap_createfilemapping"); } - d_first_copy = MapViewOfFileEx((HANDLE)d_handle, // handle to map object - FILE_MAP_WRITE, // read/write permission + d_first_copy = MapViewOfFileEx((HANDLE)d_handle, // handle to map object + FILE_MAP_WRITE, // read/write permission + 0, + 0, + size, + first_tmp); + if (d_first_copy != first_tmp) { + werror("gr::vmcircbuf_mmap_createfilemapping: MapViewOfFileEx(1)", + GetLastError()); + CloseHandle(d_handle); // cleanup + throw std::runtime_error("gr::vmcircbuf_mmap_createfilemapping"); + } + + d_second_copy = MapViewOfFileEx((HANDLE)d_handle, // handle to map object + FILE_MAP_WRITE, // read/write permission 0, 0, size, - first_tmp); - if(d_first_copy != first_tmp) { - werror( "gr::vmcircbuf_mmap_createfilemapping: MapViewOfFileEx(1)", GetLastError()); - CloseHandle(d_handle); // cleanup - throw std::runtime_error ("gr::vmcircbuf_mmap_createfilemapping"); - } - - d_second_copy = MapViewOfFileEx((HANDLE)d_handle, // handle to map object - FILE_MAP_WRITE, // read/write permission - 0, - 0, - size, - (char*)first_tmp + size);//(LPVOID) ((char *)d_first_copy + size)); - - if(d_second_copy != (char *)first_tmp + size) { - werror( "gr::vmcircbuf_mmap_createfilemapping: MapViewOfFileEx(2)", GetLastError()); - UnmapViewOfFile(d_first_copy); - CloseHandle(d_handle); // cleanup - throw std::runtime_error ("gr::vmcircbuf_mmap_createfilemapping"); + (char*)first_tmp + + size); //(LPVOID) ((char *)d_first_copy + size)); + + if (d_second_copy != (char*)first_tmp + size) { + werror("gr::vmcircbuf_mmap_createfilemapping: MapViewOfFileEx(2)", + GetLastError()); + UnmapViewOfFile(d_first_copy); + CloseHandle(d_handle); // cleanup + throw std::runtime_error("gr::vmcircbuf_mmap_createfilemapping"); } #ifdef DEBUG - fprintf(stderr,"gr::vmcircbuf_mmap_createfilemapping: contiguous? mmap %p %p %p %p\n", - (char*)d_first_copy, (char*)d_second_copy, size, (char*)d_first_copy + size); + fprintf(stderr, + "gr::vmcircbuf_mmap_createfilemapping: contiguous? mmap %p %p %p %p\n", + (char*)d_first_copy, + (char*)d_second_copy, + size, + (char*)d_first_copy + size); #endif // Now remember the important stuff d_base = (char*)d_first_copy; d_size = size; #endif /*HAVE_CREATEFILEMAPPING*/ - } +} - vmcircbuf_createfilemapping::~vmcircbuf_createfilemapping() - { +vmcircbuf_createfilemapping::~vmcircbuf_createfilemapping() +{ #ifdef HAVE_CREATEFILEMAPPING gr::thread::scoped_lock guard(s_vm_mutex); - if(UnmapViewOfFile(d_first_copy) == 0) { - werror("gr::vmcircbuf_createfilemapping: UnmapViewOfFile(d_first_copy)", GetLastError()); + if (UnmapViewOfFile(d_first_copy) == 0) { + werror("gr::vmcircbuf_createfilemapping: UnmapViewOfFile(d_first_copy)", + GetLastError()); } - d_base=NULL; - if(UnmapViewOfFile(d_second_copy) == 0) { - werror("gr::vmcircbuf_createfilemapping: UnmapViewOfFile(d_second_copy)", GetLastError()); + d_base = NULL; + if (UnmapViewOfFile(d_second_copy) == 0) { + werror("gr::vmcircbuf_createfilemapping: UnmapViewOfFile(d_second_copy)", + GetLastError()); } - //d_second=NULL; + // d_second=NULL; CloseHandle(d_handle); #endif - } +} - // ---------------------------------------------------------------- - // The factory interface - // ---------------------------------------------------------------- +// ---------------------------------------------------------------- +// The factory interface +// ---------------------------------------------------------------- - gr::vmcircbuf_factory *vmcircbuf_createfilemapping_factory::s_the_factory = 0; +gr::vmcircbuf_factory* vmcircbuf_createfilemapping_factory::s_the_factory = 0; - gr::vmcircbuf_factory * - vmcircbuf_createfilemapping_factory::singleton() - { - if(s_the_factory) - return s_the_factory; +gr::vmcircbuf_factory* vmcircbuf_createfilemapping_factory::singleton() +{ + if (s_the_factory) + return s_the_factory; s_the_factory = new vmcircbuf_createfilemapping_factory(); return s_the_factory; - } +} - int - vmcircbuf_createfilemapping_factory::granularity() - { +int vmcircbuf_createfilemapping_factory::granularity() +{ #ifdef HAVE_CREATEFILEMAPPING // return 65536;//TODO, check, is this needed or can we just use gr::pagesize() SYSTEM_INFO system_info; GetSystemInfo(&system_info); - //fprintf(stderr,"win32 AllocationGranularity %p\n",(int)system_info.dwAllocationGranularity); + // fprintf(stderr,"win32 AllocationGranularity + // %p\n",(int)system_info.dwAllocationGranularity); return (int)system_info.dwAllocationGranularity; #else return gr::pagesize(); #endif - } +} - gr::vmcircbuf * - vmcircbuf_createfilemapping_factory::make(int size) - { +gr::vmcircbuf* vmcircbuf_createfilemapping_factory::make(int size) +{ try { - return new vmcircbuf_createfilemapping(size); - } - catch(...) { - return 0; + return new vmcircbuf_createfilemapping(size); + } catch (...) { + return 0; } - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/vmcircbuf_createfilemapping.h b/gnuradio-runtime/lib/vmcircbuf_createfilemapping.h index 0513112f23..f289abcd96 100644 --- a/gnuradio-runtime/lib/vmcircbuf_createfilemapping.h +++ b/gnuradio-runtime/lib/vmcircbuf_createfilemapping.h @@ -32,36 +32,36 @@ namespace gr { - /*! - * \brief concrete class to implement circular buffers with mmap and shm_open - * \ingroup internal - */ - class GR_RUNTIME_API vmcircbuf_createfilemapping : public gr::vmcircbuf - { - public: +/*! + * \brief concrete class to implement circular buffers with mmap and shm_open + * \ingroup internal + */ +class GR_RUNTIME_API vmcircbuf_createfilemapping : public gr::vmcircbuf +{ +public: // CREATORS vmcircbuf_createfilemapping(int size); virtual ~vmcircbuf_createfilemapping(); #ifdef HAVE_CREATEFILEMAPPING - private: +private: HANDLE d_handle; LPVOID d_first_copy; LPVOID d_second_copy; #endif - }; +}; - /*! - * \brief concrete factory for circular buffers built using mmap and shm_open - */ - class GR_RUNTIME_API vmcircbuf_createfilemapping_factory : public gr::vmcircbuf_factory - { - private: - static gr::vmcircbuf_factory *s_the_factory; +/*! + * \brief concrete factory for circular buffers built using mmap and shm_open + */ +class GR_RUNTIME_API vmcircbuf_createfilemapping_factory : public gr::vmcircbuf_factory +{ +private: + static gr::vmcircbuf_factory* s_the_factory; - public: - static gr::vmcircbuf_factory *singleton(); +public: + static gr::vmcircbuf_factory* singleton(); - virtual const char *name() const { return "gr::vmcircbuf_createfilemapping_factory"; } + virtual const char* name() const { return "gr::vmcircbuf_createfilemapping_factory"; } /*! * \brief return granularity of mapping, typically equal to page size @@ -73,8 +73,8 @@ namespace gr { * * Call this to create a doubly mapped circular buffer. */ - virtual gr::vmcircbuf *make(int size); - }; + virtual gr::vmcircbuf* make(int size); +}; } /* namespace gr */ diff --git a/gnuradio-runtime/lib/vmcircbuf_mmap_shm_open.cc b/gnuradio-runtime/lib/vmcircbuf_mmap_shm_open.cc index 919986c608..3eef159d73 100644 --- a/gnuradio-runtime/lib/vmcircbuf_mmap_shm_open.cc +++ b/gnuradio-runtime/lib/vmcircbuf_mmap_shm_open.cc @@ -42,9 +42,8 @@ namespace gr { - vmcircbuf_mmap_shm_open::vmcircbuf_mmap_shm_open(int size) - : gr::vmcircbuf(size) - { +vmcircbuf_mmap_shm_open::vmcircbuf_mmap_shm_open(int size) : gr::vmcircbuf(size) +{ #if !defined(HAVE_MMAP) || !defined(HAVE_SHM_OPEN) fprintf(stderr, "gr::vmcircbuf_mmap_shm_open: mmap or shm_open is not available\n"); throw std::runtime_error("gr::vmcircbuf_mmap_shm_open"); @@ -53,9 +52,9 @@ namespace gr { static int s_seg_counter = 0; - if(size <= 0 || (size % gr::pagesize ()) != 0) { - fprintf(stderr, "gr::vmcircbuf_mmap_shm_open: invalid size = %d\n", size); - throw std::runtime_error("gr::vmcircbuf_mmap_shm_open"); + if (size <= 0 || (size % gr::pagesize()) != 0) { + fprintf(stderr, "gr::vmcircbuf_mmap_shm_open: invalid size = %d\n", size); + throw std::runtime_error("gr::vmcircbuf_mmap_shm_open"); } int shm_fd = -1; @@ -63,82 +62,89 @@ namespace gr { static bool portable_format = true; // open a new named shared memory segment - while(1) { - if(portable_format) { - - // This is the POSIX recommended "portable format". - // Of course the "portable format" doesn't work on some systems... - - snprintf(seg_name, sizeof(seg_name), - "/gnuradio-%d-%d", getpid(), s_seg_counter); - } - else { - - // Where the "portable format" doesn't work, we try building - // a full filesystem pathname pointing into a suitable temporary directory. - - snprintf(seg_name, sizeof(seg_name), - "%s/gnuradio-%d-%d", gr::tmp_path(), getpid(), s_seg_counter); - } - - shm_fd = shm_open(seg_name, O_RDWR | O_CREAT | O_EXCL, 0600); - if(shm_fd == -1 && errno == EACCES && portable_format) { - portable_format = false; - continue; // try again using "non-portable format" - } - - s_seg_counter++; - - if(shm_fd == -1) { - if(errno == EEXIST) // Named segment already exists (shouldn't happen). Try again - continue; - - char msg[1024]; - snprintf(msg, sizeof(msg), "gr::vmcircbuf_mmap_shm_open: shm_open [%s]", seg_name); - perror(msg); - throw std::runtime_error("gr::vmcircbuf_mmap_shm_open"); - } - break; + while (1) { + if (portable_format) { + + // This is the POSIX recommended "portable format". + // Of course the "portable format" doesn't work on some systems... + + snprintf( + seg_name, sizeof(seg_name), "/gnuradio-%d-%d", getpid(), s_seg_counter); + } else { + + // Where the "portable format" doesn't work, we try building + // a full filesystem pathname pointing into a suitable temporary directory. + + snprintf(seg_name, + sizeof(seg_name), + "%s/gnuradio-%d-%d", + gr::tmp_path(), + getpid(), + s_seg_counter); + } + + shm_fd = shm_open(seg_name, O_RDWR | O_CREAT | O_EXCL, 0600); + if (shm_fd == -1 && errno == EACCES && portable_format) { + portable_format = false; + continue; // try again using "non-portable format" + } + + s_seg_counter++; + + if (shm_fd == -1) { + if (errno == + EEXIST) // Named segment already exists (shouldn't happen). Try again + continue; + + char msg[1024]; + snprintf( + msg, sizeof(msg), "gr::vmcircbuf_mmap_shm_open: shm_open [%s]", seg_name); + perror(msg); + throw std::runtime_error("gr::vmcircbuf_mmap_shm_open"); + } + break; } // We've got a new shared memory segment fd open. // Now set it's length to 2x what we really want and mmap it in. - if(ftruncate(shm_fd, (off_t)2 * size) == -1) { - close(shm_fd); // cleanup - perror("gr::vmcircbuf_mmap_shm_open: ftruncate (1)"); - throw std::runtime_error("gr::vmcircbuf_mmap_shm_open"); + if (ftruncate(shm_fd, (off_t)2 * size) == -1) { + close(shm_fd); // cleanup + perror("gr::vmcircbuf_mmap_shm_open: ftruncate (1)"); + throw std::runtime_error("gr::vmcircbuf_mmap_shm_open"); } - void *first_copy = mmap(0, 2 * size, - PROT_READ | PROT_WRITE, MAP_SHARED, - shm_fd, (off_t) 0); + void* first_copy = + mmap(0, 2 * size, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, (off_t)0); - if(first_copy == MAP_FAILED) { - close(shm_fd); // cleanup - perror("gr::vmcircbuf_mmap_shm_open: mmap (1)"); - throw std::runtime_error("gr::vmcircbuf_mmap_shm_open"); + if (first_copy == MAP_FAILED) { + close(shm_fd); // cleanup + perror("gr::vmcircbuf_mmap_shm_open: mmap (1)"); + throw std::runtime_error("gr::vmcircbuf_mmap_shm_open"); } // unmap the 2nd half - if(munmap ((char *) first_copy + size, size) == -1) { - close(shm_fd); // cleanup - perror("gr::vmcircbuf_mmap_shm_open: munmap (1)"); - throw std::runtime_error("gr::vmcircbuf_mmap_shm_open"); + if (munmap((char*)first_copy + size, size) == -1) { + close(shm_fd); // cleanup + perror("gr::vmcircbuf_mmap_shm_open: munmap (1)"); + throw std::runtime_error("gr::vmcircbuf_mmap_shm_open"); } // map the first half into the now available hole where the // second half used to be. - void *second_copy = mmap((char*)first_copy + size, size, - PROT_READ | PROT_WRITE, MAP_SHARED, - shm_fd, (off_t)0); - - if(second_copy == MAP_FAILED) { - close(shm_fd); // cleanup - perror("gr::vmcircbuf_mmap_shm_open: mmap (2)"); - throw std::runtime_error("gr::vmcircbuf_mmap_shm_open"); + void* second_copy = mmap((char*)first_copy + size, + size, + PROT_READ | PROT_WRITE, + MAP_SHARED, + shm_fd, + (off_t)0); + + if (second_copy == MAP_FAILED) { + close(shm_fd); // cleanup + perror("gr::vmcircbuf_mmap_shm_open: mmap (2)"); + throw std::runtime_error("gr::vmcircbuf_mmap_shm_open"); } -#if 0 // OS/X doesn't allow you to resize the segment +#if 0 // OS/X doesn't allow you to resize the segment // cut the shared memory segment down to size if(ftruncate(shm_fd, (off_t)size) == -1) { @@ -148,61 +154,54 @@ namespace gr { } #endif - close(shm_fd); // fd no longer needed. The mapping is retained. + close(shm_fd); // fd no longer needed. The mapping is retained. - if(shm_unlink(seg_name) == -1) { // unlink the seg_name. - perror("gr::vmcircbuf_mmap_shm_open: shm_unlink"); - throw std::runtime_error("gr::vmcircbuf_mmap_shm_open"); + if (shm_unlink(seg_name) == -1) { // unlink the seg_name. + perror("gr::vmcircbuf_mmap_shm_open: shm_unlink"); + throw std::runtime_error("gr::vmcircbuf_mmap_shm_open"); } // Now remember the important stuff d_base = (char*)first_copy; d_size = size; #endif - } +} - vmcircbuf_mmap_shm_open::~vmcircbuf_mmap_shm_open() - { +vmcircbuf_mmap_shm_open::~vmcircbuf_mmap_shm_open() +{ #if defined(HAVE_MMAP) gr::thread::scoped_lock guard(s_vm_mutex); - if(munmap (d_base, 2 * d_size) == -1) { - perror("gr::vmcircbuf_mmap_shm_open: munmap (2)"); + if (munmap(d_base, 2 * d_size) == -1) { + perror("gr::vmcircbuf_mmap_shm_open: munmap (2)"); } #endif - } +} - // ---------------------------------------------------------------- - // The factory interface - // ---------------------------------------------------------------- +// ---------------------------------------------------------------- +// The factory interface +// ---------------------------------------------------------------- - gr::vmcircbuf_factory *vmcircbuf_mmap_shm_open_factory::s_the_factory = 0; +gr::vmcircbuf_factory* vmcircbuf_mmap_shm_open_factory::s_the_factory = 0; - gr::vmcircbuf_factory * - vmcircbuf_mmap_shm_open_factory::singleton() - { - if(s_the_factory) - return s_the_factory; +gr::vmcircbuf_factory* vmcircbuf_mmap_shm_open_factory::singleton() +{ + if (s_the_factory) + return s_the_factory; s_the_factory = new gr::vmcircbuf_mmap_shm_open_factory(); return s_the_factory; - } +} - int - vmcircbuf_mmap_shm_open_factory::granularity() - { - return gr::pagesize(); - } +int vmcircbuf_mmap_shm_open_factory::granularity() { return gr::pagesize(); } - gr::vmcircbuf * - vmcircbuf_mmap_shm_open_factory::make(int size) - { +gr::vmcircbuf* vmcircbuf_mmap_shm_open_factory::make(int size) +{ try { - return new vmcircbuf_mmap_shm_open(size); - } - catch (...) { - return 0; + return new vmcircbuf_mmap_shm_open(size); + } catch (...) { + return 0; } - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/vmcircbuf_mmap_shm_open.h b/gnuradio-runtime/lib/vmcircbuf_mmap_shm_open.h index 60654ee46e..d0171e6c83 100644 --- a/gnuradio-runtime/lib/vmcircbuf_mmap_shm_open.h +++ b/gnuradio-runtime/lib/vmcircbuf_mmap_shm_open.h @@ -28,29 +28,29 @@ namespace gr { - /*! - * \brief concrete class to implement circular buffers with mmap and shm_open - * \ingroup internal - */ - class GR_RUNTIME_API vmcircbuf_mmap_shm_open : public gr::vmcircbuf - { - public: +/*! + * \brief concrete class to implement circular buffers with mmap and shm_open + * \ingroup internal + */ +class GR_RUNTIME_API vmcircbuf_mmap_shm_open : public gr::vmcircbuf +{ +public: vmcircbuf_mmap_shm_open(int size); virtual ~vmcircbuf_mmap_shm_open(); - }; +}; - /*! - * \brief concrete factory for circular buffers built using mmap and shm_open - */ - class GR_RUNTIME_API vmcircbuf_mmap_shm_open_factory : public gr::vmcircbuf_factory - { - private: - static gr::vmcircbuf_factory *s_the_factory; +/*! + * \brief concrete factory for circular buffers built using mmap and shm_open + */ +class GR_RUNTIME_API vmcircbuf_mmap_shm_open_factory : public gr::vmcircbuf_factory +{ +private: + static gr::vmcircbuf_factory* s_the_factory; - public: - static gr::vmcircbuf_factory *singleton(); +public: + static gr::vmcircbuf_factory* singleton(); - virtual const char *name() const { return "gr::vmcircbuf_mmap_shm_open_factory"; } + virtual const char* name() const { return "gr::vmcircbuf_mmap_shm_open_factory"; } /*! * \brief return granularity of mapping, typically equal to page size @@ -62,8 +62,8 @@ namespace gr { * * Call this to create a doubly mapped circular buffer. */ - virtual gr::vmcircbuf *make(int size); - }; + virtual gr::vmcircbuf* make(int size); +}; } /* namespace gr */ diff --git a/gnuradio-runtime/lib/vmcircbuf_mmap_tmpfile.cc b/gnuradio-runtime/lib/vmcircbuf_mmap_tmpfile.cc index 7a02fe2de8..d9eec36df4 100644 --- a/gnuradio-runtime/lib/vmcircbuf_mmap_tmpfile.cc +++ b/gnuradio-runtime/lib/vmcircbuf_mmap_tmpfile.cc @@ -44,18 +44,17 @@ namespace gr { - vmcircbuf_mmap_tmpfile::vmcircbuf_mmap_tmpfile (int size) - : gr::vmcircbuf (size) - { +vmcircbuf_mmap_tmpfile::vmcircbuf_mmap_tmpfile(int size) : gr::vmcircbuf(size) +{ #if !defined(HAVE_MMAP) fprintf(stderr, "gr::vmcircbuf_mmap_tmpfile: mmap or mkstemp is not available\n"); throw std::runtime_error("gr::vmcircbuf_mmap_tmpfile"); #else gr::thread::scoped_lock guard(s_vm_mutex); - if(size <= 0 || (size % gr::pagesize ()) != 0) { - fprintf(stderr, "gr::vmcircbuf_mmap_tmpfile: invalid size = %d\n", size); - throw std::runtime_error("gr::vmcircbuf_mmap_tmpfile"); + if (size <= 0 || (size % gr::pagesize()) != 0) { + fprintf(stderr, "gr::vmcircbuf_mmap_tmpfile: invalid size = %d\n", size); + throw std::runtime_error("gr::vmcircbuf_mmap_tmpfile"); } int seg_fd = -1; @@ -64,137 +63,135 @@ namespace gr { static int s_seg_counter = 0; // open a temporary file that we'll map in a bit later - while(1) { - snprintf(seg_name, sizeof(seg_name), - "%s/gnuradio-%d-%d-XXXXXX", gr::tmp_path(), getpid(), s_seg_counter); - s_seg_counter++; - - seg_fd = open(seg_name, O_RDWR | O_CREAT | O_EXCL, 0600); - if(seg_fd == -1) { - if(errno == EEXIST) // File already exists (shouldn't happen). Try again - continue; - - char msg[1024]; - snprintf(msg, sizeof (msg), - "gr::vmcircbuf_mmap_tmpfile: open [%s]", seg_name); - perror(msg); - throw std::runtime_error("gr::vmcircbuf_mmap_tmpfile"); - } - break; + while (1) { + snprintf(seg_name, + sizeof(seg_name), + "%s/gnuradio-%d-%d-XXXXXX", + gr::tmp_path(), + getpid(), + s_seg_counter); + s_seg_counter++; + + seg_fd = open(seg_name, O_RDWR | O_CREAT | O_EXCL, 0600); + if (seg_fd == -1) { + if (errno == EEXIST) // File already exists (shouldn't happen). Try again + continue; + + char msg[1024]; + snprintf(msg, sizeof(msg), "gr::vmcircbuf_mmap_tmpfile: open [%s]", seg_name); + perror(msg); + throw std::runtime_error("gr::vmcircbuf_mmap_tmpfile"); + } + break; } - if(unlink (seg_name) == -1) { - perror("gr::vmcircbuf_mmap_tmpfile: unlink"); - throw std::runtime_error ("gr::vmcircbuf_mmap_tmpfile"); + if (unlink(seg_name) == -1) { + perror("gr::vmcircbuf_mmap_tmpfile: unlink"); + throw std::runtime_error("gr::vmcircbuf_mmap_tmpfile"); } // We've got a valid file descriptor to a tmp file. // Now set it's length to 2x what we really want and mmap it in. - if(ftruncate (seg_fd, (off_t) 2 * size) == -1) { - close(seg_fd); // cleanup - perror("gr::vmcircbuf_mmap_tmpfile: ftruncate (1)"); - throw std::runtime_error("gr::vmcircbuf_mmap_tmpfile"); + if (ftruncate(seg_fd, (off_t)2 * size) == -1) { + close(seg_fd); // cleanup + perror("gr::vmcircbuf_mmap_tmpfile: ftruncate (1)"); + throw std::runtime_error("gr::vmcircbuf_mmap_tmpfile"); } - void *first_copy = mmap(0, 2 * size, - PROT_READ | PROT_WRITE, MAP_SHARED, - seg_fd, (off_t)0); + void* first_copy = + mmap(0, 2 * size, PROT_READ | PROT_WRITE, MAP_SHARED, seg_fd, (off_t)0); - if(first_copy == MAP_FAILED) { - close(seg_fd); // cleanup - perror("gr::vmcircbuf_mmap_tmpfile: mmap (1)"); - throw std::runtime_error ("gr::vmcircbuf_mmap_tmpfile"); + if (first_copy == MAP_FAILED) { + close(seg_fd); // cleanup + perror("gr::vmcircbuf_mmap_tmpfile: mmap (1)"); + throw std::runtime_error("gr::vmcircbuf_mmap_tmpfile"); } // unmap the 2nd half - if(munmap ((char *) first_copy + size, size) == -1) { - close(seg_fd); // cleanup - perror("gr::vmcircbuf_mmap_tmpfile: munmap (1)"); - throw std::runtime_error("gr::vmcircbuf_mmap_tmpfile"); + if (munmap((char*)first_copy + size, size) == -1) { + close(seg_fd); // cleanup + perror("gr::vmcircbuf_mmap_tmpfile: munmap (1)"); + throw std::runtime_error("gr::vmcircbuf_mmap_tmpfile"); } // map the first half into the now available hole where the // second half used to be. - void *second_copy = mmap((char*)first_copy + size, size, - PROT_READ | PROT_WRITE, MAP_SHARED, - seg_fd, (off_t)0); - - if(second_copy == MAP_FAILED) { - munmap(first_copy, size); // cleanup - close(seg_fd); - perror("gr::vmcircbuf_mmap_tmpfile: mmap(2)"); - throw std::runtime_error("gr::vmcircbuf_mmap_tmpfile"); + void* second_copy = mmap((char*)first_copy + size, + size, + PROT_READ | PROT_WRITE, + MAP_SHARED, + seg_fd, + (off_t)0); + + if (second_copy == MAP_FAILED) { + munmap(first_copy, size); // cleanup + close(seg_fd); + perror("gr::vmcircbuf_mmap_tmpfile: mmap(2)"); + throw std::runtime_error("gr::vmcircbuf_mmap_tmpfile"); } // check for contiguity - if((char*)second_copy != (char*)first_copy + size) { - munmap(first_copy, size); // cleanup - munmap(second_copy, size); - close(seg_fd); - perror("gr::vmcircbuf_mmap_tmpfile: non-contiguous second copy"); - throw std::runtime_error("gr::vmcircbuf_mmap_tmpfile"); + if ((char*)second_copy != (char*)first_copy + size) { + munmap(first_copy, size); // cleanup + munmap(second_copy, size); + close(seg_fd); + perror("gr::vmcircbuf_mmap_tmpfile: non-contiguous second copy"); + throw std::runtime_error("gr::vmcircbuf_mmap_tmpfile"); } // cut the tmp file down to size - if(ftruncate (seg_fd, (off_t) size) == -1) { - munmap(first_copy, size); // cleanup - munmap(second_copy, size); - close(seg_fd); - perror("gr::vmcircbuf_mmap_tmpfile: ftruncate (2)"); - throw std::runtime_error("gr::vmcircbuf_mmap_tmpfile"); + if (ftruncate(seg_fd, (off_t)size) == -1) { + munmap(first_copy, size); // cleanup + munmap(second_copy, size); + close(seg_fd); + perror("gr::vmcircbuf_mmap_tmpfile: ftruncate (2)"); + throw std::runtime_error("gr::vmcircbuf_mmap_tmpfile"); } - close(seg_fd); // fd no longer needed. The mapping is retained. + close(seg_fd); // fd no longer needed. The mapping is retained. // Now remember the important stuff d_base = (char*)first_copy; d_size = size; #endif - } +} - vmcircbuf_mmap_tmpfile::~vmcircbuf_mmap_tmpfile() - { +vmcircbuf_mmap_tmpfile::~vmcircbuf_mmap_tmpfile() +{ #if defined(HAVE_MMAP) gr::thread::scoped_lock guard(s_vm_mutex); - if(munmap(d_base, 2 * d_size) == -1) { - perror("gr::vmcircbuf_mmap_tmpfile: munmap(2)"); + if (munmap(d_base, 2 * d_size) == -1) { + perror("gr::vmcircbuf_mmap_tmpfile: munmap(2)"); } #endif - } +} - // ---------------------------------------------------------------- - // The factory interface - // ---------------------------------------------------------------- +// ---------------------------------------------------------------- +// The factory interface +// ---------------------------------------------------------------- - gr::vmcircbuf_factory *vmcircbuf_mmap_tmpfile_factory::s_the_factory = 0; +gr::vmcircbuf_factory* vmcircbuf_mmap_tmpfile_factory::s_the_factory = 0; - gr::vmcircbuf_factory * - vmcircbuf_mmap_tmpfile_factory::singleton() - { - if(s_the_factory) - return s_the_factory; +gr::vmcircbuf_factory* vmcircbuf_mmap_tmpfile_factory::singleton() +{ + if (s_the_factory) + return s_the_factory; s_the_factory = new gr::vmcircbuf_mmap_tmpfile_factory(); return s_the_factory; - } +} - int - vmcircbuf_mmap_tmpfile_factory::granularity() - { - return gr::pagesize(); - } +int vmcircbuf_mmap_tmpfile_factory::granularity() { return gr::pagesize(); } - gr::vmcircbuf * - vmcircbuf_mmap_tmpfile_factory::make(int size) - { +gr::vmcircbuf* vmcircbuf_mmap_tmpfile_factory::make(int size) +{ try { - return new vmcircbuf_mmap_tmpfile(size); - } - catch (...) { - return 0; + return new vmcircbuf_mmap_tmpfile(size); + } catch (...) { + return 0; } - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/vmcircbuf_mmap_tmpfile.h b/gnuradio-runtime/lib/vmcircbuf_mmap_tmpfile.h index f8959c5736..4f4ae64090 100644 --- a/gnuradio-runtime/lib/vmcircbuf_mmap_tmpfile.h +++ b/gnuradio-runtime/lib/vmcircbuf_mmap_tmpfile.h @@ -28,29 +28,29 @@ namespace gr { - /*! - * \brief concrete class to implement circular buffers with mmap and shm_open - * \ingroup internal - */ - class GR_RUNTIME_API vmcircbuf_mmap_tmpfile : public gr::vmcircbuf - { - public: +/*! + * \brief concrete class to implement circular buffers with mmap and shm_open + * \ingroup internal + */ +class GR_RUNTIME_API vmcircbuf_mmap_tmpfile : public gr::vmcircbuf +{ +public: vmcircbuf_mmap_tmpfile(int size); virtual ~vmcircbuf_mmap_tmpfile(); - }; +}; - /*! - * \brief concrete factory for circular buffers built using mmap and shm_open - */ - class GR_RUNTIME_API vmcircbuf_mmap_tmpfile_factory : public gr::vmcircbuf_factory - { - private: - static gr::vmcircbuf_factory *s_the_factory; +/*! + * \brief concrete factory for circular buffers built using mmap and shm_open + */ +class GR_RUNTIME_API vmcircbuf_mmap_tmpfile_factory : public gr::vmcircbuf_factory +{ +private: + static gr::vmcircbuf_factory* s_the_factory; - public: - static gr::vmcircbuf_factory *singleton(); +public: + static gr::vmcircbuf_factory* singleton(); - virtual const char *name() const { return "gr::vmcircbuf_mmap_tmpfile_factory"; } + virtual const char* name() const { return "gr::vmcircbuf_mmap_tmpfile_factory"; } /*! * \brief return granularity of mapping, typically equal to page size @@ -62,8 +62,8 @@ namespace gr { * * Call this to create a doubly mapped circular buffer. */ - virtual gr::vmcircbuf *make(int size); - }; + virtual gr::vmcircbuf* make(int size); +}; } /* namespace gr */ diff --git a/gnuradio-runtime/lib/vmcircbuf_prefs.cc b/gnuradio-runtime/lib/vmcircbuf_prefs.cc index 4cb09f69f8..80c36f189f 100644 --- a/gnuradio-runtime/lib/vmcircbuf_prefs.cc +++ b/gnuradio-runtime/lib/vmcircbuf_prefs.cc @@ -41,77 +41,73 @@ namespace fs = boost::filesystem; namespace gr { - /* - * The simplest thing that could possibly work: - * the key is the filename; the value is the file contents. - */ - - static std::string - pathname(const char *key) - { +/* + * The simplest thing that could possibly work: + * the key is the filename; the value is the file contents. + */ + +static std::string pathname(const char* key) +{ static fs::path path; - path = fs::path(gr::appdata_path()) / ".gnuradio" / "prefs" / key; + path = fs::path(gr::appdata_path()) / ".gnuradio" / "prefs" / key; return path.string(); - } +} - static void - ensure_dir_path() - { +static void ensure_dir_path() +{ fs::path path = fs::path(gr::appdata_path()) / ".gnuradio"; - if(!fs::is_directory(path)) - fs::create_directory(path); + if (!fs::is_directory(path)) + fs::create_directory(path); path = path / "prefs"; - if(!fs::is_directory(path)) - fs::create_directory(path); - } + if (!fs::is_directory(path)) + fs::create_directory(path); +} - int - vmcircbuf_prefs::get(const char *key, char *value, int value_size) - { +int vmcircbuf_prefs::get(const char* key, char* value, int value_size) +{ gr::thread::scoped_lock guard(s_vm_mutex); - FILE *fp = fopen(pathname (key).c_str(), "r"); - if(fp == 0) { - perror(pathname (key).c_str()); - return 0; + FILE* fp = fopen(pathname(key).c_str(), "r"); + if (fp == 0) { + perror(pathname(key).c_str()); + return 0; } const size_t ret = fread(value, 1, value_size - 1, fp); value[ret] = '\0'; - if(ret == 0 && !feof(fp)) { - if(ferror(fp) != 0) { - perror(pathname (key).c_str()); - fclose(fp); - return -1; - } + if (ret == 0 && !feof(fp)) { + if (ferror(fp) != 0) { + perror(pathname(key).c_str()); + fclose(fp); + return -1; + } } fclose(fp); return ret; - } +} - void - vmcircbuf_prefs::set(const char *key, const char *value) - { +void vmcircbuf_prefs::set(const char* key, const char* value) +{ gr::thread::scoped_lock guard(s_vm_mutex); ensure_dir_path(); - FILE *fp = fopen(pathname(key).c_str(), "w"); - if(fp == 0) { - perror(pathname (key).c_str()); - return; + FILE* fp = fopen(pathname(key).c_str(), "w"); + if (fp == 0) { + perror(pathname(key).c_str()); + return; } size_t ret = fwrite(value, 1, strlen(value), fp); - if(ret == 0) { - if(ferror(fp) != 0) { - perror(pathname (key).c_str()); - fclose(fp); - return; - } + if (ret == 0) { + if (ferror(fp) != 0) { + perror(pathname(key).c_str()); + fclose(fp); + return; + } } fclose(fp); - }; +}; } /* namespace gr */ diff --git a/gnuradio-runtime/lib/vmcircbuf_prefs.h b/gnuradio-runtime/lib/vmcircbuf_prefs.h index ec7b6991d7..d267393298 100644 --- a/gnuradio-runtime/lib/vmcircbuf_prefs.h +++ b/gnuradio-runtime/lib/vmcircbuf_prefs.h @@ -27,12 +27,12 @@ namespace gr { - class GR_RUNTIME_API vmcircbuf_prefs - { - public: - static int get(const char *key, char *value, int value_size); - static void set(const char *key, const char *value); - }; +class GR_RUNTIME_API vmcircbuf_prefs +{ +public: + static int get(const char* key, char* value, int value_size); + static void set(const char* key, const char* value); +}; } /* namespace gr */ diff --git a/gnuradio-runtime/lib/vmcircbuf_sysv_shm.cc b/gnuradio-runtime/lib/vmcircbuf_sysv_shm.cc index c3681280d6..7f1ccd2d7b 100644 --- a/gnuradio-runtime/lib/vmcircbuf_sysv_shm.cc +++ b/gnuradio-runtime/lib/vmcircbuf_sysv_shm.cc @@ -44,9 +44,8 @@ namespace gr { - vmcircbuf_sysv_shm::vmcircbuf_sysv_shm(int size) - : gr::vmcircbuf(size) - { +vmcircbuf_sysv_shm::vmcircbuf_sysv_shm(int size) : gr::vmcircbuf(size) +{ #if !defined(HAVE_SYS_SHM_H) fprintf(stderr, "gr::vmcircbuf_sysv_shm: sysv shared memory is not available\n"); throw std::runtime_error("gr::vmcircbuf_sysv_shm"); @@ -56,46 +55,48 @@ namespace gr { int pagesize = gr::pagesize(); - if(size <= 0 || (size % pagesize) != 0) { - fprintf(stderr, "gr::vmcircbuf_sysv_shm: invalid size = %d\n", size); - throw std::runtime_error("gr::vmcircbuf_sysv_shm"); + if (size <= 0 || (size % pagesize) != 0) { + fprintf(stderr, "gr::vmcircbuf_sysv_shm: invalid size = %d\n", size); + throw std::runtime_error("gr::vmcircbuf_sysv_shm"); } // Attempt to allocate buffers (handle bad_alloc errors) int attempts_remain(MAX_SYSV_SHM_ATTEMPTS); - while(attempts_remain-- > 0){ + while (attempts_remain-- > 0) { int shmid_guard = -1; int shmid1 = -1; int shmid2 = -1; - // We use this as a guard page. We'll map it read-only on both ends of the buffer. - // Ideally we'd map it no access, but I don't think that's possible with SysV - if((shmid_guard = shmget(IPC_PRIVATE, pagesize, IPC_CREAT | 0400)) == -1) { - perror("gr::vmcircbuf_sysv_shm: shmget (0)"); - continue; + // We use this as a guard page. We'll map it read-only on both ends of the + // buffer. Ideally we'd map it no access, but I don't think that's possible with + // SysV + if ((shmid_guard = shmget(IPC_PRIVATE, pagesize, IPC_CREAT | 0400)) == -1) { + perror("gr::vmcircbuf_sysv_shm: shmget (0)"); + continue; } - if((shmid2 = shmget(IPC_PRIVATE, 2 * size + 2 * pagesize, IPC_CREAT | 0700)) == -1) { - perror("gr::vmcircbuf_sysv_shm: shmget (1)"); - shmctl(shmid_guard, IPC_RMID, 0); - continue; + if ((shmid2 = shmget(IPC_PRIVATE, 2 * size + 2 * pagesize, IPC_CREAT | 0700)) == + -1) { + perror("gr::vmcircbuf_sysv_shm: shmget (1)"); + shmctl(shmid_guard, IPC_RMID, 0); + continue; } - if((shmid1 = shmget(IPC_PRIVATE, size, IPC_CREAT | 0700)) == -1) { - perror("gr::vmcircbuf_sysv_shm: shmget (2)"); - shmctl(shmid_guard, IPC_RMID, 0); - shmctl(shmid2, IPC_RMID, 0); - continue; + if ((shmid1 = shmget(IPC_PRIVATE, size, IPC_CREAT | 0700)) == -1) { + perror("gr::vmcircbuf_sysv_shm: shmget (2)"); + shmctl(shmid_guard, IPC_RMID, 0); + shmctl(shmid2, IPC_RMID, 0); + continue; } - void *first_copy = shmat (shmid2, 0, 0); - if(first_copy == (void *) -1) { - perror("gr::vmcircbuf_sysv_shm: shmat (1)"); - shmctl(shmid_guard, IPC_RMID, 0); - shmctl(shmid2, IPC_RMID, 0); - shmctl(shmid1, IPC_RMID, 0); - continue; + void* first_copy = shmat(shmid2, 0, 0); + if (first_copy == (void*)-1) { + perror("gr::vmcircbuf_sysv_shm: shmat (1)"); + shmctl(shmid_guard, IPC_RMID, 0); + shmctl(shmid2, IPC_RMID, 0); + shmctl(shmid1, IPC_RMID, 0); + continue; } shmctl(shmid2, IPC_RMID, 0); @@ -110,40 +111,41 @@ namespace gr { shmdt(first_copy); // first read-only guard page - if(shmat(shmid_guard, first_copy, SHM_RDONLY) == (void *) -1) { - perror("gr::vmcircbuf_sysv_shm: shmat (2)"); - shmctl(shmid_guard, IPC_RMID, 0); - shmctl(shmid1, IPC_RMID, 0); - continue; + if (shmat(shmid_guard, first_copy, SHM_RDONLY) == (void*)-1) { + perror("gr::vmcircbuf_sysv_shm: shmat (2)"); + shmctl(shmid_guard, IPC_RMID, 0); + shmctl(shmid1, IPC_RMID, 0); + continue; } // first copy - if(shmat (shmid1, (char*)first_copy + pagesize, 0) == (void *) -1) { - perror("gr::vmcircbuf_sysv_shm: shmat (3)"); - shmctl(shmid_guard, IPC_RMID, 0); - shmctl(shmid1, IPC_RMID, 0); - shmdt(first_copy); - continue; + if (shmat(shmid1, (char*)first_copy + pagesize, 0) == (void*)-1) { + perror("gr::vmcircbuf_sysv_shm: shmat (3)"); + shmctl(shmid_guard, IPC_RMID, 0); + shmctl(shmid1, IPC_RMID, 0); + shmdt(first_copy); + continue; } // second copy - if(shmat (shmid1, (char*)first_copy + pagesize + size, 0) == (void *) -1) { - perror("gr::vmcircbuf_sysv_shm: shmat (4)"); - shmctl(shmid_guard, IPC_RMID, 0); - shmctl(shmid1, IPC_RMID, 0); - shmdt((char *)first_copy + pagesize); - continue; + if (shmat(shmid1, (char*)first_copy + pagesize + size, 0) == (void*)-1) { + perror("gr::vmcircbuf_sysv_shm: shmat (4)"); + shmctl(shmid_guard, IPC_RMID, 0); + shmctl(shmid1, IPC_RMID, 0); + shmdt((char*)first_copy + pagesize); + continue; } // second read-only guard page - if(shmat(shmid_guard, (char*)first_copy + pagesize + 2 * size, SHM_RDONLY) == (void *) -1) { - perror("gr::vmcircbuf_sysv_shm: shmat (5)"); - shmctl(shmid_guard, IPC_RMID, 0); - shmctl(shmid1, IPC_RMID, 0); - shmdt(first_copy); - shmdt((char *)first_copy + pagesize); - shmdt((char *)first_copy + pagesize + size); - continue; + if (shmat(shmid_guard, (char*)first_copy + pagesize + 2 * size, SHM_RDONLY) == + (void*)-1) { + perror("gr::vmcircbuf_sysv_shm: shmat (5)"); + shmctl(shmid_guard, IPC_RMID, 0); + shmctl(shmid1, IPC_RMID, 0); + shmdt(first_copy); + shmdt((char*)first_copy + pagesize); + shmdt((char*)first_copy + pagesize + size); + continue; } shmctl(shmid1, IPC_RMID, 0); @@ -154,57 +156,48 @@ namespace gr { d_size = size; break; } - if(attempts_remain<0){ + if (attempts_remain < 0) { throw std::runtime_error("gr::vmcircbuf_sysv_shm"); } #endif - } +} - vmcircbuf_sysv_shm::~vmcircbuf_sysv_shm() - { +vmcircbuf_sysv_shm::~vmcircbuf_sysv_shm() +{ #if defined(HAVE_SYS_SHM_H) gr::thread::scoped_lock guard(s_vm_mutex); - if(shmdt(d_base - gr::pagesize()) == -1 - || shmdt(d_base) == -1 - || shmdt(d_base + d_size) == -1 - || shmdt(d_base + 2 * d_size) == -1){ - perror("gr::vmcircbuf_sysv_shm: shmdt (2)"); + if (shmdt(d_base - gr::pagesize()) == -1 || shmdt(d_base) == -1 || + shmdt(d_base + d_size) == -1 || shmdt(d_base + 2 * d_size) == -1) { + perror("gr::vmcircbuf_sysv_shm: shmdt (2)"); } #endif - } +} - // ---------------------------------------------------------------- - // The factory interface - // ---------------------------------------------------------------- +// ---------------------------------------------------------------- +// The factory interface +// ---------------------------------------------------------------- - gr::vmcircbuf_factory *vmcircbuf_sysv_shm_factory::s_the_factory = 0; +gr::vmcircbuf_factory* vmcircbuf_sysv_shm_factory::s_the_factory = 0; - gr::vmcircbuf_factory * - vmcircbuf_sysv_shm_factory::singleton() - { - if(s_the_factory) - return s_the_factory; +gr::vmcircbuf_factory* vmcircbuf_sysv_shm_factory::singleton() +{ + if (s_the_factory) + return s_the_factory; s_the_factory = new gr::vmcircbuf_sysv_shm_factory(); return s_the_factory; - } +} - int - vmcircbuf_sysv_shm_factory::granularity() - { - return gr::pagesize(); - } +int vmcircbuf_sysv_shm_factory::granularity() { return gr::pagesize(); } - gr::vmcircbuf * - vmcircbuf_sysv_shm_factory::make(int size) - { +gr::vmcircbuf* vmcircbuf_sysv_shm_factory::make(int size) +{ try { - return new vmcircbuf_sysv_shm(size); - } - catch (...) { - return 0; + return new vmcircbuf_sysv_shm(size); + } catch (...) { + return 0; } - } +} } /* namespace gr */ diff --git a/gnuradio-runtime/lib/vmcircbuf_sysv_shm.h b/gnuradio-runtime/lib/vmcircbuf_sysv_shm.h index 08e0040bf1..461d60544e 100644 --- a/gnuradio-runtime/lib/vmcircbuf_sysv_shm.h +++ b/gnuradio-runtime/lib/vmcircbuf_sysv_shm.h @@ -28,29 +28,29 @@ namespace gr { - /*! - * \brief concrete class to implement circular buffers with mmap and shm_open - * \ingroup internal - */ - class GR_RUNTIME_API vmcircbuf_sysv_shm : public gr::vmcircbuf - { - public: +/*! + * \brief concrete class to implement circular buffers with mmap and shm_open + * \ingroup internal + */ +class GR_RUNTIME_API vmcircbuf_sysv_shm : public gr::vmcircbuf +{ +public: vmcircbuf_sysv_shm(int size); - virtual ~vmcircbuf_sysv_shm(); - }; + virtual ~vmcircbuf_sysv_shm(); +}; - /*! - * \brief concrete factory for circular buffers built using mmap and shm_open - */ - class GR_RUNTIME_API vmcircbuf_sysv_shm_factory : public gr::vmcircbuf_factory - { - private: - static gr::vmcircbuf_factory *s_the_factory; +/*! + * \brief concrete factory for circular buffers built using mmap and shm_open + */ +class GR_RUNTIME_API vmcircbuf_sysv_shm_factory : public gr::vmcircbuf_factory +{ +private: + static gr::vmcircbuf_factory* s_the_factory; - public: - static gr::vmcircbuf_factory *singleton(); +public: + static gr::vmcircbuf_factory* singleton(); - virtual const char *name() const { return "gr::vmcircbuf_sysv_shm_factory"; } + virtual const char* name() const { return "gr::vmcircbuf_sysv_shm_factory"; } /*! * \brief return granularity of mapping, typically equal to page size @@ -62,8 +62,8 @@ namespace gr { * * Call this to create a doubly mapped circular buffer. */ - virtual gr::vmcircbuf *make(int size); - }; + virtual gr::vmcircbuf* make(int size); +}; } /* namespace gr */ |