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.
5 // Copyright (C) 2018-2019 Intel Corporation
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"
15 #include "api/gapi_priv.hpp"
16 #include "api/gproto_priv.hpp"
18 // FIXME: it should be a visitor!
19 // FIXME: Reimplement with traits?
21 const cv::GOrigin& cv::gimpl::proto::origin_of(const cv::GProtoArg &arg)
25 case cv::GProtoArg::index_of<cv::GMat>():
26 return util::get<cv::GMat>(arg).priv();
28 case cv::GProtoArg::index_of<cv::GScalar>():
29 return util::get<cv::GScalar>(arg).priv();
31 case cv::GProtoArg::index_of<cv::detail::GArrayU>():
32 return util::get<cv::detail::GArrayU>(arg).priv();
35 util::throw_error(std::logic_error("Unsupported GProtoArg type"));
39 const cv::GOrigin& cv::gimpl::proto::origin_of(const cv::GArg &arg)
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));
48 bool cv::gimpl::proto::is_dynamic(const cv::GArg& arg)
50 // FIXME: refactor this method to be auto-generated from
51 // - GProtoArg variant parameter pack, and
52 // - traits over every type
55 case detail::ArgKind::GMAT:
56 case detail::ArgKind::GSCALAR:
57 case detail::ArgKind::GARRAY:
65 cv::GRunArg cv::value_of(const cv::GOrigin &origin)
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"));
74 cv::GProtoArg cv::gimpl::proto::rewrap(const cv::GArg &arg)
76 // FIXME: replace with a more generic any->variant
77 // (or variant<T> -> variant<U>) conversion?
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"));
87 cv::GMetaArg cv::descr_of(const cv::GRunArg &arg)
91 #if !defined(GAPI_STANDALONE)
92 case GRunArg::index_of<cv::Mat>():
93 return cv::GMetaArg(descr_of(util::get<cv::Mat>(arg)));
95 case GRunArg::index_of<cv::Scalar>():
96 return cv::GMetaArg(descr_of(util::get<cv::Scalar>(arg)));
97 #endif // !defined(GAPI_STANDALONE)
99 case GRunArg::index_of<cv::gapi::own::Mat>():
100 return cv::GMetaArg(descr_of(util::get<cv::gapi::own::Mat>(arg)));
102 case GRunArg::index_of<cv::gapi::own::Scalar>():
103 return cv::GMetaArg(descr_of(util::get<cv::gapi::own::Scalar>(arg)));
105 case GRunArg::index_of<cv::detail::VectorRef>():
106 return cv::GMetaArg(util::get<cv::detail::VectorRef>(arg).descr_of());
108 default: util::throw_error(std::logic_error("Unsupported GRunArg type"));
112 cv::GMetaArgs cv::descr_of(const cv::GRunArgs &args)
115 ade::util::transform(args, std::back_inserter(metas), [](const cv::GRunArg &arg){ return descr_of(arg); });
119 cv::GMetaArg cv::descr_of(const cv::GRunArgP &argp)
121 switch (argp.index())
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"));
136 std::ostream& operator<<(std::ostream& os, const cv::GMetaArg &arg)
138 // FIXME: Implement via variant visitor
141 case cv::GMetaArg::index_of<util::monostate>():
142 os << "(unresolved)";
145 case cv::GMetaArg::index_of<cv::GMatDesc>():
146 os << util::get<cv::GMatDesc>(arg);
149 case cv::GMetaArg::index_of<cv::GScalarDesc>():
150 os << util::get<cv::GScalarDesc>(arg);
153 case cv::GMetaArg::index_of<cv::GArrayDesc>():
154 os << util::get<cv::GArrayDesc>(arg);