|
6310 | 6310 | { get<N>(t) } -> convertible_to<const tuple_element_t<N, T>&>;
|
6311 | 6311 | };
|
6312 | 6312 |
|
| 6313 | + template<class T, size_t N> |
| 6314 | + concept @\defexposconcept{returnable-element}@ = is_reference_v<T> || move_constructible<tuple_element_t<N, T>>; |
6313 | 6315 |
|
6314 | 6316 | template<@\libconcept{input_range}@ V, size_t N>
|
6315 | 6317 | requires @\libconcept{view}@<V> && @\exposconcept{has-tuple-element}@<range_value_t<V>, N> &&
|
6316 |
| - @\exposconcept{has-tuple-element}@<remove_reference_t<range_reference_t<V>>, N> |
| 6318 | + @\exposconcept{has-tuple-element}@<remove_reference_t<range_reference_t<V>>, N> && |
| 6319 | + @\exposconcept{returnable-element}@<range_reference_t<V>, N> |
6317 | 6320 | class elements_view : public view_interface<elements_view<V, N>> {
|
6318 | 6321 | public:
|
6319 | 6322 | elements_view() = default;
|
|
6374 | 6377 | namespace std::ranges {
|
6375 | 6378 | template<@\libconcept{input_range}@ V, size_t N>
|
6376 | 6379 | requires @\libconcept{view}@<V> && @\exposconcept{has-tuple-element}@<range_value_t<V>, N> &&
|
6377 |
| - @\exposconcept{has-tuple-element}@<remove_reference_t<range_reference_t<V>>, N> |
| 6380 | + @\exposconcept{has-tuple-element}@<remove_reference_t<range_reference_t<V>>, N> && |
| 6381 | + @\exposconcept{returnable-element}@<range_reference_t<V>, N> |
6378 | 6382 | template<bool Const>
|
6379 | 6383 | class elements_view<V, N>::@\exposid{iterator}@ { // \expos
|
6380 | 6384 | using @\exposid{Base}@ = @\exposid{maybe-const}@<Const, V>; // \expos
|
6381 | 6385 |
|
6382 |
| - iterator_t<@\exposid{Base}@> @\exposid{current_}@ = iterator_t<@\exposid{Base}@>(); |
| 6386 | + iterator_t<@\exposid{Base}@> @\exposid{current_}@ = iterator_t<@\exposid{Base}@>(); // \expos |
| 6387 | + |
| 6388 | + static constexpr decltype(auto) @\exposid{get-element}@(const iterator_t<@\exposid{Base}@>& i); // \expos |
| 6389 | + |
6383 | 6390 | public:
|
6384 | 6391 | using iterator_category = typename iterator_traits<iterator_t<@\exposid{Base}@>>::iterator_category;
|
6385 | 6392 | using value_type = remove_cvref_t<tuple_element_t<N, range_value_t<@\exposid{Base}@>>>;
|
|
6395 | 6402 | constexpr iterator_t<@\exposid{Base}@> base() &&;
|
6396 | 6403 |
|
6397 | 6404 | constexpr decltype(auto) operator*() const
|
6398 |
| - { return get<N>(*@\exposid{current_}@); } |
| 6405 | + { return @\exposid{get-element}@(@\exposid{current_}@); } |
6399 | 6406 |
|
6400 | 6407 | constexpr @\exposid{iterator}@& operator++();
|
6401 | 6408 | constexpr void operator++(int);
|
|
6411 | 6418 |
|
6412 | 6419 | constexpr decltype(auto) operator[](difference_type n) const
|
6413 | 6420 | requires @\libconcept{random_access_range}@<@\exposid{Base}@>
|
6414 |
| - { return get<N>(*(@\exposid{current_}@ + n)); } |
| 6421 | + { return @\exposid{get-element}@(@\exposid{current_}@ + n); } |
6415 | 6422 |
|
6416 | 6423 | friend constexpr bool operator==(const @\exposid{iterator}@& x, const @\exposid{iterator}@& y)
|
6417 | 6424 | requires @\libconcept{equality_comparable}@<iterator_t<@\exposid{Base}@>>;
|
|
6439 | 6446 | }
|
6440 | 6447 | \end{codeblock}
|
6441 | 6448 |
|
| 6449 | +\indexlibrarymember{\exposid{get-element}}{elements_view::iterator}% |
| 6450 | +\begin{itemdecl} |
| 6451 | +static constexpr decltype(auto) @\exposid{get-element}@(const iterator_t<@\exposid{Base}@>& i); // \expos |
| 6452 | +\end{itemdecl} |
| 6453 | + |
| 6454 | +\begin{itemdescr} |
| 6455 | +\pnum |
| 6456 | +\effects |
| 6457 | +Equivalent to: |
| 6458 | +\begin{codeblock} |
| 6459 | +if constexpr (is_reference_v<range_reference_t<@\exposid{Base}@>>) { |
| 6460 | + return get<N>(*i); |
| 6461 | +} |
| 6462 | +else { |
| 6463 | + using E = remove_cv_t<tuple_element_t<N, range_reference_t<@\exposid{Base}@>>>; |
| 6464 | + return static_cast<E>(get<N>(*i)); |
| 6465 | +} |
| 6466 | +\end{codeblock} |
| 6467 | +\end{itemdescr} |
| 6468 | + |
6442 | 6469 | \indexlibraryctor{elements_view::iterator}%
|
6443 | 6470 | \begin{itemdecl}
|
6444 | 6471 | constexpr explicit @\exposid{iterator}@(iterator_t<@\exposid{Base}@> current);
|
|
6717 | 6744 | namespace std::ranges {
|
6718 | 6745 | template<@\libconcept{input_range}@ V, size_t N>
|
6719 | 6746 | requires @\libconcept{view}@<V> && @\placeholder{has-tuple-element}@<range_value_t<V>, N> &&
|
6720 |
| - @\placeholder{has-tuple-element}@<remove_reference_t<range_reference_t<V>>, N> |
| 6747 | + @\placeholder{has-tuple-element}@<remove_reference_t<range_reference_t<V>>, N> && |
| 6748 | + @\exposconcept{returnable-element}@<range_reference_t<V>, N> |
6721 | 6749 | template<bool Const>
|
6722 | 6750 | class elements_view<V, N>::@\exposid{sentinel}@ { // \expos
|
6723 | 6751 | private:
|
|
0 commit comments