Enabled forEach for const Mats
authorMaksim Shabunin <maksim.shabunin@gmail.com>
Thu, 7 Sep 2017 08:35:14 +0000 (11:35 +0300)
committerMaksim Shabunin <maksim.shabunin@gmail.com>
Thu, 7 Sep 2017 08:35:14 +0000 (11:35 +0300)
modules/core/include/opencv2/core/mat.inl.hpp
modules/core/test/test_mat.cpp

index 8445288..2ef7aec 100644 (file)
@@ -1214,7 +1214,7 @@ void Mat::forEach(const Functor& operation) {
 template<typename _Tp, typename Functor> inline
 void Mat::forEach(const Functor& operation) const {
     // call as not const
-    (const_cast<Mat*>(this))->forEach<const _Tp>(operation);
+    (const_cast<Mat*>(this))->forEach<_Tp>(operation);
 }
 
 template<typename _Tp> inline
index 7067512..6c2ab85 100644 (file)
@@ -671,6 +671,13 @@ struct InitializerFunctor5D{
     }
 };
 
+template<typename Pixel>
+struct EmptyFunctor
+{
+    void operator()(const Pixel &, const int *) const {}
+};
+
+
 void Core_ArrayOpTest::run( int /* start_from */)
 {
     int errcount = 0;
@@ -799,6 +806,17 @@ void Core_ArrayOpTest::run( int /* start_from */)
         }
     }
 
+    // test const cv::Mat::forEach
+    {
+        const Mat a(10, 10, CV_32SC3);
+        Mat b(10, 10, CV_32SC3);
+        const Mat & c = b;
+        a.forEach<Point3i>(EmptyFunctor<Point3i>());
+        b.forEach<Point3i>(EmptyFunctor<const Point3i>());
+        c.forEach<Point3i>(EmptyFunctor<Point3i>());
+        // tests compilation, no runtime check is needed
+    }
+
     RNG rng;
     const int MAX_DIM = 5, MAX_DIM_SZ = 10;
     // sparse matrix operations