[range.join.with.view] (original) (raw)
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 { template<class R> concept bidirectional-common = bidirectional_range<R> && common_range<R>; template<input_range V, forward_range Pattern> requires view<V> && input_range<range_reference_t<V>> && view<Pattern> && concatable<range_reference_t<V>, Pattern> class join_with_view : public view_interface<join_with_view<V, Pattern>> { using InnerRng = range_reference_t<V>; V base_ = V(); non-propagating-cache<iterator_t<V>> outer_it_; non-propagating-cache<remove_cv_t<_InnerRng_>> inner_; Pattern pattern_ = Pattern(); template<bool Const> struct iterator; template<bool Const> struct sentinel; public: join_with_view() requires default_initializable<V> && default_initializable<Pattern> = default;constexpr explicit join_with_view(V base, Pattern pattern);template<input_range R> requires constructible_from<V, views::all_t<R>> && 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<V> { return base_; } constexpr V base() && { return std::move(base_); } constexpr auto begin() { if constexpr (forward_range<V>) { constexpr bool use_const = simple-view<V> && is_reference_v<_InnerRng_> && simple-view<Pattern>;return iterator<use_const>{*this, ranges::begin(base_)};} else { outer_it_ = ranges::begin(base_);return iterator<false>{*this};} } constexpr auto begin() const requires forward_range<const V> && forward_range<const Pattern> && is_reference_v<range_reference_t<const V>> && input_range<range_reference_t<const V>> && concatable<range_reference_t<const V>, const Pattern> { return iterator<true>{*this, ranges::begin(base_)};} constexpr auto end() { if constexpr (forward_range<V> && is_reference_v<_InnerRng_> && forward_range<_InnerRng_> && common_range<V> && common_range<_InnerRng_>) return iterator<simple-view<V> && simple-view<Pattern>>{*this, ranges::end(base_)};else return sentinel<simple-view<V> && simple-view<Pattern>>{*this};} constexpr auto end() const requires forward_range<const V> && forward_range<const Pattern> && is_reference_v<range_reference_t<const V>> && input_range<range_reference_t<const V>> && concatable<range_reference_t<const V>, const Pattern> { using InnerConstRng = range_reference_t<const V>;if constexpr (forward_range<InnerConstRng> && common_range<const V> && common_range<InnerConstRng>) return iterator<true>{*this, ranges::end(base_)};else return sentinel<true>{*this};} };template<class R, class P> join_with_view(R&&, P&&) -> join_with_view<views::all_t<R>, views::all_t<P>>;template<input_range R> join_with_view(R&&, range_value_t<range_reference_t<R>>) -> join_with_view<views::all_t<R>, single_view<range_value_t<range_reference_t<R>>>>;}
constexpr explicit join_with_view(V base, Pattern pattern);
Effects: Initializes base_ with std::move(base) and_pattern__ with std::move(pattern).
Effects: Initializes base_ with views::all(std::forward<R>(r)) and_pattern__ with views::single(std::move(e)).