diff --git a/source/ranges.tex b/source/ranges.tex index 2a455af9e2..93aa83cd18 100644 --- a/source/ranges.tex +++ b/source/ranges.tex @@ -1642,6 +1642,14 @@ concept @\defexposconceptnc{range-with-movable-references}@ = // \expos @\libconcept{input_range}@ && @\libconcept{move_constructible}@> && @\libconcept{move_constructible}@>; + +template + concept @\defexposconcept{bidirectional-common}@ = // \expos + @\libconcept{bidirectional_range}@ && @\libconcept{common_range}@; + +template + concept @\defexposconcept{random-access-sized}@ = // \expos + @\libconcept{random_access_range}@ && @\libconcept{sized_range}@; \end{codeblock} \rSec2[view.interface]{View interface} @@ -1723,9 +1731,8 @@ constexpr decltype(auto) front() requires @\libconcept{forward_range}@; constexpr decltype(auto) front() const requires @\libconcept{forward_range}@; - constexpr decltype(auto) back() requires @\libconcept{bidirectional_range}@ && @\libconcept{common_range}@; - constexpr decltype(auto) back() const - requires @\libconcept{bidirectional_range}@ && @\libconcept{common_range}@; + constexpr decltype(auto) back() requires @\exposconcept{bidirectional-common}@; + constexpr decltype(auto) back() const requires @\exposconcept{bidirectional-common}@; template<@\libconcept{random_access_range}@ R = D> constexpr decltype(auto) operator[](range_difference_t n) { @@ -1766,9 +1773,8 @@ \indexlibrarymember{back}{view_interface}% \begin{itemdecl} -constexpr decltype(auto) back() requires @\libconcept{bidirectional_range}@ && @\libconcept{common_range}@; -constexpr decltype(auto) back() const - requires @\libconcept{bidirectional_range}@ && @\libconcept{common_range}@; +constexpr decltype(auto) back() requires @\exposconcept{bidirectional-common}@; +constexpr decltype(auto) back() const requires @\exposconcept{bidirectional-common}@;; \end{itemdecl} \begin{itemdescr} @@ -5677,14 +5683,14 @@ \item Otherwise, if \tcode{T} models -\libconcept{random_access_range} and \libconcept{sized_range} +\exposconcept{random-access-sized} and is a specialization of \tcode{span}\iref{views.span}, \tcode{basic_string_view}\iref{string.view}, or \tcode{subrange}\iref{range.subrange}, then \tcode{U(ranges::begin(E), -ranges::be\-gin(E) + std::min(ranges::distance(E), F))}, +ranges::be\-gin(E) + std::\linebreak{}min(ranges::distance(E), F))}, except that \tcode{E} is evaluated only once, where \tcode{U} is a type determined as follows: @@ -5700,10 +5706,10 @@ \item otherwise, if \tcode{T} is a specialization of \tcode{iota_view}\iref{range.iota.view} -that models \libconcept{random_access_range} and \libconcept{sized_range}, +that models \exposconcept{random-access-sized}, then \tcode{iota_view(*ranges::begin(E), -*(ranges::begin(E) + std::\linebreak{}min(ranges::distance(E), F)))}, +*(ranges::begin(E) + std::min(ranges::distance(E), \linebreak{}F)))}, except that \tcode{E} is evaluated only once. \item @@ -6142,7 +6148,7 @@ \item Otherwise, if \tcode{T} models -\libconcept{random_access_range} and \libconcept{sized_range} +\exposconcept{random-access-sized} and is \begin{itemize} \item a specialization of \tcode{span}\iref{views.span}, @@ -6160,12 +6166,12 @@ Otherwise, if \tcode{T} is a specialization of \tcode{subrange}\iref{range.subrange} -that models \libconcept{random_access_range} and \libconcept{sized_range}, +that models \exposconcept{random-access-sized}, then -\tcode{T(ranges::begin(E) + std::min(ranges::distance(E), F), ranges::\linebreak{}end(E), +\tcode{T(ranges::begin(E) + std::min(ranges::distance(E), F), ranges::end(E),\linebreak{} \exposid{to-unsigned-like}(ranges::distance(E) - std::min(ranges::distance(E), F)))}, -except that \tcode{E} and \tcode{F} are each evaluated only once. +except\linebreak{} that \tcode{E} and \tcode{F} are each evaluated only once. \item Otherwise, if \tcode{T} is @@ -6215,10 +6221,8 @@ constexpr V base() && { return std::move(@\exposid{base_}@); } constexpr auto begin() - requires (!(@\exposconcept{simple-view}@ && - @\libconcept{random_access_range}@ && @\libconcept{sized_range}@)); - constexpr auto begin() const - requires @\libconcept{random_access_range}@ && @\libconcept{sized_range}@; + requires (!(@\exposconcept{simple-view}@ && @\exposconcept{random-access-sized}@)); + constexpr auto begin() const requires @\exposconcept{random-access-sized}@; constexpr auto end() requires (!@\exposconcept{simple-view}@) { return ranges::end(@\exposid{base_}@); } @@ -6267,10 +6271,8 @@ \indexlibrarymember{begin}{drop_view}% \begin{itemdecl} constexpr auto begin() - requires (!(@\exposconcept{simple-view}@ && - @\libconcept{random_access_range}@ && @\libconcept{sized_range}@)); -constexpr auto begin() const - requires @\libconcept{random_access_range}@ && @\libconcept{sized_range}@; + requires (!(@\exposconcept{simple-view}@ && @\exposconcept{random-access-sized}@)); +constexpr auto begin() const requires @\exposconcept{random-access-sized}@; \end{itemdecl} \begin{itemdescr} @@ -6578,13 +6580,11 @@ constexpr @\exposid{iterator}@& operator--() requires @\exposid{ref-is-glvalue}@ && @\libconcept{bidirectional_range}@<@\exposid{Base}@> && - @\libconcept{bidirectional_range}@> && - @\libconcept{common_range}@>; + @\exposconcept{bidirectional-common}@>; constexpr @\exposid{iterator}@ operator--(int) requires @\exposid{ref-is-glvalue}@ && @\libconcept{bidirectional_range}@<@\exposid{Base}@> && - @\libconcept{bidirectional_range}@> && - @\libconcept{common_range}@>; + @\exposconcept{bidirectional-common}@>; friend constexpr bool operator==(const @\exposid{iterator}@& x, const @\exposid{iterator}@& y) requires @\exposid{ref-is-glvalue}@ && @\libconcept{forward_range}@<@\exposid{Base}@> && @@ -6607,8 +6607,7 @@ \begin{itemize} \item If \exposid{ref-is-glvalue} is \tcode{true}, \exposid{Base} models \libconcept{bidirectional_range}, and - \tcode{range_reference_t<\exposid{Base}>} models - both \libconcept{bidirectional_range} and \libconcept{common_range}, + \tcode{range_reference_t<\exposid{Base}>} models \exposconcept{bidirectional-common}, then \tcode{iterator_concept} denotes \tcode{bidirectio\-nal_iterator_tag}. \item Otherwise, if \exposid{ref-is-glvalue} is \tcode{true} and \exposid{Base} and \tcode{range_reference_t<\exposid{Base}>} @@ -6811,8 +6810,7 @@ \begin{itemdecl} constexpr @\exposid{iterator}@& operator--() requires @\exposid{ref-is-glvalue}@ && @\libconcept{bidirectional_range}@<@\exposid{Base}@> && - @\libconcept{bidirectional_range}@> && - @\libconcept{common_range}@>; + @\exposconcept{bidirectional-common}@>; \end{itemdecl} \begin{itemdescr} @@ -6833,8 +6831,7 @@ \begin{itemdecl} constexpr @\exposid{iterator}@ operator--(int) requires @\exposid{ref-is-glvalue}@ && @\libconcept{bidirectional_range}@<@\exposid{Base}@> && - @\libconcept{bidirectional_range}@> && - @\libconcept{common_range}@>; + @\exposconcept{bidirectional-common}@>; \end{itemdecl} \begin{itemdescr} @@ -6979,9 +6976,6 @@ @\libconcept{common_reference_with}@, range_reference_t

