1*770602cfSLouis Dionne //===----------------------------------------------------------------------===//
2*770602cfSLouis Dionne //
3*770602cfSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*770602cfSLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5*770602cfSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*770602cfSLouis Dionne //
7*770602cfSLouis Dionne //===----------------------------------------------------------------------===//
8*770602cfSLouis Dionne
9*770602cfSLouis Dionne // UNSUPPORTED: c++03, c++11, c++14, c++17
10*770602cfSLouis Dionne // UNSUPPORTED: libcpp-has-no-incomplete-ranges
11*770602cfSLouis Dionne
12*770602cfSLouis Dionne // take_view() requires default_initializable<V> = default;
13*770602cfSLouis Dionne
14*770602cfSLouis Dionne #include <ranges>
15*770602cfSLouis Dionne #include <cassert>
16*770602cfSLouis Dionne
17*770602cfSLouis Dionne int buff[8] = {1, 2, 3, 4, 5, 6, 7, 8};
18*770602cfSLouis Dionne
19*770602cfSLouis Dionne struct DefaultConstructible : std::ranges::view_base {
DefaultConstructibleDefaultConstructible20*770602cfSLouis Dionne constexpr DefaultConstructible() : begin_(buff), end_(buff + 8) { }
beginDefaultConstructible21*770602cfSLouis Dionne constexpr int const* begin() const { return begin_; }
endDefaultConstructible22*770602cfSLouis Dionne constexpr int const* end() const { return end_; }
23*770602cfSLouis Dionne private:
24*770602cfSLouis Dionne int const* begin_;
25*770602cfSLouis Dionne int const* end_;
26*770602cfSLouis Dionne };
27*770602cfSLouis Dionne
28*770602cfSLouis Dionne struct NonDefaultConstructible : std::ranges::view_base {
29*770602cfSLouis Dionne NonDefaultConstructible() = delete;
30*770602cfSLouis Dionne int* begin() const;
31*770602cfSLouis Dionne int* end() const;
32*770602cfSLouis Dionne };
33*770602cfSLouis Dionne
test()34*770602cfSLouis Dionne constexpr bool test() {
35*770602cfSLouis Dionne {
36*770602cfSLouis Dionne std::ranges::take_view<DefaultConstructible> tv;
37*770602cfSLouis Dionne assert(tv.begin() == buff);
38*770602cfSLouis Dionne assert(tv.size() == 0);
39*770602cfSLouis Dionne }
40*770602cfSLouis Dionne
41*770602cfSLouis Dionne // Test SFINAE-friendliness
42*770602cfSLouis Dionne {
43*770602cfSLouis Dionne static_assert( std::is_default_constructible_v<std::ranges::take_view<DefaultConstructible>>);
44*770602cfSLouis Dionne static_assert(!std::is_default_constructible_v<std::ranges::take_view<NonDefaultConstructible>>);
45*770602cfSLouis Dionne }
46*770602cfSLouis Dionne
47*770602cfSLouis Dionne return true;
48*770602cfSLouis Dionne }
49*770602cfSLouis Dionne
main(int,char **)50*770602cfSLouis Dionne int main(int, char**) {
51*770602cfSLouis Dionne test();
52*770602cfSLouis Dionne static_assert(test());
53*770602cfSLouis Dionne
54*770602cfSLouis Dionne return 0;
55*770602cfSLouis Dionne }
56