1*a2b3ab8fSHui //===----------------------------------------------------------------------===// 2*a2b3ab8fSHui // 3*a2b3ab8fSHui // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*a2b3ab8fSHui // See https://llvm.org/LICENSE.txt for license information. 5*a2b3ab8fSHui // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*a2b3ab8fSHui // 7*a2b3ab8fSHui //===----------------------------------------------------------------------===// 8*a2b3ab8fSHui 9*a2b3ab8fSHui // UNSUPPORTED: c++03, c++11, c++14, c++17 10*a2b3ab8fSHui 11*a2b3ab8fSHui // template<forward_range V, forward_range Pattern> 12*a2b3ab8fSHui // requires view<V> && view<Pattern> && 13*a2b3ab8fSHui // indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to> 14*a2b3ab8fSHui // class split_view; 15*a2b3ab8fSHui 16*a2b3ab8fSHui #include <ranges> 17*a2b3ab8fSHui 18*a2b3ab8fSHui #include "test_macros.h" 19*a2b3ab8fSHui #include "test_iterators.h" 20*a2b3ab8fSHui 21*a2b3ab8fSHui template <class It> 22*a2b3ab8fSHui using Range = std::ranges::subrange<It, sentinel_wrapper<It>>; 23*a2b3ab8fSHui 24*a2b3ab8fSHui template <class View, class Pattern> 25*a2b3ab8fSHui concept HasSplitView = requires { typename std::ranges::split_view<View, Pattern>; }; 26*a2b3ab8fSHui 27*a2b3ab8fSHui static_assert(HasSplitView<Range<int*>, Range<int*>>); 28*a2b3ab8fSHui 29*a2b3ab8fSHui // !forward_range<V> 30*a2b3ab8fSHui static_assert(!HasSplitView<Range<cpp20_input_iterator<int*>>, Range<int*>>); 31*a2b3ab8fSHui 32*a2b3ab8fSHui // !forward_range<Pattern> 33*a2b3ab8fSHui static_assert(!HasSplitView<Range<int*>, Range<cpp20_input_iterator<int*>>>); 34*a2b3ab8fSHui 35*a2b3ab8fSHui struct NotAView { 36*a2b3ab8fSHui int* begin() const; 37*a2b3ab8fSHui int* end() const; 38*a2b3ab8fSHui }; 39*a2b3ab8fSHui 40*a2b3ab8fSHui // !view<V> 41*a2b3ab8fSHui static_assert(!HasSplitView<NotAView, Range<int*>>); 42*a2b3ab8fSHui 43*a2b3ab8fSHui // !view<Pattern> 44*a2b3ab8fSHui static_assert(!HasSplitView<Range<int*>, NotAView>); 45*a2b3ab8fSHui 46*a2b3ab8fSHui // indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to 47*a2b3ab8fSHui struct Foo {}; 48*a2b3ab8fSHui static_assert(!HasSplitView<Range<int*>, Range<Foo*>>); 49