brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.6 KiB · eecefd1 Raw
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