Publishing 2019 R1 content
[platform/upstream/dldt.git] / inference-engine / thirdparty / fluid / modules / gapi / src / api / gproto.cpp
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 #include "precomp.hpp"
9
10 #include <ade/util/algorithm.hpp>
11 #include "opencv2/gapi/util/throw.hpp"
12 #include "opencv2/gapi/garg.hpp"
13 #include "opencv2/gapi/gproto.hpp"
14
15 #include "api/gapi_priv.hpp"
16 #include "api/gproto_priv.hpp"
17
18 // FIXME: it should be a visitor!
19 // FIXME: Reimplement with traits?
20
21 const cv::GOrigin& cv::gimpl::proto::origin_of(const cv::GProtoArg &arg)
22 {
23     switch (arg.index())
24     {
25     case cv::GProtoArg::index_of<cv::GMat>():
26         return util::get<cv::GMat>(arg).priv();
27
28     case cv::GProtoArg::index_of<cv::GScalar>():
29         return util::get<cv::GScalar>(arg).priv();
30
31     case cv::GProtoArg::index_of<cv::detail::GArrayU>():
32         return util::get<cv::detail::GArrayU>(arg).priv();
33
34     default:
35         util::throw_error(std::logic_error("Unsupported GProtoArg type"));
36     }
37 }
38
39 const cv::GOrigin& cv::gimpl::proto::origin_of(const cv::GArg &arg)
40 {
41     // Generic, but not very efficient implementation
42     // FIXME: Walking a thin line here!!! Here we rely that GArg and
43     // GProtoArg share the same object and this is true while objects
44     // are reference-counted, so return value is not a reference to a tmp.
45     return origin_of(rewrap(arg));
46 }
47
48 bool cv::gimpl::proto::is_dynamic(const cv::GArg& arg)
49 {
50     // FIXME: refactor this method to be auto-generated from
51     // - GProtoArg variant parameter pack, and
52     // - traits over every type
53     switch (arg.kind)
54     {
55     case detail::ArgKind::GMAT:
56     case detail::ArgKind::GSCALAR:
57     case detail::ArgKind::GARRAY:
58         return true;
59
60     default:
61         return false;
62     }
63 }
64
65 cv::GRunArg cv::value_of(const cv::GOrigin &origin)
66 {
67     switch (origin.shape)
68     {
69     case GShape::GSCALAR: return GRunArg(util::get<cv::gapi::own::Scalar>(origin.value));
70     default: util::throw_error(std::logic_error("Unsupported shape for constant"));
71     }
72 }
73
74 cv::GProtoArg cv::gimpl::proto::rewrap(const cv::GArg &arg)
75 {
76     // FIXME: replace with a more generic any->variant
77     // (or variant<T> -> variant<U>) conversion?
78     switch (arg.kind)
79     {
80     case detail::ArgKind::GMAT:    return GProtoArg(arg.get<cv::GMat>());
81     case detail::ArgKind::GSCALAR: return GProtoArg(arg.get<cv::GScalar>());
82     case detail::ArgKind::GARRAY:  return GProtoArg(arg.get<cv::detail::GArrayU>());
83     default: util::throw_error(std::logic_error("Unsupported GArg type"));
84     }
85 }
86
87 cv::GMetaArg cv::descr_of(const cv::GRunArg &arg)
88 {
89     switch (arg.index())
90     {
91 #if !defined(GAPI_STANDALONE)
92         case GRunArg::index_of<cv::Mat>():
93             return cv::GMetaArg(descr_of(util::get<cv::Mat>(arg)));
94
95         case GRunArg::index_of<cv::Scalar>():
96             return cv::GMetaArg(descr_of(util::get<cv::Scalar>(arg)));
97 #endif // !defined(GAPI_STANDALONE)
98
99         case GRunArg::index_of<cv::gapi::own::Mat>():
100             return cv::GMetaArg(descr_of(util::get<cv::gapi::own::Mat>(arg)));
101
102         case GRunArg::index_of<cv::gapi::own::Scalar>():
103             return cv::GMetaArg(descr_of(util::get<cv::gapi::own::Scalar>(arg)));
104
105         case GRunArg::index_of<cv::detail::VectorRef>():
106             return cv::GMetaArg(util::get<cv::detail::VectorRef>(arg).descr_of());
107
108         default: util::throw_error(std::logic_error("Unsupported GRunArg type"));
109     }
110 }
111
112 cv::GMetaArgs cv::descr_of(const cv::GRunArgs &args)
113 {
114     cv::GMetaArgs metas;
115     ade::util::transform(args, std::back_inserter(metas), [](const cv::GRunArg &arg){ return descr_of(arg); });
116     return metas;
117 }
118
119 cv::GMetaArg cv::descr_of(const cv::GRunArgP &argp)
120 {
121     switch (argp.index())
122     {
123 #if !defined(GAPI_STANDALONE)
124     case GRunArgP::index_of<cv::Mat*>():               return GMetaArg(descr_of(*util::get<cv::Mat*>(argp)));
125     case GRunArgP::index_of<cv::UMat*>():              return GMetaArg(descr_of(*util::get<cv::UMat*>(argp)));
126     case GRunArgP::index_of<cv::Scalar*>():            return GMetaArg(descr_of(*util::get<cv::Scalar*>(argp)));
127 #endif //  !defined(GAPI_STANDALONE)
128     case GRunArgP::index_of<cv::gapi::own::Mat*>():    return GMetaArg(descr_of(*util::get<cv::gapi::own::Mat*>(argp)));
129     case GRunArgP::index_of<cv::gapi::own::Scalar*>(): return GMetaArg(descr_of(*util::get<cv::gapi::own::Scalar*>(argp)));
130     case GRunArgP::index_of<cv::detail::VectorRef>(): return GMetaArg(util::get<cv::detail::VectorRef>(argp).descr_of());
131     default: util::throw_error(std::logic_error("Unsupported GRunArgP type"));
132     }
133 }
134
135 namespace cv {
136 std::ostream& operator<<(std::ostream& os, const cv::GMetaArg &arg)
137 {
138     // FIXME: Implement via variant visitor
139     switch (arg.index())
140     {
141     case cv::GMetaArg::index_of<util::monostate>():
142         os << "(unresolved)";
143         break;
144
145     case cv::GMetaArg::index_of<cv::GMatDesc>():
146         os << util::get<cv::GMatDesc>(arg);
147         break;
148
149     case cv::GMetaArg::index_of<cv::GScalarDesc>():
150         os << util::get<cv::GScalarDesc>(arg);
151         break;
152
153     case cv::GMetaArg::index_of<cv::GArrayDesc>():
154         os << util::get<cv::GArrayDesc>(arg);
155         break;
156     default:
157         GAPI_Assert(false);
158     }
159
160     return os;
161 }
162 }