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 <cstddef>
16#include <limits>
17#include <type_traits>
18#endif
19
20namespace wasmtime {
21
22#ifdef __cpp_lib_span
23
25template <typename T, std::size_t Extent = std::dynamic_extent>
26using Span = std::span<T, Extent>;
27
28#else
29
31inline constexpr size_t dynamic_extent =
32 std::numeric_limits<std::size_t>::max();
33
39template <typename T, std::size_t Extent = dynamic_extent> class Span;
40
42template <typename T> struct IsSpan : std::false_type {};
43
44template <typename T, std::size_t Extent>
45struct IsSpan<Span<T, Extent>> : std::true_type {};
46
47template <typename T, std::size_t Extent> class Span {
48 static_assert(Extent == dynamic_extent,
49 "The current implementation supports dynamic-extent span only");
50
51public:
53 using iterator = T *;
54
56 Span(T *t, std::size_t n) : ptr_{t}, size_{n} {}
57
59 template <typename C,
60 std::enable_if_t<
62 std::is_pointer_v<decltype(std::declval<C &>().data())> &&
63 std::is_convertible_v<
64 std::remove_pointer_t<
65 decltype(std::declval<C &>().data())> (*)[],
66 T (*)[]> &&
67 std::is_convertible_v<decltype(std::declval<C>().size()),
68 std::size_t>,
69 int> = 0>
70 Span(C &range) : ptr_{range.data()}, size_{range.size()} {}
71
73 T &operator[](ptrdiff_t idx) const {
74 return ptr_[idx]; // NOLINT
75 }
76
78 T *data() const { return ptr_; }
79
81 std::size_t size() const { return size_; }
82
84 iterator begin() const { return ptr_; }
85
87 iterator end() const {
88 return ptr_ + size_; // NOLINT
89 }
90
92 std::size_t size_bytes() const { return sizeof(T) * size_; }
93
94private:
95 T *ptr_;
96 std::size_t size_;
97};
98
99#endif
100
101} // namespace wasmtime
102
103#endif // WASMTIME_SPAN_HH
Span class used when c++20 is not available.
Definition: span.hh:47
std::size_t size_bytes() const
Returns size in bytes.
Definition: span.hh:92
std::size_t size() const
Returns number of data that referred by Span class.
Definition: span.hh:81
iterator end() const
Returns end iterator.
Definition: span.hh:87
T * iterator
Type used to iterate over this span (a raw pointer)
Definition: span.hh:53
T * data() const
Returns pointer to data.
Definition: span.hh:78
Span(T *t, std::size_t n)
Constructor of Span class.
Definition: span.hh:56
iterator begin() const
Returns begin iterator.
Definition: span.hh:84
T & operator[](ptrdiff_t idx) const
Returns item by index.
Definition: span.hh:73
Span(C &range)
Constructor of Span class for containers.
Definition: span.hh:70
constexpr size_t dynamic_extent
Means number of elements determined at runtime.
Definition: span.hh:31
Check whether a type is Span
Definition: span.hh:42