core(ocl): ocl::Kernels::args() via variadic template
authorAlexander Alekhin <alexander.a.alekhin@gmail.com>
Fri, 3 May 2019 22:23:50 +0000 (22:23 +0000)
committerAlexander Alekhin <alexander.a.alekhin@gmail.com>
Sat, 4 May 2019 00:06:31 +0000 (00:06 +0000)
modules/core/include/opencv2/core/ocl.hpp

index 95f0fcd..115f5d1 100644 (file)
@@ -407,161 +407,28 @@ public:
     template<typename _Tp> int set(int i, const _Tp& value)
     { return set(i, &value, sizeof(value)); }
 
-    template<typename _Tp0>
-    Kernel& args(const _Tp0& a0)
-    {
-        set(0, a0); return *this;
-    }
-
-    template<typename _Tp0, typename _Tp1>
-    Kernel& args(const _Tp0& a0, const _Tp1& a1)
-    {
-        int i = set(0, a0); set(i, a1); return *this;
-    }
 
-    template<typename _Tp0, typename _Tp1, typename _Tp2>
-    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2)
-    {
-        int i = set(0, a0); i = set(i, a1); set(i, a2); return *this;
-    }
+protected:
+    template<typename _Tp0> inline
+    int set_args_(int i, const _Tp0& a0) { return set(i, a0); }
+    template<typename _Tp0, typename... _Tps> inline
+    int set_args_(int i, const _Tp0& a0, const _Tps&... rest_args) { i = set(i, a0); return set_args_(i, rest_args...); }
+public:
+    /** @brief Setup OpenCL Kernel arguments.
+    Avoid direct using of set(i, ...) methods.
+    @code
+    bool ok = kernel
+        .args(
+            srcUMat, dstUMat,
+            (float)some_float_param
+        ).run(ndims, globalSize, localSize);
+    if (!ok) return false;
+    @endcode
+    */
+    template<typename... _Tps> inline
+    Kernel& args(const _Tps&... kernel_args) { set_args_(0, kernel_args...); return *this; }
 
-    template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3>
-    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3)
-    {
-        int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); return *this;
-    }
 
-    template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4>
-    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2,
-                 const _Tp3& a3, const _Tp4& a4)
-    {
-        int i = set(0, a0); i = set(i, a1); i = set(i, a2);
-        i = set(i, a3); set(i, a4); return *this;
-    }
-
-    template<typename _Tp0, typename _Tp1, typename _Tp2,
-             typename _Tp3, typename _Tp4, typename _Tp5>
-    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2,
-                 const _Tp3& a3, const _Tp4& a4, const _Tp5& a5)
-    {
-        int i = set(0, a0); i = set(i, a1); i = set(i, a2);
-        i = set(i, a3); i = set(i, a4); set(i, a5); return *this;
-    }
-
-    template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
-             typename _Tp4, typename _Tp5, typename _Tp6>
-    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
-                 const _Tp4& a4, const _Tp5& a5, const _Tp6& a6)
-    {
-        int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3);
-        i = set(i, a4); i = set(i, a5); set(i, a6); return *this;
-    }
-
-    template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
-             typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7>
-    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
-                 const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7)
-    {
-        int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3);
-        i = set(i, a4); i = set(i, a5); i = set(i, a6); set(i, a7); return *this;
-    }
-
-    template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4,
-             typename _Tp5, typename _Tp6, typename _Tp7, typename _Tp8>
-    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
-                 const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
-                 const _Tp8& a8)
-    {
-        int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4);
-        i = set(i, a5); i = set(i, a6); i = set(i, a7); set(i, a8); return *this;
-    }
-
-    template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4,
-             typename _Tp5, typename _Tp6, typename _Tp7, typename _Tp8, typename _Tp9>
-    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
-                 const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
-                 const _Tp8& a8, const _Tp9& a9)
-    {
-        int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
-        i = set(i, a6); i = set(i, a7); i = set(i, a8); set(i, a9); return *this;
-    }
-
-    template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
-             typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
-             typename _Tp8, typename _Tp9, typename _Tp10>
-    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
-                 const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
-                 const _Tp8& a8, const _Tp9& a9, const _Tp10& a10)
-    {
-        int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
-        i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); set(i, a10); return *this;
-    }
-
-    template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
-             typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
-             typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11>
-    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
-                 const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
-                 const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11)
-    {
-        int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
-        i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); i = set(i, a10); set(i, a11); return *this;
-    }
-
-    template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
-             typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
-             typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11, typename _Tp12>
-    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
-                 const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
-                 const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11,
-                 const _Tp12& a12)
-    {
-        int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
-        i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); i = set(i, a10); i = set(i, a11);
-        set(i, a12); return *this;
-    }
-
-    template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
-             typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
-             typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11, typename _Tp12,
-             typename _Tp13>
-    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
-                 const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
-                 const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11,
-                 const _Tp12& a12, const _Tp13& a13)
-    {
-        int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
-        i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); i = set(i, a10); i = set(i, a11);
-        i = set(i, a12); set(i, a13); return *this;
-    }
-
-    template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
-             typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
-             typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11, typename _Tp12,
-             typename _Tp13, typename _Tp14>
-    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
-                 const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
-                 const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11,
-                 const _Tp12& a12, const _Tp13& a13, const _Tp14& a14)
-    {
-        int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
-        i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); i = set(i, a10); i = set(i, a11);
-        i = set(i, a12); i = set(i, a13); set(i, a14); return *this;
-    }
-
-    template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
-             typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
-             typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11, typename _Tp12,
-             typename _Tp13, typename _Tp14, typename _Tp15>
-    Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
-                 const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
-                 const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11,
-                 const _Tp12& a12, const _Tp13& a13, const _Tp14& a14, const _Tp15& a15)
-    {
-        int i = set(0, a0); i = set(i, a1); i = set(i, a2); i = set(i, a3); i = set(i, a4); i = set(i, a5);
-        i = set(i, a6); i = set(i, a7); i = set(i, a8); i = set(i, a9); i = set(i, a10); i = set(i, a11);
-        i = set(i, a12); i = set(i, a13); i = set(i, a14); set(i, a15); return *this;
-    }
     /** @brief Run the OpenCL kernel.
     @param dims the work problem dimensions. It is the length of globalsize and localsize. It can be either 1, 2 or 3.
     @param globalsize work items for each dimension. It is not the final globalsize passed to