// -*- C++ -*-
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===---------------------------------------------------------------------===//

#ifndef _LIBCPP_SPAN
#define _LIBCPP_SPAN

/*
    span synopsis

namespace std {

// constants
inline constexpr size_t dynamic_extent = numeric_limits<size_t>::max();

template<class T>
  concept integral-constant-like =                           // exposition only, since C++26
    is_integral_v<decltype(T::value)> &&
    !is_same_v<bool, remove_const_t<decltype(T::value)>> &&
    convertible_to<T, decltype(T::value)> &&
    equality_comparable_with<T, decltype(T::value)> &&
    bool_constant<T() == T::value>::value &&
    bool_constant<static_cast<decltype(T::value)>(T()) == T::value>::value;

template<class T>
  constexpr size_t maybe-static-ext = dynamic_extent;        // exposition only, since C++26
template<integral-constant-like T>
  constexpr size_t maybe-static-ext<T> = {T::value};

// [views.span], class template span
template <class ElementType, size_t Extent = dynamic_extent>
    class span;

template<class ElementType, size_t Extent>
  inline constexpr bool ranges::enable_view<span<ElementType, Extent>> = true;

template<class ElementType, size_t Extent>
    inline constexpr bool ranges::enable_borrowed_range<span<ElementType, Extent>> = true;

// [span.objectrep], views of object representation
template <class ElementType, size_t Extent>
    span<const byte, ((Extent == dynamic_extent) ? dynamic_extent :
        (sizeof(ElementType) * Extent))> as_bytes(span<ElementType, Extent> s) noexcept;

template <class ElementType, size_t Extent>
    span<      byte, ((Extent == dynamic_extent) ? dynamic_extent :
        (sizeof(ElementType) * Extent))> as_writable_bytes(span<ElementType, Extent> s) noexcept;


template <class ElementType, size_t Extent = dynamic_extent>
class span {
public:
    // constants and types
    using element_type = ElementType;
    using value_type = remove_cv_t<ElementType>;
    using size_type = size_t;
    using difference_type = ptrdiff_t;
    using pointer = element_type*;
    using const_pointer = const element_type*;
    using reference = element_type&;
    using const_reference = const element_type&;
    using iterator = implementation-defined;
    using reverse_iterator = std::reverse_iterator<iterator>;
    static constexpr size_type extent = Extent;

    // [span.cons], span constructors, copy, assignment, and destructor
    constexpr span() noexcept;
    template <class It>
    constexpr explicit(Extent != dynamic_extent) span(It first, size_type count);
    template <class It, class End>
    constexpr explicit(Extent != dynamic_extent) span(It first, End last);
    template <size_t N>
        constexpr span(type_identity_t<element_type> (&arr)[N]) noexcept;
    template <size_t N>
        constexpr span(array<value_type, N>& arr) noexcept;
    template <size_t N>
        constexpr span(const array<value_type, N>& arr) noexcept;
    template<class R>
      constexpr explicit(Extent != dynamic_extent) span(R&& r);
    constexpr explicit(extent != dynamic_extent) span(std::initializer_list<value_type> il); // Since C++26
    constexpr span(const span& other) noexcept = default;
    template <class OtherElementType, size_t OtherExtent>
        constexpr explicit(Extent != dynamic_extent) span(const span<OtherElementType, OtherExtent>& s) noexcept;
    constexpr span& operator=(const span& other) noexcept = default;

    // [span.sub], span subviews
    template <size_t Count>
        constexpr span<element_type, Count> first() const;
    template <size_t Count>
        constexpr span<element_type, Count> last() const;
    template <size_t Offset, size_t Count = dynamic_extent>
        constexpr span<element_type, see below> subspan() const;

    constexpr span<element_type, dynamic_extent> first(size_type count) const;
    constexpr span<element_type, dynamic_extent> last(size_type count) const;
    constexpr span<element_type, dynamic_extent> subspan(size_type offset, size_type count = dynamic_extent) const;

    // [span.obs], span observers
    constexpr size_type size() const noexcept;
    constexpr size_type size_bytes() const noexcept;
    [[nodiscard]] constexpr bool empty() const noexcept;

    // [span.elem], span element access
    constexpr reference operator[](size_type idx) const;
    constexpr reference at(size_type idx) const; // since C++26
    constexpr reference front() const;
    constexpr reference back() const;
    constexpr pointer data() const noexcept;

    // [span.iterators], span iterator support
    constexpr iterator begin() const noexcept;
    constexpr iterator end() const noexcept;
    constexpr reverse_iterator rbegin() const noexcept;
    constexpr reverse_iterator rend() const noexcept;

private:
    pointer data_;    // exposition only
    size_type size_;  // exposition only
};

template<class It, class EndOrSize>
    span(It, EndOrSize) -> span<remove_reference_t<iter_reference_t<_It>>>;                             // until C++26
template<class It, class EndOrSize>
    span(It, EndOrSize) -> span<remove_reference_t<iter_reference_t<It>>, maybe-static-ext<EndOrSize>>; // since C++26

template<class T, size_t N>
    span(T (&)[N]) -> span<T, N>;

template<class T, size_t N>
    span(array<T, N>&) -> span<T, N>;

template<class T, size_t N>
    span(const array<T, N>&) -> span<const T, N>;

template<class R>
    span(R&&) -> span<remove_reference_t<ranges::range_reference_t<R>>>;

} // namespace std

*/

