G-API: Added an arbitrary-argument version of cv::gapi::combine
authorDmitry Matveev <dmitry.matveev@intel.com>
Fri, 6 Dec 2019 07:43:02 +0000 (10:43 +0300)
committerDmitry Matveev <dmitry.matveev@intel.com>
Fri, 6 Dec 2019 07:47:50 +0000 (10:47 +0300)
- Now user doesn't need to do `combine(x, combine(y, combine(z, zz)))` but
  just `combine(x, y, z, zz)`

modules/gapi/include/opencv2/gapi/gkernel.hpp
modules/gapi/test/gapi_kernel_tests.cpp

index 78f6e8f..35ce8d5 100644 (file)
@@ -537,8 +537,29 @@ namespace gapi {
 
     /** @} */
 
+    // FYI - this function is already commented above
     GAPI_EXPORTS GKernelPackage combine(const GKernelPackage  &lhs,
                                         const GKernelPackage  &rhs);
+
+    /**
+     * @brief Combines multiple G-API kernel packages into one
+     *
+     * @overload
+     *
+     * This function successively combines the passed kernel packages using a right fold.
+     * Calling `combine(a, b, c)` is equal to `combine(a, combine(b, c))`.
+     *
+     * @return The resulting kernel package
+     */
+    template<typename... Ps>
+    GKernelPackage combine(const GKernelPackage &a, const GKernelPackage &b, Ps&&... rest)
+    {
+        return combine(a, combine(b, rest...));
+    }
+
+    /** \addtogroup gapi_compile_args
+     * @{
+     */
     /**
      * @brief cv::use_only() is a special combinator which hints G-API to use only
      * kernels specified in cv::GComputation::compile() (and not to extend kernels available by
@@ -548,6 +569,7 @@ namespace gapi {
     {
         GKernelPackage pkg;
     };
+    /** @} */
 
 } // namespace gapi
 
index 7a33b0d..6ed98ad 100644 (file)
@@ -325,6 +325,21 @@ TEST(KernelPackage, Can_Use_Custom_Kernel)
                         compile({in_meta, in_meta}, cv::compile_args(pkg)));
 }
 
+TEST(KernelPackage, CombineMultiple)
+{
+    namespace J = Jupiter;
+    namespace S = Saturn;
+    auto a = cv::gapi::kernels<J::Foo>();
+    auto b = cv::gapi::kernels<J::Bar>();
+    auto c = cv::gapi::kernels<S::Qux>();
+    auto pkg = cv::gapi::combine(a, b, c);
+
+    EXPECT_EQ(3u, pkg.size());
+    EXPECT_TRUE(pkg.includes<J::Foo>());
+    EXPECT_TRUE(pkg.includes<J::Bar>());
+    EXPECT_TRUE(pkg.includes<S::Qux>());
+}
+
 TEST_F(HeteroGraph, Call_Custom_Kernel_Default_Backend)
 {
     // in0 -> GCPUAdd -> tmp -> cpu::GClone -> GCPUBGR2Gray -> out