summaryrefslogtreecommitdiff
path: root/include/gras/detail/element.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/gras/detail/element.hpp')
-rw-r--r--include/gras/detail/element.hpp27
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