#if __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
#  include <__cxx03/__config>
#else
#  include <__assert>
#  include <__concepts/convertible_to.h>
#  include <__concepts/equality_comparable.h>
#  include <__config>
#  include <__cstddef/byte.h>
#  include <__cstddef/ptrdiff_t.h>
#  include <__fwd/array.h>
#  include <__fwd/span.h>
#  include <__iterator/bounded_iter.h>
#  include <__iterator/concepts.h>
#  include <__iterator/iterator_traits.h>
#  include <__iterator/reverse_iterator.h>
#  include <__iterator/wrap_iter.h>
#  include <__memory/pointer_traits.h>
#  include <__ranges/concepts.h>
#  include <__ranges/data.h>
#  include <__ranges/enable_borrowed_range.h>
#  include <__ranges/enable_view.h>
#  include <__ranges/size.h>
#  include <__type_traits/integral_constant.h>
#  include <__type_traits/is_array.h>
#  include <__type_traits/is_const.h>
#  include <__type_traits/is_convertible.h>
#  include <__type_traits/is_integral.h>
#  include <__type_traits/is_same.h>
#  include <__type_traits/remove_const.h>
#  include <__type_traits/remove_cv.h>
#  include <__type_traits/remove_cvref.h>
#  include <__type_traits/remove_reference.h>
#  include <__type_traits/type_identity.h>
#  include <__utility/forward.h>
#  include <initializer_list>
#  include <stdexcept>
#  include <version>

// standard-mandated includes

// [iterator.range]
#  include <__iterator/access.h>
#  include <__iterator/data.h>
#  include <__iterator/empty.h>
#  include <__iterator/reverse_access.h>
#  include <__iterator/size.h>

#  if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
#    pragma GCC system_header
#  endif

_LIBCPP_PUSH_MACROS
#  include <__undef_macros>

_LIBCPP_BEGIN_NAMESPACE_STD

#  if _LIBCPP_STD_VER >= 20

template <class _Tp>
struct __is_std_span : false_type {};

template <class _Tp, size_t _Sz>
struct __is_std_span<span<_Tp, _Sz>> : true_type {};

