xref: /llvm-project/libcxx/test/std/ranges/range.adaptors/range.chunk.by/ctor.default.pass.cpp (revision e99c4906e44ae3f921fa05356909d006cda8d954)
1065dc485SJakub Mazurkiewicz //===----------------------------------------------------------------------===//
2065dc485SJakub Mazurkiewicz //
3065dc485SJakub Mazurkiewicz // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4065dc485SJakub Mazurkiewicz // See https://llvm.org/LICENSE.txt for license information.
5065dc485SJakub Mazurkiewicz // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6065dc485SJakub Mazurkiewicz //
7065dc485SJakub Mazurkiewicz //===----------------------------------------------------------------------===//
8065dc485SJakub Mazurkiewicz 
9065dc485SJakub Mazurkiewicz // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
10065dc485SJakub Mazurkiewicz 
11065dc485SJakub Mazurkiewicz // <ranges>
12065dc485SJakub Mazurkiewicz 
13065dc485SJakub Mazurkiewicz // chunk_by_view() requires std::default_initializable<View> &&
14065dc485SJakub Mazurkiewicz //                          std::default_initializable<Pred> = default;
15065dc485SJakub Mazurkiewicz 
16065dc485SJakub Mazurkiewicz #include <ranges>
17065dc485SJakub Mazurkiewicz 
18065dc485SJakub Mazurkiewicz #include <cassert>
19*e99c4906SNikolas Klauser #include <cstddef>
20065dc485SJakub Mazurkiewicz #include <type_traits>
21065dc485SJakub Mazurkiewicz 
22065dc485SJakub Mazurkiewicz constexpr int buff[] = {-2, 1, -1, 2};
23065dc485SJakub Mazurkiewicz 
24065dc485SJakub Mazurkiewicz struct DefaultConstructibleView : std::ranges::view_base {
25065dc485SJakub Mazurkiewicz   DefaultConstructibleView() = default;
26065dc485SJakub Mazurkiewicz   constexpr int const* begin() const { return buff; }
27065dc485SJakub Mazurkiewicz   constexpr int const* end() const { return buff + 4; }
28065dc485SJakub Mazurkiewicz };
29065dc485SJakub Mazurkiewicz 
30065dc485SJakub Mazurkiewicz struct DefaultConstructiblePredicate {
31065dc485SJakub Mazurkiewicz   DefaultConstructiblePredicate() = default;
32065dc485SJakub Mazurkiewicz   constexpr bool operator()(int x, int y) const { return x != -y; }
33065dc485SJakub Mazurkiewicz };
34065dc485SJakub Mazurkiewicz 
35065dc485SJakub Mazurkiewicz struct NoDefaultView : std::ranges::view_base {
36065dc485SJakub Mazurkiewicz   NoDefaultView() = delete;
37065dc485SJakub Mazurkiewicz   int* begin() const;
38065dc485SJakub Mazurkiewicz   int* end() const;
39065dc485SJakub Mazurkiewicz };
40065dc485SJakub Mazurkiewicz 
41065dc485SJakub Mazurkiewicz struct NoDefaultPredicate {
42065dc485SJakub Mazurkiewicz   NoDefaultPredicate() = delete;
43065dc485SJakub Mazurkiewicz   constexpr bool operator()(int, int) const;
44065dc485SJakub Mazurkiewicz };
45065dc485SJakub Mazurkiewicz 
46065dc485SJakub Mazurkiewicz struct NoexceptView : std::ranges::view_base {
47065dc485SJakub Mazurkiewicz   NoexceptView() noexcept;
48065dc485SJakub Mazurkiewicz   int const* begin() const;
49065dc485SJakub Mazurkiewicz   int const* end() const;
50065dc485SJakub Mazurkiewicz };
51065dc485SJakub Mazurkiewicz 
52065dc485SJakub Mazurkiewicz struct NoexceptPredicate {
53065dc485SJakub Mazurkiewicz   NoexceptPredicate() noexcept;
54065dc485SJakub Mazurkiewicz   bool operator()(int, int) const;
55065dc485SJakub Mazurkiewicz };
56065dc485SJakub Mazurkiewicz 
57065dc485SJakub Mazurkiewicz struct MayThrowView : std::ranges::view_base {
58065dc485SJakub Mazurkiewicz   MayThrowView() noexcept(false);
59065dc485SJakub Mazurkiewicz   int const* begin() const;
60065dc485SJakub Mazurkiewicz   int const* end() const;
61065dc485SJakub Mazurkiewicz };
62065dc485SJakub Mazurkiewicz 
63065dc485SJakub Mazurkiewicz struct MayThrowPredicate {
64065dc485SJakub Mazurkiewicz   MayThrowPredicate() noexcept(false);
65065dc485SJakub Mazurkiewicz   bool operator()(int, int) const;
66065dc485SJakub Mazurkiewicz };
67065dc485SJakub Mazurkiewicz 
68065dc485SJakub Mazurkiewicz constexpr void compareRanges(std::ranges::subrange<const int*> v, std::initializer_list<int> list) {
69065dc485SJakub Mazurkiewicz   assert(v.size() == list.size());
70065dc485SJakub Mazurkiewicz   for (size_t i = 0; i < v.size(); ++i) {
71065dc485SJakub Mazurkiewicz     assert(v[i] == list.begin()[i]);
72065dc485SJakub Mazurkiewicz   }
73065dc485SJakub Mazurkiewicz }
74065dc485SJakub Mazurkiewicz 
75065dc485SJakub Mazurkiewicz constexpr bool test() {
76065dc485SJakub Mazurkiewicz   // Check default constructor with default initialization
77065dc485SJakub Mazurkiewicz   {
78065dc485SJakub Mazurkiewicz     using View = std::ranges::chunk_by_view<DefaultConstructibleView, DefaultConstructiblePredicate>;
79065dc485SJakub Mazurkiewicz     View view;
80065dc485SJakub Mazurkiewicz     auto it = view.begin(), end = view.end();
81065dc485SJakub Mazurkiewicz     compareRanges(*it++, {-2, 1});
82065dc485SJakub Mazurkiewicz     compareRanges(*it++, {-1, 2});
83065dc485SJakub Mazurkiewicz     assert(it == end);
84065dc485SJakub Mazurkiewicz   }
85065dc485SJakub Mazurkiewicz 
86065dc485SJakub Mazurkiewicz   // Check default construction with copy-list-initialization
87065dc485SJakub Mazurkiewicz   {
88065dc485SJakub Mazurkiewicz     using View = std::ranges::chunk_by_view<DefaultConstructibleView, DefaultConstructiblePredicate>;
89065dc485SJakub Mazurkiewicz     View view  = {};
90065dc485SJakub Mazurkiewicz     auto it = view.begin(), end = view.end();
91065dc485SJakub Mazurkiewicz     compareRanges(*it++, {-2, 1});
92065dc485SJakub Mazurkiewicz     compareRanges(*it++, {-1, 2});
93065dc485SJakub Mazurkiewicz     assert(it == end);
94065dc485SJakub Mazurkiewicz   }
95065dc485SJakub Mazurkiewicz 
96065dc485SJakub Mazurkiewicz   // Check cases where the default constructor isn't provided
97065dc485SJakub Mazurkiewicz   {
98065dc485SJakub Mazurkiewicz     static_assert(
99065dc485SJakub Mazurkiewicz         !std::is_default_constructible_v<std::ranges::chunk_by_view<NoDefaultView, DefaultConstructiblePredicate>>);
100065dc485SJakub Mazurkiewicz     static_assert(
101065dc485SJakub Mazurkiewicz         !std::is_default_constructible_v<std::ranges::chunk_by_view<DefaultConstructibleView, NoDefaultPredicate>>);
102065dc485SJakub Mazurkiewicz     static_assert(!std::is_default_constructible_v<std::ranges::chunk_by_view<NoDefaultView, NoDefaultPredicate>>);
103065dc485SJakub Mazurkiewicz   }
104065dc485SJakub Mazurkiewicz 
105065dc485SJakub Mazurkiewicz   // Check noexcept-ness
106065dc485SJakub Mazurkiewicz   {
107065dc485SJakub Mazurkiewicz     {
108065dc485SJakub Mazurkiewicz       using View = std::ranges::chunk_by_view<MayThrowView, MayThrowPredicate>;
109065dc485SJakub Mazurkiewicz       static_assert(!noexcept(View()));
110065dc485SJakub Mazurkiewicz     }
111065dc485SJakub Mazurkiewicz     {
112065dc485SJakub Mazurkiewicz       using View = std::ranges::chunk_by_view<MayThrowView, NoexceptPredicate>;
113065dc485SJakub Mazurkiewicz       static_assert(!noexcept(View()));
114065dc485SJakub Mazurkiewicz     }
115065dc485SJakub Mazurkiewicz     {
116065dc485SJakub Mazurkiewicz       using View = std::ranges::chunk_by_view<NoexceptView, MayThrowPredicate>;
117065dc485SJakub Mazurkiewicz       static_assert(!noexcept(View()));
118065dc485SJakub Mazurkiewicz     }
119065dc485SJakub Mazurkiewicz     {
120065dc485SJakub Mazurkiewicz       using View = std::ranges::chunk_by_view<NoexceptView, NoexceptPredicate>;
121065dc485SJakub Mazurkiewicz       static_assert(noexcept(View()));
122065dc485SJakub Mazurkiewicz     }
123065dc485SJakub Mazurkiewicz   }
124065dc485SJakub Mazurkiewicz 
125065dc485SJakub Mazurkiewicz   return true;
126065dc485SJakub Mazurkiewicz }
127065dc485SJakub Mazurkiewicz 
128065dc485SJakub Mazurkiewicz int main(int, char**) {
129065dc485SJakub Mazurkiewicz   test();
130065dc485SJakub Mazurkiewicz   static_assert(test());
131065dc485SJakub Mazurkiewicz 
132065dc485SJakub Mazurkiewicz   return 0;
133065dc485SJakub Mazurkiewicz }
134