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 1071909de3SMark de Wever // UNSUPPORTED: libcpp-has-no-incomplete-ranges 1134503987Szoecarver 12f192616cSLouis Dionne // template<class R> 1334503987Szoecarver // concept contiguous_range; 1434503987Szoecarver 1534503987Szoecarver #include <ranges> 1634503987Szoecarver 1734503987Szoecarver #include "test_range.h" 1834503987Szoecarver #include "test_iterators.h" 1934503987Szoecarver 2034503987Szoecarver namespace ranges = std::ranges; 2134503987Szoecarver 2234503987Szoecarver template <template <class...> class I> check_range()2334503987Szoecarverconstexpr bool check_range() { 2434503987Szoecarver constexpr bool result = ranges::contiguous_range<test_range<I> >; 2534503987Szoecarver static_assert(ranges::contiguous_range<test_range<I> const> == result); 2634503987Szoecarver static_assert(ranges::contiguous_range<test_non_const_common_range<I> > == result); 2734503987Szoecarver static_assert(ranges::contiguous_range<test_non_const_range<I> > == result); 2834503987Szoecarver static_assert(ranges::contiguous_range<test_common_range<I> > == result); 2934503987Szoecarver static_assert(ranges::contiguous_range<test_common_range<I> const> == result); 3034503987Szoecarver static_assert(!ranges::contiguous_range<test_non_const_common_range<I> const>); 3134503987Szoecarver static_assert(!ranges::contiguous_range<test_non_const_range<I> const>); 3234503987Szoecarver return result; 3334503987Szoecarver } 3434503987Szoecarver 3534503987Szoecarver static_assert(!check_range<cpp20_input_iterator>()); 3634503987Szoecarver static_assert(!check_range<forward_iterator>()); 3734503987Szoecarver static_assert(!check_range<bidirectional_iterator>()); 3834503987Szoecarver static_assert(!check_range<random_access_iterator>()); 3934503987Szoecarver static_assert(check_range<contiguous_iterator>()); 4034503987Szoecarver 4134503987Szoecarver struct ContiguousWhenNonConst { 4234503987Szoecarver const int *begin() const; 4334503987Szoecarver const int *end() const; 4434503987Szoecarver int *begin(); 4534503987Szoecarver int *end(); 4634503987Szoecarver int *data() const; 4734503987Szoecarver }; 4834503987Szoecarver static_assert( std::ranges::contiguous_range<ContiguousWhenNonConst>); 494163f61fSArthur O'Dwyer static_assert( std::ranges::random_access_range<const ContiguousWhenNonConst>); 5034503987Szoecarver static_assert(!std::ranges::contiguous_range<const ContiguousWhenNonConst>); 5134503987Szoecarver 5234503987Szoecarver struct ContiguousWhenConst { 5334503987Szoecarver const int *begin() const; 5434503987Szoecarver const int *end() const; 5534503987Szoecarver int *begin(); 5634503987Szoecarver int *end(); 5734503987Szoecarver const int *data() const; 5834503987Szoecarver }; 594163f61fSArthur O'Dwyer static_assert( std::ranges::contiguous_range<const ContiguousWhenConst>); 6034503987Szoecarver static_assert( std::ranges::random_access_range<ContiguousWhenConst>); 6134503987Szoecarver static_assert(!std::ranges::contiguous_range<ContiguousWhenConst>); 6234503987Szoecarver 6334503987Szoecarver struct DataFunctionWrongReturnType { 6434503987Szoecarver const int *begin() const; 6534503987Szoecarver const int *end() const; 6634503987Szoecarver const char *data() const; 6734503987Szoecarver }; 6834503987Szoecarver static_assert( std::ranges::random_access_range<DataFunctionWrongReturnType>); 694163f61fSArthur O'Dwyer static_assert(!std::ranges::contiguous_range<DataFunctionWrongReturnType>); 709824f867Szoecarver 719824f867Szoecarver struct WrongObjectness { 729824f867Szoecarver const int *begin() const; 739824f867Szoecarver const int *end() const; 749824f867Szoecarver void *data() const; 759824f867Szoecarver }; 769824f867Szoecarver static_assert(std::ranges::contiguous_range<WrongObjectness>); 77*bf150e8dSArthur O'Dwyer 78*bf150e8dSArthur O'Dwyer // Test ADL-proofing. 79*bf150e8dSArthur O'Dwyer struct Incomplete; 80*bf150e8dSArthur O'Dwyer template<class T> struct Holder { T t; }; 81*bf150e8dSArthur O'Dwyer 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>*&&>); 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 static_assert(!std::ranges::contiguous_range<Holder<Incomplete>* const&&>); 88*bf150e8dSArthur O'Dwyer 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>*(&&)[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*bf150e8dSArthur O'Dwyer static_assert( std::ranges::contiguous_range<Holder<Incomplete>* const(&&)[10]>); 95