|
426 | 426 | -> decltype(std::begin(c));
|
427 | 427 | template<class C> constexpr auto cend(const C& c) noexcept(noexcept(std::end(c)))
|
428 | 428 | -> decltype(std::end(c));
|
| 429 | + |
429 | 430 | template<class C> constexpr auto rbegin(C& c) -> decltype(c.rbegin());
|
430 | 431 | template<class C> constexpr auto rbegin(const C& c) -> decltype(c.rbegin());
|
431 | 432 | template<class C> constexpr auto rend(C& c) -> decltype(c.rend());
|
|
442 | 443 | template<class C> constexpr auto ssize(const C& c)
|
443 | 444 | -> common_type_t<ptrdiff_t, make_signed_t<decltype(c.size())>>;
|
444 | 445 | template<class T, ptrdiff_t N> constexpr ptrdiff_t ssize(const T (&array)[N]) noexcept;
|
| 446 | + |
445 | 447 | template<class C> [[nodiscard]] constexpr auto empty(const C& c) -> decltype(c.empty());
|
446 | 448 | template<class T, size_t N> [[nodiscard]] constexpr bool empty(const T (&array)[N]) noexcept;
|
447 | 449 | template<class E> [[nodiscard]] constexpr bool empty(initializer_list<E> il) noexcept;
|
| 450 | + |
448 | 451 | template<class C> constexpr auto data(C& c) -> decltype(c.data());
|
449 | 452 | template<class C> constexpr auto data(const C& c) -> decltype(c.data());
|
450 | 453 | template<class T, size_t N> constexpr T* data(T (&array)[N]) noexcept;
|
|
2423 | 2426 | \begin{codeblock}
|
2424 | 2427 | template<class In, class Out>
|
2425 | 2428 | concept @\deflibconcept{indirectly_movable}@ =
|
2426 |
| - @\libconcept{indirectly_readable}@<In> && |
2427 |
| - @\libconcept{indirectly_writable}@<Out, iter_rvalue_reference_t<In>>; |
| 2429 | + @\libconcept{indirectly_readable}@<In> && @\libconcept{indirectly_writable}@<Out, iter_rvalue_reference_t<In>>; |
2428 | 2430 | \end{codeblock}
|
2429 | 2431 |
|
2430 | 2432 | \pnum
|
|
2542 | 2544 | \begin{codeblock}
|
2543 | 2545 | template<class I>
|
2544 | 2546 | concept @\deflibconcept{permutable}@ =
|
2545 |
| - @\libconcept{forward_iterator}@<I> && |
2546 |
| - @\libconcept{indirectly_movable_storable}@<I, I> && |
2547 |
| - @\libconcept{indirectly_swappable}@<I, I>; |
| 2547 | + @\libconcept{forward_iterator}@<I> && @\libconcept{indirectly_movable_storable}@<I, I> && @\libconcept{indirectly_swappable}@<I, I>; |
2548 | 2548 | \end{codeblock}
|
2549 | 2549 |
|
2550 | 2550 | \rSec3[alg.req.mergeable]{Concept \cname{mergeable}}
|
|
2910 | 2910 | the ending and starting positions of \tcode{i}.
|
2911 | 2911 | \end{itemdescr}
|
2912 | 2912 |
|
| 2913 | +\newpage |
| 2914 | + |
2913 | 2915 | \rSec3[range.iter.op.distance]{\tcode{ranges::distance}}
|
2914 | 2916 | \indexlibraryglobal{distance}%
|
2915 | 2917 | \begin{itemdecl}
|
|
3477 | 3479 | \tcode{x.base() < y.base()}.
|
3478 | 3480 | \end{itemdescr}
|
3479 | 3481 |
|
| 3482 | +\newpage |
| 3483 | + |
3480 | 3484 | \indexlibrarymember{operator<=}{reverse_iterator}%
|
3481 | 3485 | \begin{itemdecl}
|
3482 | 3486 | template<class Iterator1, class Iterator2>
|
|
4690 | 4694 | void fun(ForwardIterator begin, ForwardIterator end);
|
4691 | 4695 |
|
4692 | 4696 | list<int> s;
|
| 4697 | + |
4693 | 4698 | // populate the list \tcode{s}
|
4694 | 4699 | using CI = common_iterator<counted_iterator<list<int>::iterator>, default_sentinel_t>;
|
| 4700 | + |
4695 | 4701 | // call \tcode{fun} on a range of 10 ints
|
4696 | 4702 | fun(CI(counted_iterator(s.begin(), 10)), CI(default_sentinel));
|
4697 | 4703 | \end{codeblock}
|
|
5108 | 5114 | a range of $N$ elements starting at a given position
|
5109 | 5115 | without needing to know the end position a priori.
|
5110 | 5116 |
|
| 5117 | +\newpage |
| 5118 | + |
5111 | 5119 | \pnum
|
5112 | 5120 | \begin{example}
|
5113 | 5121 | \begin{codeblock}
|
|
0 commit comments