template <class _Range, class _ElementType>
concept __span_compatible_range =
    !__is_std_span<remove_cvref_t<_Range>>::value &&                //
    ranges::contiguous_range<_Range> &&                             //
    ranges::sized_range<_Range> &&                                  //
    (ranges::borrowed_range<_Range> || is_const_v<_ElementType>) && //
    !__is_std_array_v<remove_cvref_t<_Range>> &&                    //
    !is_array_v<remove_cvref_t<_Range>> &&                          //
    is_convertible_v<remove_reference_t<ranges::range_reference_t<_Range>> (*)[], _ElementType (*)[]>;

template <class _From, class _To>
concept __span_array_convertible = is_convertible_v<_From (*)[], _To (*)[]>;

template <class _It, class _Tp>
concept __span_compatible_iterator =
    contiguous_iterator<_It> && __span_array_convertible<remove_reference_t<iter_reference_t<_It>>, _Tp>;

template <class _Sentinel, class _It>
concept __span_compatible_sentinel_for = sized_sentinel_for<_Sentinel, _It> && !is_convertible_v<_Sentinel, size_t>;

template <typename _Tp, size_t _Extent>
class span {
public:
  //  constants and types
  using element_type    = _Tp;
  using value_type      = remove_cv_t<_Tp>;
  using size_type       = size_t;
  using difference_type = ptrdiff_t;
  using pointer         = _Tp*;
  using const_pointer   = const _Tp*;
  using reference       = _Tp&;
  using const_reference = const _Tp&;
#    ifdef _LIBCPP_ABI_BOUNDED_ITERATORS
  using iterator = __bounded_iter<pointer>;
#    else
  using iterator = __wrap_iter<pointer>;
#    endif
  using reverse_iterator = std::reverse_iterator<iterator>;

  static constexpr size_type extent = _Extent;

  // [span.cons], span constructors, copy, assignment, and destructor
  template <size_t _Sz = _Extent>
    requires(_Sz == 0)
  _LIBCPP_HIDE_FROM_ABI constexpr span() noexcept : __data_{nullptr} {}

#    if _LIBCPP_STD_VER >= 26
  _LIBCPP_HIDE_FROM_ABI constexpr explicit span(std::initializer_list<value_type> __il)
    requires is_const_v<element_type>
      : __data_{__il.begin()} {
    _LIBCPP_ASSERT_VALID_INPUT_RANGE(
        _Extent == __il.size(), "Size mismatch in span's constructor _Extent != __il.size().");
  }
#    endif

  constexpr span(const span&) noexcept            = default;
  constexpr span& operator=(const span&) noexcept = default;

  template <__span_compatible_iterator<element_type> _It>
  _LIBCPP_HIDE_FROM_ABI constexpr explicit span(_It __first, size_type __count) : __data_{std::to_address(__first)} {
    (void)__count;
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(_Extent == __count, "size mismatch in span's constructor (iterator, len)");
    _LIBCPP_ASSERT_VALID_INPUT_RANGE(__count == 0 || std::to_address(__first) != nullptr,
                                     "passed nullptr with non-zero length in span's constructor (iterator, len)");
  }

  template <__span_compatible_iterator<element_type> _It, __span_compatible_sentinel_for<_It> _End>
  _LIBCPP_HIDE_FROM_ABI constexpr explicit span(_It __first, _End __last) : __data_{std::to_address(__first)} {
    // [span.cons]/10
    // Throws: When and what last - first throws.
    [[maybe_unused]] auto __dist = __last - __first;
    _LIBCPP_ASSERT_VALID_INPUT_RANGE(__dist >= 0, "invalid range in span's constructor (iterator, sentinel)");
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(
        __dist == _Extent, "invalid range in span's constructor (iterator, sentinel): last - first != extent");
  }

  _LIBCPP_HIDE_FROM_ABI constexpr span(type_identity_t<element_type> (&__arr)[_Extent]) noexcept : __data_{__arr} {}

  template <__span_array_convertible<element_type> _OtherElementType>
  _LIBCPP_HIDE_FROM_ABI constexpr span(array<_OtherElementType, _Extent>& __arr) noexcept : __data_{__arr.data()} {}

