Add move constructor and move assignment operator to ref_ptr

Use conditional compilation to make it work only with C++11 support.
This commit is contained in:
elsid 2021-04-29 00:55:37 +02:00 committed by Robert Osfield
parent 2695f29be0
commit 969c1821be

View File

@ -22,6 +22,10 @@
#include <string> #include <string>
#endif #endif
#if __cplusplus >= 201103L
#include <utility>
#endif
namespace osg { namespace osg {
template<typename T> class observer_ptr; template<typename T> class observer_ptr;
@ -36,6 +40,9 @@ class ref_ptr
ref_ptr() : _ptr(0) {} ref_ptr() : _ptr(0) {}
ref_ptr(T* ptr) : _ptr(ptr) { if (_ptr) _ptr->ref(); } ref_ptr(T* ptr) : _ptr(ptr) { if (_ptr) _ptr->ref(); }
ref_ptr(const ref_ptr& rp) : _ptr(rp._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<class Other> ref_ptr(const ref_ptr<Other>& rp) : _ptr(rp._ptr) { if (_ptr) _ptr->ref(); } template<class Other> ref_ptr(const ref_ptr<Other>& rp) : _ptr(rp._ptr) { if (_ptr) _ptr->ref(); }
ref_ptr(observer_ptr<T>& optr) : _ptr(0) { optr.lock(*this); } ref_ptr(observer_ptr<T>& optr) : _ptr(0) { optr.lock(*this); }
~ref_ptr() { if (_ptr) _ptr->unref(); _ptr = 0; } ~ref_ptr() { if (_ptr) _ptr->unref(); _ptr = 0; }
@ -52,6 +59,17 @@ class ref_ptr
return *this; return *this;
} }
#if __cplusplus >= 201103L
template<class Other> ref_ptr& operator = (ref_ptr<Other>&& 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) inline ref_ptr& operator = (T* ptr)
{ {
if (_ptr==ptr) return *this; if (_ptr==ptr) return *this;