brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.5 KiB · e35c83e Raw
56 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 forward_range;13 14#include <ranges>15 16#include "test_iterators.h"17#include "test_range.h"18 19template <template <class...> class I>20constexpr bool check_forward_range() {21  constexpr bool result = std::ranges::forward_range<test_range<I> >;22  static_assert(std::ranges::forward_range<test_range<I> const> == result);23  static_assert(std::ranges::forward_range<test_non_const_common_range<I> > == result);24  static_assert(std::ranges::forward_range<test_non_const_range<I> > == result);25  static_assert(std::ranges::forward_range<test_common_range<I> > == result);26  static_assert(std::ranges::forward_range<test_common_range<I> const> == result);27  static_assert(!std::ranges::forward_range<test_non_const_common_range<I> const>);28  static_assert(!std::ranges::forward_range<test_non_const_range<I> const>);29  return result;30}31 32static_assert(!check_forward_range<cpp17_input_iterator>());33static_assert(!check_forward_range<cpp20_input_iterator>());34static_assert(check_forward_range<forward_iterator>());35static_assert(check_forward_range<bidirectional_iterator>());36static_assert(check_forward_range<random_access_iterator>());37static_assert(check_forward_range<contiguous_iterator>());38 39// Test ADL-proofing.40struct Incomplete;41template<class T> struct Holder { T t; };42 43static_assert(!std::ranges::forward_range<Holder<Incomplete>*>);44static_assert(!std::ranges::forward_range<Holder<Incomplete>*&>);45static_assert(!std::ranges::forward_range<Holder<Incomplete>*&&>);46static_assert(!std::ranges::forward_range<Holder<Incomplete>* const>);47static_assert(!std::ranges::forward_range<Holder<Incomplete>* const&>);48static_assert(!std::ranges::forward_range<Holder<Incomplete>* const&&>);49 50static_assert( std::ranges::forward_range<Holder<Incomplete>*[10]>);51static_assert( std::ranges::forward_range<Holder<Incomplete>*(&)[10]>);52static_assert( std::ranges::forward_range<Holder<Incomplete>*(&&)[10]>);53static_assert( std::ranges::forward_range<Holder<Incomplete>* const[10]>);54static_assert( std::ranges::forward_range<Holder<Incomplete>* const(&)[10]>);55static_assert( std::ranges::forward_range<Holder<Incomplete>* const(&&)[10]>);56