// This file is part of OpenCV project. // It is subject to the license terms in the LICENSE file found in the top-level directory // of this distribution and at http://opencv.org/license.html. // // Copyright (C) 2018 Intel Corporation #ifndef OPENCV_GAPI_GPROTO_HPP #define OPENCV_GAPI_GPROTO_HPP #include #include #include #include #include #include #include #include #include #include namespace cv { // FIXME: user shouldn't deal with it - put to detail? // GProtoArg is an union type over G-types which can serve as // GComputation's in/output slots. In other words, GProtoArg // wraps any type which can serve as G-API exchange type. // // In Runtime, GProtoArgs are substituted with appropriate GRunArgs. // // GProtoArg objects are constructed in-place when user describes // (captures) computations, user doesn't interact with these types // directly. using GProtoArg = util::variant < GMat , GMatP , GFrame , GScalar , detail::GArrayU // instead of GArray , detail::GOpaqueU // instead of GOpaque >; using GProtoArgs = std::vector; namespace detail { template inline GProtoArgs packArgs(Ts... args) { return GProtoArgs{ GProtoArg(wrap_gapi_helper::wrap(args))... }; } } template struct GIOProtoArgs { public: // NB: Used by python wrapper GIOProtoArgs() = default; explicit GIOProtoArgs(const GProtoArgs& args) : m_args(args) {} explicit GIOProtoArgs(GProtoArgs &&args) : m_args(std::move(args)) {} GProtoArgs m_args; // TODO: Think about the addition operator /** * @brief This operator allows to complement the proto vectors at runtime. * * It's an ordinary overload of addition assignment operator. * * Example of usage: * @snippet samples/cpp/tutorial_code/gapi/doc_snippets/dynamic_graph_snippets.cpp GIOProtoArgs usage * */ template friend GIOProtoArgs& operator += (GIOProtoArgs &lhs, const GIOProtoArgs &rhs); }; template cv::GIOProtoArgs& operator += (cv::GIOProtoArgs &lhs, const cv::GIOProtoArgs &rhs) { lhs.m_args.reserve(lhs.m_args.size() + rhs.m_args.size()); lhs.m_args.insert(lhs.m_args.end(), rhs.m_args.begin(), rhs.m_args.end()); return lhs; } struct In_Tag{}; struct Out_Tag{}; using GProtoInputArgs = GIOProtoArgs; using GProtoOutputArgs = GIOProtoArgs; // Perfect forwarding template inline GProtoInputArgs GIn(Ts&&... ts) { return GProtoInputArgs(detail::packArgs(std::forward(ts)...)); } template inline GProtoOutputArgs GOut(Ts&&... ts) { return GProtoOutputArgs(detail::packArgs(std::forward(ts)...)); } namespace detail { // Extract elements form tuple // FIXME: Someday utilize a generic tuple_to_vec<> routine template static GProtoOutputArgs getGOut_impl(const std::tuple& ts, detail::Seq) { return GProtoOutputArgs{ detail::packArgs(std::get(ts)...)}; } } template inline GProtoOutputArgs GOut(const std::tuple& ts) { // TODO: think of std::forward(ts) return detail::getGOut_impl(ts, typename detail::MkSeq::type()); } // Takes rvalue as input arg template inline GProtoOutputArgs GOut(std::tuple&& ts) { // TODO: think of std::forward(ts) return detail::getGOut_impl(ts, typename detail::MkSeq::type()); } // Extract run-time arguments from node origin // Can be used to extract constant values associated with G-objects // (like GScalar) at graph construction time GRunArg value_of(const GOrigin &origin); // Transform run-time computation arguments into a collection of metadata // extracted from that arguments GMetaArg GAPI_EXPORTS descr_of(const GRunArg &arg ); GMetaArgs GAPI_EXPORTS descr_of(const GRunArgs &args); // Transform run-time operation result argument into metadata extracted from that argument // Used to compare the metadata, which generated at compile time with the metadata result operation in run time GMetaArg GAPI_EXPORTS descr_of(const GRunArgP& argp); // Checks if run-time computation argument can be described by metadata bool GAPI_EXPORTS can_describe(const GMetaArg& meta, const GRunArg& arg); bool GAPI_EXPORTS can_describe(const GMetaArgs& metas, const GRunArgs& args); // Checks if run-time computation result argument can be described by metadata. // Used to check if the metadata generated at compile time // coincides with output arguments passed to computation in cpu and ocl backends bool GAPI_EXPORTS can_describe(const GMetaArg& meta, const GRunArgP& argp); // Validates input arguments void GAPI_EXPORTS validate_input_arg(const GRunArg& arg); void GAPI_EXPORTS validate_input_args(const GRunArgs& args); } // namespace cv #endif // OPENCV_GAPI_GPROTO_HPP