Wasmtime
span.hh
Go to the documentation of this file.
1
5#ifndef WASMTIME_SPAN_HH
6#define WASMTIME_SPAN_HH
7
8#ifdef __has_include
9#if __has_include(<span>)
10#include <span>
11#endif
12#endif
13
14#ifndef __cpp_lib_span
15#include <limits>
16#endif
17
18namespace wasmtime {
19
20#ifdef __cpp_lib_span
21
23template <typename T, std::size_t Extent = std::dynamic_extent>
24using Span = std::span<T, Extent>;
25
26#else
27
29inline constexpr size_t dynamic_extent =
30 std::numeric_limits<std::size_t>::max();
31
37template <typename T, std::size_t Extent = dynamic_extent> class Span;
38
40template <typename T> struct IsSpan : std::false_type {};
41
42template <typename T, std::size_t Extent>
43struct IsSpan<Span<T, Extent>> : std::true_type {};
44
45template <typename T, std::size_t Extent> class Span {
46 static_assert(Extent == dynamic_extent,
47 "The current implementation supports dynamic-extent span only");
48
49public:
51 using iterator = T *;
52
54 Span(T *t, std::size_t n) : ptr_{t}, size_{n} {}
55
57 template <typename C,
58 std::enable_if_t<
60 std::is_pointer_v<decltype(std::declval<C &>().data())> &&
61 std::is_convertible_v<
62 std::remove_pointer_t<
63 decltype(std::declval<C &>().data())> (*)[],
64 T (*)[]> &&
65 std::is_convertible_v<decltype(std::declval<C>().size()),
66 std::size_t>,
67 int> = 0>
68 Span(C &range) : ptr_{range.data()}, size_{range.size()} {}
69
71 T &operator[](ptrdiff_t idx) const {
72 return ptr_[idx]; // NOLINT
73 }
74
76 T *data() const { return ptr_; }
77
79 std::size_t size() const { return size_; }
80
82 iterator begin() const { return ptr_; }
83
85 iterator end() const {
86 return ptr_ + size_; // NOLINT
87 }
88
90 std::size_t size_bytes() const { return sizeof(T) * size_; }
91
92private:
93 T *ptr_;
94 std::size_t size_;
95};
96
97#endif
98
99} // namespace wasmtime
100
101#endif // WASMTIME_SPAN_HH
102
Span class used when c++20 is not available.
Definition: span.hh:45
std::size_t size_bytes() const
Returns size in bytes.
Definition: span.hh:90
std::size_t size() const
Returns number of data that referred by Span class.
Definition: span.hh:79
iterator end() const
Returns end iterator.
Definition: span.hh:85
T * iterator
Type used to iterate over this span (a raw pointer)
Definition: span.hh:51
T * data() const
Returns pointer to data.
Definition: span.hh:76
Span(T *t, std::size_t n)
Constructor of Span class.
Definition: span.hh:54
iterator begin() const
Returns begin iterator.
Definition: span.hh:82
T & operator[](ptrdiff_t idx) const
Returns item by index.
Definition: span.hh:71
Span(C &range)
Constructor of Span class for containers.
Definition: span.hh:68
constexpr size_t dynamic_extent
Means number of elements determined at runtime.
Definition: span.hh:29
Check whether a type is Span
Definition: span.hh:40