  template <class _OtherElementType>
    requires __span_array_convertible<const _OtherElementType, element_type>
  _LIBCPP_HIDE_FROM_ABI constexpr span(const array<_OtherElementType, _Extent>& __arr) noexcept
      : __data_{__arr.data()} {}

  template <__span_compatible_range<element_type> _Range>
  _LIBCPP_HIDE_FROM_ABI constexpr explicit span(_Range&& __r) : __data_{ranges::data(__r)} {
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(ranges::size(__r) == _Extent, "size mismatch in span's constructor (range)");
  }

  template <__span_array_convertible<element_type> _OtherElementType>
  _LIBCPP_HIDE_FROM_ABI constexpr span(const span<_OtherElementType, _Extent>& __other) noexcept
      : __data_{__other.data()} {}

  template <__span_array_convertible<element_type> _OtherElementType>
  _LIBCPP_HIDE_FROM_ABI constexpr explicit span(const span<_OtherElementType, dynamic_extent>& __other) noexcept
      : __data_{__other.data()} {
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(_Extent == __other.size(), "size mismatch in span's constructor (other span)");
  }

  template <size_t _Count>
  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr span<element_type, _Count> first() const noexcept {
    static_assert(_Count <= _Extent, "span<T, N>::first<Count>(): Count out of range");
    return span<element_type, _Count>{data(), _Count};
  }

  template <size_t _Count>
  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr span<element_type, _Count> last() const noexcept {
    static_assert(_Count <= _Extent, "span<T, N>::last<Count>(): Count out of range");
    return span<element_type, _Count>{data() + size() - _Count, _Count};
  }

  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr span<element_type, dynamic_extent>
  first(size_type __count) const noexcept {
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__count <= size(), "span<T, N>::first(count): count out of range");
    return {data(), __count};
  }

  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr span<element_type, dynamic_extent>
  last(size_type __count) const noexcept {
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__count <= size(), "span<T, N>::last(count): count out of range");
    return {data() + size() - __count, __count};
  }

  template <size_t _Offset, size_t _Count = dynamic_extent>
  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto subspan() const noexcept
      -> span<element_type, _Count != dynamic_extent ? _Count : _Extent - _Offset> {
    static_assert(_Offset <= _Extent, "span<T, N>::subspan<Offset, Count>(): Offset out of range");
    static_assert(_Count == dynamic_extent || _Count <= _Extent - _Offset,
                  "span<T, N>::subspan<Offset, Count>(): Offset + Count out of range");

    using _ReturnType = span<element_type, _Count != dynamic_extent ? _Count : _Extent - _Offset>;
    return _ReturnType{data() + _Offset, _Count == dynamic_extent ? size() - _Offset : _Count};
  }

  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr span<element_type, dynamic_extent>
  subspan(size_type __offset, size_type __count = dynamic_extent) const noexcept {
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__offset <= size(), "span<T, N>::subspan(offset, count): offset out of range");
    if (__count == dynamic_extent)
      return {data() + __offset, size() - __offset};
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(
        __count <= size() - __offset, "span<T, N>::subspan(offset, count): offset + count out of range");
    return {data() + __offset, __count};
  }

  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr size_type size() const noexcept { return _Extent; }
  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr size_type size_bytes() const noexcept {
    return _Extent * sizeof(element_type);
  }
  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr bool empty() const noexcept { return _Extent == 0; }

  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr reference operator[](size_type __idx) const noexcept {
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__idx < size(), "span<T, N>::operator[](index): index out of range");
    return __data_[__idx];
  }

#    if _LIBCPP_STD_VER >= 26
  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr reference at(size_type __index) const {
    if (__index >= size())
      std::__throw_out_of_range("span");
    return __data_[__index];
  }
