Publishing 2019 R1 content
[platform/upstream/dldt.git] / inference-engine / thirdparty / fluid / modules / gapi / src / backends / common / gbackend.hpp
1 // This file is part of OpenCV project.
2 // It is subject to the license terms in the LICENSE file found in the top-level directory
3 // of this distribution and at http://opencv.org/license.html.
4 //
5 // Copyright (C) 2018-2019 Intel Corporation
6
7
8 #ifndef OPENCV_GAPI_GBACKEND_HPP
9 #define OPENCV_GAPI_GBACKEND_HPP
10
11 #include <string>
12 #include <memory>
13
14 #include <ade/node.hpp>
15
16 #include "opencv2/gapi/garg.hpp"
17 #include "opencv2/gapi/own/mat.hpp"
18
19 #include "opencv2/gapi/util/optional.hpp"
20 #include "opencv2/gapi/own/scalar.hpp"
21
22 #include "compiler/gmodel.hpp"
23
24 namespace cv {
25 namespace gimpl {
26
27     // Forward declarations
28     struct Data;
29     struct RcDesc;
30
31 namespace magazine {
32     template<typename... Ts> struct Class
33     {
34         template<typename T> using MapT = std::unordered_map<int, T>;
35         template<typename T>       MapT<T>& slot()
36         {
37             return std::get<ade::util::type_list_index<T, Ts...>::value>(slots);
38         }
39         template<typename T> const MapT<T>& slot() const
40         {
41             return std::get<ade::util::type_list_index<T, Ts...>::value>(slots);
42         }
43     private:
44         std::tuple<MapT<Ts>...> slots;
45     };
46
47 } // namespace magazine
48 #if !defined(GAPI_STANDALONE)
49 using Mag = magazine::Class<cv::gapi::own::Mat, cv::UMat, cv::gapi::own::Scalar, cv::detail::VectorRef>;
50 #else
51 using Mag = magazine::Class<cv::gapi::own::Mat, cv::gapi::own::Scalar, cv::detail::VectorRef>;
52 #endif
53
54 namespace magazine
55 {
56     void         bindInArg (Mag& mag, const RcDesc &rc, const GRunArg  &arg, bool is_umat = false);
57     void         bindOutArg(Mag& mag, const RcDesc &rc, const GRunArgP &arg, bool is_umat = false);
58
59     void         resetInternalData(Mag& mag, const Data &d);
60     cv::GRunArg  getArg    (const Mag& mag, const RcDesc &ref);
61     cv::GRunArgP getObjPtr (      Mag& mag, const RcDesc &rc, bool is_umat = false);
62     void         writeBack (const Mag& mag, const RcDesc &rc, GRunArgP &g_arg, bool is_umat = false);
63 } // namespace magazine
64
65 namespace detail
66 {
67 template<typename... Ts> struct magazine
68 {
69     template<typename T> using MapT = std::unordered_map<int, T>;
70     template<typename T>       MapT<T>& slot()
71     {
72         return std::get<util::type_list_index<T, Ts...>::value>(slots);
73     }
74     template<typename T> const MapT<T>& slot() const
75     {
76         return std::get<util::type_list_index<T, Ts...>::value>(slots);
77     }
78 private:
79     std::tuple<MapT<Ts>...> slots;
80 };
81 } // namespace detail
82
83 struct GRuntimeArgs
84 {
85     GRunArgs   inObjs;
86     GRunArgsP outObjs;
87 };
88
89 template<typename T>
90 inline cv::util::optional<T> getCompileArg(const cv::GCompileArgs &args)
91 {
92     for (auto &compile_arg : args)
93     {
94         if (compile_arg.tag == cv::detail::CompileArgTag<T>::tag())
95         {
96             return cv::util::optional<T>(compile_arg.get<T>());
97         }
98     }
99     return cv::util::optional<T>();
100 }
101
102
103
104 }} // cv::gimpl
105
106 #endif // OPENCV_GAPI_GBACKEND_HPP