134503987Szoecarver //===----------------------------------------------------------------------===// 234503987Szoecarver // 334503987Szoecarver // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 434503987Szoecarver // See https://llvm.org/LICENSE.txt for license information. 534503987Szoecarver // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 634503987Szoecarver // 734503987Szoecarver //===----------------------------------------------------------------------===// 834503987Szoecarver 934503987Szoecarver // UNSUPPORTED: c++03, c++11, c++14, c++17 1034503987Szoecarver 11f192616cSLouis Dionne // template<class R> 1234503987Szoecarver // concept contiguous_range; 1334503987Szoecarver 1434503987Szoecarver #include <ranges> 1534503987Szoecarver 1634503987Szoecarver #include "test_range.h" 1734503987Szoecarver #include "test_iterators.h" 1834503987Szoecarver 1934503987Szoecarver namespace ranges = std::ranges; 2034503987Szoecarver 2134503987Szoecarver template <template <class...> class I> check_range()2234503987Szoecarverconstexpr bool check_range() { 2334503987Szoecarver constexpr bool result = ranges::contiguous_range<test_range<I> >; 2434503987Szoecarver static_assert(ranges::contiguous_range<test_range<I> const> == result); 2534503987Szoecarver static_assert(ranges::contiguous_range<test_non_const_common_range<I> > == result); 2634503987Szoecarver static_assert(ranges::contiguous_range<test_non_const_range<I> > == result); 2734503987Szoecarver static_assert(ranges::contiguous_range<test_common_range<I> > == result); 2834503987Szoecarver static_assert(ranges::contiguous_range<test_common_range<I> const> == result); 2934503987Szoecarver static_assert(!ranges::contiguous_range<test_non_const_common_range<I> const>); 3034503987Szoecarver static_assert(!ranges::contiguous_range<test_non_const_range<I> const>); 3134503987Szoecarver return result; 3234503987Szoecarver } 3334503987Szoecarver 3434503987Szoecarver static_assert(!check_range<cpp20_input_iterator>()); 3534503987Szoecarver static_assert(!check_range<forward_iterator>()); 3634503987Szoecarver static_assert(!check_range<bidirectional_iterator>()); 3734503987Szoecarver static_assert(!check_range<random_access_iterator>()); 3834503987Szoecarver static_assert(check_range<contiguous_iterator>()); 3934503987Szoecarver 4034503987Szoecarver struct ContiguousWhenNonConst { 4134503987Szoecarver const int *begin() const; 4234503987Szoecarver const int *end() const; 4334503987Szoecarver int *begin(); 4434503987Szoecarver int *end(); 4534503987Szoecarver int *data() const; 4634503987Szoecarver }; 4734503987Szoecarver static_assert( std::ranges::contiguous_range<ContiguousWhenNonConst>); 484163f61fSArthur O'Dwyer static_assert( std::ranges::random_access_range<const ContiguousWhenNonConst>); 4934503987Szoecarver static_assert(!std::ranges::contiguous_range<const ContiguousWhenNonConst>); 5034503987Szoecarver 5134503987Szoecarver struct ContiguousWhenConst { 5234503987Szoecarver const int *begin() const; 5334503987Szoecarver const int *end() const; 5434503987Szoecarver int *begin(); 5534503987Szoecarver int *end(); 5634503987Szoecarver const int *data() const; 5734503987Szoecarver }; 584163f61fSArthur O'Dwyer static_assert( std::ranges::contiguous_range<const ContiguousWhenConst>); 5934503987Szoecarver static_assert( std::ranges::random_access_range<ContiguousWhenConst>); 6034503987Szoecarver static_assert(!std::ranges::contiguous_range<ContiguousWhenConst>); 6134503987Szoecarver 6234503987Szoecarver struct DataFunctionWrongReturnType { 6334503987Szoecarver const int *begin() const; 6434503987Szoecarver const int *end() const; 6534503987Szoecarver const char *data() const; 6634503987Szoecarver }; 6734503987Szoecarver static_assert( std::ranges::random_access_range<DataFunctionWrongReturnType>); 684163f61fSArthur O'Dwyer static_assert(!std::ranges::contiguous_range<DataFunctionWrongReturnType>); 699824f867Szoecarver 709824f867Szoecarver struct WrongObjectness { 719824f867Szoecarver const int *begin() const; 729824f867Szoecarver const int *end() const; 739824f867Szoecarver void *data() const; 749824f867Szoecarver }; 759824f867Szoecarver static_assert(std::ranges::contiguous_range<WrongObjectness>); 76*bf150e8dSArthur O'Dwyer 77*bf150e8dSArthur O'Dwyer // Test ADL-proofing. 78*bf150e8dSArthur O'Dwyer struct Incomplete; 79*bf150e8dSArthur O'Dwyer template<class T> struct Holder { T t; }; 80*bf150e8dSArthur O'Dwyer 81*bf150e8dSArthur O'Dwyer static_assert(!std::ranges::contiguous_range<Holder<Incomplete>*>); 82*bf150e8dSArthur O'Dwyer static_assert(!std::ranges::contiguous_range<Holder<Incomplete>*&>); 83*bf150e8dSArthur O'Dwyer static_assert(!std::ranges::contiguous_range<Holder<Incomplete>*&&>); 84*bf150e8dSArthur O'Dwyer static_assert(!std::ranges::contiguous_range<Holder<Incomplete>* const>); 85*bf150e8dSArthur O'Dwyer static_assert(!std::ranges::contiguous_range<Holder<Incomplete>* const&>); 86*bf150e8dSArthur O'Dwyer static_assert(!std::ranges::contiguous_range<Holder<Incomplete>* const&&>); 87*bf150e8dSArthur O'Dwyer 88*bf150e8dSArthur O'Dwyer static_assert( std::ranges::contiguous_range<Holder<Incomplete>*[10]>); 89*bf150e8dSArthur O'Dwyer static_assert( std::ranges::contiguous_range<Holder<Incomplete>*(&)[10]>); 90*bf150e8dSArthur O'Dwyer static_assert( std::ranges::contiguous_range<Holder<Incomplete>*(&&)[10]>); 91*bf150e8dSArthur O'Dwyer static_assert( std::ranges::contiguous_range<Holder<Incomplete>* const[10]>); 92*bf150e8dSArthur O'Dwyer static_assert( std::ranges::contiguous_range<Holder<Incomplete>* const(&)[10]>); 93*bf150e8dSArthur O'Dwyer static_assert( std::ranges::contiguous_range<Holder<Incomplete>* const(&&)[10]>); 94