#    endif

  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr reference front() const noexcept {
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "span<T, N>::front() on empty span");
    return __data_[0];
  }

  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr reference back() const noexcept {
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "span<T, N>::back() on empty span");
    return __data_[size() - 1];
  }

  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr pointer data() const noexcept { return __data_; }

  // [span.iter], span iterator support
  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr iterator begin() const noexcept {
#    ifdef _LIBCPP_ABI_BOUNDED_ITERATORS
    return std::__make_bounded_iter(data(), data(), data() + size());
#    else
    return iterator(data());
#    endif
  }
  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr iterator end() const noexcept {
#    ifdef _LIBCPP_ABI_BOUNDED_ITERATORS
    return std::__make_bounded_iter(data() + size(), data(), data() + size());
#    else
    return iterator(data() + size());
#    endif
  }
  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr reverse_iterator rbegin() const noexcept {
    return reverse_iterator(end());
  }
  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr reverse_iterator rend() const noexcept {
    return reverse_iterator(begin());
  }

  _LIBCPP_HIDE_FROM_ABI span<const byte, _Extent * sizeof(element_type)> __as_bytes() const noexcept {
    return span<const byte, _Extent * sizeof(element_type)>{reinterpret_cast<const byte*>(data()), size_bytes()};
  }

  _LIBCPP_HIDE_FROM_ABI span<byte, _Extent * sizeof(element_type)> __as_writable_bytes() const noexcept {
    return span<byte, _Extent * sizeof(element_type)>{reinterpret_cast<byte*>(data()), size_bytes()};
  }

private:
  pointer __data_;
};

template <typename _Tp>
class span<_Tp, dynamic_extent> {
public:
  //  constants and types
  using element_type    = _Tp;
  using value_type      = remove_cv_t<_Tp>;
  using size_type       = size_t;
  using difference_type = ptrdiff_t;
  using pointer         = _Tp*;
  using const_pointer   = const _Tp*;
  using reference       = _Tp&;
  using const_reference = const _Tp&;
#    ifdef _LIBCPP_ABI_BOUNDED_ITERATORS
  using iterator = __bounded_iter<pointer>;
#    else
  using iterator = __wrap_iter<pointer>;
#    endif
  using reverse_iterator = std::reverse_iterator<iterator>;

  static constexpr size_type extent = dynamic_extent;

  // [span.cons], span constructors, copy, assignment, and destructor
  _LIBCPP_HIDE_FROM_ABI constexpr span() noexcept : __data_{nullptr}, __size_{0} {}

#    if _LIBCPP_STD_VER >= 26
  _LIBCPP_HIDE_FROM_ABI constexpr span(std::initializer_list<value_type> __il)
    requires is_const_v<element_type>
      : __data_{__il.begin()}, __size_{__il.size()} {}
#    endif

  constexpr span(const span&) noexcept            = default;
  constexpr span& operator=(const span&) noexcept = default;

  template <__span_compatible_iterator<element_type> _It>
  _LIBCPP_HIDE_FROM_ABI constexpr span(_It __first, size_type __count)
      : __data_{std::to_address(__first)}, __size_{__count} {
    _LIBCPP_ASSERT_VALID_INPUT_RANGE(__count == 0 || std::to_address(__first) != nullptr,
                                     "passed nullptr with non-zero length in span's constructor (iterator, len)");
  }

  template <__span_compatible_iterator<element_type> _It, __span_compatible_sentinel_for<_It> _End>
  _LIBCPP_HIDE_FROM_ABI constexpr span(_It __first, _End __last)
      : __data_(std::to_address(__first)), __size_(__last - __first) {
    _LIBCPP_ASSERT_VALID_INPUT_RANGE(__last - __first >= 0, "invalid range in span's constructor (iterator, sentinel)");
  }

  template <size_t _Sz>
  _LIBCPP_HIDE_FROM_ABI constexpr span(type_identity_t<element_type> (&__arr)[_Sz]) noexcept
      : __data_{__arr}, __size_{_Sz} {}

