Files
2025-10-25 03:02:53 +03:00

8.7 KiB
Raw Permalink Blame History

[range.join.with.view]

25 Ranges library [ranges]

25.7 Range adaptors [range.adaptors]

25.7.15 Join with view [range.join.with]

25.7.15.2 Class template join_with_view [range.join.with.view]

🔗

namespace std::ranges {templateconcept bidirectional-common = bidirectional_range && common_range; // exposition onlytemplate<input_range V, forward_range Pattern>requires view && input_range<range_reference_t>&& view&& concatable<range_reference_t, Pattern>class join_with_view : public view_interface<join_with_view<V, Pattern>> {using InnerRng = range_reference_t; // exposition only V base_ = V(); // exposition only**non-propagating-cache<iterator_t> outer_it_; // exposition only, present only// when forward_rangenon-propagating-cache<remove_cv_t<InnerRng>> inner_; // exposition only, present only// if is_reference_v<InnerRng> is false Pattern pattern_ = Pattern(); // exposition only// [range.join.with.iterator], class template join_with_view::iteratortemplate struct iterator; // exposition only// [range.join.with.sentinel], class template join_with_view::sentineltemplate struct sentinel; // exposition onlypublic: join_with_view()requires default_initializable && default_initializable = default; constexpr explicit join_with_view(V base, Pattern pattern); template<input_range R>requires constructible_from<V, views::all_t> &&constructible_from<Pattern, single_view<range_value_t<InnerRng>>>constexpr explicit join_with_view(R&& r, range_value_t<InnerRng> e); constexpr V base() const & requires copy_constructible { return base_; }constexpr V base() && { return std::move(base_); }constexpr auto begin() {if constexpr (forward_range) {constexpr bool use_const =simple-view && is_reference_v<InnerRng> && simple-view; return iterator<use_const>{*this, ranges::begin(base_)}; }else {outer_it_ = ranges::begin(base_); return iterator{*this}; }}constexpr auto begin() constrequires forward_range &&forward_range && is_reference_v<range_reference_t> &&input_range<range_reference_t> &&concatable<range_reference_t, const Pattern> {return iterator{*this, ranges::begin(base_)}; }constexpr auto end() {if constexpr (forward_range && is_reference_v<InnerRng> && forward_range<InnerRng> &&common_range && common_range<InnerRng>)return iterator<simple-view && simple-view>{*this, ranges::end(base_)}; elsereturn sentinel<simple-view && simple-view>{*this}; }constexpr auto end() constrequires forward_range && forward_range && is_reference_v<range_reference_t> &&input_range<range_reference_t> &&concatable<range_reference_t, const Pattern> {using InnerConstRng = range_reference_t; if constexpr (forward_range &&common_range && common_range)return iterator{*this, ranges::end(base_)}; elsereturn sentinel{*this}; }}; template<class R, class P> join_with_view(R&&, P&&) -> join_with_view<views::all_t, views::all_t

>; template<input_range R> join_with_view(R&&, range_value_t<range_reference_t>)-> join_with_view<views::all_t, single_view<range_value_t<range_reference_t>>>;}

🔗

constexpr explicit join_with_view(V base, Pattern pattern);

1

#

Effects: Initializes base_ with std::move(base) andpattern_ with std::move(pattern).

🔗

template<[input_range](range.refinements#concept:input_range "25.4.6Other range refinements[range.refinements]") R> requires [constructible_from](concept.constructible#concept:constructible_from "18.4.11Concept constructible_­from[concept.constructible]")<V, views::all_t<R>> && [constructible_from](concept.constructible#concept:constructible_from "18.4.11Concept constructible_­from[concept.constructible]")<Pattern, single_view<range_value_t<InnerRng>>> constexpr explicit join_with_view(R&& r, range_value_t<InnerRng> e);

2

#

Effects: Initializes base_ with views::all(std::forward(r)) andpattern_ with views::single(std::move(e)).