namespace std::ranges { template<class T> requires is_object_v<T> class empty_view : public view_interface<empty_view<T>> { public: static constexpr T* begin() noexcept { return nullptr; } static constexpr T* end() noexcept { return nullptr; } static constexpr T* data() noexcept { return nullptr; } static constexpr ptrdiff_t size() noexcept { return 0; } static constexpr bool empty() noexcept { return true; } friend constexpr T* begin(empty_view) noexcept { return nullptr; } friend constexpr T* end(empty_view) noexcept { return nullptr; } }; }
namespace std::ranges { template<CopyConstructible T> requires is_object_v<T> class single_view : public view_interface<single_view<T>> { private: semiregular<T> value_; // exposition only public: single_view() = default; constexpr explicit single_view(const T& t); constexpr explicit single_view(T&& t); template<class... Args> requires Constructible<T, Args...> constexpr single_view(in_place_t, Args&&... args); constexpr T* begin() noexcept; constexpr const T* begin() const noexcept; constexpr T* end() noexcept; constexpr const T* end() const noexcept; static constexpr ptrdiff_t size() noexcept; constexpr T* data() noexcept; constexpr const T* data() const noexcept; }; }
constexpr explicit single_view(const T& t);
constexpr explicit single_view(T&& t);
template<class... Args>
constexpr single_view(in_place_t, Args&&... args);
constexpr T* begin() noexcept;
constexpr const T* begin() const noexcept;
constexpr T* end() noexcept;
constexpr const T* end() const noexcept;
static constexpr ptrdiff_t size() noexcept;
constexpr T* data() noexcept;
constexpr const T* data() const noexcept;
namespace std::ranges { template<class I> concept Decrementable = // exposition only see below; template<class I> concept Advanceable = // exposition only see below; template<WeaklyIncrementable W, Semiregular Bound = unreachable_sentinel_t> requires weakly-equality-comparable-with<W, Bound> class iota_view : public view_interface<iota_view<W, Bound>> { private: struct iterator; // exposition only struct sentinel; // exposition only W value_ = W(); // exposition only Bound bound_ = Bound(); // exposition only public: iota_view() = default; constexpr explicit iota_view(W value); constexpr iota_view(type_identity_t<W> value, type_identity_t<Bound> bound); constexpr iterator begin() const; constexpr sentinel end() const; constexpr iterator end() const requires Same<W, Bound>; constexpr auto size() const requires (Same<W, Bound> && Advanceable<W>) || (Integral<W> && Integral<Bound>) || SizedSentinel<Bound, W> { return bound_ - value_; } }; template<class W, class Bound> requires (!Integral<W> || !Integral<Bound> || is_signed_v<W> == is_signed_v<Bound>) iota_view(W, Bound) -> iota_view<W, Bound>; }
template<class I>
concept Decrementable =
Incrementable<I> && requires(I i) {
{ --i } -> Same<I&>;
{ i-- } -> Same<I>;
};
template<class I>
concept Advanceable =
Decrementable<I> && StrictTotallyOrdered<I> &&
requires(I i, const I j, const iter_difference_t<I> n) {
{ i += n } -> Same<I&>;
{ i -= n } -> Same<I&>;
{ j + n } -> Same<I>;
{ n + j } -> Same<I>;
{ j - n } -> Same<I>;
{ j - j } -> Same<iter_difference_t<I>>;
};
constexpr explicit iota_view(W value);
constexpr iota_view(type_identity_t<W> value, type_identity_t<Bound> bound);
constexpr iterator begin() const;
constexpr sentinel end() const;
constexpr iterator end() const requires Same<W, Bound>;
namespace std::ranges { template<class W, class Bound> struct iota_view<W, Bound>::iterator { private: W value_ = W(); // exposition only public: using iterator_category = see below; using value_type = W; using difference_type = iter_difference_t<W>; iterator() = default; constexpr explicit iterator(W value); constexpr W operator*() const noexcept(is_nothrow_copy_constructible_v<W>); constexpr iterator& operator++(); constexpr void operator++(int); constexpr iterator operator++(int) requires Incrementable<W>; constexpr iterator& operator--() requires Decrementable<W>; constexpr iterator operator--(int) requires Decrementable<W>; constexpr iterator& operator+=(difference_type n) requires Advanceable<W>; constexpr iterator& operator-=(difference_type n) requires Advanceable<W>; constexpr W operator[](difference_type n) const requires Advanceable<W>; friend constexpr bool operator==(const iterator& x, const iterator& y) requires EqualityComparable<W>; friend constexpr bool operator!=(const iterator& x, const iterator& y) requires EqualityComparable<W>; friend constexpr bool operator<(const iterator& x, const iterator& y) requires StrictTotallyOrdered<W>; friend constexpr bool operator>(const iterator& x, const iterator& y) requires StrictTotallyOrdered<W>; friend constexpr bool operator<=(const iterator& x, const iterator& y) requires StrictTotallyOrdered<W>; friend constexpr bool operator>=(const iterator& x, const iterator& y) requires StrictTotallyOrdered<W>; friend constexpr iterator operator+(iterator i, difference_type n) requires Advanceable<W>; friend constexpr iterator operator+(difference_type n, iterator i) requires Advanceable<W>; friend constexpr iterator operator-(iterator i, difference_type n) requires Advanceable<W>; friend constexpr difference_type operator-(const iterator& x, const iterator& y) requires Advanceable<W>; }; }
constexpr explicit iterator(W value);
constexpr W operator*() const noexcept(is_nothrow_copy_constructible_v<W>);
constexpr iterator& operator++();
constexpr void operator++(int);
constexpr iterator operator++(int) requires Incrementable<W>;
constexpr iterator& operator--() requires Decrementable<W>;
constexpr iterator operator--(int) requires Decrementable<W>;
constexpr iterator& operator+=(difference_type n)
requires Advanceable<W>;
constexpr iterator& operator-=(difference_type n)
requires Advanceable<W>;
constexpr W operator[](difference_type n) const
requires Advanceable<W>;
friend constexpr bool operator==(const iterator& x, const iterator& y)
requires EqualityComparable<W>;
friend constexpr bool operator!=(const iterator& x, const iterator& y)
requires EqualityComparable<W>;
friend constexpr bool operator<(const iterator& x, const iterator& y)
requires StrictTotallyOrdered<W>;
friend constexpr bool operator>(const iterator& x, const iterator& y)
requires StrictTotallyOrdered<W>;
friend constexpr bool operator<=(const iterator& x, const iterator& y)
requires StrictTotallyOrdered<W>;
friend constexpr bool operator>=(const iterator& x, const iterator& y)
requires StrictTotallyOrdered<W>;
friend constexpr iterator operator+(iterator i, difference_type n)
requires Advanceable<W>;
friend constexpr iterator operator+(difference_type n, iterator i)
requires Advanceable<W>;
friend constexpr iterator operator-(iterator i, difference_type n)
requires Advanceable<W>;
friend constexpr difference_type operator-(const iterator& x, const iterator& y)
requires Advanceable<W>;
namespace std::ranges { template<class W, class Bound> struct iota_view<W, Bound>::sentinel { private: Bound bound_ = Bound(); // exposition only public: sentinel() = default; constexpr explicit sentinel(Bound bound); friend constexpr bool operator==(const iterator& x, const sentinel& y); friend constexpr bool operator==(const sentinel& x, const iterator& y); friend constexpr bool operator!=(const iterator& x, const sentinel& y); friend constexpr bool operator!=(const sentinel& x, const iterator& y); }; }
constexpr explicit sentinel(Bound bound);
friend constexpr bool operator==(const iterator& x, const sentinel& y);
friend constexpr bool operator==(const sentinel& x, const iterator& y);
friend constexpr bool operator!=(const iterator& x, const sentinel& y);
friend constexpr bool operator!=(const sentinel& x, const iterator& y);