1 // Copyright The OpenTelemetry Authors
2 // SPDX-License-Identifier: Apache-2.0
7 # include "opentelemetry/std/utility.h"
11 # include <initializer_list>
12 # include <type_traits>
14 # include "opentelemetry/nostd/detail/decay.h"
15 # include "opentelemetry/nostd/detail/invoke.h"
16 # include "opentelemetry/version.h"
18 OPENTELEMETRY_BEGIN_NAMESPACE
22 * Back port of std::data
24 * See https://en.cppreference.com/w/cpp/iterator/data
27 auto data(C
&c
) noexcept(noexcept(c
.data())) -> decltype(c
.data())
33 auto data(const C
&c
) noexcept(noexcept(c
.data())) -> decltype(c
.data())
38 template <class T
, size_t N
>
39 T
*data(T (&array
)[N
]) noexcept
45 const E
*data(std::initializer_list
<E
> list
) noexcept
51 * Back port of std::size
53 * See https://en.cppreference.com/w/cpp/iterator/size
56 auto size(const C
&c
) noexcept(noexcept(c
.size())) -> decltype(c
.size())
61 template <class T
, size_t N
>
62 size_t size(T (&array
)[N
]) noexcept
68 * Back port of std::bool_constant
71 using bool_constant
= std::integral_constant
<bool, B
>;
74 * Back port of std::integer_sequence
76 template <typename T
, T
... Is
>
77 struct integer_sequence
80 static constexpr std::size_t size() noexcept
{ return sizeof...(Is
); }
84 * Back port of std::index_sequence
86 template <std::size_t... Is
>
87 using index_sequence
= integer_sequence
<std::size_t, Is
...>;
90 * Back port of std::make_index_sequence
94 template <class, size_t>
95 struct index_sequence_push_back
98 template <size_t... Indexes
, size_t I
>
99 struct index_sequence_push_back
<index_sequence
<Indexes
...>, I
>
101 using type
= index_sequence
<Indexes
..., I
>;
104 template <class T
, size_t I
>
105 using index_sequence_push_back_t
= typename index_sequence_push_back
<T
, I
>::type
;
108 struct make_index_sequence_impl
110 using type
= index_sequence_push_back_t
<typename make_index_sequence_impl
<N
- 1>::type
, N
- 1>;
114 struct make_index_sequence_impl
<0>
116 using type
= index_sequence
<>;
118 } // namespace detail
121 using make_index_sequence
= typename
detail::make_index_sequence_impl
<N
>::type
;
124 * Back port of std::index_sequence_for
126 template <class... Ts
>
127 using index_sequence_for
= make_index_sequence
<sizeof...(Ts
)>;
130 * Back port of std::in_place_t
134 explicit in_place_t() = default;
138 * Back port of std::in_place_index_t
140 template <std::size_t I
>
141 struct in_place_index_t
143 explicit in_place_index_t() = default;
147 * Back port of std::in_place_type_t
149 template <typename T
>
150 struct in_place_type_t
152 explicit in_place_type_t() = default;
155 OPENTELEMETRY_END_NAMESPACE