c++ move semantics for cv::Mat
This commit is contained in:
parent
5a0af53683
commit
1afc9eb730
@ -1854,6 +1854,11 @@ public:
|
|||||||
/** @overload */
|
/** @overload */
|
||||||
template<typename _Tp, typename Functor> void forEach(const Functor& operation) const;
|
template<typename _Tp, typename Functor> void forEach(const Functor& operation) const;
|
||||||
|
|
||||||
|
#ifdef CV_CXX_MOVE_SEMANTICS
|
||||||
|
Mat(Mat&& m);
|
||||||
|
Mat& operator = (Mat&& m);
|
||||||
|
#endif
|
||||||
|
|
||||||
enum { MAGIC_VAL = 0x42FF0000, AUTO_STEP = 0, CONTINUOUS_FLAG = CV_MAT_CONT_FLAG, SUBMATRIX_FLAG = CV_SUBMAT_FLAG };
|
enum { MAGIC_VAL = 0x42FF0000, AUTO_STEP = 0, CONTINUOUS_FLAG = CV_MAT_CONT_FLAG, SUBMATRIX_FLAG = CV_SUBMAT_FLAG };
|
||||||
enum { MAGIC_MASK = 0xFFFF0000, TYPE_MASK = 0x00000FFF, DEPTH_MASK = 7 };
|
enum { MAGIC_MASK = 0xFFFF0000, TYPE_MASK = 0x00000FFF, DEPTH_MASK = 7 };
|
||||||
|
|
||||||
|
@ -1107,6 +1107,69 @@ void Mat::push_back(const MatExpr& expr)
|
|||||||
push_back(static_cast<Mat>(expr));
|
push_back(static_cast<Mat>(expr));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CV_CXX_MOVE_SEMANTICS
|
||||||
|
|
||||||
|
inline
|
||||||
|
Mat::Mat(Mat&& m)
|
||||||
|
: flags(m.flags), dims(m.dims), rows(m.rows), cols(m.cols), data(m.data),
|
||||||
|
datastart(m.datastart), dataend(m.dataend), datalimit(m.datalimit), allocator(m.allocator),
|
||||||
|
u(m.u), size(&rows)
|
||||||
|
{
|
||||||
|
if (m.dims <= 2) // move new step/size info
|
||||||
|
{
|
||||||
|
step[0] = m.step[0];
|
||||||
|
step[1] = m.step[1];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CV_DbgAssert(m.step.p != m.step.buf);
|
||||||
|
step.p = m.step.p;
|
||||||
|
size.p = m.size.p;
|
||||||
|
m.step.p = m.step.buf;
|
||||||
|
m.size.p = &m.rows;
|
||||||
|
}
|
||||||
|
m.flags = MAGIC_VAL; m.dims = m.rows = m.cols = 0;
|
||||||
|
m.data = NULL; m.datastart = NULL; m.dataend = NULL; m.datalimit = NULL;
|
||||||
|
m.allocator = NULL;
|
||||||
|
m.u = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
Mat& Mat::operator = (Mat&& m)
|
||||||
|
{
|
||||||
|
release();
|
||||||
|
flags = m.flags; dims = m.dims; rows = m.rows; cols = m.cols; data = m.data;
|
||||||
|
datastart = m.datastart; dataend = m.dataend; datalimit = m.datalimit; allocator = m.allocator;
|
||||||
|
u = m.u;
|
||||||
|
if (step.p != step.buf) // release self step/size
|
||||||
|
{
|
||||||
|
fastFree(step.p);
|
||||||
|
step.p = step.buf;
|
||||||
|
size.p = &rows;
|
||||||
|
}
|
||||||
|
if (m.dims <= 2) // move new step/size info
|
||||||
|
{
|
||||||
|
step[0] = m.step[0];
|
||||||
|
step[1] = m.step[1];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CV_DbgAssert(m.step.p != m.step.buf);
|
||||||
|
step.p = m.step.p;
|
||||||
|
size.p = m.size.p;
|
||||||
|
m.step.p = m.step.buf;
|
||||||
|
m.size.p = &m.rows;
|
||||||
|
}
|
||||||
|
m.flags = MAGIC_VAL; m.dims = m.rows = m.cols = 0;
|
||||||
|
m.data = NULL; m.datastart = NULL; m.dataend = NULL; m.datalimit = NULL;
|
||||||
|
m.allocator = NULL;
|
||||||
|
m.u = NULL;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////// MatSize ////////////////////////////
|
///////////////////////////// MatSize ////////////////////////////
|
||||||
|
|
||||||
inline
|
inline
|
||||||
|
Loading…
x
Reference in New Issue
Block a user