github.com/kaydxh/golang@v0.0.131/pkg/gocv/cgo/third_path/opencv4/include/opencv2/gapi/garg.hpp (about) 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-2020 Intel Corporation 6 7 8 #ifndef OPENCV_GAPI_GARG_HPP 9 #define OPENCV_GAPI_GARG_HPP 10 11 #include <vector> 12 #include <unordered_map> 13 #include <type_traits> 14 15 #include <opencv2/gapi/opencv_includes.hpp> 16 #include <opencv2/gapi/own/mat.hpp> 17 #include <opencv2/gapi/media.hpp> 18 19 #include <opencv2/gapi/util/util.hpp> 20 #include <opencv2/gapi/util/any.hpp> 21 #include <opencv2/gapi/util/variant.hpp> 22 23 #include <opencv2/gapi/gmat.hpp> 24 #include <opencv2/gapi/gscalar.hpp> 25 #include <opencv2/gapi/garray.hpp> 26 #include <opencv2/gapi/gopaque.hpp> 27 #include <opencv2/gapi/gframe.hpp> 28 #include <opencv2/gapi/gtype_traits.hpp> 29 #include <opencv2/gapi/gmetaarg.hpp> 30 #include <opencv2/gapi/streaming/source.hpp> 31 #include <opencv2/gapi/rmat.hpp> 32 33 namespace cv { 34 35 class GArg; 36 37 namespace detail { 38 template<typename T> 39 using is_garg = std::is_same<GArg, typename std::decay<T>::type>; 40 } 41 42 // Parameter holder class for a node 43 // Depending on platform capabilities, can either support arbitrary types 44 // (as `boost::any`) or a limited number of types (as `boot::variant`). 45 // FIXME: put into "details" as a user shouldn't use it in his code 46 class GAPI_EXPORTS GArg 47 { 48 public: 49 GArg() {} 50 51 template<typename T, typename std::enable_if<!detail::is_garg<T>::value, int>::type = 0> 52 explicit GArg(const T &t) 53 : kind(detail::GTypeTraits<T>::kind) 54 , opaque_kind(detail::GOpaqueTraits<T>::kind) 55 , value(detail::wrap_gapi_helper<T>::wrap(t)) 56 { 57 } 58 59 template<typename T, typename std::enable_if<!detail::is_garg<T>::value, int>::type = 0> 60 explicit GArg(T &&t) 61 : kind(detail::GTypeTraits<typename std::decay<T>::type>::kind) 62 , opaque_kind(detail::GOpaqueTraits<typename std::decay<T>::type>::kind) 63 , value(detail::wrap_gapi_helper<T>::wrap(t)) 64 { 65 } 66 67 template<typename T> inline T& get() 68 { 69 return util::any_cast<typename std::remove_reference<T>::type>(value); 70 } 71 72 template<typename T> inline const T& get() const 73 { 74 return util::any_cast<typename std::remove_reference<T>::type>(value); 75 } 76 77 template<typename T> inline T& unsafe_get() 78 { 79 return util::unsafe_any_cast<typename std::remove_reference<T>::type>(value); 80 } 81 82 template<typename T> inline const T& unsafe_get() const 83 { 84 return util::unsafe_any_cast<typename std::remove_reference<T>::type>(value); 85 } 86 87 detail::ArgKind kind = detail::ArgKind::OPAQUE_VAL; 88 detail::OpaqueKind opaque_kind = detail::OpaqueKind::CV_UNKNOWN; 89 90 protected: 91 util::any value; 92 }; 93 94 using GArgs = std::vector<GArg>; 95 96 // FIXME: Express as M<GProtoArg...>::type 97 // FIXME: Move to a separate file! 98 using GRunArgBase = util::variant< 99 #if !defined(GAPI_STANDALONE) 100 cv::UMat, 101 #endif // !defined(GAPI_STANDALONE) 102 cv::RMat, 103 cv::gapi::wip::IStreamSource::Ptr, 104 cv::Mat, 105 cv::Scalar, 106 cv::detail::VectorRef, 107 cv::detail::OpaqueRef, 108 cv::MediaFrame 109 >; 110 111 namespace detail { 112 template<typename,typename> 113 struct in_variant; 114 115 template<typename T, typename... Types> 116 struct in_variant<T, util::variant<Types...> > 117 : std::integral_constant<bool, cv::detail::contains<T, Types...>::value > { 118 }; 119 } // namespace detail 120 121 struct GAPI_EXPORTS GRunArg: public GRunArgBase 122 { 123 // Metadata information here 124 using Meta = std::unordered_map<std::string, util::any>; 125 Meta meta; 126 127 // Mimic the old GRunArg semantics here, old of the times when 128 // GRunArg was an alias to variant<> 129 GRunArg(); 130 GRunArg(const cv::GRunArg &arg); 131 GRunArg(cv::GRunArg &&arg); 132 133 GRunArg& operator= (const GRunArg &arg); 134 GRunArg& operator= (GRunArg &&arg); 135 136 template <typename T> 137 GRunArg(const T &t, 138 const Meta &m = Meta{}, 139 typename std::enable_if< detail::in_variant<T, GRunArgBase>::value, int>::type = 0) 140 : GRunArgBase(t) 141 , meta(m) 142 { 143 } 144 template <typename T> 145 GRunArg(T &&t, 146 const Meta &m = Meta{}, 147 typename std::enable_if< detail::in_variant<T, GRunArgBase>::value, int>::type = 0) 148 : GRunArgBase(std::move(t)) 149 , meta(m) 150 { 151 } 152 template <typename T> auto operator= (const T &t) 153 -> typename std::enable_if< detail::in_variant<T, GRunArgBase>::value, cv::GRunArg>::type& 154 { 155 GRunArgBase::operator=(t); 156 return *this; 157 } 158 template <typename T> auto operator= (T&& t) 159 -> typename std::enable_if< detail::in_variant<T, GRunArgBase>::value, cv::GRunArg>::type& 160 { 161 GRunArgBase::operator=(std::move(t)); 162 return *this; 163 } 164 }; 165 using GRunArgs = std::vector<GRunArg>; 166 167 // TODO: Think about the addition operator 168 /** 169 * @brief This operator allows to complement the input vector at runtime. 170 * 171 * It's an ordinary overload of addition assignment operator. 172 * 173 * Example of usage: 174 * @snippet dynamic_graph.cpp GRunArgs usage 175 * 176 */ 177 inline GRunArgs& operator += (GRunArgs &lhs, const GRunArgs &rhs) 178 { 179 lhs.reserve(lhs.size() + rhs.size()); 180 lhs.insert(lhs.end(), rhs.begin(), rhs.end()); 181 return lhs; 182 } 183 184 namespace gapi 185 { 186 namespace wip 187 { 188 /** 189 * @brief This aggregate type represents all types which G-API can 190 * handle (via variant). 191 * 192 * It only exists to overcome C++ language limitations (where a 193 * `using`-defined class can't be forward-declared). 194 */ 195 struct GAPI_EXPORTS Data: public GRunArg 196 { 197 using GRunArg::GRunArg; 198 template <typename T> 199 Data& operator= (const T& t) { GRunArg::operator=(t); return *this; } 200 template <typename T> 201 Data& operator= (T&& t) { GRunArg::operator=(std::move(t)); return *this; } 202 }; 203 } // namespace wip 204 } // namespace gapi 205 206 using GRunArgP = util::variant< 207 #if !defined(GAPI_STANDALONE) 208 cv::UMat*, 209 #endif // !defined(GAPI_STANDALONE) 210 cv::Mat*, 211 cv::RMat*, 212 cv::Scalar*, 213 cv::MediaFrame*, 214 cv::detail::VectorRef, 215 cv::detail::OpaqueRef 216 >; 217 using GRunArgsP = std::vector<GRunArgP>; 218 219 // TODO: Think about the addition operator 220 /** 221 * @brief This operator allows to complement the output vector at runtime. 222 * 223 * It's an ordinary overload of addition assignment operator. 224 * 225 * Example of usage: 226 * @snippet dynamic_graph.cpp GRunArgsP usage 227 * 228 */ 229 inline GRunArgsP& operator += (GRunArgsP &lhs, const GRunArgsP &rhs) 230 { 231 lhs.reserve(lhs.size() + rhs.size()); 232 lhs.insert(lhs.end(), rhs.begin(), rhs.end()); 233 return lhs; 234 } 235 236 namespace gapi 237 { 238 GAPI_EXPORTS cv::GRunArgsP bind(cv::GRunArgs &results); 239 GAPI_EXPORTS cv::GRunArg bind(cv::GRunArgP &out); // FIXME: think more about it 240 } 241 242 template<typename... Ts> inline GRunArgs gin(const Ts&... args) 243 { 244 return GRunArgs{ GRunArg(detail::wrap_host_helper<Ts>::wrap_in(args))... }; 245 } 246 247 template<typename... Ts> inline GRunArgsP gout(Ts&... args) 248 { 249 return GRunArgsP{ GRunArgP(detail::wrap_host_helper<Ts>::wrap_out(args))... }; 250 } 251 252 struct GTypeInfo; 253 using GTypesInfo = std::vector<GTypeInfo>; 254 255 // FIXME: Needed for python bridge, must be moved to more appropriate header 256 namespace detail { 257 struct ExtractArgsCallback 258 { 259 cv::GRunArgs operator()(const cv::GTypesInfo& info) const { return c(info); } 260 using CallBackT = std::function<cv::GRunArgs(const cv::GTypesInfo& info)>; 261 CallBackT c; 262 }; 263 264 struct ExtractMetaCallback 265 { 266 cv::GMetaArgs operator()(const cv::GTypesInfo& info) const { return c(info); } 267 using CallBackT = std::function<cv::GMetaArgs(const cv::GTypesInfo& info)>; 268 CallBackT c; 269 }; 270 271 void constructGraphOutputs(const cv::GTypesInfo &out_info, 272 cv::GRunArgs &args, 273 cv::GRunArgsP &outs); 274 } // namespace detail 275 276 } // namespace cv 277 278 #endif // OPENCV_GAPI_GARG_HPP