Date
2022-05-17.11:58:16
Message id
12459

Content

Proposed resolution:

This wording is relative to N4910.

  1. Modify [range.utility.helpers] as indicated:

    [Drafting note: This change effectively just moves the definitions of require-constant and tiny-range from [range.lazy.split.view] to [range.utility.helpers].]

    […]
    template<class T, class U>
      concept different-from = // exposition only
        !same_as<remove_cvref_t<T>, remove_cvref_t<U>>;
    
    template<auto> struct require-constant; // exposition only
    
    template<class R>
    concept tiny-range = // exposition only
      sized_range<R> &&
      requires { typename require-constant<remove_reference_t<R>::size()>; } &&
      (remove_reference_t<R>::size() <= 1);
    
  2. Modify [range.owning.view], class template owning_view synopsis, as indicated:

    […]
    constexpr static auto size() requires tiny-range<R>
    { return R::size(); }
    constexpr auto size() requires sized_range<R>
    { return ranges::size(r_); }
    constexpr auto size() const requires sized_range<const R>
    { return ranges::size(r_); }
    […]
    
  3. Modify [range.lazy.split.view], class template lazy_split_view synopsis, as indicated:

    [Drafting note: This change effectively just moves the definitions of require-constant and tiny-range from [range.lazy.split.view] to [range.utility.helpers].]

    namespace std::ranges {
      template<auto> struct require-constant; // exposition only
      
      template<class R>
      concept tiny-range = // exposition only
        sized_range<R> &&
        requires { typename require-constant<remove_reference_t<R>::size()>; } &&
        (remove_reference_t<R>::size() <= 1);
        
      template<input_range V, forward_range Pattern>
        requires view<V> && view<Pattern> &&
                 indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to> &&
                 (forward_range<V> || tiny-range<Pattern>)
      class lazy_split_view : public view_interface<lazy_split_view<V, Pattern>> {
        […]
      };
      […]
    }