From 5a0af53683116975749b251b675699d445745881 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Sat, 15 Aug 2015 16:45:19 +0300 Subject: [PATCH] c++ move semantics for cv::Ptr<> --- modules/core/include/opencv2/core/cvdef.h | 19 +++++++++++++++ modules/core/include/opencv2/core/cvstd.hpp | 5 ++++ modules/core/include/opencv2/core/ptr.inl.hpp | 23 +++++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/modules/core/include/opencv2/core/cvdef.h b/modules/core/include/opencv2/core/cvdef.h index 1d933b5c30..b78e22dd43 100644 --- a/modules/core/include/opencv2/core/cvdef.h +++ b/modules/core/include/opencv2/core/cvdef.h @@ -228,4 +228,23 @@ # endif #endif + +/****************************************************************************************\ +* C++ Move semantics * +\****************************************************************************************/ + +#ifndef CV_CXX_MOVE_SEMANTICS +# if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) || defined(_MSC_VER) && _MSC_VER >= 1600 +# define CV_CXX_MOVE_SEMANTICS 1 +# elif defined(__clang) +# if __has_feature(cxx_rvalue_references) +# define CV_CXX_MOVE_SEMANTICS 1 +# endif +# endif +#else +# if CV_CXX_MOVE_SEMANTICS == 0 +# undef CV_CXX_MOVE_SEMANTICS +# endif +#endif + #endif // __OPENCV_CORE_CVDEF_H__ diff --git a/modules/core/include/opencv2/core/cvstd.hpp b/modules/core/include/opencv2/core/cvstd.hpp index a229f533e1..e638207542 100644 --- a/modules/core/include/opencv2/core/cvstd.hpp +++ b/modules/core/include/opencv2/core/cvstd.hpp @@ -411,6 +411,11 @@ struct Ptr template Ptr dynamicCast() const; +#ifdef CV_CXX_MOVE_SEMANTICS + Ptr(Ptr&& o); + Ptr& operator = (Ptr&& o); +#endif + private: detail::PtrOwner* owner; T* stored; diff --git a/modules/core/include/opencv2/core/ptr.inl.hpp b/modules/core/include/opencv2/core/ptr.inl.hpp index 65c09d1cb4..3f6f214a8f 100644 --- a/modules/core/include/opencv2/core/ptr.inl.hpp +++ b/modules/core/include/opencv2/core/ptr.inl.hpp @@ -252,6 +252,29 @@ Ptr Ptr::dynamicCast() const return Ptr(*this, dynamic_cast(stored)); } +#ifdef CV_CXX_MOVE_SEMANTICS + +template +Ptr::Ptr(Ptr&& o) : owner(o.owner), stored(o.stored) +{ + o.owner = NULL; + o.stored = NULL; +} + +template +Ptr& Ptr::operator = (Ptr&& o) +{ + release(); + owner = o.owner; + stored = o.stored; + o.owner = NULL; + o.stored = NULL; + return *this; +} + +#endif + + template void swap(Ptr& ptr1, Ptr& ptr2){ ptr1.swap(ptr2);