NVIDIA DeepStream SDK API Reference

9.2 Release
includes/opentelemetry/std/variant.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 // IWYU pragma: private, include "opentelemetry/nostd/variant.h"
7 
8 #include "opentelemetry/version.h"
9 
10 #include <cstddef>
11 #include <memory>
12 #include <utility>
13 #include <variant>
14 
16 // Standard Type aliases in nostd namespace
17 namespace nostd
18 {
19 using std::get_if;
20 using std::monostate;
22 
23 // nostd::variant<...>
24 template <class... _Types>
25 using variant = std::variant<_Types...>;
26 
27 template <class... _Types>
28 using variant_size = std::variant_size<_Types...>;
29 
31 
32 #if defined(__APPLE__) && defined(_LIBCPP_USE_AVAILABILITY_APPLE)
33 // Apple Platforms provide std::bad_variant_access only in newer versions of OS.
34 // To keep API compatible with any version of OS - we are providing our own
35 // implementation of nostd::bad_variant_access exception.
36 # if __EXCEPTIONS
37 
38 // nostd::bad_variant_access
39 class bad_variant_access : public std::exception
40 {
41 public:
42  virtual const char *what() const noexcept override { return "bad_variant_access"; }
43 };
44 
45 [[noreturn]] inline void throw_bad_variant_access()
46 {
47  throw bad_variant_access{};
48 }
49 # endif
50 
51 # if __EXCEPTIONS
52 # define THROW_BAD_VARIANT_ACCESS throw_bad_variant_access()
53 # else
54 # define THROW_BAD_VARIANT_ACCESS std::terminate()
55 # endif
56 
57 //
58 // nostd::get<...> for Apple Clang
59 //
60 template <typename T, class... Types>
61 constexpr auto get_type = [](auto &&t) constexpr -> decltype(auto) {
62  auto v = t;
63  auto result = std::get_if<T>(&v); // TODO: optimize with std::forward(t) if t is not rvalue
64  if (result)
65  {
66  return *result;
67  }
69  return *result;
70 };
71 
72 template <std::size_t I, class... Types>
73 constexpr auto get_index = [](auto &&t) constexpr -> decltype(auto) {
74  auto v = t;
75  auto result = std::get_if<I>(&v); // TODO: optimize with std::forward(t) if t is not rvalue
76  if (result)
77  {
78  return *result;
79  }
81  return *result;
82 };
83 
84 template <std::size_t I, class... Types>
85 constexpr std::variant_alternative_t<I, std::variant<Types...>> &get(std::variant<Types...> &v)
86 {
87  return get_index<I, Types...>(v);
88 };
89 
90 template <std::size_t I, class... Types>
91 constexpr std::variant_alternative_t<I, std::variant<Types...>> &&get(std::variant<Types...> &&v)
92 {
93  return get_index<I, Types...>(std::forward<decltype(v)>(v));
94 };
95 
96 template <std::size_t I, class... Types>
97 constexpr const std::variant_alternative_t<I, std::variant<Types...>> &get(
98  const std::variant<Types...> &v)
99 {
100  return get_index<I, Types...>(v);
101 };
102 
103 template <std::size_t I, class... Types>
104 constexpr const std::variant_alternative_t<I, std::variant<Types...>> &&get(
105  const std::variant<Types...> &&v)
106 {
107  return get_index<I, Types...>(std::forward<decltype(v)>(v));
108 };
109 
110 template <class T, class... Types>
111 constexpr T &get(std::variant<Types...> &v)
112 {
113  return get_type<T, Types...>(v);
114 };
115 
116 template <class T, class... Types>
117 constexpr T /*&&*/ get(std::variant<Types...> &&v)
118 {
119  return get_type<T, Types...>(v);
120 };
121 
122 template <class T, class... Types>
123 constexpr const T &get(const std::variant<Types...> &v)
124 {
125  return get_type<T, Types...>(v);
126 };
127 
128 template <class T, class... Types>
129 constexpr const T &&get(const std::variant<Types...> &&v)
130 {
131  return get_type<T, Types...>(std::forward<decltype(v)>(v));
132 };
133 
134 template <class _Callable, class... _Variants>
135 constexpr auto visit(_Callable &&_Obj, _Variants &&..._Args)
136 {
137  // Ref:
138  // https://stackoverflow.com/questions/52310835/xcode-10-call-to-unavailable-function-stdvisit
139  return std::__variant_detail::__visitation::__variant::__visit_value(_Obj, _Args...);
140 };
141 
142 #else
143 using std::bad_variant_access;
144 
145 template <std::size_t I, class... Types>
146 constexpr std::variant_alternative_t<I, std::variant<Types...>> &get(std::variant<Types...> &v)
147 {
148  return std::get<I, Types...>(v);
149 }
150 
151 template <std::size_t I, class... Types>
152 constexpr std::variant_alternative_t<I, std::variant<Types...>> &&get(std::variant<Types...> &&v)
153 {
154  return std::get<I, Types...>(std::forward<decltype(v)>(v));
155 }
156 
157 template <std::size_t I, class... Types>
158 constexpr const std::variant_alternative_t<I, std::variant<Types...>> &get(
159  const std::variant<Types...> &v)
160 {
161  return std::get<I, Types...>(v);
162 }
163 
164 template <std::size_t I, class... Types>
165 constexpr const std::variant_alternative_t<I, std::variant<Types...>> &&get(
166  const std::variant<Types...> &&v)
167 {
168  return std::get<I, Types...>(std::forward<decltype(v)>(v));
169 }
170 
171 template <class T, class... Types>
172 constexpr T &get(std::variant<Types...> &v)
173 {
174  return std::get<T, Types...>(v);
175 }
176 
177 template <class T, class... Types>
178 constexpr T &&get(std::variant<Types...> &&v)
179 {
180  return std::get<T, Types...>(std::forward<decltype(v)>(v));
181 }
182 
183 template <class T, class... Types>
184 constexpr const T &get(const std::variant<Types...> &v)
185 {
186  return std::get<T, Types...>(v);
187 }
188 
189 template <class T, class... Types>
190 constexpr const T &&get(const std::variant<Types...> &&v)
191 {
192  return std::get<T, Types...>(std::forward<decltype(v)>(v));
193 }
194 
195 template <class _Callable, class... _Variants>
196 constexpr auto visit(_Callable &&_Obj, _Variants &&..._Args)
197 {
198  return std::visit<_Callable, _Variants...>(static_cast<_Callable &&>(_Obj),
199  static_cast<_Variants &&>(_Args)...);
200 }
201 
202 #endif
203 
204 /*
205 # if _HAS_CXX20
206 template <class _Ret, class _Callable, class... _Variants>
207 constexpr _Ret visit(_Callable &&_Obj, _Variants &&... _Args)
208 {
209  return std::visit<_Ret, _Callable, _Variants...>(
210  static_cast<_Callable &&>(_Obj),
211  static_cast<_Variants &&>(_Args)...);
212 };
213 # endif
214 */
215 
216 // nostd::holds_alternative
217 template <std::size_t I, typename... Ts>
218 inline constexpr bool holds_alternative(const variant<Ts...> &v) noexcept
219 {
220  return v.index() == I;
221 }
222 
223 template <typename T, typename... Ts>
224 inline constexpr bool holds_alternative(const variant<Ts...> &v) noexcept
225 {
226  return std::holds_alternative<T, Ts...>(v);
227 }
228 
229 } // namespace nostd
nostd
Definition: includes/opentelemetry/nostd/function_ref.h:14
absl::OTABSL_OPTION_NAMESPACE_NAME::variant
Definition: includes/opentelemetry/nostd/variant.h:61
absl::get_if
constexpr absl::OTABSL_OPTION_NAMESPACE_NAME::add_pointer_t< variant_alternative_t< I, variant< Types... > > > get_if(variant< Types... > *v) noexcept
Definition: includes/opentelemetry/nostd/internal/absl/types/variant.h:348
nostd::get
constexpr const T && get(const std::variant< Types... > &&v)
Definition: includes/opentelemetry/std/variant.h:190
absl::OTABSL_OPTION_NAMESPACE_NAME::variant_size
Definition: includes/opentelemetry/nostd/variant.h:59
OPENTELEMETRY_BEGIN_NAMESPACE
#define OPENTELEMETRY_BEGIN_NAMESPACE
Definition: includes/opentelemetry/version.h:21
OPENTELEMETRY_END_NAMESPACE
#define OPENTELEMETRY_END_NAMESPACE
Definition: includes/opentelemetry/version.h:24
nostd::variant
std::variant< _Types... > variant
Definition: includes/opentelemetry/std/variant.h:25
THROW_BAD_VARIANT_ACCESS
#define THROW_BAD_VARIANT_ACCESS
Definition: includes/opentelemetry/nostd/variant.h:41
nostd::get
constexpr std::variant_alternative_t< I, std::variant< Types... > > & get(std::variant< Types... > &v)
Definition: includes/opentelemetry/std/variant.h:146
nostd::visit
constexpr auto visit(_Callable &&_Obj, _Variants &&..._Args)
Definition: includes/opentelemetry/std/variant.h:196
nostd::variant_alternative_t
typename variant_alternative< I, T >::type variant_alternative_t
Definition: includes/opentelemetry/nostd/detail/variant_alternative.h:19
nostd::monostate
std::monostate monostate
Definition: includes/opentelemetry/std/variant.h:30
nostd::holds_alternative
constexpr bool holds_alternative(const variant< Ts... > &v) noexcept
Definition: includes/opentelemetry/std/variant.h:218
nostd::variant_size
std::variant_size< _Types... > variant_size
Definition: includes/opentelemetry/std/variant.h:28