diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/usrp_uhd/device.hpp | 2 | ||||
-rw-r--r-- | include/usrp_uhd/gain_handler.hpp | 20 | ||||
-rw-r--r-- | include/usrp_uhd/props.hpp | 4 | ||||
-rw-r--r-- | include/usrp_uhd/usrp/dboard/base.hpp | 16 | ||||
-rw-r--r-- | include/usrp_uhd/usrp/mboard/base.hpp | 4 | ||||
-rw-r--r-- | include/usrp_uhd/usrp/mboard/test.hpp | 4 | ||||
-rw-r--r-- | include/usrp_uhd/usrp/mboard/usrp2.hpp | 4 | ||||
-rw-r--r-- | include/usrp_uhd/usrp/usrp.hpp | 4 | ||||
-rw-r--r-- | include/usrp_uhd/utils.hpp | 4 | ||||
-rw-r--r-- | include/usrp_uhd/wax.hpp | 170 |
10 files changed, 130 insertions, 102 deletions
diff --git a/include/usrp_uhd/device.hpp b/include/usrp_uhd/device.hpp index b2627f887..e0356feb0 100644 --- a/include/usrp_uhd/device.hpp +++ b/include/usrp_uhd/device.hpp @@ -82,7 +82,7 @@ public: virtual void recv_raw(const recv_args_t &) = 0; //connect dsps and subdevs - void connect(const wax::type &src, const wax::type &sink); + void connect(const wax::obj &src, const wax::obj &sink); }; } //namespace usrp_uhd diff --git a/include/usrp_uhd/gain_handler.hpp b/include/usrp_uhd/gain_handler.hpp index e036ab701..22e987803 100644 --- a/include/usrp_uhd/gain_handler.hpp +++ b/include/usrp_uhd/gain_handler.hpp @@ -51,7 +51,7 @@ public: * Ensures that the gain name is valid. * \return true for handled, false to pass on */ - bool intercept_get(const wax::type &key, wax::type &val); + bool intercept_get(const wax::obj &key, wax::obj &val); /*! * Intercept sets for overall gain. @@ -59,16 +59,16 @@ public: * Ensures that the new gain is within range. * \return true for handled, false to pass on */ - bool intercept_set(const wax::type &key, const wax::type &val); + bool intercept_set(const wax::obj &key, const wax::obj &val); private: wax::obj::ptr _wax_obj_ptr; - wax::type _gain_prop; - wax::type _gain_min_prop; - wax::type _gain_max_prop; - wax::type _gain_step_prop; - wax::type _gain_names_prop; + wax::obj _gain_prop; + wax::obj _gain_min_prop; + wax::obj _gain_max_prop; + wax::obj _gain_step_prop; + wax::obj _gain_names_prop; /*! * Verify that the key is valid: @@ -76,14 +76,14 @@ private: * If the name if not valid, throw a std::invalid_argument. * The name can only be valid if its in the list of gain names. */ - void _check_key(const wax::type &key); + void _check_key(const wax::obj &key); /* * Private interface to test if two wax types are equal: * The constructor will bind an instance of this for a specific type. * This bound equals functions allows the intercept methods to be non-templated. */ - template <class T> static bool is_equal(const wax::type &a, const wax::type &b){ + template <class T> static bool is_equal(const wax::obj &a, const wax::obj &b){ try{ return wax::cast<T>(a) == wax::cast<T>(b); } @@ -91,7 +91,7 @@ private: return false; } } - boost::function<bool(const wax::type &, const wax::type &)> _is_equal; + boost::function<bool(const wax::obj &, const wax::obj &)> _is_equal; }; diff --git a/include/usrp_uhd/props.hpp b/include/usrp_uhd/props.hpp index 6370bdd28..de3280969 100644 --- a/include/usrp_uhd/props.hpp +++ b/include/usrp_uhd/props.hpp @@ -42,14 +42,14 @@ namespace usrp_uhd{ //typedef for handling named properties typedef std::vector<std::string> prop_names_t; - typedef boost::tuple<wax::type, std::string> named_prop_t; + typedef boost::tuple<wax::obj, std::string> named_prop_t; /*! * Utility function to separate a named property into its components. * \param key a reference to the prop object * \param name a reference to the name object */ - inline named_prop_t extract_named_prop(const wax::type &key, const std::string &name = ""){ + inline named_prop_t extract_named_prop(const wax::obj &key, const std::string &name = ""){ if (key.type() == typeid(named_prop_t)){ return wax::cast<named_prop_t>(key); } diff --git a/include/usrp_uhd/usrp/dboard/base.hpp b/include/usrp_uhd/usrp/dboard/base.hpp index 161d47a9e..50896b9a8 100644 --- a/include/usrp_uhd/usrp/dboard/base.hpp +++ b/include/usrp_uhd/usrp/dboard/base.hpp @@ -43,10 +43,10 @@ public: virtual ~base(void); //interface - virtual void rx_get(const wax::type &key, wax::type &val) = 0; - virtual void rx_set(const wax::type &key, const wax::type &val) = 0; - virtual void tx_get(const wax::type &key, wax::type &val) = 0; - virtual void tx_set(const wax::type &key, const wax::type &val) = 0; + virtual void rx_get(const wax::obj &key, wax::obj &val) = 0; + virtual void rx_set(const wax::obj &key, const wax::obj &val) = 0; + virtual void tx_get(const wax::obj &key, wax::obj &val) = 0; + virtual void tx_set(const wax::obj &key, const wax::obj &val) = 0; protected: std::string get_subdev_name(void); @@ -84,8 +84,8 @@ public: virtual ~rx_base(void); //override here so the derived classes cannot - void tx_get(const wax::type &key, wax::type &val); - void tx_set(const wax::type &key, const wax::type &val); + void tx_get(const wax::obj &key, wax::obj &val); + void tx_set(const wax::obj &key, const wax::obj &val); }; /*! @@ -102,8 +102,8 @@ public: virtual ~tx_base(void); //override here so the derived classes cannot - void rx_get(const wax::type &key, wax::type &val); - void rx_set(const wax::type &key, const wax::type &val); + void rx_get(const wax::obj &key, wax::obj &val); + void rx_set(const wax::obj &key, const wax::obj &val); }; }}} //namespace diff --git a/include/usrp_uhd/usrp/mboard/base.hpp b/include/usrp_uhd/usrp/mboard/base.hpp index 59236dce9..65810f329 100644 --- a/include/usrp_uhd/usrp/mboard/base.hpp +++ b/include/usrp_uhd/usrp/mboard/base.hpp @@ -36,8 +36,8 @@ public: //TODO other api calls private: - virtual void get(const wax::type &, wax::type &) = 0; - virtual void set(const wax::type &, const wax::type &) = 0; + virtual void get(const wax::obj &, wax::obj &) = 0; + virtual void set(const wax::obj &, const wax::obj &) = 0; }; }}} //namespace diff --git a/include/usrp_uhd/usrp/mboard/test.hpp b/include/usrp_uhd/usrp/mboard/test.hpp index 75e1f838f..fc1ea6e70 100644 --- a/include/usrp_uhd/usrp/mboard/test.hpp +++ b/include/usrp_uhd/usrp/mboard/test.hpp @@ -35,8 +35,8 @@ public: ~test(void); private: - void get(const wax::type &, wax::type &); - void set(const wax::type &, const wax::type &); + void get(const wax::obj &, wax::obj &); + void set(const wax::obj &, const wax::obj &); std::map<std::string, dboard::manager::sptr> _dboard_managers; }; diff --git a/include/usrp_uhd/usrp/mboard/usrp2.hpp b/include/usrp_uhd/usrp/mboard/usrp2.hpp index ea0083bc4..a8e950d93 100644 --- a/include/usrp_uhd/usrp/mboard/usrp2.hpp +++ b/include/usrp_uhd/usrp/mboard/usrp2.hpp @@ -42,8 +42,8 @@ public: ~usrp2(void); private: - void get(const wax::type &, wax::type &); - void set(const wax::type &, const wax::type &); + void get(const wax::obj &, wax::obj &); + void set(const wax::obj &, const wax::obj &); std::map<std::string, dboard::manager::sptr> _dboard_managers; }; diff --git a/include/usrp_uhd/usrp/usrp.hpp b/include/usrp_uhd/usrp/usrp.hpp index a8cd1dc7c..a8a052b52 100644 --- a/include/usrp_uhd/usrp/usrp.hpp +++ b/include/usrp_uhd/usrp/usrp.hpp @@ -39,8 +39,8 @@ public: void recv_raw(const recv_args_t &); private: - void get(const wax::type &, wax::type &); - void set(const wax::type &, const wax::type &); + void get(const wax::obj &, wax::obj &); + void set(const wax::obj &, const wax::obj &); std::map<std::string, mboard::base::sptr> _mboards; boost::function<void(const device::send_args_t &)> _send_raw_cb; diff --git a/include/usrp_uhd/utils.hpp b/include/usrp_uhd/utils.hpp index 6a2848b96..a8f1c132d 100644 --- a/include/usrp_uhd/utils.hpp +++ b/include/usrp_uhd/utils.hpp @@ -48,11 +48,11 @@ template<typename T> T signum(T n){ inline void tune( freq_t target_freq, freq_t lo_offset, - wax::proxy subdev_freq_proxy, + wax::obj subdev_freq_proxy, bool subdev_quadrature, bool subdev_spectrum_inverted, bool subdev_is_tx, - wax::proxy dsp_freq_proxy, + wax::obj dsp_freq_proxy, freq_t dsp_sample_rate ){ // Ask the d'board to tune as closely as it can to target_freq+lo_offset diff --git a/include/usrp_uhd/wax.hpp b/include/usrp_uhd/wax.hpp index c8a671a61..f0e7a3acc 100644 --- a/include/usrp_uhd/wax.hpp +++ b/include/usrp_uhd/wax.hpp @@ -19,21 +19,18 @@ #define INCLUDED_WAX_HPP #include <boost/any.hpp> -#include <boost/function.hpp> #include <boost/shared_ptr.hpp> -#include <boost/weak_ptr.hpp> -#include <boost/pointer_cast.hpp> #include <iostream> /*! * WAX - it's a metaphor! * - * The WAX framework allows object to have generic/anytype properties. - * These properties can be addressed through generic/anytype identifiers. + * The WAX framework allows object to have generic/anyobj properties. + * These properties can be addressed through generic/anyobj identifiers. * A property of a WAX object may even be another WAX object. * * When a property is a WAX object, the returned value must be an obj pointer. - * A WAX object provides two types of pointers: obj::ptr and obj::sptr. + * A WAX object provides two objs of pointers: obj::ptr and obj::sptr. * The choice of pointer vs smart pointer depends on the owner of the memory. * * Proprties may be referenced though the [] overloaded operator. @@ -42,101 +39,132 @@ * my_obj[prop1][prop2][prop3] = value * value = my_obj[prop1][prop2][prop3] * - * Any value returned from an access operation is of wax::type. - * To use this value, it must be cast with wax::cast<new_type>(value). + * Any value returned from an access operation is of wax::obj. + * To use this value, it must be cast with wax::cast<new_obj>(value). */ namespace wax{ - //general typedefs - typedef boost::any type; typedef boost::bad_any_cast bad_cast; - //dummy class declarations - class obj; class proxy; - /*! * WAX object base class: - * A wax object subclass should override the set and get methods. - * The magic of operator chaining is handled by the [] operator. + * + * A wax obj has two major purposes: + * 1) to act as a polymorphic container, just like boost any + * 2) to provide a nested set/get properties interface + * + * Internally, the polymorphic container is handled by a boost any. + * For properties, a subclass should override the set and get methods. + * For property nesting, wax obj subclasses return special links + * to other wax obj subclasses, and the api handles the magic. */ class obj{ public: //obj pointer typedefs typedef boost::shared_ptr<obj> sptr; - typedef obj* ptr; + typedef obj* ptr; - //cast derived pointer to obj base class pointer - template <class T> static sptr cast(boost::shared_ptr<T> r){ - return boost::static_pointer_cast<obj>(r); - } - template <class T> static ptr cast(T *r){ - return dynamic_cast<ptr>(r); - } - - //structors + /*! + * Default constructor: + * The contents will be empty. + */ obj(void); - virtual ~obj(void); - //public interface - proxy operator[](const type &key); - - private: - //private interface - virtual void get(const type &key, type &val) = 0; - virtual void set(const type &key, const type &val) = 0; - }; + /*! + * Copy constructor: + * The contents will be cloned. + * \param o another wax::obj + */ + obj(const obj &o); + + /*! + * Templated any type constructor: + * The contents can be anything. + * Uses the boost::any to handle the magic. + * \param o an object of any type + */ + template<class T> obj(const T &o){ + _contents = o; + } - /*! - * WAX proxy class: - * Allows the obj [] operator to return a proxy result. - * This result can be assigned to via the = operator. - * Or this result can be called again with the [] operator. - */ - class proxy{ - public: - //destructors - ~proxy(void); + /*! + * Destructor. + */ + virtual ~obj(void); - //overloaded - type operator()(void); - proxy operator[](const type &key); - proxy operator=(const type &key); + /*! + * The chaining operator: + * This operator allows access objs with properties. + * A call to the [] operator will return a new proxy obj. + * The proxy object is an obj with special proxy contents. + * Assignment and casting can be used on this special object + * to access the property referenced by the obj key. + * \param key a key to identify a property within this obj + * \return a special wax obj that proxies the obj and key + */ + obj operator[](const obj &key); + + /*! + * The assignment operator: + * This operator allows for assignment of new contents. + * In the special case where this obj contains a proxy, + * the value will be set to the proxy's property reference. + * \param val the new value to assign to the wax obj + * \return a reference to this obj (*this) + */ + obj & operator=(const obj &val); + + /*! + * Get a link in the chain: + * When a wax obj returns another wax obj as part of a get call, + * the return value should be set to the result of this method. + * Doing so will ensure chain-ability of the returned object. + * \return an obj containing a valid link to a wax obj + */ + obj get_link(void) const; + + /*! + * Get the type of the contents of this obj. + * \return a reference to the type_info + */ + const std::type_info & type(void) const; private: - //typedefs for callables from the object that built this proxy - typedef boost::function<void(const type &)> setter_t; - typedef boost::function<void(type &)> getter_t; + //private interface (override in subclasses) + virtual void get(const obj &, obj &); + virtual void set(const obj &, const obj &); + + /*! + * Resolve the contents of this obj. + * In the case where this obj is a proxy, + * the referenced property will be resolved. + * Otherwise, just get the private contents. + * \return a boost any type with contents + */ + boost::any resolve(void) const; + template<class T> friend T cast(const obj &); + + //private contents of this obj + boost::any _contents; - //private contructor - proxy(getter_t, setter_t); - //access to private contructor - friend proxy obj::operator[](const type &key); - - getter_t d_getter; - setter_t d_setter; }; /*! - * Cast a wax::type into the desired type - * Usage wax::cast<new_type>(my_value). + * Cast a wax::obj into the desired obj. + * Usage wax::cast<new_obj>(my_value). * - * \param val the any type to cast - * \return data of the desired type + * \param val the obj to cast + * \return an object of the desired type * \throw wax::bad_cast when the cast fails */ - template<typename T> T cast(const type & val){ - //special case to handle the proxy - if (val.type() == typeid(proxy)){ - return cast<T>(boost::any_cast<proxy>(val)()); - } - //do the type cast - return boost::any_cast<T>(val); + template<class T> T cast(const obj &val){ + return boost::any_cast<T>(val.resolve()); } } //namespace wax -//ability to use types with stream operators -std::ostream& operator<<(std::ostream &os, const wax::type &x); +//ability to use wax::obj with stream operators +std::ostream& operator<<(std::ostream &, const wax::obj &); #endif /* INCLUDED_WAX_HPP */ |