NVIDIA DeepStream SDK API Reference

9.2 Release
9.2/includes/opentelemetry/nostd/detail/invoke.h
Go to the documentation of this file.
1 // Copyright The OpenTelemetry Authors
2 // SPDX-License-Identifier: Apache-2.0
3 
4 #pragma once
5 
6 #include <type_traits>
7 #include <utility>
8 
9 #include "opentelemetry/nostd/detail/decay.h"
10 #include "opentelemetry/nostd/detail/void.h"
11 #include "opentelemetry/version.h"
12 
13 #define OPENTELEMETRY_RETURN(...) \
14  noexcept(noexcept(__VA_ARGS__))->decltype(__VA_ARGS__) \
15  { \
16  return __VA_ARGS__; \
17  }
18 
20 namespace nostd
21 {
22 namespace detail
23 {
24 
25 template <typename T>
26 struct is_reference_wrapper : std::false_type
27 {};
28 
29 template <typename T>
30 struct is_reference_wrapper<std::reference_wrapper<T>> : std::true_type
31 {};
32 
33 template <bool, int>
34 struct Invoke;
35 
36 template <>
37 struct Invoke<true /* pmf */, 0 /* is_base_of */>
38 {
39  template <typename R, typename T, typename Arg, typename... Args>
40  inline static constexpr auto invoke(R T::*pmf, Arg &&arg, Args &&...args)
41  OPENTELEMETRY_RETURN((std::forward<Arg>(arg).*pmf)(std::forward<Args>(args)...))
42 };
43 
44 template <>
45 struct Invoke<true /* pmf */, 1 /* is_reference_wrapper */>
46 {
47  template <typename R, typename T, typename Arg, typename... Args>
48  inline static constexpr auto invoke(R T::*pmf, Arg &&arg, Args &&...args)
49  OPENTELEMETRY_RETURN((std::forward<Arg>(arg).get().*pmf)(std::forward<Args>(args)...))
50 };
51 
52 template <>
53 struct Invoke<true /* pmf */, 2 /* otherwise */>
54 {
55  template <typename R, typename T, typename Arg, typename... Args>
56  inline static constexpr auto invoke(R T::*pmf, Arg &&arg, Args &&...args)
57  OPENTELEMETRY_RETURN(((*std::forward<Arg>(arg)).*pmf)(std::forward<Args>(args)...))
58 };
59 
60 template <>
61 struct Invoke<false /* pmo */, 0 /* is_base_of */>
62 {
63  template <typename R, typename T, typename Arg>
64  inline static constexpr auto invoke(R T::*pmo, Arg &&arg)
65  OPENTELEMETRY_RETURN(std::forward<Arg>(arg).*pmo)
66 };
67 
68 template <>
69 struct Invoke<false /* pmo */, 1 /* is_reference_wrapper */>
70 {
71  template <typename R, typename T, typename Arg>
72  inline static constexpr auto invoke(R T::*pmo, Arg &&arg)
73  OPENTELEMETRY_RETURN(std::forward<Arg>(arg).get().*pmo)
74 };
75 
76 template <>
77 struct Invoke<false /* pmo */, 2 /* otherwise */>
78 {
79  template <typename R, typename T, typename Arg>
80  inline static constexpr auto invoke(R T::*pmo, Arg &&arg)
81  OPENTELEMETRY_RETURN((*std::forward<Arg>(arg)).*pmo)
82 };
83 
84 template <typename R, typename T, typename Arg, typename... Args>
85 inline constexpr auto invoke_impl(R T::*f, Arg &&arg, Args &&...args) OPENTELEMETRY_RETURN(
86  Invoke<std::is_function<R>::value,
87  (std::is_base_of<T, decay_t<Arg>>::value ? 0
88  : is_reference_wrapper<decay_t<Arg>>::value ? 1
89  : 2)>::invoke(f,
90  std::forward<Arg>(arg),
91  std::forward<Args>(args)...))
92 
93 #ifdef _MSC_VER
94 # pragma warning(push)
95 # pragma warning(disable : 4100)
96 #endif
97  template <typename F, typename... Args>
98  inline constexpr auto invoke_impl(F &&f, Args &&...args)
99  OPENTELEMETRY_RETURN(std::forward<F>(f)(std::forward<Args>(args)...))
100 #ifdef _MSC_VER
101 # pragma warning(pop)
102 #endif
103 } // namespace detail
104 
105 /* clang-format off */
106 template <typename F, typename... Args>
107 inline constexpr auto invoke(F &&f, Args &&... args)
108  OPENTELEMETRY_RETURN(detail::invoke_impl(std::forward<F>(f), std::forward<Args>(args)...))
109 
110 namespace detail
111 /* clang-format on */
112 {
113 
114  template <typename Void, typename, typename...>
115  struct invoke_result
116  {};
117 
118  template <typename F, typename... Args>
119  struct invoke_result<void_t<decltype(nostd::invoke(std::declval<F>(), std::declval<Args>()...))>,
120  F, Args...>
121  {
122  using type = decltype(nostd::invoke(std::declval<F>(), std::declval<Args>()...));
123  };
124 
125 } // namespace detail
126 
127 template <typename F, typename... Args>
128 using invoke_result = detail::invoke_result<void, F, Args...>;
129 
130 template <typename F, typename... Args>
131 using invoke_result_t = typename invoke_result<F, Args...>::type;
132 
133 namespace detail
134 {
135 
136 template <typename Void, typename, typename...>
138 {};
139 
140 template <typename F, typename... Args>
141 struct is_invocable<void_t<invoke_result_t<F, Args...>>, F, Args...> : std::true_type
142 {};
143 
144 template <typename Void, typename, typename, typename...>
146 {};
147 
148 template <typename R, typename F, typename... Args>
149 struct is_invocable_r<void_t<invoke_result_t<F, Args...>>, R, F, Args...>
150  : std::is_convertible<invoke_result_t<F, Args...>, R>
151 {};
152 
153 } // namespace detail
154 
155 template <typename F, typename... Args>
156 using is_invocable = detail::is_invocable<void, F, Args...>;
157 
158 template <typename R, typename F, typename... Args>
159 using is_invocable_r = detail::is_invocable_r<void, R, F, Args...>;
160 } // namespace nostd
162 
163 #undef OPENTELEMETRY_RETURN
half_float::detail::false_type
bool_type< false > false_type
Definition: includes/half.hpp:489
nostd
Definition: includes/opentelemetry/nostd/function_ref.h:14
nostd::invoke_result_t
typename invoke_result< F, Args... >::type invoke_result_t
Definition: includes/opentelemetry/nostd/detail/invoke.h:131
OPENTELEMETRY_RETURN
#define OPENTELEMETRY_RETURN(...)
Definition: 9.2/includes/opentelemetry/nostd/detail/invoke.h:13
OPENTELEMETRY_BEGIN_NAMESPACE
#define OPENTELEMETRY_BEGIN_NAMESPACE
Definition: includes/opentelemetry/version.h:21
absl::base_internal::Invoke
InvokeT< F, Args... > Invoke(F &&f, Args &&... args)
Definition: includes/opentelemetry/nostd/internal/absl/base/internal/invoke.h:162
nostd::invoke_result
detail::invoke_result< void, F, Args... > invoke_result
Definition: includes/opentelemetry/nostd/detail/invoke.h:128
OPENTELEMETRY_END_NAMESPACE
#define OPENTELEMETRY_END_NAMESPACE
Definition: includes/opentelemetry/version.h:24
nostd::void_t
typename detail::voider< Tx... >::type void_t
Back port of std::void_t.
Definition: includes/opentelemetry/nostd/detail/void.h:26
nostd::invoke
constexpr auto invoke(F &&f, Args &&... args) OPENTELEMETRY_RETURN(detail
Definition: includes/opentelemetry/nostd/detail/invoke.h:107
nostd::get
constexpr std::variant_alternative_t< I, std::variant< Types... > > & get(std::variant< Types... > &v)
Definition: includes/opentelemetry/std/variant.h:146
half_float::detail::true_type
bool_type< true > true_type
Definition: includes/half.hpp:488
nostd::is_invocable_r
detail::is_invocable_r< void, R, F, Args... > is_invocable_r
Definition: includes/opentelemetry/nostd/detail/invoke.h:159
std
Extensions to the C++ standard library.
Definition: includes/opentelemetry/nostd/string_view.h:212
nostd::is_invocable
detail::is_invocable< void, F, Args... > is_invocable
Definition: includes/opentelemetry/nostd/detail/invoke.h:156