xref: /llvm-project/libcxx/test/std/ranges/range.adaptors/range.take/ctor.default.pass.cpp (revision 0a4aa8a122aa097499c498b639a75b5e9a73e9f0)
1770602cfSLouis Dionne //===----------------------------------------------------------------------===//
2770602cfSLouis Dionne //
3770602cfSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4770602cfSLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5770602cfSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6770602cfSLouis Dionne //
7770602cfSLouis Dionne //===----------------------------------------------------------------------===//
8770602cfSLouis Dionne 
9770602cfSLouis Dionne // UNSUPPORTED: c++03, c++11, c++14, c++17
10770602cfSLouis Dionne 
11770602cfSLouis Dionne // take_view() requires default_initializable<V> = default;
12770602cfSLouis Dionne 
13770602cfSLouis Dionne #include <cassert>
14*0a4aa8a1SNikolas Klauser #include <ranges>
15*0a4aa8a1SNikolas Klauser #include <type_traits>
16770602cfSLouis Dionne 
17770602cfSLouis Dionne int buff[8] = {1, 2, 3, 4, 5, 6, 7, 8};
18770602cfSLouis Dionne 
19770602cfSLouis Dionne struct DefaultConstructible : std::ranges::view_base {
DefaultConstructibleDefaultConstructible20770602cfSLouis Dionne   constexpr DefaultConstructible() : begin_(buff), end_(buff + 8) { }
beginDefaultConstructible21770602cfSLouis Dionne   constexpr int const* begin() const { return begin_; }
endDefaultConstructible22770602cfSLouis Dionne   constexpr int const* end() const { return end_; }
23770602cfSLouis Dionne private:
24770602cfSLouis Dionne   int const* begin_;
25770602cfSLouis Dionne   int const* end_;
26770602cfSLouis Dionne };
27770602cfSLouis Dionne 
28770602cfSLouis Dionne struct NonDefaultConstructible : std::ranges::view_base {
29770602cfSLouis Dionne   NonDefaultConstructible() = delete;
30770602cfSLouis Dionne   int* begin() const;
31770602cfSLouis Dionne   int* end() const;
32770602cfSLouis Dionne };
33770602cfSLouis Dionne 
test()34770602cfSLouis Dionne constexpr bool test() {
35770602cfSLouis Dionne   {
36770602cfSLouis Dionne     std::ranges::take_view<DefaultConstructible> tv;
37770602cfSLouis Dionne     assert(tv.begin() == buff);
38770602cfSLouis Dionne     assert(tv.size() == 0);
39770602cfSLouis Dionne   }
40770602cfSLouis Dionne 
41770602cfSLouis Dionne   // Test SFINAE-friendliness
42770602cfSLouis Dionne   {
43770602cfSLouis Dionne     static_assert( std::is_default_constructible_v<std::ranges::take_view<DefaultConstructible>>);
44770602cfSLouis Dionne     static_assert(!std::is_default_constructible_v<std::ranges::take_view<NonDefaultConstructible>>);
45770602cfSLouis Dionne   }
46770602cfSLouis Dionne 
47770602cfSLouis Dionne   return true;
48770602cfSLouis Dionne }
49770602cfSLouis Dionne 
main(int,char **)50770602cfSLouis Dionne int main(int, char**) {
51770602cfSLouis Dionne   test();
52770602cfSLouis Dionne   static_assert(test());
53770602cfSLouis Dionne 
54770602cfSLouis Dionne   return 0;
55770602cfSLouis Dionne }
56