52 using element_type = T;
53 using value_type = std::remove_cv_t<T>;
54 using size_type = std::size_t;
55 using difference_type = std::ptrdiff_t;
57 using const_pointer =
const T*;
59 using const_reference =
const T&;
61 using reverse_iterator = std::reverse_iterator<iterator>;
63 constexpr data_view(T* ptr, size_type size) noexcept : ptr_{ptr}, size_{size} {}
65 template <std::
size_t N>
66 constexpr data_view(type_identity_t<element_type> (&array)[N])
noexcept
67 : ptr_{array}, size_{N} {}
69 template <
typename U, std::
size_t N>
70 constexpr data_view(std::array<U, N>& array)
noexcept
71 : ptr_{array.data()}, size_{array.size()} {}
73 template <
typename U, std::
size_t N>
74 constexpr data_view(
const std::array<U, N>& array)
noexcept
75 : ptr_{array.data()}, size_{array.size()} {}
77#if __cpp_lib_ranges >= 201911L
78 template <
typename Range>
80 : ptr_{std::ranges::data(range)}, size_{std::ranges::size(range)} {}
83#if __cpp_lib_span >= 202002L
84 template <
typename U, std::
size_t N>
86 const std::span<U, N>& source) noexcept
87 : ptr_{source.data()}, size_{source.size()} {}
94 constexpr reference operator[](size_type index)
const noexcept {
98#if __cpp_lib_span >= 202002L
99 constexpr operator std::span<T>()
const noexcept {
100 return std::span<T>{ptr_, size_};
104 [[nodiscard]]
constexpr iterator begin()
const noexcept {
108 [[nodiscard]]
constexpr iterator end()
const noexcept {
112 [[nodiscard]]
constexpr reverse_iterator rbegin()
const noexcept {
113 return reverse_iterator{end()};
116 [[nodiscard]]
constexpr reverse_iterator rend()
const noexcept {
117 return reverse_iterator{begin()};
120 [[nodiscard]]
constexpr pointer data()
const noexcept {
124 [[nodiscard]]
constexpr size_type size()
const noexcept {
128 [[nodiscard]]
constexpr bool empty()
const noexcept {
132 [[nodiscard]]
constexpr size_type size_bytes()
const noexcept {
133 return size_ *
sizeof(T);
136 [[nodiscard]]
constexpr reference front()
const noexcept {
140 [[nodiscard]]
constexpr reference back()
const noexcept {
141 return ptr_[size_ - 1];
144 [[nodiscard]]
constexpr data_view subview(size_type index, size_type count)
const noexcept {