65 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, class T>12// concept output_range;13 14#include <ranges>15 16#include <iterator>17#include "test_iterators.h"18#include "test_range.h"19 20struct T { };21 22// Satisfied when it's a range and has the right iterator23struct GoodRange {24 cpp17_output_iterator<T*> begin();25 sentinel end();26};27static_assert(std::ranges::range<GoodRange>);28static_assert(std::output_iterator<std::ranges::iterator_t<GoodRange>, T>);29static_assert(std::ranges::output_range<GoodRange, T>);30 31// Not satisfied when it's not a range32struct NotRange {33 cpp17_output_iterator<T*> begin();34};35static_assert(!std::ranges::range<NotRange>);36static_assert( std::output_iterator<std::ranges::iterator_t<NotRange>, T>);37static_assert(!std::ranges::output_range<NotRange, T>);38 39// Not satisfied when the iterator is not an output_iterator40struct RangeWithBadIterator {41 cpp17_input_iterator<T const*> begin();42 sentinel end();43};44static_assert( std::ranges::range<RangeWithBadIterator>);45static_assert(!std::output_iterator<std::ranges::iterator_t<RangeWithBadIterator>, T>);46static_assert(!std::ranges::output_range<RangeWithBadIterator, T>);47 48// Test ADL-proofing.49struct Incomplete;50template<class T> struct Holder { T t; };51 52static_assert(!std::ranges::output_range<Holder<Incomplete>*, Holder<Incomplete>*>);53static_assert(!std::ranges::output_range<Holder<Incomplete>*&, Holder<Incomplete>*>);54static_assert(!std::ranges::output_range<Holder<Incomplete>*&&, Holder<Incomplete>*>);55static_assert(!std::ranges::output_range<Holder<Incomplete>* const, Holder<Incomplete>*>);56static_assert(!std::ranges::output_range<Holder<Incomplete>* const&, Holder<Incomplete>*>);57static_assert(!std::ranges::output_range<Holder<Incomplete>* const&&, Holder<Incomplete>*>);58 59static_assert( std::ranges::output_range<Holder<Incomplete>*[10], Holder<Incomplete>*>);60static_assert( std::ranges::output_range<Holder<Incomplete>*(&)[10], Holder<Incomplete>*>);61static_assert( std::ranges::output_range<Holder<Incomplete>*(&&)[10], Holder<Incomplete>*>);62static_assert(!std::ranges::output_range<Holder<Incomplete>* const[10], Holder<Incomplete>*>);63static_assert(!std::ranges::output_range<Holder<Incomplete>* const(&)[10], Holder<Incomplete>*>);64static_assert(!std::ranges::output_range<Holder<Incomplete>* const(&&)[10], Holder<Incomplete>*>);65