xref: /llvm-project/libcxx/test/std/ranges/range.adaptors/range.reverse/types.h (revision 3666dd795d9e2114e49bd58ace042b663d6f8a3a)
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