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>> =
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 =
71 is_array_convertible<From, To>::value;
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>
79 struct is_compatible_iterator<
82 std::is_base_of<std::random_access_iterator_tag,
83 typename std::iterator_traits<It>::iterator_category>,
84 is_array_convertible<std::remove_reference_t<iter_reference_t<It>>,
85 T>>> : std::true_type {};
86 template <
typename It>
87 static constexpr bool is_compatible_iterator_v =
88 is_compatible_iterator<It>::value;
93 requires(!std::is_function_v<U>)
94 [[nodiscard]]
static constexpr U* to_address(U* p)
noexcept {
98 template <
typename It>
100 requires(
const It& it) { std::pointer_traits<It>::to_address(it); } ||
101 requires(
const It& it) { it.operator->(); })
102 [[nodiscard]]
static constexpr auto to_address(
const It& it)
noexcept {
103 return std::to_address(it);
116 template <
typename Iterator,
117 std::enable_if_t<is_compatible_iterator_v<Iterator>,
bool> =
true>
120 : data_(to_address(first)), size_(count) {}
123 template <
typename Iterator,
124 std::enable_if_t<is_compatible_iterator_v<Iterator> &&
125 !std::is_convertible_v<Iterator, size_t>,
129 : data_(to_address(first)), size_(last - first) {}
134 : data_(a), size_(N) {}
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} {}
151 [[nodiscard]]
constexpr T*
data()
const {
return data_; }
153 [[nodiscard]]
constexpr size_t size()
const {
return size_; }
155 [[nodiscard]]
constexpr T&
operator[](
size_t i)
const {
return data_[i]; }
158 [[nodiscard]]
constexpr bool empty()
const {
return size() == 0; }
172#if __has_include(<ranges>)
173 using iterator_concept = std::contiguous_iterator_tag;
183 return a.ptr_ == b.ptr_;
185#if V8_HAVE_SPACESHIP_OPERATOR
186 [[nodiscard]]
friend constexpr auto operator<=>(
const Iterator&,
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_;
265 return lhs.ptr_ - rhs.ptr_;
270 [[nodiscard]]
constexpr reference operator[](
size_t offset)
const {
277 constexpr explicit Iterator(T* ptr) : ptr_(ptr) {}
302template <
class T, std::size_t N, std::size_t... I>
304 T (&a)[N], std::index_sequence<I...>) {
308template <
class T, std::size_t N, std::size_t... I>
310 T (&&a)[N], std::index_sequence<I...>) {
311 return {{std::move(a[I])...}};
315template <
class T, std::
size_t N>
316[[nodiscard]]
constexpr std::array<std::remove_cv_t<T>, N>
to_array(T (&a)[N]) {
320template <
class T, std::
size_t N>
321[[nodiscard]]
constexpr std::array<std::remove_cv_t<T>, N>
to_array(
324 std::make_index_sequence<N>{});
Definition: v8-memory-span.h:160
std::ptrdiff_t difference_type
Definition: v8-memory-span.h:162
friend constexpr bool operator>(const Iterator &a, const Iterator &b)
Definition: v8-memory-span.h:204
friend constexpr difference_type operator-(const Iterator &lhs, const Iterator &rhs)
Definition: v8-memory-span.h:263
constexpr Iterator & operator+=(difference_type rhs)
Definition: v8-memory-span.h:236
friend constexpr Iterator operator+(Iterator lhs, difference_type rhs)
Definition: v8-memory-span.h:241
constexpr Iterator & operator++()
Definition: v8-memory-span.h:214
friend constexpr bool operator>=(const Iterator &a, const Iterator &b)
Definition: v8-memory-span.h:208
friend constexpr bool operator==(const Iterator &a, const Iterator &b)
Definition: v8-memory-span.h:179
std::random_access_iterator_tag iterator_category
Definition: v8-memory-span.h:166
T value_type
Definition: v8-memory-span.h:163
constexpr Iterator()=default
friend constexpr bool operator!=(const Iterator &a, const Iterator &b)
Definition: v8-memory-span.h:191
value_type & reference
Definition: v8-memory-span.h:165
constexpr reference operator*() const
Definition: v8-memory-span.h:268
friend constexpr Iterator operator+(difference_type lhs, const Iterator &rhs)
Definition: v8-memory-span.h:247
constexpr Iterator operator--(int)
Definition: v8-memory-span.h:230
constexpr Iterator operator++(int)
Definition: v8-memory-span.h:219
value_type * pointer
Definition: v8-memory-span.h:164
friend constexpr bool operator<(const Iterator &a, const Iterator &b)
Definition: v8-memory-span.h:196
constexpr Iterator & operator-=(difference_type rhs)
Definition: v8-memory-span.h:252
friend constexpr Iterator operator-(Iterator lhs, difference_type rhs)
Definition: v8-memory-span.h:257
friend constexpr bool operator<=(const Iterator &a, const Iterator &b)
Definition: v8-memory-span.h:200
constexpr Iterator & operator--()
Definition: v8-memory-span.h:225
constexpr pointer operator->() const
Definition: v8-memory-span.h:269
Definition: v8-memory-span.h:64
constexpr MemorySpan(std::nullptr_t, size_t)
Definition: v8-memory-span.h:113
Iterator end() const
Definition: v8-memory-span.h:283
constexpr MemorySpan(std::array< U, N > &a) noexcept
Definition: v8-memory-span.h:139
constexpr MemorySpan()=default
constexpr T & operator[](size_t i) const
Definition: v8-memory-span.h:155
constexpr MemorySpan(const std::array< U, N > &a) noexcept
Definition: v8-memory-span.h:146
constexpr MemorySpan(Iterator first, size_t count)
Definition: v8-memory-span.h:118
constexpr MemorySpan(T(&a)[N]) noexcept
Definition: v8-memory-span.h:133
constexpr T * data() const
Definition: v8-memory-span.h:151
constexpr MemorySpan(Iterator first, Iterator last)
Definition: v8-memory-span.h:127
constexpr bool empty() const
Definition: v8-memory-span.h:158
Iterator begin() const
Definition: v8-memory-span.h:282
constexpr size_t size() const
Definition: v8-memory-span.h:153
constexpr std::array< std::remove_cv_t< T >, N > to_array_rvalue_impl(T(&&a)[N], std::index_sequence< I... >)
Definition: v8-memory-span.h:309
constexpr std::array< std::remove_cv_t< T >, N > to_array_lvalue_impl(T(&a)[N], std::index_sequence< I... >)
Definition: v8-memory-span.h:303
Definition: libplatform.h:15
constexpr std::array< std::remove_cv_t< T >, N > to_array(T(&a)[N])
Definition: v8-memory-span.h:316
#define V8_EXPORT
Definition: v8config.h:849