xref: /llvm-project/libcxx/test/std/ranges/range.adaptors/range.drop.while/range.concept.compile.pass.cpp (revision 594fa1474f0c96da864257c0cda31b9b8381cd15)
1*594fa147SHui Xie //===----------------------------------------------------------------------===//
2*594fa147SHui Xie //
3*594fa147SHui Xie // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*594fa147SHui Xie // See https://llvm.org/LICENSE.txt for license information.
5*594fa147SHui Xie // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*594fa147SHui Xie //
7*594fa147SHui Xie //===----------------------------------------------------------------------===//
8*594fa147SHui Xie 
9*594fa147SHui Xie // UNSUPPORTED: c++03, c++11, c++14, c++17
10*594fa147SHui Xie 
11*594fa147SHui Xie // concept checking
12*594fa147SHui Xie // template<view V, class Pred>
13*594fa147SHui Xie //     requires input_range<V> && is_object_v<Pred> &&
14*594fa147SHui Xie //              indirect_unary_predicate<const Pred, iterator_t<V>>
15*594fa147SHui Xie //   class drop_while_view;
16*594fa147SHui Xie 
17*594fa147SHui Xie #include <array>
18*594fa147SHui Xie #include <ranges>
19*594fa147SHui Xie 
20*594fa147SHui Xie #include "test_iterators.h"
21*594fa147SHui Xie 
22*594fa147SHui Xie template <class It>
23*594fa147SHui Xie using Range = std::ranges::subrange<It, sentinel_wrapper<It>>;
24*594fa147SHui Xie 
25*594fa147SHui Xie template <class Val = int>
26*594fa147SHui Xie struct Pred {
27*594fa147SHui Xie   bool operator()(const Val&) const;
28*594fa147SHui Xie };
29*594fa147SHui Xie 
30*594fa147SHui Xie template <class V, class Pred>
31*594fa147SHui Xie concept HasDropWhileView = requires { typename std::ranges::drop_while_view<V, Pred>; };
32*594fa147SHui Xie 
33*594fa147SHui Xie static_assert(HasDropWhileView<Range<int*>, bool (*)(int)>);
34*594fa147SHui Xie static_assert(HasDropWhileView<Range<int*>, Pred<int>>);
35*594fa147SHui Xie 
36*594fa147SHui Xie // !view<V>
37*594fa147SHui Xie static_assert(!HasDropWhileView<std::array<int, 5>, Pred<int>>);
38*594fa147SHui Xie 
39*594fa147SHui Xie // !input_range
40*594fa147SHui Xie static_assert(!HasDropWhileView<Range<cpp20_output_iterator<int*>>, bool (*)(int)>);
41*594fa147SHui Xie 
42*594fa147SHui Xie // !is_object_v<Pred>
43*594fa147SHui Xie static_assert(!HasDropWhileView<Range<int*>, Pred<int>&>);
44*594fa147SHui Xie 
45*594fa147SHui Xie // !indirect_unary_predicate<const Pred, iterator_t<V>>
46*594fa147SHui Xie static_assert(!HasDropWhileView<Range<int*>, int>);
47*594fa147SHui Xie static_assert(!HasDropWhileView<Range<int**>, Pred<int>>);
48