diff --git a/include/osg/ref_ptr b/include/osg/ref_ptr index 693e98e2c..d79cde397 100644 --- a/include/osg/ref_ptr +++ b/include/osg/ref_ptr @@ -22,6 +22,10 @@ #include #endif +#if __cplusplus >= 201103L +#include +#endif + namespace osg { template class observer_ptr; @@ -36,6 +40,9 @@ class ref_ptr ref_ptr() : _ptr(0) {} ref_ptr(T* ptr) : _ptr(ptr) { if (_ptr) _ptr->ref(); } ref_ptr(const ref_ptr& rp) : _ptr(rp._ptr) { if (_ptr) _ptr->ref(); } +#if __cplusplus >= 201103L + ref_ptr(ref_ptr&& rp) noexcept : _ptr(rp._ptr) { rp._ptr = 0; } +#endif template ref_ptr(const ref_ptr& rp) : _ptr(rp._ptr) { if (_ptr) _ptr->ref(); } ref_ptr(observer_ptr& optr) : _ptr(0) { optr.lock(*this); } ~ref_ptr() { if (_ptr) _ptr->unref(); _ptr = 0; } @@ -52,6 +59,17 @@ class ref_ptr return *this; } +#if __cplusplus >= 201103L + template ref_ptr& operator = (ref_ptr&& rp) + { + if (_ptr == rp._ptr) return *this; + if (_ptr != nullptr) _ptr->unref(); + _ptr = rp._ptr; + rp._ptr = nullptr; + return *this; + } +#endif + inline ref_ptr& operator = (T* ptr) { if (_ptr==ptr) return *this;