diff options
author | Josh Blum | 2013-04-03 23:31:34 -0700 |
---|---|---|
committer | Josh Blum | 2013-04-03 23:31:34 -0700 |
commit | c85fe5cb75d32544eb89a573e8df61757a940766 (patch) | |
tree | a1e0fb013bb2d31823738f5ab7de7b69316193ed | |
parent | 0651aff49ae7e066bc301faeecfbd519c4743849 (diff) | |
download | sandhi-c85fe5cb75d32544eb89a573e8df61757a940766.tar.gz sandhi-c85fe5cb75d32544eb89a573e8df61757a940766.tar.bz2 sandhi-c85fe5cb75d32544eb89a573e8df61757a940766.zip |
gras: code cleanup and comments from last commit
-rw-r--r-- | include/gras/detail/element.hpp | 25 | ||||
-rw-r--r-- | include/gras/element.hpp | 13 | ||||
-rw-r--r-- | lib/element.cpp | 27 | ||||
-rw-r--r-- | python/gras/GRAS_Block.i | 13 |
4 files changed, 44 insertions, 34 deletions
diff --git a/include/gras/detail/element.hpp b/include/gras/detail/element.hpp index 22a63a0..2b97c8f 100644 --- a/include/gras/detail/element.hpp +++ b/include/gras/detail/element.hpp @@ -5,37 +5,12 @@ namespace gras { - struct WeakElementSharedPtr : WeakElement - { - WeakElementSharedPtr(boost::weak_ptr<Element> weak_self) - { - _weak_self = weak_self; - } - boost::shared_ptr<void> lock(void) - { - return _weak_self.lock(); - } - boost::weak_ptr<Element> _weak_self; - }; - template <typename T> inline Element::Element(const boost::shared_ptr<T> &elem) { *this = elem->shared_to_element(); } - //! Convert a shared ptr of a derived class to an Element - inline Element &Element::shared_to_element(void) - { - try - { - if (not this->weak_self) - this->weak_self.reset(new WeakElementSharedPtr(this->shared_from_this())); - } - catch(...){} - return *this; - } - } //namespace gras #endif /*INCLUDED_GRAS_DETAIL_ELEMENT_HPP*/ diff --git a/include/gras/element.hpp b/include/gras/element.hpp index f9a223d..cfaa5e4 100644 --- a/include/gras/element.hpp +++ b/include/gras/element.hpp @@ -19,13 +19,22 @@ struct ElementImpl; typedef boost::shared_ptr<ElementImpl> ElementBase; +struct Block; + +/*! + * Weak Element interface class: + * Allows internals to get a reference to the container holding an element. + * This container could be a shared_ptr or perhaps a Python object. + */ struct WeakElement { + //! Lock creates a shared pointer holding a container reference virtual boost::shared_ptr<void> lock(void) = 0; }; -struct Block; - +/*! + * Element is a base class for all topological elements. + */ struct GRAS_API Element : ElementBase, boost::enable_shared_from_this<Element> { //! Create an empty element diff --git a/lib/element.cpp b/lib/element.cpp index 6736011..340bd85 100644 --- a/lib/element.cpp +++ b/lib/element.cpp @@ -31,6 +31,33 @@ Element::~Element(void) //NOP } +//! Weak element overload for the case of shared_ptr container +struct WeakElementSharedPtr : WeakElement +{ + WeakElementSharedPtr(boost::weak_ptr<Element> weak_self) + { + _weak_self = weak_self; + } + boost::shared_ptr<void> lock(void) + { + return _weak_self.lock(); + } + boost::weak_ptr<Element> _weak_self; +}; + +Element &Element::shared_to_element(void) +{ + try + { + if (not this->weak_self) + { + this->weak_self.reset(new WeakElementSharedPtr(this->shared_from_this())); + } + } + catch(...){} + return *this; +} + ElementImpl::~ElementImpl(void) { if (this->executor) this->top_block_cleanup(); diff --git a/python/gras/GRAS_Block.i b/python/gras/GRAS_Block.i index e18476a..9cd96e2 100644 --- a/python/gras/GRAS_Block.i +++ b/python/gras/GRAS_Block.i @@ -122,11 +122,10 @@ struct BlockPython : Block this->reset(); } - void _Py_set_ref(PyObject *o) - { - std::cout << o->ob_refcnt <<std::endl; - this->weak_self.reset(new WeakElementPyObject(o)); - } + void _Py_init_weak_ref__(PyObject *o) + { + this->weak_self.reset(new WeakElementPyObject(o)); + } void notify_active(void) { @@ -242,10 +241,10 @@ def sig_to_dtype_sig(sig): class Block(BlockPython): def __init__(self, name='Block', in_sig=None, out_sig=None): BlockPython.__init__(self, name) + self._Py_init_weak_ref__(self) self.set_input_signature(in_sig) self.set_output_signature(out_sig) - self.__prop_registry = dict(); - self._Py_set_ref(self) + self.__prop_registry = dict() def set_input_signature(self, sig): self.__in_sig = sig_to_dtype_sig(sig) |