  template <__span_array_convertible<element_type> _OtherElementType, size_t _Sz>
  _LIBCPP_HIDE_FROM_ABI constexpr span(array<_OtherElementType, _Sz>& __arr) noexcept
      : __data_{__arr.data()}, __size_{_Sz} {}

  template <class _OtherElementType, size_t _Sz>
    requires __span_array_convertible<const _OtherElementType, element_type>
  _LIBCPP_HIDE_FROM_ABI constexpr span(const array<_OtherElementType, _Sz>& __arr) noexcept
      : __data_{__arr.data()}, __size_{_Sz} {}

  template <__span_compatible_range<element_type> _Range>
  _LIBCPP_HIDE_FROM_ABI constexpr span(_Range&& __r) : __data_(ranges::data(__r)), __size_{ranges::size(__r)} {}

  template <__span_array_convertible<element_type> _OtherElementType, size_t _OtherExtent>
  _LIBCPP_HIDE_FROM_ABI constexpr span(const span<_OtherElementType, _OtherExtent>& __other) noexcept
      : __data_{__other.data()}, __size_{__other.size()} {}

  template <size_t _Count>
  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr span<element_type, _Count> first() const noexcept {
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(_Count <= size(), "span<T>::first<Count>(): Count out of range");
    return span<element_type, _Count>{data(), _Count};
  }

  template <size_t _Count>
  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr span<element_type, _Count> last() const noexcept {
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(_Count <= size(), "span<T>::last<Count>(): Count out of range");
    return span<element_type, _Count>{data() + size() - _Count, _Count};
  }

  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr span<element_type, dynamic_extent>
  first(size_type __count) const noexcept {
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__count <= size(), "span<T>::first(count): count out of range");
    return {data(), __count};
  }

  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr span<element_type, dynamic_extent>
  last(size_type __count) const noexcept {
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__count <= size(), "span<T>::last(count): count out of range");
    return {data() + size() - __count, __count};
  }

  template <size_t _Offset, size_t _Count = dynamic_extent>
  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr span<element_type, _Count> subspan() const noexcept {
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(_Offset <= size(), "span<T>::subspan<Offset, Count>(): Offset out of range");
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(_Count == dynamic_extent || _Count <= size() - _Offset,
                                        "span<T>::subspan<Offset, Count>(): Offset + Count out of range");
    return span<element_type, _Count>{data() + _Offset, _Count == dynamic_extent ? size() - _Offset : _Count};
  }

  [[nodiscard]] constexpr span<element_type, dynamic_extent> _LIBCPP_HIDE_FROM_ABI
  subspan(size_type __offset, size_type __count = dynamic_extent) const noexcept {
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__offset <= size(), "span<T>::subspan(offset, count): offset out of range");
    if (__count == dynamic_extent)
      return {data() + __offset, size() - __offset};
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(
        __count <= size() - __offset, "span<T>::subspan(offset, count): offset + count out of range");
    return {data() + __offset, __count};
  }

  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr size_type size() const noexcept { return __size_; }
  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr size_type size_bytes() const noexcept {
    return __size_ * sizeof(element_type);
  }
  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr bool empty() const noexcept { return __size_ == 0; }

  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr reference operator[](size_type __idx) const noexcept {
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__idx < size(), "span<T>::operator[](index): index out of range");
    return __data_[__idx];
  }

#    if _LIBCPP_STD_VER >= 26
  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr reference at(size_type __index) const {
    if (__index >= size())
      std::__throw_out_of_range("span");
    return __data_[__index];
  }
