diff options
Diffstat (limited to 'include/gras/detail/element.hpp')
-rw-r--r-- | include/gras/detail/element.hpp | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/include/gras/detail/element.hpp b/include/gras/detail/element.hpp index 2b97c8f..f8a8904 100644 --- a/include/gras/detail/element.hpp +++ b/include/gras/detail/element.hpp @@ -3,12 +3,37 @@ #ifndef INCLUDED_GRAS_DETAIL_ELEMENT_HPP #define INCLUDED_GRAS_DETAIL_ELEMENT_HPP +#include <boost/weak_ptr.hpp> + namespace gras { + + //! Weak element overload for the case of shared_ptr container + struct WeakElementSharedPtr : WeakElement + { + WeakElementSharedPtr(boost::weak_ptr<const void> weak_self) + { + _weak_self = weak_self; + } + boost::shared_ptr<const void> lock(void) + { + return _weak_self.lock(); + } + boost::weak_ptr<const void> _weak_self; + }; + template <typename T> inline Element::Element(const boost::shared_ptr<T> &elem) { - *this = elem->shared_to_element(); + //the container is a shared pointer, so save the reference, + //unless the reference was already set to something + if (not elem->weak_self) + { + elem->weak_self.reset(new WeakElementSharedPtr(elem)); + } + + //initialize this new Element from the argument passed + *this = *elem; } } //namespace gras |