1*a2c6a119SHui Xie //===----------------------------------------------------------------------===//
2*a2c6a119SHui Xie //
3*a2c6a119SHui Xie // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*a2c6a119SHui Xie // See https://llvm.org/LICENSE.txt for license information.
5*a2c6a119SHui Xie // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*a2c6a119SHui Xie //
7*a2c6a119SHui Xie //===----------------------------------------------------------------------===//
8*a2c6a119SHui Xie
9*a2c6a119SHui Xie // UNSUPPORTED: c++03, c++11, c++14, c++17
10*a2c6a119SHui Xie
11*a2c6a119SHui Xie // take_while_view() requires default_initializable<V> && default_initializable<Pred> = default;
12*a2c6a119SHui Xie
13*a2c6a119SHui Xie #include <cassert>
14*a2c6a119SHui Xie #include <ranges>
15*a2c6a119SHui Xie #include <type_traits>
16*a2c6a119SHui Xie
17*a2c6a119SHui Xie template <bool defaultInitable>
18*a2c6a119SHui Xie struct View : std::ranges::view_base {
19*a2c6a119SHui Xie int i;
20*a2c6a119SHui Xie constexpr explicit View()
21*a2c6a119SHui Xie requires defaultInitable
22*a2c6a119SHui Xie = default;
23*a2c6a119SHui Xie int* begin() const;
24*a2c6a119SHui Xie int* end() const;
25*a2c6a119SHui Xie };
26*a2c6a119SHui Xie
27*a2c6a119SHui Xie template <bool defaultInitable>
28*a2c6a119SHui Xie struct Pred {
29*a2c6a119SHui Xie int i;
30*a2c6a119SHui Xie constexpr explicit Pred()
31*a2c6a119SHui Xie requires defaultInitable
32*a2c6a119SHui Xie = default;
33*a2c6a119SHui Xie bool operator()(int) const;
34*a2c6a119SHui Xie };
35*a2c6a119SHui Xie
36*a2c6a119SHui Xie // clang-format off
37*a2c6a119SHui Xie static_assert( std::is_default_constructible_v<std::ranges::take_while_view<View<true >, Pred<true >>>);
38*a2c6a119SHui Xie static_assert(!std::is_default_constructible_v<std::ranges::take_while_view<View<false>, Pred<true >>>);
39*a2c6a119SHui Xie static_assert(!std::is_default_constructible_v<std::ranges::take_while_view<View<true >, Pred<false>>>);
40*a2c6a119SHui Xie static_assert(!std::is_default_constructible_v<std::ranges::take_while_view<View<false>, Pred<false>>>);
41*a2c6a119SHui Xie // clang-format on
42*a2c6a119SHui Xie
test()43*a2c6a119SHui Xie constexpr bool test() {
44*a2c6a119SHui Xie {
45*a2c6a119SHui Xie std::ranges::take_while_view<View<true>, Pred<true>> twv = {};
46*a2c6a119SHui Xie assert(twv.base().i == 0);
47*a2c6a119SHui Xie assert(twv.pred().i == 0);
48*a2c6a119SHui Xie }
49*a2c6a119SHui Xie return true;
50*a2c6a119SHui Xie }
51*a2c6a119SHui Xie
main(int,char **)52*a2c6a119SHui Xie int main(int, char**) {
53*a2c6a119SHui Xie test();
54*a2c6a119SHui Xie static_assert(test());
55*a2c6a119SHui Xie return 0;
56*a2c6a119SHui Xie }
57