// 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 #include "precomp.hpp" #include #include "opencv2/gapi/util/throw.hpp" #include "opencv2/gapi/garg.hpp" #include "opencv2/gapi/gproto.hpp" #include "api/gorigin.hpp" #include "api/gproto_priv.hpp" // FIXME: it should be a visitor! // FIXME: Reimplement with traits? const cv::GOrigin& cv::gimpl::proto::origin_of(const cv::GProtoArg &arg) { switch (arg.index()) { case cv::GProtoArg::index_of(): return util::get(arg).priv(); case cv::GProtoArg::index_of(): return util::get(arg).priv(); case cv::GProtoArg::index_of(): return util::get(arg).priv(); case cv::GProtoArg::index_of(): return util::get(arg).priv(); default: util::throw_error(std::logic_error("Unsupported GProtoArg type")); } } const cv::GOrigin& cv::gimpl::proto::origin_of(const cv::GArg &arg) { // Generic, but not very efficient implementation // FIXME: Walking a thin line here!!! Here we rely that GArg and // GProtoArg share the same object and this is true while objects // are reference-counted, so return value is not a reference to a tmp. return origin_of(rewrap(arg)); } bool cv::gimpl::proto::is_dynamic(const cv::GArg& arg) { // FIXME: refactor this method to be auto-generated from // - GProtoArg variant parameter pack, and // - traits over every type switch (arg.kind) { case detail::ArgKind::GMAT: case detail::ArgKind::GMATP: case detail::ArgKind::GSCALAR: case detail::ArgKind::GARRAY: return true; default: return false; } } cv::GRunArg cv::value_of(const cv::GOrigin &origin) { switch (origin.shape) { case GShape::GSCALAR: return GRunArg(util::get(origin.value)); default: util::throw_error(std::logic_error("Unsupported shape for constant")); } } cv::GProtoArg cv::gimpl::proto::rewrap(const cv::GArg &arg) { // FIXME: replace with a more generic any->variant // (or variant -> variant) conversion? switch (arg.kind) { case detail::ArgKind::GMAT: return GProtoArg(arg.get()); case detail::ArgKind::GMATP: return GProtoArg(arg.get()); case detail::ArgKind::GSCALAR: return GProtoArg(arg.get()); case detail::ArgKind::GARRAY: return GProtoArg(arg.get()); default: util::throw_error(std::logic_error("Unsupported GArg type")); } } cv::GMetaArg cv::descr_of(const cv::GRunArg &arg) { switch (arg.index()) { #if !defined(GAPI_STANDALONE) case GRunArg::index_of(): return cv::GMetaArg(descr_of(util::get(arg))); case GRunArg::index_of(): return cv::GMetaArg(descr_of(util::get(arg))); #endif // !defined(GAPI_STANDALONE) case GRunArg::index_of(): return cv::GMetaArg(descr_of(util::get(arg))); case GRunArg::index_of(): return cv::GMetaArg(descr_of(util::get(arg))); case GRunArg::index_of(): return cv::GMetaArg(util::get(arg).descr_of()); default: util::throw_error(std::logic_error("Unsupported GRunArg type")); } } cv::GMetaArgs cv::descr_of(const cv::GRunArgs &args) { cv::GMetaArgs metas; ade::util::transform(args, std::back_inserter(metas), [](const cv::GRunArg &arg){ return descr_of(arg); }); return metas; } cv::GMetaArg cv::descr_of(const cv::GRunArgP &argp) { switch (argp.index()) { #if !defined(GAPI_STANDALONE) case GRunArgP::index_of(): return GMetaArg(descr_of(*util::get(argp))); case GRunArgP::index_of(): return GMetaArg(descr_of(*util::get(argp))); case GRunArgP::index_of(): return GMetaArg(descr_of(*util::get(argp))); #endif // !defined(GAPI_STANDALONE) case GRunArgP::index_of(): return GMetaArg(descr_of(*util::get(argp))); case GRunArgP::index_of(): return GMetaArg(descr_of(*util::get(argp))); case GRunArgP::index_of(): return GMetaArg(util::get(argp).descr_of()); default: util::throw_error(std::logic_error("Unsupported GRunArgP type")); } } bool cv::can_describe(const GMetaArg& meta, const GRunArgP& argp) { switch (argp.index()) { #if !defined(GAPI_STANDALONE) case GRunArgP::index_of(): return util::holds_alternative(meta) && util::get(meta).canDescribe(*util::get(argp)); case GRunArgP::index_of(): return meta == GMetaArg(descr_of(*util::get(argp))); case GRunArgP::index_of(): return meta == GMetaArg(descr_of(*util::get(argp))); #endif // !defined(GAPI_STANDALONE) case GRunArgP::index_of(): return util::holds_alternative(meta) && util::get(meta).canDescribe(*util::get(argp)); case GRunArgP::index_of(): return meta == GMetaArg(descr_of(*util::get(argp))); case GRunArgP::index_of(): return meta == GMetaArg(util::get(argp).descr_of()); default: util::throw_error(std::logic_error("Unsupported GRunArgP type")); } } bool cv::can_describe(const GMetaArg& meta, const GRunArg& arg) { switch (arg.index()) { #if !defined(GAPI_STANDALONE) case GRunArg::index_of(): return util::holds_alternative(meta) && util::get(meta).canDescribe(util::get(arg)); case GRunArg::index_of(): return meta == cv::GMetaArg(descr_of(util::get(arg))); case GRunArg::index_of(): return meta == cv::GMetaArg(descr_of(util::get(arg))); #endif // !defined(GAPI_STANDALONE) case GRunArg::index_of(): return util::holds_alternative(meta) && util::get(meta).canDescribe(util::get(arg)); case GRunArg::index_of(): return meta == cv::GMetaArg(descr_of(util::get(arg))); case GRunArg::index_of(): return meta == cv::GMetaArg(util::get(arg).descr_of()); default: util::throw_error(std::logic_error("Unsupported GRunArg type")); } } bool cv::can_describe(const GMetaArgs &metas, const GRunArgs &args) { return metas.size() == args.size() && std::equal(metas.begin(), metas.end(), args.begin(), [](const GMetaArg& meta, const GRunArg& arg) { return can_describe(meta, arg); }); } namespace cv { std::ostream& operator<<(std::ostream& os, const cv::GMetaArg &arg) { // FIXME: Implement via variant visitor switch (arg.index()) { case cv::GMetaArg::index_of(): os << "(unresolved)"; break; case cv::GMetaArg::index_of(): os << util::get(arg); break; case cv::GMetaArg::index_of(): os << util::get(arg); break; case cv::GMetaArg::index_of(): os << util::get(arg); break; default: GAPI_Assert(false); } return os; } }