xref: /llvm-project/libcxx/test/std/ranges/range.req/range.refinements/contiguous_range.compile.pass.cpp (revision d2baefae6846765eef6a6dd69d4fdf1082ce29ad)
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 // template<class R>
13 // concept contiguous_range;
14 
15 #include <ranges>
16 
17 #include "test_range.h"
18 #include "test_iterators.h"
19 
20 namespace ranges = std::ranges;
21 
22 template <template <class...> class I>
23 constexpr bool check_range() {
24   constexpr bool result = ranges::contiguous_range<test_range<I> >;
25   static_assert(ranges::contiguous_range<test_range<I> const> == result);
26   static_assert(ranges::contiguous_range<test_non_const_common_range<I> > == result);
27   static_assert(ranges::contiguous_range<test_non_const_range<I> > == result);
28   static_assert(ranges::contiguous_range<test_common_range<I> > == result);
29   static_assert(ranges::contiguous_range<test_common_range<I> const> == result);
30   static_assert(!ranges::contiguous_range<test_non_const_common_range<I> const>);
31   static_assert(!ranges::contiguous_range<test_non_const_range<I> const>);
32   return result;
33 }
34 
35 static_assert(!check_range<cpp20_input_iterator>());
36 static_assert(!check_range<forward_iterator>());
37 static_assert(!check_range<bidirectional_iterator>());
38 static_assert(!check_range<random_access_iterator>());
39 static_assert(check_range<contiguous_iterator>());
40 
41 struct ContiguousWhenNonConst {
42     const int *begin() const;
43     const int *end() const;
44     int *begin();
45     int *end();
46     int *data() const;
47 };
48 static_assert( std::ranges::contiguous_range<ContiguousWhenNonConst>);
49 static_assert( std::ranges::random_access_range<const ContiguousWhenNonConst>);
50 static_assert(!std::ranges::contiguous_range<const ContiguousWhenNonConst>);
51 
52 struct ContiguousWhenConst {
53     const int *begin() const;
54     const int *end() const;
55     int *begin();
56     int *end();
57     const int *data() const;
58 };
59 static_assert( std::ranges::contiguous_range<const ContiguousWhenConst>);
60 static_assert( std::ranges::random_access_range<ContiguousWhenConst>);
61 static_assert(!std::ranges::contiguous_range<ContiguousWhenConst>);
62 
63 struct DataFunctionWrongReturnType {
64     const int *begin() const;
65     const int *end() const;
66     const char *data() const;
67 };
68 static_assert( std::ranges::random_access_range<DataFunctionWrongReturnType>);
69 static_assert(!std::ranges::contiguous_range<DataFunctionWrongReturnType>);
70 
71 struct WrongObjectness {
72     const int *begin() const;
73     const int *end() const;
74     void *data() const;
75 };
76 static_assert(std::ranges::contiguous_range<WrongObjectness>);
77 
78 // Test ADL-proofing.
79 struct Incomplete;
80 template<class T> struct Holder { T t; };
81 
82 static_assert(!std::ranges::contiguous_range<Holder<Incomplete>*>);
83 static_assert(!std::ranges::contiguous_range<Holder<Incomplete>*&>);
84 static_assert(!std::ranges::contiguous_range<Holder<Incomplete>*&&>);
85 static_assert(!std::ranges::contiguous_range<Holder<Incomplete>* const>);
86 static_assert(!std::ranges::contiguous_range<Holder<Incomplete>* const&>);
87 static_assert(!std::ranges::contiguous_range<Holder<Incomplete>* const&&>);
88 
89 static_assert( std::ranges::contiguous_range<Holder<Incomplete>*[10]>);
90 static_assert( std::ranges::contiguous_range<Holder<Incomplete>*(&)[10]>);
91 static_assert( std::ranges::contiguous_range<Holder<Incomplete>*(&&)[10]>);
92 static_assert( std::ranges::contiguous_range<Holder<Incomplete>* const[10]>);
93 static_assert( std::ranges::contiguous_range<Holder<Incomplete>* const(&)[10]>);
94 static_assert( std::ranges::contiguous_range<Holder<Incomplete>* const(&&)[10]>);
95