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