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>
69 template <
typename From,
typename To>
70 static constexpr bool is_array_convertible_v =
73 template <
typename It>
76 template <
typename It,
typename =
void>
78 template <
typename It>
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 =
91 [[nodiscard]]
static constexpr U*
to_address(U* p)
noexcept {
95 template <
typename It,
96 typename = std::void_t<decltype(std::declval<It&>().operator->())>>
97 [[nodiscard]]
static constexpr auto to_address(It it)
noexcept {
98 return it.operator->();
111 template <
typename Iterator,
112 std::enable_if_t<is_compatible_iterator_v<Iterator>,
bool> =
true>
118 template <
typename Iterator,
119 std::enable_if_t<is_compatible_iterator_v<Iterator> &&
120 !std::is_convertible_v<Iterator, size_t>,
124 :
data_(to_address(first)),
size_(last - first) {}
132 template <
typename U,
size_t N,
133 std::enable_if_t<is_array_convertible_v<U, T>,
bool> =
true>
135 std::array<U, N>& a)
noexcept
139 template <
typename U,
size_t N,
140 std::enable_if_t<is_array_convertible_v<const U, T>,
bool> =
true>
142 const std::array<U, N>& a)
noexcept
146 [[nodiscard]]
constexpr T*
data()
const {
return data_; }
148 [[nodiscard]]
constexpr size_t size()
const {
return size_; }
153 [[nodiscard]]
constexpr bool empty()
const {
return size() == 0; }
167#if __has_include(<ranges>)
168 using iterator_concept = std::contiguous_iterator_tag;
178 return a.ptr_ == b.
ptr_;
180#if V8_HAVE_SPACESHIP_OPERATOR
181 [[nodiscard]]
friend constexpr auto operator<=>(
const Iterator&,
188 return a.ptr_ != b.
ptr_;
193 return a.ptr_ < b.
ptr_;
197 return a.ptr_ <= b.
ptr_;
201 return a.ptr_ > b.
ptr_;
205 return a.ptr_ >= b.
ptr_;
297template <
class T, std::size_t N, std::size_t...
I>
299 T (&a)[N], std::index_sequence<I...>) {
303template <
class T, std::size_t N, std::size_t...
I>
305 T (&&a)[N], std::index_sequence<I...>) {
306 return {{std::move(a[
I])...}};
310template <
class T, std::
size_t N>
311[[nodiscard]]
constexpr std::array<std::remove_cv_t<T>, N>
to_array(T (&a)[N]) {
315template <
class T, std::
size_t N>
316[[nodiscard]]
constexpr std::array<std::remove_cv_t<T>, N>
to_array(
319 std::make_index_sequence<N>{});
uint8_t data_[MAX_STACK_LENGTH]
std::ptrdiff_t difference_type
constexpr Iterator(T *ptr)
friend constexpr bool operator>(const Iterator &a, const Iterator &b)
friend constexpr difference_type operator-(const Iterator &lhs, const Iterator &rhs)
constexpr Iterator & operator+=(difference_type rhs)
friend constexpr Iterator operator+(Iterator lhs, difference_type rhs)
constexpr Iterator & operator++()
friend constexpr bool operator>=(const Iterator &a, const Iterator &b)
friend constexpr bool operator==(const Iterator &a, const Iterator &b)
std::random_access_iterator_tag iterator_category
constexpr Iterator()=default
friend constexpr bool operator!=(const Iterator &a, const Iterator &b)
constexpr reference operator*() const
friend constexpr Iterator operator+(difference_type lhs, const Iterator &rhs)
constexpr Iterator operator--(int)
constexpr Iterator operator++(int)
friend constexpr bool operator<(const Iterator &a, const Iterator &b)
constexpr Iterator & operator-=(difference_type rhs)
friend constexpr Iterator operator-(Iterator lhs, difference_type rhs)
friend constexpr bool operator<=(const Iterator &a, const Iterator &b)
constexpr Iterator & operator--()
constexpr pointer operator->() const
constexpr MemorySpan(std::nullptr_t, size_t)
static constexpr U * to_address(U *p) noexcept
constexpr MemorySpan(std::array< U, N > &a) noexcept
constexpr MemorySpan()=default
constexpr T & operator[](size_t i) const
constexpr MemorySpan(const std::array< U, N > &a) noexcept
constexpr MemorySpan(Iterator first, size_t count)
constexpr MemorySpan(T(&a)[N]) noexcept
static constexpr auto to_address(It it) noexcept
constexpr T * data() const
decltype(*std::declval< It & >()) iter_reference_t
std::is_convertible< From(*)[], To(*)[]> is_array_convertible
constexpr MemorySpan(Iterator first, Iterator last)
constexpr bool empty() const
constexpr size_t size() const
constexpr std::array< std::remove_cv_t< T >, N > to_array_rvalue_impl(T(&&a)[N], std::index_sequence< I... >)
constexpr std::array< std::remove_cv_t< T >, N > to_array_lvalue_impl(T(&a)[N], std::index_sequence< I... >)
constexpr std::array< std::remove_cv_t< T >, N > to_array(T(&a)[N])
#define I(name, number_of_args, result_size)