NVIDIA DeepStream SDK API Reference

9.2 Release
9.2/includes/opentelemetry/nostd/span.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 // Try to use either `std::span` or `gsl::span`
7 #if defined(OPENTELEMETRY_STL_VERSION)
8 # if OPENTELEMETRY_STL_VERSION >= 2020
9 # include <array>
10 # include <cstddef>
11 # include <iterator>
12 # include <type_traits>
13 
19 # if !defined(OPENTELEMETRY_OPTION_USE_STD_SPAN) && defined(_LIBCPP_VERSION)
20 # if _LIBCPP_VERSION <= 14000
21 # define OPENTELEMETRY_OPTION_USE_STD_SPAN 0
22 # endif
23 # endif
24 # ifndef OPENTELEMETRY_OPTION_USE_STD_SPAN
25 # define OPENTELEMETRY_OPTION_USE_STD_SPAN 1
26 # endif
27 # if OPENTELEMETRY_OPTION_USE_STD_SPAN
28 # include "opentelemetry/std/span.h"
29 # endif
30 # endif /* OPENTELEMETRY_STL_VERSION >= 2020 */
31 #endif /* OPENTELEMETRY_STL_VERSION */
32 
33 // Fallback to `nostd::span` if necessary
34 #if !defined(OPENTELEMETRY_HAVE_SPAN)
35 # include <array>
36 # include <cassert>
37 # include <cstddef>
38 # include <exception>
39 # include <iterator>
40 # include <type_traits>
41 
42 # include "opentelemetry/nostd/utility.h"
43 # include "opentelemetry/version.h"
44 
46 namespace nostd
47 {
48 constexpr size_t dynamic_extent = static_cast<size_t>(-1);
49 
50 template <class T, size_t Extent = dynamic_extent>
51 class span;
52 
53 namespace detail
54 {
58 template <class T>
59 struct is_specialized_span_convertible : std::false_type
60 {};
61 
62 template <class T, size_t N>
63 struct is_specialized_span_convertible<std::array<T, N>> : std::true_type
64 {};
65 
66 template <class T, size_t N>
67 struct is_specialized_span_convertible<T[N]> : std::true_type
68 {};
69 
70 template <class T, size_t Extent>
71 struct is_specialized_span_convertible<span<T, Extent>> : std::true_type
72 {};
73 } // namespace detail
74 
85 template <class T, size_t Extent>
86 class span
87 {
88 public:
89  static constexpr size_t extent = Extent;
90 
91  // This arcane code is how we make default-construction result in an SFINAE error
92  // with C++11 when Extent != 0 as specified by the std::span API.
93  //
94  // See https://stackoverflow.com/a/10309720/4447365
95  template <bool B = Extent == 0, typename std::enable_if<B>::type * = nullptr>
96  span() noexcept : data_{nullptr}
97  {}
98 
99  span(T *data, size_t count) noexcept : data_{data}
100  {
101  if (count != Extent)
102  {
103  std::terminate();
104  }
105  }
106 
107  span(T *first, T *last) noexcept : data_{first}
108  {
109  if (std::distance(first, last) != Extent)
110  {
111  std::terminate();
112  }
113  }
114 
115  template <size_t N, typename std::enable_if<Extent == N>::type * = nullptr>
116  span(T (&array)[N]) noexcept : data_{array}
117  {}
118 
119  template <size_t N, typename std::enable_if<Extent == N>::type * = nullptr>
120  span(std::array<T, N> &array) noexcept : data_{array.data()}
121  {}
122 
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()}
125  {}
126 
127  template <
128  class C,
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 (*)[],
132  T (*)[]>::value &&
133  std::is_convertible<decltype(nostd::size(std::declval<const C &>())),
134  size_t>::value>::type * = nullptr>
135  span(C &c) noexcept(noexcept(nostd::data(c), nostd::size(c))) : data_{nostd::data(c)}
136  {
137  if (nostd::size(c) != Extent)
138  {
139  std::terminate();
140  }
141  }
142 
143  template <
144  class C,
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 (*)[],
148  T (*)[]>::value &&
149  std::is_convertible<decltype(nostd::size(std::declval<const C &>())),
150  size_t>::value>::type * = nullptr>
151  span(const C &c) noexcept(noexcept(nostd::data(c), nostd::size(c))) : data_{nostd::data(c)}
152  {
153  if (nostd::size(c) != Extent)
154  {
155  std::terminate();
156  }
157  }
158 
159  template <class U,
160  size_t N,
161  typename std::enable_if<N == Extent &&
162  std::is_convertible<U (*)[], T (*)[]>::value>::type * = nullptr>
163  span(const span<U, N> &other) noexcept : data_{other.data()}
164  {}
165 
166  span(const span &) noexcept = default;
167 
168  span &operator=(const span &) noexcept = default;
169 
170  bool empty() const noexcept { return Extent == 0; }
171 
172  T *data() const noexcept { return data_; }
173 
174  size_t size() const noexcept { return Extent; }
175 
176  T &operator[](size_t index) const noexcept
177  {
178  assert(index < Extent);
179  return data_[index];
180  }
181 
182  T *begin() const noexcept { return data_; }
183 
184  T *end() const noexcept { return data_ + Extent; }
185 
186 private:
187  T *data_;
188 };
189 
190 template <class T>
191 class span<T, dynamic_extent>
192 {
193 public:
194  static constexpr size_t extent = dynamic_extent;
195 
196  span() noexcept : extent_{0}, data_{nullptr} {}
197 
198  span(T *data, size_t count) noexcept : extent_{count}, data_{data} {}
199 
200  span(T *first, T *last) noexcept
201  : extent_{static_cast<size_t>(std::distance(first, last))}, data_{first}
202  {
203  assert(first <= last);
204  }
205 
206  template <size_t N>
207  span(T (&array)[N]) noexcept : extent_{N}, data_{array}
208  {}
209 
210  template <size_t N>
211  span(std::array<T, N> &array) noexcept : extent_{N}, data_{array.data()}
212  {}
213 
214  template <size_t N>
215  span(const std::array<T, N> &array) noexcept : extent_{N}, data_{array.data()}
216  {}
217 
218  template <
219  class C,
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 (*)[],
223  T (*)[]>::value &&
224  std::is_convertible<decltype(nostd::size(std::declval<const C &>())),
225  size_t>::value>::type * = nullptr>
226  span(C &c) noexcept(noexcept(nostd::data(c), nostd::size(c)))
227  : extent_{nostd::size(c)}, data_{nostd::data(c)}
228  {}
229 
230  template <
231  class C,
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 (*)[],
235  T (*)[]>::value &&
236  std::is_convertible<decltype(nostd::size(std::declval<const C &>())),
237  size_t>::value>::type * = nullptr>
238  span(const C &c) noexcept(noexcept(nostd::data(c), nostd::size(c)))
239  : extent_{nostd::size(c)}, data_{nostd::data(c)}
240  {}
241 
242  template <class U,
243  size_t N,
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()}
246  {}
247 
248  span(const span &) noexcept = default;
249 
250  span &operator=(const span &) noexcept = default;
251 
252  bool empty() const noexcept { return extent_ == 0; }
253 
254  T *data() const noexcept { return data_; }
255 
256  size_t size() const noexcept { return extent_; }
257 
258  T &operator[](size_t index) const noexcept
259  {
260  assert(index < extent_);
261  return data_[index];
262  }
263 
264  T *begin() const noexcept { return data_; }
265 
266  T *end() const noexcept { return data_ + extent_; }
267 
268 private:
269  size_t extent_;
270  T *data_;
271 };
272 } // namespace nostd
274 #endif
half_float::detail::false_type
bool_type< false > false_type
Definition: includes/half.hpp:489
nostd::span::end
T * end() const noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:184
nostd::span::span
span(const std::array< T, N > &array) noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:124
nostd
Definition: includes/opentelemetry/nostd/function_ref.h:14
nostd::span< T, dynamic_extent >::span
span(const C &c) noexcept(noexcept(nostd::data(c), nostd::size(c)))
Definition: 9.2/includes/opentelemetry/nostd/span.h:238
nostd::span< T, dynamic_extent >::span
span(T *first, T *last) noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:200
nostd::span< T, dynamic_extent >::span
span(const std::array< T, N > &array) noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:215
nostd::span< T, dynamic_extent >::span
span(const span< U, N > &other) noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:245
nostd::span< T, dynamic_extent >::end
T * end() const noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:266
nostd::span::begin
T * begin() const noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:182
nostd::span::span
span(const span< U, N > &other) noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:163
OPENTELEMETRY_BEGIN_NAMESPACE
#define OPENTELEMETRY_BEGIN_NAMESPACE
Definition: includes/opentelemetry/version.h:21
nostd::span
Back port of std::span.
Definition: includes/opentelemetry/nostd/span.h:51
nostd::span::data
T * data() const noexcept
Definition: includes/opentelemetry/nostd/span.h:172
nostd::span::size
size_t size() const noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:174
nostd::span< T, dynamic_extent >::begin
T * begin() const noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:264
OPENTELEMETRY_END_NAMESPACE
#define OPENTELEMETRY_END_NAMESPACE
Definition: includes/opentelemetry/version.h:24
nostd::span::empty
bool empty() const noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:170
nostd::span::span
span(const C &c) noexcept(noexcept(nostd::data(c), nostd::size(c)))
Definition: 9.2/includes/opentelemetry/nostd/span.h:151
nostd::span< T, dynamic_extent >::empty
bool empty() const noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:252
nostd::span::operator=
span & operator=(const span &) noexcept=default
nostd::dynamic_extent
constexpr size_t dynamic_extent
Definition: includes/opentelemetry/nostd/span.h:48
nostd::span::span
span(C &c) noexcept(noexcept(nostd::data(c), nostd::size(c)))
Definition: 9.2/includes/opentelemetry/nostd/span.h:135
half_float::detail::true_type
bool_type< true > true_type
Definition: includes/half.hpp:488
pydeepstreamdoc::signalemitter::SourceManagerDoc::terminate
constexpr const char * terminate
Definition: service-maker/sources/python/src/bindings/docstrings/signalemitterdoc.h:47
nostd::size
auto size(const C &c) noexcept(noexcept(c.size())) -> decltype(c.size())
Back port of std::size.
Definition: includes/opentelemetry/nostd/utility.h:60
std
Extensions to the C++ standard library.
Definition: includes/opentelemetry/nostd/string_view.h:212
nostd::span< T, dynamic_extent >::span
span(C &c) noexcept(noexcept(nostd::data(c), nostd::size(c)))
Definition: 9.2/includes/opentelemetry/nostd/span.h:226
nostd::span::span
span(T(&array)[N]) noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:116
nostd::span< T, dynamic_extent >::span
span(T *data, size_t count) noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:198
nostd::span::extent
static constexpr size_t extent
Definition: includes/opentelemetry/nostd/span.h:89
nostd::span::span
span(T *data, size_t count) noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:99
nostd::span::span
span(std::array< T, N > &array) noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:120
nostd::span< T, dynamic_extent >::operator[]
T & operator[](size_t index) const noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:258
nostd::span< T, dynamic_extent >::span
span() noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:196
nostd::span< T, dynamic_extent >::size
size_t size() const noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:256
nostd::span< T, dynamic_extent >::span
span(std::array< T, N > &array) noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:211
nostd::span< T, dynamic_extent >::span
span(T(&array)[N]) noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:207
nostd::span< T, dynamic_extent >::data
T * data() const noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:254
nostd::data
auto data(C &c) noexcept(noexcept(c.data())) -> decltype(c.data())
Back port of std::data.
Definition: includes/opentelemetry/nostd/utility.h:31
nostd::span::span
span(T *first, T *last) noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:107
nostd::span::operator[]
T & operator[](size_t index) const noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:176
nostd::span::span
span() noexcept
Definition: 9.2/includes/opentelemetry/nostd/span.h:96