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 // class std::ranges::subrange;
12770602cfSLouis Dionne
13770602cfSLouis Dionne #include <cassert>
14*52915d78SNikolas Klauser #include <ranges>
15*52915d78SNikolas Klauser #include <utility>
16*52915d78SNikolas Klauser
17770602cfSLouis Dionne #include "test_macros.h"
18770602cfSLouis Dionne
test_sized_subrange()19770602cfSLouis Dionne constexpr void test_sized_subrange()
20770602cfSLouis Dionne {
21770602cfSLouis Dionne int a[4] = {1,2,3,4};
22770602cfSLouis Dionne auto r = std::ranges::subrange(a, a+4);
23770602cfSLouis Dionne assert(std::ranges::sized_range<decltype(r)>);
24770602cfSLouis Dionne {
25770602cfSLouis Dionne auto [first, last] = r;
26770602cfSLouis Dionne assert(first == a);
27770602cfSLouis Dionne assert(last == a+4);
28770602cfSLouis Dionne }
29770602cfSLouis Dionne {
30770602cfSLouis Dionne auto [first, last] = std::move(r);
31770602cfSLouis Dionne assert(first == a);
32770602cfSLouis Dionne assert(last == a+4);
33770602cfSLouis Dionne }
34770602cfSLouis Dionne {
35770602cfSLouis Dionne auto [first, last] = std::as_const(r);
36770602cfSLouis Dionne assert(first == a);
37770602cfSLouis Dionne assert(last == a+4);
38770602cfSLouis Dionne }
39770602cfSLouis Dionne {
40770602cfSLouis Dionne auto [first, last] = std::move(std::as_const(r));
41770602cfSLouis Dionne assert(first == a);
42770602cfSLouis Dionne assert(last == a+4);
43770602cfSLouis Dionne }
44770602cfSLouis Dionne }
45770602cfSLouis Dionne
test_unsized_subrange()46770602cfSLouis Dionne constexpr void test_unsized_subrange()
47770602cfSLouis Dionne {
48770602cfSLouis Dionne int a[4] = {1,2,3,4};
49770602cfSLouis Dionne auto r = std::ranges::subrange(a, std::unreachable_sentinel);
50770602cfSLouis Dionne assert(!std::ranges::sized_range<decltype(r)>);
51770602cfSLouis Dionne {
52770602cfSLouis Dionne auto [first, last] = r;
53770602cfSLouis Dionne assert(first == a);
54770602cfSLouis Dionne ASSERT_SAME_TYPE(decltype(last), std::unreachable_sentinel_t);
55770602cfSLouis Dionne }
56770602cfSLouis Dionne {
57770602cfSLouis Dionne auto [first, last] = std::move(r);
58770602cfSLouis Dionne assert(first == a);
59770602cfSLouis Dionne ASSERT_SAME_TYPE(decltype(last), std::unreachable_sentinel_t);
60770602cfSLouis Dionne }
61770602cfSLouis Dionne {
62770602cfSLouis Dionne auto [first, last] = std::as_const(r);
63770602cfSLouis Dionne assert(first == a);
64770602cfSLouis Dionne ASSERT_SAME_TYPE(decltype(last), std::unreachable_sentinel_t);
65770602cfSLouis Dionne }
66770602cfSLouis Dionne {
67770602cfSLouis Dionne auto [first, last] = std::move(std::as_const(r));
68770602cfSLouis Dionne assert(first == a);
69770602cfSLouis Dionne ASSERT_SAME_TYPE(decltype(last), std::unreachable_sentinel_t);
70770602cfSLouis Dionne }
71770602cfSLouis Dionne }
72770602cfSLouis Dionne
test_copies_not_originals()73770602cfSLouis Dionne constexpr void test_copies_not_originals()
74770602cfSLouis Dionne {
75770602cfSLouis Dionne int a[4] = {1,2,3,4};
76770602cfSLouis Dionne {
77770602cfSLouis Dionne auto r = std::ranges::subrange(a, a+4);
78770602cfSLouis Dionne auto&& [first, last] = r;
79770602cfSLouis Dionne ASSERT_SAME_TYPE(decltype(first), int*);
80770602cfSLouis Dionne ASSERT_SAME_TYPE(decltype(last), int*);
81770602cfSLouis Dionne first = a+2;
82770602cfSLouis Dionne last = a+2;
83770602cfSLouis Dionne assert(r.begin() == a);
84770602cfSLouis Dionne assert(r.end() == a+4);
85770602cfSLouis Dionne }
86770602cfSLouis Dionne {
87770602cfSLouis Dionne const auto r = std::ranges::subrange(a, a+4);
88770602cfSLouis Dionne auto&& [first, last] = r;
89770602cfSLouis Dionne ASSERT_SAME_TYPE(decltype(first), int*);
90770602cfSLouis Dionne ASSERT_SAME_TYPE(decltype(last), int*);
91770602cfSLouis Dionne first = a+2;
92770602cfSLouis Dionne last = a+2;
93770602cfSLouis Dionne assert(r.begin() == a);
94770602cfSLouis Dionne assert(r.end() == a+4);
95770602cfSLouis Dionne }
96770602cfSLouis Dionne }
97770602cfSLouis Dionne
test()98770602cfSLouis Dionne constexpr bool test()
99770602cfSLouis Dionne {
100770602cfSLouis Dionne test_sized_subrange();
101770602cfSLouis Dionne test_unsized_subrange();
102770602cfSLouis Dionne test_copies_not_originals();
103770602cfSLouis Dionne return true;
104770602cfSLouis Dionne }
105770602cfSLouis Dionne
main(int,char **)106770602cfSLouis Dionne int main(int, char**)
107770602cfSLouis Dionne {
108770602cfSLouis Dionne test();
109770602cfSLouis Dionne static_assert(test());
110770602cfSLouis Dionne
111770602cfSLouis Dionne return 0;
112770602cfSLouis Dionne }
113