1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 // UNSUPPORTED: c++03, c++11, c++14, c++17
10 // UNSUPPORTED: libcpp-has-no-incomplete-ranges
11
12 // class std::ranges::subrange;
13
14 #include <ranges>
15
16 #include <cassert>
17 #include "test_iterators.h"
18 #include "types.h"
19
test()20 constexpr bool test() {
21 int buff[] = {1, 2, 3, 4, 5};
22
23 {
24 std::ranges::subrange<MoveOnlyForwardIter, int*> a(MoveOnlyForwardIter(buff), buff + 5, 5);
25 assert(base(a.begin()) == buff);
26 assert(!a.empty());
27 assert(a.size() == 5);
28 }
29
30 {
31 std::ranges::subrange<ForwardIter> b(ForwardIter(nullptr), ForwardIter(nullptr));
32 assert(b.empty());
33 }
34
35 {
36 std::ranges::subrange<ForwardIter> c{ForwardIter(buff), ForwardIter(buff)};
37 assert(c.empty());
38 }
39
40 {
41 std::ranges::subrange<ForwardIter> d(ForwardIter(buff), ForwardIter(buff + 1));
42 assert(!d.empty());
43 }
44
45 {
46 bool minusWasCalled = false;
47 SizedSentinelForwardIter beg(buff, &minusWasCalled), end(buff + 5, &minusWasCalled);
48 std::ranges::subrange<SizedSentinelForwardIter> e(beg, end, 5);
49 assert(!e.empty());
50
51 // Make sure that operator- is used to calculate size when possible.
52 minusWasCalled = false;
53 assert(e.size() == 5);
54 assert(minusWasCalled);
55 }
56
57 return true;
58 }
59
60
main(int,char **)61 int main(int, char**) {
62 test();
63 static_assert(test());
64
65 return 0;
66 }
67