This commit is contained in:
2025-10-25 03:02:53 +03:00
commit 043225d523
3416 changed files with 681196 additions and 0 deletions

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,37 @@
[range.concat.overview]
# 25 Ranges library [[ranges]](./#ranges)
## 25.7 Range adaptors [[range.adaptors]](range.adaptors#range.concat.overview)
### 25.7.18 Concat view [[range.concat]](range.concat#overview)
#### 25.7.18.1 Overview [range.concat.overview]
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L8697)
concat_view presents a view that concatenates all the underlying ranges[.](#1.sentence-1)
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L8700)
The name views::concat denotes
a customization point object ([[customization.point.object]](customization.point.object "16.3.3.3.5Customization Point Object types"))[.](#2.sentence-1)
Given a pack of subexpressions Es...,
the expression views::concat(Es...) is expression-equivalent to
- [(2.1)](#2.1)
views::all(Es...) if Es is a pack with only one element
whose type models [input_range](range.refinements#concept:input_range "25.4.6Other range refinements[range.refinements]"),
- [(2.2)](#2.2)
otherwise, concat_view(Es...)[.](#2.sentence-2)
[*Example [1](#example-1)*: vector<int> v1{1, 2, 3}, v2{4, 5}, v3{};
array a{6, 7, 8};auto s = views::single(9);for (auto&& i : views::concat(v1, v2, v3, a, s)) { print("{} ", i); // prints 1 2 3 4 5 6 7 8 9} — *end example*]

View File

@@ -0,0 +1,122 @@
[range.concat.view]
# 25 Ranges library [[ranges]](./#ranges)
## 25.7 Range adaptors [[range.adaptors]](range.adaptors#range.concat.view)
### 25.7.18 Concat view [[range.concat]](range.concat#view)
#### 25.7.18.2 Class template concat_view [range.concat.view]
[🔗](#lib:concat_view)
namespace std::ranges {template<class... Rs>using *concat-reference-t* = common_reference_t<range_reference_t<Rs>...>; // *exposition only*template<class... Rs>using *concat-value-t* = common_type_t<range_value_t<Rs>...>; // *exposition only*template<class... Rs>using *concat-rvalue-reference-t* = // *exposition only* common_reference_t<range_rvalue_reference_t<Rs>...>; template<class... Rs>concept [*concat-indirectly-readable*](#concept:concat-indirectly-readable "25.7.18.2Class template concat_­view[range.concat.view]") = *see below*; // *exposition only*template<class... Rs>concept [*concatable*](#concept:concatable "25.7.18.2Class template concat_­view[range.concat.view]") = *see below*; // *exposition only*template<bool Const, class... Rs>concept [*concat-is-random-access*](#concept:concat-is-random-access "25.7.18.2Class template concat_­view[range.concat.view]") = *see below*; // *exposition only*template<bool Const, class... Rs>concept [*concat-is-bidirectional*](#concept:concat-is-bidirectional "25.7.18.2Class template concat_­view[range.concat.view]") = *see below*; // *exposition only*template<[input_range](range.refinements#concept:input_range "25.4.6Other range refinements[range.refinements]")... Views>requires ([view](range.view#concept:view "25.4.5Views[range.view]")<Views> && ...) && (sizeof...(Views) > 0) &&[*concatable*](#concept:concatable "25.7.18.2Class template concat_­view[range.concat.view]")<Views...>class concat_view : public view_interface<concat_view<Views...>> { tuple<Views...> *views_*; // *exposition only*// [[range.concat.iterator]](range.concat.iterator "25.7.18.3Class concat_­view::iterator"), class template concat_view::*iterator*template<bool> class *iterator*; // *exposition only*public:constexpr concat_view() = default; constexpr explicit concat_view(Views... views); constexpr *iterator*<false> begin() requires (!([*simple-view*](range.utility.helpers#concept:simple-view "25.5.2Helper concepts[range.utility.helpers]")<Views> && ...)); constexpr *iterator*<true> begin() constrequires ([range](range.range#concept:range "25.4.2Ranges[range.range]")<const Views> && ...) && [*concatable*](#concept:concatable "25.7.18.2Class template concat_­view[range.concat.view]")<const Views...>; constexpr auto end() requires (!([*simple-view*](range.utility.helpers#concept:simple-view "25.5.2Helper concepts[range.utility.helpers]")<Views> && ...)); constexpr auto end() constrequires ([range](range.range#concept:range "25.4.2Ranges[range.range]")<const Views> && ...) && [*concatable*](#concept:concatable "25.7.18.2Class template concat_­view[range.concat.view]")<const Views...>; constexpr auto size() requires ([sized_range](range.sized#concept:sized_range "25.4.4Sized ranges[range.sized]")<Views> && ...); constexpr auto size() const requires ([sized_range](range.sized#concept:sized_range "25.4.4Sized ranges[range.sized]")<const Views> && ...); }; template<class... R> concat_view(R&&...) -> concat_view<views::all_t<R>...>;}
[🔗](#concept:concat-indirectly-readable)
`template<class... Rs>
concept [concat-indirectly-readable](#concept:concat-indirectly-readable "25.7.18.2Class template concat_­view[range.concat.view]") = see below; // exposition only
`
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L8780)
The exposition-only [*concat-indirectly-readable*](#concept:concat-indirectly-readable "25.7.18.2Class template concat_­view[range.concat.view]") concept
is equivalent to:template<class Ref, class RRef, class It>concept [*concat-indirectly-readable-impl*](#concept:concat-indirectly-readable-impl "25.7.18.2Class template concat_­view[range.concat.view]") = // *exposition only*requires (const It it) {{ *it } -> [convertible_to](concept.convertible#concept:convertible_to "18.4.4Concept convertible_­to[concept.convertible]")<Ref>; { ranges::iter_move(it) } -> [convertible_to](concept.convertible#concept:convertible_to "18.4.4Concept convertible_­to[concept.convertible]")<RRef>; };
template<class... Rs>concept [*concat-indirectly-readable*](#concept:concat-indirectly-readable "25.7.18.2Class template concat_­view[range.concat.view]") = // *exposition only*[common_reference_with](concept.commonref#concept:common_reference_with "18.4.5Concept common_­reference_­with[concept.commonref]")<*concat-reference-t*<Rs...>&&, *concat-value-t*<Rs...>&> &&[common_reference_with](concept.commonref#concept:common_reference_with "18.4.5Concept common_­reference_­with[concept.commonref]")<*concat-reference-t*<Rs...>&&, *concat-rvalue-reference-t*<Rs...>&&> &&[common_reference_with](concept.commonref#concept:common_reference_with "18.4.5Concept common_­reference_­with[concept.commonref]")<*concat-rvalue-reference-t*<Rs...>&&, *concat-value-t*<Rs...> const&> &&([*concat-indirectly-readable-impl*](#concept:concat-indirectly-readable-impl "25.7.18.2Class template concat_­view[range.concat.view]")<*concat-reference-t*<Rs...>, *concat-rvalue-reference-t*<Rs...>,
iterator_t<Rs>> && ...);
[🔗](#concept:concatable)
`template<class... Rs>
concept [concatable](#concept:concatable "25.7.18.2Class template concat_­view[range.concat.view]") = see below; // exposition only
`
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L8811)
The exposition-only [*concatable*](#concept:concatable "25.7.18.2Class template concat_­view[range.concat.view]") concept is equivalent to:template<class... Rs>concept [*concatable*](#concept:concatable "25.7.18.2Class template concat_­view[range.concat.view]") = requires { // *exposition only*typename *concat-reference-t*<Rs...>; typename *concat-value-t*<Rs...>; typename *concat-rvalue-reference-t*<Rs...>; } && [*concat-indirectly-readable*](#concept:concat-indirectly-readable "25.7.18.2Class template concat_­view[range.concat.view]")<Rs...>;
[🔗](#concept:concat-is-random-access)
`template<bool Const, class... Rs>
concept [concat-is-random-access](#concept:concat-is-random-access "25.7.18.2Class template concat_­view[range.concat.view]") = see below; // exposition only
`
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L8829)
Let Fs be the pack that consists of all elements of Rs except the last element,
then *concat-is-random-access* is equivalent to:template<bool Const, class... Rs>concept [*concat-is-random-access*](#concept:concat-is-random-access "25.7.18.2Class template concat_­view[range.concat.view]") = // *exposition only*[*all-random-access*](range.adaptor.helpers#concept:all-random-access "25.7.5Range adaptor helpers[range.adaptor.helpers]")<Const, Rs...> &&([common_range](range.refinements#concept:common_range "25.4.6Other range refinements[range.refinements]")<*maybe-const*<Const, Fs>> && ...);
[🔗](#concept:concat-is-bidirectional)
`template<bool Const, class... Rs>
concept [concat-is-bidirectional](#concept:concat-is-bidirectional "25.7.18.2Class template concat_­view[range.concat.view]") = see below; // exposition only
`
[4](#4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L8848)
Let Fs be the pack that consists of all elements of Rs except the last element,
then *concat-is-bidirectional* is equivalent to:template<bool Const, class... Rs>concept [*concat-is-bidirectional*](#concept:concat-is-bidirectional "25.7.18.2Class template concat_­view[range.concat.view]") = // *exposition only*[*all-bidirectional*](range.adaptor.helpers#concept:all-bidirectional "25.7.5Range adaptor helpers[range.adaptor.helpers]")<Const, Rs...> &&([common_range](range.refinements#concept:common_range "25.4.6Other range refinements[range.refinements]")<*maybe-const*<Const, Fs>> && ...);
[🔗](#lib:concat_view,constructor)
`constexpr explicit concat_view(Views... views);
`
[5](#5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L8867)
*Effects*: Initializes *views_* with std::move(views)...[.](#5.sentence-1)
[🔗](#lib:begin,concat_view)
`constexpr iterator<false> begin() requires (!([simple-view](range.utility.helpers#concept:simple-view "25.5.2Helper concepts[range.utility.helpers]")<Views> && ...));
constexpr iterator<true> begin() const
requires ([range](range.range#concept:range "25.4.2Ranges[range.range]")<const Views> && ...) && [concatable](#concept:concatable "25.7.18.2Class template concat_­view[range.concat.view]")<const Views...>;
`
[6](#6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L8880)
*Effects*: Let *is-const* betrue for the const-qualified overload, andfalse otherwise[.](#6.sentence-1)
Equivalent to:*iterator*<*is-const*> it(this, in_place_index<0>, ranges::begin(std::get<0>(*views_*)));
it.template *satisfy*<0>();return it;
[🔗](#lib:end,concat_view)
`constexpr auto end() requires (!([simple-view](range.utility.helpers#concept:simple-view "25.5.2Helper concepts[range.utility.helpers]")<Views> && ...));
constexpr auto end() const
requires ([range](range.range#concept:range "25.4.2Ranges[range.range]")<const Views> && ...) && [concatable](#concept:concatable "25.7.18.2Class template concat_­view[range.concat.view]")<const Views...>;
`
[7](#7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L8901)
*Effects*: Let *is-const* betrue for the const-qualified overload, andfalse otherwise[.](#7.sentence-1)
Equivalent to:constexpr auto N = sizeof...(Views);if constexpr ([common_range](range.refinements#concept:common_range "25.4.6Other range refinements[range.refinements]")<*maybe-const*<*is-const*, Views...[N - 1]>>) {return *iterator*<*is-const*>(this, in_place_index<N - 1>,
ranges::end(std::get<N - 1>(*views_*)));} else {return default_sentinel;}
[🔗](#lib:size,concat_view)
`constexpr auto size() requires ([sized_range](range.sized#concept:sized_range "25.4.4Sized ranges[range.sized]")<Views> && ...);
constexpr auto size() const requires ([sized_range](range.sized#concept:sized_range "25.4.4Sized ranges[range.sized]")<const Views> && ...);
`
[8](#8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/ranges.tex#L8925)
*Effects*: Equivalent to:return apply([](auto... sizes) {using CT = *make-unsigned-like-t*<common_type_t<decltype(sizes)...>>; return (CT(sizes) + ...); }, *tuple-transform*(ranges::size, *views_*));