8 #include "opentelemetry/version.h"
24 template <
class... _Types>
27 template <
class... _Types>
32 #if defined(__APPLE__) && defined(_LIBCPP_USE_AVAILABILITY_APPLE)
39 class bad_variant_access :
public std::exception
42 virtual const char *what()
const noexcept
override {
return "bad_variant_access"; }
45 [[noreturn]]
inline void throw_bad_variant_access()
47 throw bad_variant_access{};
52 # define THROW_BAD_VARIANT_ACCESS throw_bad_variant_access()
54 # define THROW_BAD_VARIANT_ACCESS std::terminate()
60 template <
typename T,
class... Types>
61 constexpr
auto get_type = [](
auto &&t) constexpr -> decltype(
auto) {
63 auto result = std::get_if<T>(&v);
72 template <std::size_t I,
class... Types>
73 constexpr
auto get_index = [](
auto &&t) constexpr -> decltype(
auto) {
75 auto result = std::get_if<I>(&v);
84 template <std::size_t I,
class... Types>
87 return get_index<I, Types...>(v);
90 template <std::size_t I,
class... Types>
93 return get_index<I, Types...>(std::forward<decltype(v)>(v));
96 template <std::size_t I,
class... Types>
98 const std::variant<Types...> &v)
100 return get_index<I, Types...>(v);
103 template <std::size_t I,
class... Types>
105 const std::variant<Types...> &&v)
107 return get_index<I, Types...>(std::forward<decltype(v)>(v));
110 template <
class T,
class... Types>
111 constexpr T &
get(std::variant<Types...> &v)
113 return get_type<T, Types...>(v);
116 template <
class T,
class... Types>
117 constexpr T
get(std::variant<Types...> &&v)
119 return get_type<T, Types...>(v);
122 template <
class T,
class... Types>
123 constexpr
const T &
get(
const std::variant<Types...> &v)
125 return get_type<T, Types...>(v);
128 template <
class T,
class... Types>
129 constexpr
const T &&
get(
const std::variant<Types...> &&v)
131 return get_type<T, Types...>(std::forward<decltype(v)>(v));
134 template <
class _Callable,
class... _Variants>
135 constexpr
auto visit(_Callable &&_Obj, _Variants &&..._Args)
139 return std::__variant_detail::__visitation::__variant::__visit_value(_Obj, _Args...);
143 using std::bad_variant_access;
145 template <std::size_t I,
class... Types>
151 template <std::size_t I,
class... Types>
154 return std::get<I, Types...>(std::forward<decltype(v)>(v));
157 template <std::size_t I,
class... Types>
159 const std::variant<Types...> &v)
164 template <std::size_t I,
class... Types>
166 const std::variant<Types...> &&v)
168 return std::get<I, Types...>(std::forward<decltype(v)>(v));
171 template <
class T,
class... Types>
172 constexpr T &
get(std::variant<Types...> &v)
177 template <
class T,
class... Types>
178 constexpr T &&
get(std::variant<Types...> &&v)
180 return std::get<T, Types...>(std::forward<decltype(v)>(v));
183 template <
class T,
class... Types>
184 constexpr
const T &
get(
const std::variant<Types...> &v)
189 template <
class T,
class... Types>
190 constexpr
const T &&
get(
const std::variant<Types...> &&v)
192 return std::get<T, Types...>(std::forward<decltype(v)>(v));
195 template <
class _Callable,
class... _Variants>
196 constexpr
auto visit(_Callable &&_Obj, _Variants &&..._Args)
198 return std::visit<_Callable, _Variants...>(
static_cast<_Callable &&
>(_Obj),
199 static_cast<_Variants &&
>(_Args)...);
217 template <std::size_t I,
typename... Ts>
220 return v.index() == I;
223 template <
typename T,
typename... Ts>