> && @\libconcept{common_reference_with}@, range_rvalue_reference_t

>; - template - concept @\defexposconcept{bidirectional-common}@ = @\libconcept{bidirectional_range}@ && @\libconcept{common_range}@; // \expos - template<@\libconcept{input_range}@ V, @\libconcept{forward_range}@ Pattern> requires @\libconcept{view}@ && @\libconcept{input_range}@> && @\libconcept{view}@ @@ -8531,28 +8525,28 @@ constexpr V base() && { return std::move(@\exposid{base_}@); } constexpr auto begin() { - if constexpr (@\libconcept{random_access_range}@ && @\libconcept{sized_range}@) + if constexpr (@\exposconcept{random-access-sized}@) return ranges::begin(@\exposid{base_}@); else return common_iterator, sentinel_t>(ranges::begin(@\exposid{base_}@)); } constexpr auto begin() const requires @\libconcept{range}@ { - if constexpr (@\libconcept{random_access_range}@ && @\libconcept{sized_range}@) + if constexpr (@\exposconcept{random-access-sized}@) return ranges::begin(@\exposid{base_}@); else return common_iterator, sentinel_t>(ranges::begin(@\exposid{base_}@)); } constexpr auto end() { - if constexpr (@\libconcept{random_access_range}@ && @\libconcept{sized_range}@) + if constexpr (@\exposconcept{random-access-sized}@) return ranges::begin(@\exposid{base_}@) + ranges::distance(@\exposid{base_}@); else return common_iterator, sentinel_t>(ranges::end(@\exposid{base_}@)); } constexpr auto end() const requires @\libconcept{range}@ { - if constexpr (@\libconcept{random_access_range}@ && @\libconcept{sized_range}@) + if constexpr (@\exposconcept{random-access-sized}@) return ranges::begin(@\exposid{base_}@) + ranges::distance(@\exposid{base_}@); else return common_iterator, sentinel_t>(ranges::end(@\exposid{base_}@)); @@ -13359,11 +13353,11 @@ \begin{codeblock} namespace std::ranges { template - concept @\defexposconcept{slide-caches-nothing}@ = @\libconcept{random_access_range}@ && @\libconcept{sized_range}@; // \expos + concept @\defexposconcept{slide-caches-nothing}@ = @\exposconcept{random-access-sized}@; // \expos template concept @\defexposconcept{slide-caches-last}@ = // \expos - !@\exposconcept{slide-caches-nothing}@ && @\libconcept{bidirectional_range}@ && @\libconcept{common_range}@; + !@\exposconcept{slide-caches-nothing}@ && @\exposconcept{bidirectional-common}@; template concept @\defexposconcept{slide-caches-first}@ = // \expos @@ -14969,12 +14963,11 @@ template concept @\defexposconcept{cartesian-product-is-random-access}@ = // \expos (@\libconcept{random_access_range}@<@\exposid{maybe-const}@> && ... && - (@\libconcept{random_access_range}@<@\exposid{maybe-const}@> - && @\libconcept{sized_range}@<@\exposid{maybe-const}@>)); + @\exposconcept{random-access-sized}@<@\exposid{maybe-const}@>); template concept @\defexposconcept{cartesian-product-common-arg}@ = // \expos - @\libconcept{common_range}@ || (@\libconcept{sized_range}@ && @\libconcept{random_access_range}@); + @\libconcept{common_range}@ || @\exposconcept{random-access-sized}@; template concept @\defexposconcept{cartesian-product-is-bidirectional}@ = // \expos