diff options
-rw-r--r-- | include/gnuradio/element.hpp | 10 | ||||
-rw-r--r-- | lib/element.cpp | 3 | ||||
-rw-r--r-- | swig/sw_runtime.i | 9 |
3 files changed, 14 insertions, 8 deletions
diff --git a/include/gnuradio/element.hpp b/include/gnuradio/element.hpp index 51c79b8..4cad346 100644 --- a/include/gnuradio/element.hpp +++ b/include/gnuradio/element.hpp @@ -21,6 +21,7 @@ #include <gnuradio/io_signature.hpp> #include <boost/shared_ptr.hpp> #include <boost/weak_ptr.hpp> +#include <boost/enable_shared_from_this.hpp> //this is part of core for now, treat it as such #include <gr_core_api.h> @@ -31,7 +32,7 @@ namespace gnuradio struct ElementImpl; -struct GR_RUNTIME_API Element : boost::shared_ptr<ElementImpl> +struct GR_RUNTIME_API Element : boost::shared_ptr<ElementImpl>, boost::enable_shared_from_this<Element> { //! Create an empty element @@ -47,12 +48,11 @@ struct GR_RUNTIME_API Element : boost::shared_ptr<ElementImpl> template <typename T> Element(const boost::shared_ptr<T> &elem) { - *this = *elem; - weak_self = elem; + *this = elem->shared_to_element(); } - //! Get the derived class as an element - const Element &get_base(void) const; + //! Convert a shared ptr of a derived class to an Element + Element &shared_to_element(void); //! for internal use only boost::weak_ptr<Element> weak_self; diff --git a/lib/element.cpp b/lib/element.cpp index 861a2dc..db0bbac 100644 --- a/lib/element.cpp +++ b/lib/element.cpp @@ -46,8 +46,9 @@ ElementImpl::~ElementImpl(void) if (this->topology) this->hier_block_cleanup(); } -const Element &Element::get_base(void) const +Element &Element::shared_to_element(void) { + this->weak_self = this->shared_from_this(); return *this; } diff --git a/swig/sw_runtime.i b/swig/sw_runtime.i index e8df947..a25cbaa 100644 --- a/swig/sw_runtime.i +++ b/swig/sw_runtime.i @@ -51,8 +51,13 @@ struct TopBlockPython : TopBlock def internal_connect__(fcn, obj, *args): + def to_element(obj): + if isinstance(obj, Element): return obj + try: return obj.shared_to_element() + except: raise Exception('cant coerce obj %s to element'%(obj)) + if len(args) == 1: - fcn(obj, args[0].get_base()) + fcn(obj, to_element(args[0])) return for src, sink in zip(args, args[1:]): @@ -60,7 +65,7 @@ def internal_connect__(fcn, obj, *args): except: src_index = 0 try: sink, sink_index = sink except: sink_index = 0 - fcn(obj, src.get_base(), src_index, sink.get_base(), sink_index) + fcn(obj, to_element(src), src_index, to_element(sink), sink_index) class top_block(TopBlockPython): def __init__(self, *args, **kwargs): |