inline _InputArray::_InputArray(const double& val)
{ init(FIXED_TYPE + FIXED_SIZE + MATX + CV_64F + ACCESS_READ, &val, Size(1,1)); }
-inline _InputArray::_InputArray(const MatExpr& expr)
-{ init(FIXED_TYPE + FIXED_SIZE + EXPR + ACCESS_READ, &expr); }
-
inline _InputArray::_InputArray(const cuda::GpuMat& d_mat)
{ init(CUDA_GPU_MAT + ACCESS_READ, &d_mat); }
//! @endcond
+static inline
+void swap(MatExpr& a, MatExpr& b) { a.swap(b); }
+
} //cv
#ifdef _MSC_VER
return e;
}
+void MatExpr::swap(MatExpr& other)
+{
+ using std::swap;
+
+ swap(op, other.op);
+ swap(flags, other.flags);
+
+ swap(a, other.a);
+ swap(b, other.b);
+ swap(c, other.c);
+
+ swap(alpha, other.alpha);
+ swap(beta, other.beta);
+
+ swap(s, other.s);
+}
+
+_InputArray::_InputArray(const MatExpr& expr)
+{
+#if 1
+ if (!isIdentity(expr))
+ {
+ Mat result = expr; // TODO improve through refcount == 1 of expr.a (inplace operation is possible - except gemm?)
+ MatExpr result_expr(result);
+ swap(const_cast<MatExpr&>(expr), result_expr);
+ }
+ CV_Assert(isIdentity(expr));
+ init(FIXED_TYPE + FIXED_SIZE + MAT + ACCESS_READ, &expr.a);
+#else
+ init(FIXED_TYPE + FIXED_SIZE + EXPR + ACCESS_READ, &expr);
+#endif
+}
+
} // cv::