7 #if defined(OPENTELEMETRY_STL_VERSION)
8 # if OPENTELEMETRY_STL_VERSION >= 2020
12 # include <type_traits>
19 # if !defined(OPENTELEMETRY_OPTION_USE_STD_SPAN) && defined(_LIBCPP_VERSION)
20 # if _LIBCPP_VERSION <= 14000
21 # define OPENTELEMETRY_OPTION_USE_STD_SPAN 0
24 # ifndef OPENTELEMETRY_OPTION_USE_STD_SPAN
25 # define OPENTELEMETRY_OPTION_USE_STD_SPAN 1
27 # if OPENTELEMETRY_OPTION_USE_STD_SPAN
28 # include "opentelemetry/std/span.h"
34 #if !defined(OPENTELEMETRY_HAVE_SPAN)
40 # include <type_traits>
42 # include "opentelemetry/nostd/utility.h"
43 # include "opentelemetry/version.h"
50 template <
class T,
size_t Extent = dynamic_extent>
62 template <
class T,
size_t N>
66 template <
class T,
size_t N>
70 template <
class T,
size_t Extent>
85 template <
class T,
size_t Extent>
89 static constexpr
size_t extent = Extent;
95 template <bool B = Extent == 0, typename std::enable_if<B>::type * =
nullptr>
96 span() noexcept : data_{
nullptr}
107 span(T *first, T *last) noexcept : data_{first}
109 if (std::distance(first, last) != Extent)
115 template <size_t N, typename std::enable_if<Extent == N>::type * =
nullptr>
116 span(T (&array)[N]) noexcept : data_{array}
119 template <size_t N, typename std::enable_if<Extent == N>::type * =
nullptr>
120 span(std::array<T, N> &array) noexcept : data_{array.data()}
123 template <size_t N, typename std::enable_if<Extent == N>::type * =
nullptr>
124 span(
const std::array<T, N> &array) noexcept : data_{array.data()}
129 typename std::enable_if<!detail::is_specialized_span_convertible<C>::value &&
130 std::is_convertible<
typename std::remove_pointer<decltype(
nostd::data(
131 std::declval<C &>()))>::type (*)[],
133 std::is_convertible<decltype(nostd::size(std::declval<const C &>())),
134 size_t>::value>::type * =
nullptr>
145 typename std::enable_if<!detail::is_specialized_span_convertible<C>::value &&
146 std::is_convertible<
typename std::remove_pointer<decltype(
nostd::data(
147 std::declval<const C &>()))>::type (*)[],
149 std::is_convertible<decltype(nostd::size(std::declval<const C &>())),
150 size_t>::value>::type * =
nullptr>
161 typename std::enable_if<N == Extent &&
162 std::is_convertible<U (*)[], T (*)[]>::value>::type * =
nullptr>
166 span(
const span &) noexcept =
default;
170 bool empty() const noexcept {
return Extent == 0; }
172 T *
data() const noexcept {
return data_; }
174 size_t size() const noexcept {
return Extent; }
178 assert(index < Extent);
182 T *
begin() const noexcept {
return data_; }
184 T *
end() const noexcept {
return data_ + Extent; }
196 span() noexcept : extent_{0}, data_{
nullptr} {}
200 span(T *first, T *last) noexcept
201 : extent_{
static_cast<size_t>(std::distance(first, last))}, data_{first}
203 assert(first <= last);
207 span(T (&array)[N]) noexcept : extent_{N}, data_{array}
211 span(std::array<T, N> &array) noexcept : extent_{N}, data_{array.data()}
215 span(
const std::array<T, N> &array) noexcept : extent_{N}, data_{array.data()}
220 typename std::enable_if<!detail::is_specialized_span_convertible<C>::value &&
221 std::is_convertible<
typename std::remove_pointer<decltype(
nostd::data(
222 std::declval<C &>()))>::type (*)[],
224 std::is_convertible<decltype(nostd::size(std::declval<const C &>())),
225 size_t>::value>::type * =
nullptr>
232 typename std::enable_if<!detail::is_specialized_span_convertible<C>::value &&
233 std::is_convertible<
typename std::remove_pointer<decltype(
nostd::data(
234 std::declval<const C &>()))>::type (*)[],
236 std::is_convertible<decltype(nostd::size(std::declval<const C &>())),
237 size_t>::value>::type * =
nullptr>
244 typename std::enable_if<std::is_convertible<U (*)[], T (*)[]>::value>::type * =
nullptr>
245 span(
const span<U, N> &other) noexcept : extent_{other.size()}, data_{other.data()}
248 span(
const span &) noexcept =
default;
252 bool empty() const noexcept {
return extent_ == 0; }
254 T *
data() const noexcept {
return data_; }
256 size_t size() const noexcept {
return extent_; }
260 assert(index < extent_);
264 T *
begin() const noexcept {
return data_; }
266 T *
end() const noexcept {
return data_ + extent_; }