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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef TEST_STD_RANGES_RANGE_ADAPTORS_RANGE_REVERSE_TYPES_H 10 #define TEST_STD_RANGES_RANGE_ADAPTORS_RANGE_REVERSE_TYPES_H 11 12 #include "test_macros.h" 13 #include "test_iterators.h" 14 15 struct BidirRange : std::ranges::view_base { 16 int *begin_; 17 int* end_; 18 BidirRangeBidirRange19 constexpr BidirRange(int* b, int* e) : begin_(b), end_(e) { } 20 beginBidirRange21 constexpr bidirectional_iterator<int*> begin() { return bidirectional_iterator<int*>{begin_}; } beginBidirRange22 constexpr bidirectional_iterator<const int*> begin() const { return bidirectional_iterator<const int*>{begin_}; } endBidirRange23 constexpr bidirectional_iterator<int*> end() { return bidirectional_iterator<int*>{end_}; } endBidirRange24 constexpr bidirectional_iterator<const int*> end() const { return bidirectional_iterator<const int*>{end_}; } 25 }; 26 static_assert( std::ranges::bidirectional_range<BidirRange>); 27 static_assert( std::ranges::common_range<BidirRange>); 28 static_assert( std::ranges::view<BidirRange>); 29 static_assert( std::copyable<BidirRange>); 30 31 enum CopyCategory { MoveOnly, Copyable }; 32 template<CopyCategory CC> 33 struct BidirSentRange : std::ranges::view_base { 34 using sent_t = sentinel_wrapper<bidirectional_iterator<int*>>; 35 using sent_const_t = sentinel_wrapper<bidirectional_iterator<const int*>>; 36 37 int* begin_; 38 int* end_; 39 BidirSentRangeBidirSentRange40 constexpr BidirSentRange(int* b, int* e) : begin_(b), end_(e) { } 41 constexpr BidirSentRange(const BidirSentRange &) requires (CC == Copyable) = default; 42 constexpr BidirSentRange(BidirSentRange &&) requires (CC == MoveOnly) = default; 43 constexpr BidirSentRange& operator=(const BidirSentRange &) requires (CC == Copyable) = default; 44 constexpr BidirSentRange& operator=(BidirSentRange &&) requires (CC == MoveOnly) = default; 45 beginBidirSentRange46 constexpr bidirectional_iterator<int*> begin() { return bidirectional_iterator<int*>{begin_}; } beginBidirSentRange47 constexpr bidirectional_iterator<const int*> begin() const { return bidirectional_iterator<const int*>{begin_}; } endBidirSentRange48 constexpr sent_t end() { return sent_t{bidirectional_iterator<int*>{end_}}; } endBidirSentRange49 constexpr sent_const_t end() const { return sent_const_t{bidirectional_iterator<const int*>{end_}}; } 50 }; 51 static_assert( std::ranges::bidirectional_range<BidirSentRange<MoveOnly>>); 52 static_assert(!std::ranges::common_range<BidirSentRange<MoveOnly>>); 53 static_assert( std::ranges::view<BidirSentRange<MoveOnly>>); 54 static_assert(!std::copyable<BidirSentRange<MoveOnly>>); 55 static_assert( std::ranges::bidirectional_range<BidirSentRange<Copyable>>); 56 static_assert(!std::ranges::common_range<BidirSentRange<Copyable>>); 57 static_assert( std::ranges::view<BidirSentRange<Copyable>>); 58 static_assert( std::copyable<BidirSentRange<Copyable>>); 59 60 #endif // TEST_STD_RANGES_RANGE_ADAPTORS_RANGE_REVERSE_TYPES_H 61