|
720 | 720 | the requirement that the number of elements in the range can be determined
|
721 | 721 | in constant time using the \tcode{ranges::size} function.
|
722 | 722 | The \libconcept{view} concept specifies requirements on a \libconcept{range} type
|
723 |
| -with constant-time copy and assign operations. |
| 723 | +with constant-time destruction and move operations. |
724 | 724 |
|
725 | 725 | \pnum
|
726 | 726 | Several refinements of \libconcept{range} group requirements
|
|
898 | 898 |
|
899 | 899 | \rSec2[range.view]{Views}
|
900 | 900 |
|
| 901 | +\pnum |
| 902 | +The \libconcept{view} concept specifies the requirements of a \libconcept{range} type |
| 903 | +that has constant time move construction, move assignment, and destruction; |
| 904 | +that is, the cost of these operations is |
| 905 | +% FIXME: Shouldn't this be "independent of the number of elements"? |
| 906 | +not proportional to the number of elements in the \tcode{view}. |
| 907 | + |
901 | 908 | \begin{itemdecl}
|
902 | 909 | template<class T>
|
903 | 910 | concept @\deflibconcept{view}@ =
|
904 |
| - range<T> && semiregular<T> && enable_view<T>; |
| 911 | + range<T> && movable<T> && default_constructible<T> && enable_view<T>; |
905 | 912 | \end{itemdecl}
|
906 | 913 |
|
907 | 914 | \begin{itemdescr}
|
908 |
| -% FIXME: This should explicitly say when view is modeled. |
909 | 915 | \pnum
|
910 |
| -The \libconcept{view} concept specifies the requirements of a \libconcept{range} type |
911 |
| -that has constant time copy, move, and assignment operators; that is, the cost of |
912 |
| -these operations is not proportional to the number of elements in the |
913 |
| -\tcode{view}. |
| 916 | +\tcode{T} models \libconcept{view} only if: |
| 917 | +\begin{itemize} |
| 918 | +\item |
| 919 | +\tcode{copy_constructible<T>} is \tcode{false}, or |
| 920 | +\tcode{T} has \bigoh{1} copy construction; and |
| 921 | + |
| 922 | +\item |
| 923 | +\tcode{copyable<T>} is \tcode{false}, or |
| 924 | +\tcode{T} has \bigoh{1} copy assignment. |
| 925 | +\end{itemize} |
914 | 926 |
|
915 | 927 | \pnum
|
916 | 928 | \begin{example}
|
|
925 | 937 | \end{itemize}
|
926 | 938 |
|
927 | 939 | Most containers\iref{containers} are not views since
|
928 |
| -copying the container copies the elements, |
| 940 | +destruction of the container destroys the elements, |
929 | 941 | which cannot be done in constant time.
|
930 | 942 | \end{example}
|
931 | 943 | \end{itemdescr}
|
|
2701 | 2713 | \rSec3[range.filter.view]{Class template \tcode{filter_view}}
|
2702 | 2714 |
|
2703 | 2715 | \indexlibraryglobal{filter_view}%
|
| 2716 | +\indexlibrarymember{base}{filter_view}% |
| 2717 | +\indexlibrarymember{end}{filter_view}% |
2704 | 2718 | \begin{codeblock}
|
2705 | 2719 | namespace std::ranges {
|
2706 | 2720 | template<input_range V, indirect_unary_predicate<iterator_t<V>> Pred>
|
|
2722 | 2736 | requires viewable_range<R> && constructible_from<V, all_view<R>>
|
2723 | 2737 | constexpr filter_view(R&& r, Pred pred);
|
2724 | 2738 |
|
2725 |
| - constexpr V base() const; |
| 2739 | + constexpr V base() const& requires copy_constructible<V> { return base_; } |
| 2740 | + constexpr V base() && { return std::move(base_); } |
2726 | 2741 |
|
2727 | 2742 | constexpr iterator begin();
|
2728 | 2743 | constexpr auto end() {
|
|
2764 | 2779 | and initializes \tcode{pred_} with \tcode{std::\brk{}move(pred)}.
|
2765 | 2780 | \end{itemdescr}
|
2766 | 2781 |
|
2767 |
| -\indexlibrarymember{base}{filter_view}% |
2768 |
| -\begin{itemdecl} |
2769 |
| -constexpr V base() const; |
2770 |
| -\end{itemdecl} |
2771 |
| - |
2772 |
| -\begin{itemdescr} |
2773 |
| -\pnum |
2774 |
| -\effects |
2775 |
| -Equivalent to: \tcode{return base_;} |
2776 |
| -\end{itemdescr} |
2777 |
| - |
2778 | 2782 | \indexlibrarymember{begin}{filter_view}%
|
2779 | 2783 | \begin{itemdecl}
|
2780 | 2784 | constexpr iterator begin();
|
|
3116 | 3120 | \rSec3[range.transform.view]{Class template \tcode{transform_view}}
|
3117 | 3121 |
|
3118 | 3122 | \indexlibraryglobal{transform_view}%
|
| 3123 | +\indexlibrarymember{base}{transform_view}% |
| 3124 | +\indexlibrarymember{size}{transform_view}% |
3119 | 3125 | \begin{codeblock}
|
3120 | 3126 | namespace std::ranges {
|
3121 | 3127 | template<input_range V, copy_constructible F>
|
|
3138 | 3144 | requires viewable_range<R> && constructible_from<V, all_view<R>>
|
3139 | 3145 | constexpr transform_view(R&& r, F fun);
|
3140 | 3146 |
|
3141 |
| - constexpr V base() const; |
| 3147 | + constexpr V base() const& requires copy_constructible<V> { return base_; } |
| 3148 | + constexpr V base() && { return std::move(base_); } |
3142 | 3149 |
|
3143 | 3150 | constexpr iterator<false> begin();
|
3144 | 3151 | constexpr iterator<true> begin() const
|
|
3190 | 3197 | and \tcode{fun_} with \tcode{std::move(fun)}.
|
3191 | 3198 | \end{itemdescr}
|
3192 | 3199 |
|
3193 |
| -\indexlibrarymember{base}{transform_view}% |
3194 |
| -\begin{itemdecl} |
3195 |
| -constexpr V base() const; |
3196 |
| -\end{itemdecl} |
3197 |
| - |
3198 |
| -\begin{itemdescr} |
3199 |
| -\pnum |
3200 |
| -\effects |
3201 |
| -Equivalent to: \tcode{return base_;} |
3202 |
| -\end{itemdescr} |
3203 |
| - |
3204 | 3200 | \indexlibrarymember{begin}{transform_view}%
|
3205 | 3201 | \begin{itemdecl}
|
3206 | 3202 | constexpr iterator<false> begin();
|
|
3804 | 3800 | \rSec3[range.take.view]{Class template \tcode{take_view}}
|
3805 | 3801 |
|
3806 | 3802 | \indexlibraryglobal{take_view}%
|
| 3803 | +\indexlibrarymember{base}{take_view}% |
| 3804 | +\indexlibrarymember{begin}{take_view}% |
| 3805 | +\indexlibrarymember{end}{take_view}% |
| 3806 | +\indexlibrarymember{size}{take_view}% |
3807 | 3807 | \begin{codeblock}
|
3808 | 3808 | namespace std::ranges {
|
3809 | 3809 | template<view V>
|
|
3820 | 3820 | requires constructible_from<V, all_view<R>>
|
3821 | 3821 | constexpr take_view(R&& r, range_difference_t<V> count);
|
3822 | 3822 |
|
3823 |
| - constexpr V base() const; |
| 3823 | + constexpr V base() const& requires copy_constructible<V> { return base_; } |
| 3824 | + constexpr V base() && { return std::move(base_); } |
3824 | 3825 |
|
3825 | 3826 | constexpr auto begin() requires (!@\placeholder{simple-view}@<V>) {
|
3826 | 3827 | if constexpr (sized_range<V>) {
|
|
3905 | 3906 | and \tcode{count_} with \tcode{count}.
|
3906 | 3907 | \end{itemdescr}
|
3907 | 3908 |
|
3908 |
| -\indexlibrarymember{base}{take_view}% |
3909 |
| -\begin{itemdecl} |
3910 |
| -constexpr V base() const; |
3911 |
| -\end{itemdecl} |
3912 |
| - |
3913 |
| -\begin{itemdescr} |
3914 |
| -\pnum |
3915 |
| -\effects |
3916 |
| -Equivalent to: \tcode{return base_;} |
3917 |
| -\end{itemdescr} |
3918 |
| - |
3919 | 3909 | \rSec3[range.take.sentinel]{Class template \tcode{take_view::sentinel}}
|
3920 | 3910 |
|
3921 | 3911 | \indexlibraryglobal{take_view::sentinel}%
|
|
4436 | 4426 | \rSec3[range.join.view]{Class template \tcode{join_view}}
|
4437 | 4427 |
|
4438 | 4428 | \indexlibraryglobal{join_view}%
|
| 4429 | +\indexlibrarymember{base}{join_view}% |
| 4430 | +\indexlibrarymember{begin}{join_view}% |
| 4431 | +\indexlibrarymember{end}{join_view}% |
4439 | 4432 | \begin{codeblock}
|
4440 | 4433 | namespace std::ranges {
|
4441 | 4434 | template<input_range V>
|
|
4464 | 4457 | requires viewable_range<R> && constructible_from<V, all_view<R>>
|
4465 | 4458 | constexpr explicit join_view(R&& r);
|
4466 | 4459 |
|
| 4460 | + constexpr V base() const& requires copy_constructible<V> { return base_; } |
| 4461 | + constexpr V base() && { return std::move(base_); } |
| 4462 | + |
4467 | 4463 | constexpr auto begin() {
|
4468 | 4464 | return iterator<@\placeholder{simple-view}@<V>>{*this, ranges::begin(base_)};
|
4469 | 4465 | }
|
|
4649 | 4645 | \effects
|
4650 | 4646 | Equivalent to:
|
4651 | 4647 | \begin{codeblock}
|
4652 |
| -auto update_inner = [this](range_reference_t<Base> x) -> decltype(auto) { |
| 4648 | +auto update_inner = [this](range_reference_t<Base> x) -> auto& { |
4653 | 4649 | if constexpr (ref_is_glvalue) // \tcode{x} is a reference
|
4654 |
| - return (x); // \tcode{(x)} is an lvalue |
| 4650 | + return x; |
4655 | 4651 | else
|
4656 |
| - return (parent_->inner_ = views::all(x)); |
| 4652 | + return (parent_->inner_ = views::all(std::move(x))); |
4657 | 4653 | };
|
4658 | 4654 |
|
4659 | 4655 | for (; outer_ != ranges::end(parent_->base_); ++outer_) {
|
|
4922 | 4918 | \rSec3[range.split.view]{Class template \tcode{split_view}}
|
4923 | 4919 |
|
4924 | 4920 | \indexlibraryglobal{split_view}%
|
| 4921 | +\indexlibrarymember{base}{split_view}% |
| 4922 | +\indexlibrarymember{begin}{split_view}% |
| 4923 | +\indexlibrarymember{end}{split_view}% |
4925 | 4924 | \begin{codeblock}
|
4926 | 4925 | namespace std::ranges {
|
4927 | 4926 | template<auto> struct @\placeholdernc{require-constant}@; // \expos
|
|
4959 | 4958 | constructible_from<Pattern, single_view<range_value_t<R>>>
|
4960 | 4959 | constexpr split_view(R&& r, range_value_t<R> e);
|
4961 | 4960 |
|
| 4961 | + constexpr V base() const& requires copy_constructible<V> { return base_; } |
| 4962 | + constexpr V base() && { return std::move(base_); } |
| 4963 | + |
4962 | 4964 | constexpr auto begin() {
|
4963 | 4965 | if constexpr (forward_range<V>)
|
4964 | 4966 | return outer_iterator<@\placeholder{simple-view}@<V>>{*this, ranges::begin(base_)};
|
|
5459 | 5461 | \rSec3[range.common.view]{Class template \tcode{common_view}}
|
5460 | 5462 |
|
5461 | 5463 | \indexlibraryglobal{common_view}%
|
| 5464 | +\indexlibrarymember{base}{common_view}% |
| 5465 | +\indexlibrarymember{size}{common_view}% |
| 5466 | +\indexlibrarymember{begin}{common_view}% |
| 5467 | +\indexlibrarymember{end}{common_view}% |
5462 | 5468 | \begin{codeblock}
|
5463 | 5469 | namespace std::ranges {
|
5464 | 5470 | template<view V>
|
|
5475 | 5481 | requires (!common_range<R> && constructible_from<V, all_view<R>>)
|
5476 | 5482 | constexpr explicit common_view(R&& r);
|
5477 | 5483 |
|
5478 |
| - constexpr V base() const; |
| 5484 | + constexpr V base() const& requires copy_constructible<V> { return base_; } |
| 5485 | + constexpr V base() && { return std::move(base_); } |
5479 | 5486 |
|
5480 | 5487 | constexpr auto size() requires sized_range<V> {
|
5481 | 5488 | return ranges::size(base_);
|
|
5542 | 5549 | Initializes \tcode{base_} with \tcode{views::all(std::forward<R>(r))}.
|
5543 | 5550 | \end{itemdescr}
|
5544 | 5551 |
|
5545 |
| -\indexlibrarymember{base}{common_view}% |
5546 |
| -\begin{itemdecl} |
5547 |
| -constexpr V base() const; |
5548 |
| -\end{itemdecl} |
5549 |
| - |
5550 |
| -\begin{itemdescr} |
5551 |
| -\pnum |
5552 |
| -\effects |
5553 |
| -Equivalent to: \tcode{return base_;} |
5554 |
| -\end{itemdescr} |
5555 |
| - |
5556 | 5552 | \rSec3[range.common.adaptor]{\tcode{views::common}}
|
5557 | 5553 |
|
5558 | 5554 | \pnum
|
|
5589 | 5585 | \rSec3[range.reverse.view]{Class template \tcode{reverse_view}}
|
5590 | 5586 |
|
5591 | 5587 | \indexlibraryglobal{reverse_view}%
|
| 5588 | +\indexlibrarymember{base}{reverse_view}% |
| 5589 | +\indexlibrarymember{size}{reverse_view}% |
5592 | 5590 | \begin{codeblock}
|
5593 | 5591 | namespace std::ranges {
|
5594 | 5592 | template<view V>
|
|
5605 | 5603 | requires bidirectional_range<R> && constructible_from<V, all_view<R>>
|
5606 | 5604 | constexpr explicit reverse_view(R&& r);
|
5607 | 5605 |
|
5608 |
| - constexpr V base() const; |
| 5606 | + constexpr V base() const& requires copy_constructible<V> { return base_; } |
| 5607 | + constexpr V base() && { return std::move(base_); } |
5609 | 5608 |
|
5610 | 5609 | constexpr reverse_iterator<iterator_t<V>> begin();
|
5611 | 5610 | constexpr reverse_iterator<iterator_t<V>> begin() requires common_range<V>;
|
|
5653 | 5652 | Initializes \tcode{base_} with \tcode{views::all(std::forward<R>(r))}.
|
5654 | 5653 | \end{itemdescr}
|
5655 | 5654 |
|
5656 |
| -\indexlibrarymember{base}{reverse_view}% |
5657 |
| -\begin{itemdecl} |
5658 |
| -constexpr V base() const; |
5659 |
| -\end{itemdecl} |
5660 |
| - |
5661 |
| -\begin{itemdescr} |
5662 |
| -\pnum |
5663 |
| -\effects |
5664 |
| -Equivalent to: \tcode{return base_;} |
5665 |
| -\end{itemdescr} |
5666 |
| - |
5667 | 5655 | \indexlibrarymember{begin}{reverse_view}%
|
5668 | 5656 | \begin{itemdecl}
|
5669 | 5657 | constexpr reverse_iterator<iterator_t<V>> begin();
|
|
0 commit comments