5#ifndef INCLUDE_V8_MEMORY_SPAN_H_
6#define INCLUDE_V8_MEMORY_SPAN_H_
30inline constexpr bool std::ranges::enable_view<v8::MemorySpan<T>> =
true;
32inline constexpr bool std::ranges::enable_borrowed_range<v8::MemorySpan<T>> =
51 template <
typename From,
typename To>
52 using is_array_convertible = std::is_convertible<From (*)[], To (*)[]>;
53 template <
typename From,
typename To>
54 static constexpr bool is_array_convertible_v =
55 is_array_convertible<From, To>::value;
57 template <
typename It>
58 using iter_reference_t =
decltype(*std::declval<It&>());
60 template <
typename It,
typename =
void>
61 struct is_compatible_iterator : std::false_type {};
62 template <
typename It>
63 struct is_compatible_iterator<
66 std::is_base_of<std::random_access_iterator_tag,
67 typename std::iterator_traits<It>::iterator_category>,
68 is_array_convertible<std::remove_reference_t<iter_reference_t<It>>,
69 T>>> : std::true_type {};
70 template <
typename It>
71 static constexpr bool is_compatible_iterator_v =
72 is_compatible_iterator<It>::value;
77 requires(!std::is_function_v<U>)
78 [[nodiscard]]
static constexpr U* to_address(U* p)
noexcept {
82 template <
typename It>
84 requires(
const It& it) { std::pointer_traits<It>::to_address(it); } ||
85 requires(
const It& it) { it.operator->(); })
86 [[nodiscard]]
static constexpr auto to_address(
const It& it)
noexcept {
87 return std::to_address(it);
100 template <
typename Iterator,
101 std::enable_if_t<is_compatible_iterator_v<Iterator>,
bool> =
true>
104 : data_(to_address(first)), size_(count) {}
107 template <
typename Iterator,
108 std::enable_if_t<is_compatible_iterator_v<Iterator> &&
109 !std::is_convertible_v<Iterator, size_t>,
113 : data_(to_address(first)), size_(last - first) {}
118 : data_(a), size_(N) {}
121 template <
typename U,
size_t N,
122 std::enable_if_t<is_array_convertible_v<U, T>,
bool> =
true>
124 std::array<U, N>& a)
noexcept
125 : data_(a.data()), size_{N} {}
128 template <
typename U,
size_t N,
129 std::enable_if_t<is_array_convertible_v<const U, T>,
bool> =
true>
131 const std::array<U, N>& a)
noexcept
132 : data_(a.data()), size_{N} {}
135 [[nodiscard]]
constexpr T*
data()
const {
return data_; }
137 [[nodiscard]]
constexpr size_t size()
const {
return size_; }
139 [[nodiscard]]
constexpr T&
operator[](
size_t i)
const {
return data_[i]; }
142 [[nodiscard]]
constexpr bool empty()
const {
return size() == 0; }
210 return lhs.ptr_ - rhs.ptr_;
215 [[nodiscard]]
constexpr reference operator[](
size_t offset)
const {
222 constexpr explicit Iterator(T* ptr) : ptr_(ptr) {}
247template <
class T, std::size_t N, std::size_t... I>
249 T (&a)[N], std::index_sequence<I...>) {
253template <
class T, std::size_t N, std::size_t... I>
255 T (&&a)[N], std::index_sequence<I...>) {
256 return {{std::move(a[I])...}};
260template <
class T, std::
size_t N>
261[[nodiscard]]
constexpr std::array<std::remove_cv_t<T>, N>
to_array(T (&a)[N]) {
265template <
class T, std::
size_t N>
266[[nodiscard]]
constexpr std::array<std::remove_cv_t<T>, N>
to_array(
269 std::make_index_sequence<N>{});
Definition: v8-memory-span.h:144
std::ptrdiff_t difference_type
Definition: v8-memory-span.h:146
friend constexpr difference_type operator-(const Iterator &lhs, const Iterator &rhs)
Definition: v8-memory-span.h:208
constexpr Iterator & operator+=(difference_type rhs)
Definition: v8-memory-span.h:181
friend constexpr Iterator operator+(Iterator lhs, difference_type rhs)
Definition: v8-memory-span.h:186
constexpr Iterator & operator++()
Definition: v8-memory-span.h:159
std::random_access_iterator_tag iterator_category
Definition: v8-memory-span.h:150
T value_type
Definition: v8-memory-span.h:147
constexpr Iterator()=default
value_type & reference
Definition: v8-memory-span.h:149
constexpr reference operator*() const
Definition: v8-memory-span.h:213
std::contiguous_iterator_tag iterator_concept
Definition: v8-memory-span.h:151
friend constexpr Iterator operator+(difference_type lhs, const Iterator &rhs)
Definition: v8-memory-span.h:192
constexpr bool operator==(const Iterator &) const =default
constexpr auto operator<=>(const Iterator &) const =default
constexpr Iterator operator--(int)
Definition: v8-memory-span.h:175
constexpr Iterator operator++(int)
Definition: v8-memory-span.h:164
value_type * pointer
Definition: v8-memory-span.h:148
constexpr Iterator & operator-=(difference_type rhs)
Definition: v8-memory-span.h:197
friend constexpr Iterator operator-(Iterator lhs, difference_type rhs)
Definition: v8-memory-span.h:202
constexpr Iterator & operator--()
Definition: v8-memory-span.h:170
constexpr pointer operator->() const
Definition: v8-memory-span.h:214
Definition: v8-memory-span.h:48
constexpr MemorySpan(std::nullptr_t, size_t)
Definition: v8-memory-span.h:97
Iterator end() const
Definition: v8-memory-span.h:228
constexpr MemorySpan(std::array< U, N > &a) noexcept
Definition: v8-memory-span.h:123
constexpr MemorySpan()=default
constexpr T & operator[](size_t i) const
Definition: v8-memory-span.h:139
constexpr MemorySpan(const std::array< U, N > &a) noexcept
Definition: v8-memory-span.h:130
constexpr MemorySpan(Iterator first, size_t count)
Definition: v8-memory-span.h:102
constexpr MemorySpan(T(&a)[N]) noexcept
Definition: v8-memory-span.h:117
constexpr T * data() const
Definition: v8-memory-span.h:135
constexpr MemorySpan(Iterator first, Iterator last)
Definition: v8-memory-span.h:111
constexpr bool empty() const
Definition: v8-memory-span.h:142
Iterator begin() const
Definition: v8-memory-span.h:227
constexpr size_t size() const
Definition: v8-memory-span.h:137
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:254
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:248
Definition: libplatform.h:15
constexpr std::array< std::remove_cv_t< T >, N > to_array(T(&a)[N])
Definition: v8-memory-span.h:261
#define V8_EXPORT
Definition: v8config.h:855