]> git.proxmox.com Git - ceph.git/blob - ceph/src/jaegertracing/opentelemetry-cpp/api/include/opentelemetry/nostd/detail/type_pack_element.h
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / jaegertracing / opentelemetry-cpp / api / include / opentelemetry / nostd / detail / type_pack_element.h
1 #pragma once
2
3 #include <cstddef>
4 #include <type_traits>
5
6 #include "opentelemetry/nostd/utility.h"
7 #include "opentelemetry/version.h"
8
9 OPENTELEMETRY_BEGIN_NAMESPACE
10 namespace nostd
11 {
12 namespace detail
13 {
14 template <std::size_t N>
15 using size_constant = std::integral_constant<std::size_t, N>;
16
17 template <std::size_t I, typename T>
18 struct indexed_type : size_constant<I>
19 {
20 using type = T;
21 };
22
23 template <std::size_t I, typename... Ts>
24 struct type_pack_element_impl
25 {
26 private:
27 template <typename>
28 struct set;
29
30 template <std::size_t... Is>
31 struct set<index_sequence<Is...>> : indexed_type<Is, Ts>...
32 {};
33
34 template <typename T>
35 inline static std::enable_if<true, T> impl(indexed_type<I, T>);
36
37 inline static std::enable_if<false> impl(...);
38
39 public:
40 using type = decltype(impl(set<index_sequence_for<Ts...>>{}));
41 };
42
43 template <std::size_t I, typename... Ts>
44 using type_pack_element = typename type_pack_element_impl<I, Ts...>::type;
45
46 template <std::size_t I, typename... Ts>
47 using type_pack_element_t = typename type_pack_element<I, Ts...>::type;
48 } // namespace detail
49 } // namespace nostd
50 OPENTELEMETRY_END_NAMESPACE