xref: /llvm-project/libcxx/test/std/ranges/range.adaptors/robust_against_nonbool.compile.pass.cpp (revision 02540b2f6dc6c2d42a3365bef78833d7fab98491)
1*02540b2fSLouis Dionne //===----------------------------------------------------------------------===//
2*02540b2fSLouis Dionne //
3*02540b2fSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*02540b2fSLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5*02540b2fSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*02540b2fSLouis Dionne //
7*02540b2fSLouis Dionne //===----------------------------------------------------------------------===//
8*02540b2fSLouis Dionne 
9*02540b2fSLouis Dionne // UNSUPPORTED: c++03, c++11, c++14, c++17
10*02540b2fSLouis Dionne 
11*02540b2fSLouis Dionne // <ranges>
12*02540b2fSLouis Dionne //
13*02540b2fSLouis Dionne // Range adaptors that take predicates should support predicates that return a non-boolean
14*02540b2fSLouis Dionne // value as long as the returned type is implicitly convertible to bool.
15*02540b2fSLouis Dionne 
16*02540b2fSLouis Dionne #include <ranges>
17*02540b2fSLouis Dionne 
18*02540b2fSLouis Dionne #include "boolean_testable.h"
19*02540b2fSLouis Dionne 
20*02540b2fSLouis Dionne template <std::ranges::view View>
use(View view)21*02540b2fSLouis Dionne constexpr void use(View view) {
22*02540b2fSLouis Dionne   // Just use the view in a few ways. Our goal here is to trigger the instantiation
23*02540b2fSLouis Dionne   // of various functions related to the view and its iterators in the hopes that we
24*02540b2fSLouis Dionne   // instantiate functions that might have incorrect implementations w.r.t. predicates.
25*02540b2fSLouis Dionne   auto first = std::ranges::begin(view);
26*02540b2fSLouis Dionne   auto last  = std::ranges::end(view);
27*02540b2fSLouis Dionne   ++first;
28*02540b2fSLouis Dionne   --first;
29*02540b2fSLouis Dionne   (void)(first == last);
30*02540b2fSLouis Dionne   (void)(first != last);
31*02540b2fSLouis Dionne   (void)std::ranges::empty(view);
32*02540b2fSLouis Dionne }
33*02540b2fSLouis Dionne 
34*02540b2fSLouis Dionne using Value    = StrictComparable<int>;
35*02540b2fSLouis Dionne using Iterator = StrictBooleanIterator<Value*>;
36*02540b2fSLouis Dionne using Range    = std::ranges::subrange<Iterator>;
37*02540b2fSLouis Dionne auto pred1     = StrictUnaryPredicate;
38*02540b2fSLouis Dionne auto pred2     = StrictBinaryPredicate;
39*02540b2fSLouis Dionne 
f(Range in)40*02540b2fSLouis Dionne void f(Range in) {
41*02540b2fSLouis Dionne   (void)pred1;
42*02540b2fSLouis Dionne   (void)pred2;
43*02540b2fSLouis Dionne 
44*02540b2fSLouis Dionne #if TEST_STD_VER >= 23
45*02540b2fSLouis Dionne   {
46*02540b2fSLouis Dionne     auto view = std::views::chunk_by(in, pred2);
47*02540b2fSLouis Dionne     use(view);
48*02540b2fSLouis Dionne   }
49*02540b2fSLouis Dionne #endif
50*02540b2fSLouis Dionne   {
51*02540b2fSLouis Dionne     auto view = std::views::drop_while(in, pred1);
52*02540b2fSLouis Dionne     use(view);
53*02540b2fSLouis Dionne   }
54*02540b2fSLouis Dionne   {
55*02540b2fSLouis Dionne     auto view = std::views::filter(in, pred1);
56*02540b2fSLouis Dionne     use(view);
57*02540b2fSLouis Dionne   }
58*02540b2fSLouis Dionne   {
59*02540b2fSLouis Dionne     auto view = std::views::take_while(in, pred1);
60*02540b2fSLouis Dionne     use(view);
61*02540b2fSLouis Dionne   }
62*02540b2fSLouis Dionne }
63