summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/gnuradio/element.hpp10
-rw-r--r--lib/element.cpp3
-rw-r--r--swig/sw_runtime.i9
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):