#    endif

  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr reference front() const noexcept {
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "span<T>::front() on empty span");
    return __data_[0];
  }

  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr reference back() const noexcept {
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "span<T>::back() on empty span");
    return __data_[size() - 1];
  }

  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr pointer data() const noexcept { return __data_; }

  // [span.iter], span iterator support
  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr iterator begin() const noexcept {
#    ifdef _LIBCPP_ABI_BOUNDED_ITERATORS
    return std::__make_bounded_iter(data(), data(), data() + size());
#    else
    return iterator(data());
#    endif
  }
  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr iterator end() const noexcept {
#    ifdef _LIBCPP_ABI_BOUNDED_ITERATORS
    return std::__make_bounded_iter(data() + size(), data(), data() + size());
#    else
    return iterator(data() + size());
#    endif
  }
  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr reverse_iterator rbegin() const noexcept {
    return reverse_iterator(end());
  }
  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr reverse_iterator rend() const noexcept {
    return reverse_iterator(begin());
  }

  _LIBCPP_HIDE_FROM_ABI span<const byte, dynamic_extent> __as_bytes() const noexcept {
    return {reinterpret_cast<const byte*>(data()), size_bytes()};
  }

  _LIBCPP_HIDE_FROM_ABI span<byte, dynamic_extent> __as_writable_bytes() const noexcept {
    return {reinterpret_cast<byte*>(data()), size_bytes()};
  }

private:
  pointer __data_;
  size_type __size_;
};

template <class _Tp, size_t _Extent>
inline constexpr bool ranges::enable_borrowed_range<span<_Tp, _Extent> > = true;

template <class _ElementType, size_t _Extent>
inline constexpr bool ranges::enable_view<span<_ElementType, _Extent>> = true;

//  as_bytes & as_writable_bytes
template <class _Tp, size_t _Extent>
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI auto as_bytes(span<_Tp, _Extent> __s) noexcept {
  return __s.__as_bytes();
}

template <class _Tp, size_t _Extent>
  requires(!is_const_v<_Tp>)
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI auto as_writable_bytes(span<_Tp, _Extent> __s) noexcept {
  return __s.__as_writable_bytes();
}

#    if _LIBCPP_STD_VER >= 26
template <class _Tp>
concept __integral_constant_like =
    is_integral_v<decltype(_Tp::value)> && !is_same_v<bool, remove_const_t<decltype(_Tp::value)>> &&
    convertible_to<_Tp, decltype(_Tp::value)> && equality_comparable_with<_Tp, decltype(_Tp::value)> &&
    bool_constant<_Tp() == _Tp::value>::value &&
    bool_constant<static_cast<decltype(_Tp::value)>(_Tp()) == _Tp::value>::value;

template <class _Tp>
inline constexpr size_t __maybe_static_ext = dynamic_extent;

template <__integral_constant_like _Tp>
inline constexpr size_t __maybe_static_ext<_Tp> = {_Tp::value};

template <contiguous_iterator _It, class _EndOrSize>
span(_It, _EndOrSize) -> span<remove_reference_t<iter_reference_t<_It>>, __maybe_static_ext<_EndOrSize>>;
#    else
template <contiguous_iterator _It, class _EndOrSize>
span(_It, _EndOrSize) -> span<remove_reference_t<iter_reference_t<_It>>>;
#    endif

template <class _Tp, size_t _Sz>
span(_Tp (&)[_Sz]) -> span<_Tp, _Sz>;

template <class _Tp, size_t _Sz>
span(array<_Tp, _Sz>&) -> span<_Tp, _Sz>;

template <class _Tp, size_t _Sz>
span(const array<_Tp, _Sz>&) -> span<const _Tp, _Sz>;

template <ranges::contiguous_range _Range>
span(_Range&&) -> span<remove_reference_t<ranges::range_reference_t<_Range>>>;

#  endif // _LIBCPP_STD_VER >= 20

_LIBCPP_END_NAMESPACE_STD

_LIBCPP_POP_MACROS

#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
#    include <array>
#    include <concepts>
#    include <functional>
#    include <iterator>
#    include <type_traits>
#  endif
#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)

#endif // _LIBCPP_SPAN
