diff --git a/modules/core/include/opencv2/core/types.hpp b/modules/core/include/opencv2/core/types.hpp index 16f7b3066e..7c3b56f990 100644 --- a/modules/core/include/opencv2/core/types.hpp +++ b/modules/core/include/opencv2/core/types.hpp @@ -163,10 +163,12 @@ public: Point_(); Point_(_Tp _x, _Tp _y); Point_(const Point_& pt); + Point_(Point_&& pt) noexcept; Point_(const Size_<_Tp>& sz); Point_(const Vec<_Tp, 2>& v); Point_& operator = (const Point_& pt); + Point_& operator = (Point_&& pt) noexcept; //! conversion to another data type template operator Point_<_Tp2>() const; @@ -243,10 +245,12 @@ public: Point3_(); Point3_(_Tp _x, _Tp _y, _Tp _z); Point3_(const Point3_& pt); + Point3_(Point3_&& pt) noexcept; explicit Point3_(const Point_<_Tp>& pt); Point3_(const Vec<_Tp, 3>& v); Point3_& operator = (const Point3_& pt); + Point3_& operator = (Point3_&& pt) noexcept; //! conversion to another data type template operator Point3_<_Tp2>() const; //! conversion to cv::Vec<> @@ -317,9 +321,11 @@ public: Size_(); Size_(_Tp _width, _Tp _height); Size_(const Size_& sz); + Size_(Size_&& sz) noexcept; Size_(const Point_<_Tp>& pt); Size_& operator = (const Size_& sz); + Size_& operator = (Size_&& sz) noexcept; //! the area (width*height) _Tp area() const; //! aspect ratio (width/height) @@ -420,10 +426,12 @@ public: Rect_(); Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height); Rect_(const Rect_& r); + Rect_(Rect_&& r) noexcept; Rect_(const Point_<_Tp>& org, const Size_<_Tp>& sz); Rect_(const Point_<_Tp>& pt1, const Point_<_Tp>& pt2); Rect_& operator = ( const Rect_& r ); + Rect_& operator = ( Rect_&& r ) noexcept; //! the top-left corner Point_<_Tp> tl() const; //! the bottom-right corner @@ -633,6 +641,12 @@ public: Scalar_(_Tp v0, _Tp v1, _Tp v2=0, _Tp v3=0); Scalar_(_Tp v0); + Scalar_(const Scalar_& s); + Scalar_(Scalar_&& s) noexcept; + + Scalar_& operator=(const Scalar_& s); + Scalar_& operator=(Scalar_&& s) noexcept; + template Scalar_(const Vec<_Tp2, cn>& v); @@ -1147,6 +1161,10 @@ template inline Point_<_Tp>::Point_(const Point_& pt) : x(pt.x), y(pt.y) {} +template inline +Point_<_Tp>::Point_(Point_&& pt) noexcept + : x(std::move(pt.x)), y(std::move(pt.y)) {} + template inline Point_<_Tp>::Point_(const Size_<_Tp>& sz) : x(sz.width), y(sz.height) {} @@ -1162,6 +1180,13 @@ Point_<_Tp>& Point_<_Tp>::operator = (const Point_& pt) return *this; } +template inline +Point_<_Tp>& Point_<_Tp>::operator = (Point_&& pt) noexcept +{ + x = std::move(pt.x); y = std::move(pt.y); + return *this; +} + template template inline Point_<_Tp>::operator Point_<_Tp2>() const { @@ -1403,6 +1428,10 @@ template inline Point3_<_Tp>::Point3_(const Point3_& pt) : x(pt.x), y(pt.y), z(pt.z) {} +template inline +Point3_<_Tp>::Point3_(Point3_&& pt) noexcept + : x(std::move(pt.x)), y(std::move(pt.y)), z(std::move(pt.z)) {} + template inline Point3_<_Tp>::Point3_(const Point_<_Tp>& pt) : x(pt.x), y(pt.y), z(_Tp()) {} @@ -1430,6 +1459,13 @@ Point3_<_Tp>& Point3_<_Tp>::operator = (const Point3_& pt) return *this; } +template inline +Point3_<_Tp>& Point3_<_Tp>::operator = (Point3_&& pt) noexcept +{ + x = std::move(pt.x); y = std::move(pt.y); z = std::move(pt.z); + return *this; +} + template inline _Tp Point3_<_Tp>::dot(const Point3_& pt) const { @@ -1646,6 +1682,10 @@ template inline Size_<_Tp>::Size_(const Size_& sz) : width(sz.width), height(sz.height) {} +template inline +Size_<_Tp>::Size_(Size_&& sz) noexcept + : width(std::move(sz.width)), height(std::move(sz.height)) {} + template inline Size_<_Tp>::Size_(const Point_<_Tp>& pt) : width(pt.x), height(pt.y) {} @@ -1663,6 +1703,13 @@ Size_<_Tp>& Size_<_Tp>::operator = (const Size_<_Tp>& sz) return *this; } +template inline +Size_<_Tp>& Size_<_Tp>::operator = (Size_<_Tp>&& sz) noexcept +{ + width = std::move(sz.width); height = std::move(sz.height); + return *this; +} + template inline _Tp Size_<_Tp>::area() const { @@ -1777,6 +1824,10 @@ template inline Rect_<_Tp>::Rect_(const Rect_<_Tp>& r) : x(r.x), y(r.y), width(r.width), height(r.height) {} +template inline +Rect_<_Tp>::Rect_(Rect_<_Tp>&& r) noexcept + : x(std::move(r.x)), y(std::move(r.y)), width(std::move(r.width)), height(std::move(r.height)) {} + template inline Rect_<_Tp>::Rect_(const Point_<_Tp>& org, const Size_<_Tp>& sz) : x(org.x), y(org.y), width(sz.width), height(sz.height) {} @@ -1800,6 +1851,16 @@ Rect_<_Tp>& Rect_<_Tp>::operator = ( const Rect_<_Tp>& r ) return *this; } +template inline +Rect_<_Tp>& Rect_<_Tp>::operator = ( Rect_<_Tp>&& r ) noexcept +{ + x = std::move(r.x); + y = std::move(r.y); + width = std::move(r.width); + height = std::move(r.height); + return *this; +} + template inline Point_<_Tp> Rect_<_Tp>::tl() const { @@ -1984,8 +2045,6 @@ inline RotatedRect::RotatedRect(const Point2f& _center, const Size2f& _size, float _angle) : center(_center), size(_size), angle(_angle) {} - - ///////////////////////////////// Range ///////////////////////////////// inline @@ -2085,6 +2144,36 @@ Scalar_<_Tp>::Scalar_(_Tp v0, _Tp v1, _Tp v2, _Tp v3) this->val[3] = v3; } +template inline +Scalar_<_Tp>::Scalar_(const Scalar_<_Tp>& s) : Vec<_Tp, 4>(s) { +} + +template inline +Scalar_<_Tp>::Scalar_(Scalar_<_Tp>&& s) noexcept { + this->val[0] = std::move(s.val[0]); + this->val[1] = std::move(s.val[1]); + this->val[2] = std::move(s.val[2]); + this->val[3] = std::move(s.val[3]); +} + +template inline +Scalar_<_Tp>& Scalar_<_Tp>::operator=(const Scalar_<_Tp>& s) { + this->val[0] = s.val[0]; + this->val[1] = s.val[1]; + this->val[2] = s.val[2]; + this->val[3] = s.val[3]; + return *this; +} + +template inline +Scalar_<_Tp>& Scalar_<_Tp>::operator=(Scalar_<_Tp>&& s) noexcept { + this->val[0] = std::move(s.val[0]); + this->val[1] = std::move(s.val[1]); + this->val[2] = std::move(s.val[2]); + this->val[3] = std::move(s.val[3]); + return *this; +} + template template inline Scalar_<_Tp>::Scalar_(const Vec<_Tp2, cn>& v) {