5#ifndef INCLUDE_V8_MEMORY_SPAN_H_
6#define INCLUDE_V8_MEMORY_SPAN_H_
19#if __has_include
(<version>)
22#if defined(__cpp_lib_three_way_comparison) &&
23 __cpp_lib_three_way_comparison >= 201711L
24#define V8_HAVE_SPACESHIP_OPERATOR 1
26#define V8_HAVE_SPACESHIP_OPERATOR 0
31#if __has_include
(<ranges>)
45inline constexpr bool std::ranges::enable_view<v8::MemorySpan<T>> =
true;
47inline constexpr bool std::ranges::enable_borrowed_range<v8::MemorySpan<T>> =
54
55
56
57
58
59
60
61
62
67 template <
typename From,
typename To>
68 using is_array_convertible = std::is_convertible<From (*)[], To (*)[]>;
69 template <
typename From,
typename To>
70 static constexpr bool is_array_convertible_v =
73 template <
typename It>
74 using iter_reference_t =
decltype(*std::declval<It&>());
76 template <
typename It,
typename =
void>
77 struct is_compatible_iterator : std::false_type {};
78 template <
typename It>
86 template <
typename It>
87 static constexpr bool is_compatible_iterator_v =
93 requires(!std::is_function_v<U>)
98 template <
typename It>
111
112
116 template <
typename Iterator,
117 std::enable_if_t<is_compatible_iterator_v<Iterator>,
bool> =
true>
123 template <
typename Iterator,
124 std::enable_if_t<is_compatible_iterator_v<Iterator> &&
125 !std::is_convertible_v<Iterator, size_t>,
137 template <
typename U, size_t N,
138 std::enable_if_t<is_array_convertible_v<U, T>,
bool> =
true>
140 std::array<U, N>& a)
noexcept
141 : data_(a.data()),
size_{
N} {}
144 template <
typename U, size_t N,
145 std::enable_if_t<is_array_convertible_v<
const U, T>,
bool> =
true>
147 const std::array<U, N>& a)
noexcept
148 : data_(a.data()),
size_{
N} {}
162 using difference_type = std::ptrdiff_t;
163 using value_type = T;
164 using pointer = value_type*;
165 using reference = value_type&;
166 using iterator_category = std::random_access_iterator_tag;
172#if __has_include
(<ranges>)
183 return a.ptr_ == b.ptr_;
193 return a.ptr_ != b.ptr_;
198 return a.ptr_ < b.ptr_;
202 return a.ptr_ <= b.ptr_;
206 return a.ptr_ > b.ptr_;
210 return a.ptr_ >= b.ptr_;
242 difference_type rhs) {
258 difference_type rhs) {
265 return lhs.ptr_ - rhs.ptr_;
277 constexpr explicit Iterator(T* ptr) : ptr_(ptr) {}
291
292
293
294
295
296
297
298
299
302template <
class T, std::size_t N, std::size_t... I>
303[[nodiscard]]
constexpr std::array<std::remove_cv_t<T>, N> to_array_lvalue_impl(
308template <
class T, std::size_t N, std::size_t... I>
309[[nodiscard]]
constexpr std::array<std::remove_cv_t<T>, N> to_array_rvalue_impl(
315template <
class T, std::size_t N>
317 return detail::to_array_lvalue_impl(a, std::make_index_sequence<N>{});
320template <
class T, std::size_t N>
323 return detail::to_array_rvalue_impl(std::move(a),
324 std::make_index_sequence<N>{});
constexpr Iterator operator--(int)
friend constexpr bool operator>(const Iterator &a, const Iterator &b)
friend constexpr difference_type operator-(const Iterator &lhs, const Iterator &rhs)
friend constexpr Iterator operator+(Iterator lhs, difference_type rhs)
friend constexpr bool operator>=(const Iterator &a, const Iterator &b)
friend constexpr bool operator==(const Iterator &a, const Iterator &b)
constexpr Iterator operator++(int)
constexpr Iterator & operator--()
friend constexpr bool operator!=(const Iterator &a, const Iterator &b)
constexpr reference operator[](size_t offset) const
friend constexpr Iterator operator+(difference_type lhs, const Iterator &rhs)
constexpr Iterator & operator++()
friend constexpr bool operator<(const Iterator &a, const Iterator &b)
friend constexpr Iterator operator-(Iterator lhs, difference_type rhs)
constexpr reference operator*() const
constexpr Iterator()=default
friend constexpr bool operator<=(const Iterator &a, const Iterator &b)
constexpr pointer operator->() const
constexpr Iterator & operator+=(difference_type rhs)
constexpr Iterator & operator-=(difference_type rhs)
constexpr T * data() const
constexpr T & operator[](size_t i) const
constexpr MemorySpan(std::array< U, N > &a) noexcept
constexpr MemorySpan(std::nullptr_t, size_t)
constexpr MemorySpan(const std::array< U, N > &a) noexcept
constexpr MemorySpan(T(&a)[N]) noexcept
constexpr size_t size() const
constexpr MemorySpan(Iterator first, size_t count)
constexpr MemorySpan(Iterator first, Iterator last)
constexpr bool empty() const
constexpr std::array< std::remove_cv_t< T >, N > to_array(T(&a)[N])
constexpr std::array< std::remove_cv_t< T >, N > to_array(T(&&a)[N])
#define V8_HAVE_SPACESHIP_OPERATOR