Blame view

3rdparty/opencv_4_1/include/opencv2/gapi/gproto.hpp 4 KB
09c2d08c   Hu Chunming   arm交付版
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
  // 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 <type_traits>
  #include <vector>
  #include <ostream>
  
  #include <opencv2/gapi/util/variant.hpp>
  
  #include <opencv2/gapi/gmat.hpp>
  #include <opencv2/gapi/gscalar.hpp>
  #include <opencv2/gapi/garray.hpp>
  #include <opencv2/gapi/garg.hpp>
  #include <opencv2/gapi/gmetaarg.hpp>
  
  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
      , GScalar
      , detail::GArrayU // instead of GArray<T>
      >;
  
  using GProtoArgs = std::vector<GProtoArg>;
  
  namespace detail
  {
  template<typename... Ts> inline GProtoArgs packArgs(Ts... args)
  {
      return GProtoArgs{ GProtoArg(wrap_gapi_helper<Ts>::wrap(args))... };
  }
  
  }
  
  template<class Tag>
  struct GIOProtoArgs
  {
  public:
      explicit GIOProtoArgs(const GProtoArgs& args) : m_args(args) {}
      explicit GIOProtoArgs(GProtoArgs &&args)      : m_args(std::move(args)) {}
  
      GProtoArgs m_args;
  };
  
  struct In_Tag{};
  struct Out_Tag{};
  
  using GProtoInputArgs  = GIOProtoArgs<In_Tag>;
  using GProtoOutputArgs = GIOProtoArgs<Out_Tag>;
  
  // Perfect forwarding
  template<typename... Ts> inline GProtoInputArgs GIn(Ts&&... ts)
  {
      return GProtoInputArgs(detail::packArgs(std::forward<Ts>(ts)...));
  }
  
  template<typename... Ts> inline GProtoOutputArgs GOut(Ts&&... ts)
  {
      return GProtoOutputArgs(detail::packArgs(std::forward<Ts>(ts)...));
  }
  
  namespace detail
  {
      // Extract elements form tuple
      // FIXME: Someday utilize a generic tuple_to_vec<> routine
      template<typename... Ts, int... Indexes>
      static GProtoOutputArgs getGOut_impl(const std::tuple<Ts...>& ts, detail::Seq<Indexes...>)
      {
          return GProtoOutputArgs{ detail::packArgs(std::get<Indexes>(ts)...)};
      }
  }
  
  template<typename... Ts> inline GProtoOutputArgs GOut(const std::tuple<Ts...>& ts)
  {
      // TODO: think of std::forward(ts)
      return detail::getGOut_impl(ts, typename detail::MkSeq<sizeof...(Ts)>::type());
  }
  
  // Takes rvalue as input arg
  template<typename... Ts> inline GProtoOutputArgs GOut(std::tuple<Ts...>&& ts)
  {
      // TODO: think of std::forward(ts)
      return detail::getGOut_impl(ts, typename detail::MkSeq<sizeof...(Ts)>::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);
  
  } // namespace cv
  
  #endif // OPENCV_GAPI_GPROTO_HPP