@@ -11,6 +11,8 @@ module;
11
11
export module containers.adapt;
12
12
13
13
import containers.begin_end;
14
+ import containers.is_iterator;
15
+ import containers.is_iterator_sentinel;
14
16
import containers.iter_value_t ;
15
17
import containers.iterator_adapter;
16
18
import containers.reference_wrapper;
@@ -34,43 +36,54 @@ concept statically_sized_adapted_range = sized_adapted_range<Range, Traits> and
34
36
35
37
export template <typename Range, typename Traits>
36
38
struct adapt {
39
+ private:
40
+ using adapt_iterator_traits = std::conditional_t <
41
+ std::is_empty_v<Traits> and std::is_copy_assignable_v<Traits>,
42
+ Traits,
43
+ decltype (std::reference_wrapper(bounded::declval<Traits const &>()))
44
+ >;
45
+
46
+ [[no_unique_address]] Range m_range;
47
+ [[no_unique_address]] Traits m_traits;
48
+
49
+ public:
37
50
constexpr adapt (Range && range, Traits traits):
38
51
m_range(OPERATORS_FORWARD(range)),
39
52
m_traits(std::move(traits))
40
53
{
41
54
}
42
55
43
- constexpr auto begin () const & {
56
+ constexpr auto begin () const & -> iterator auto {
44
57
return containers::adapt_iterator (
45
58
::containers::unwrap (m_traits).get_begin(m_range),
46
59
adapt_iterator_traits(m_traits)
47
60
);
48
61
}
49
- constexpr auto begin () & {
62
+ constexpr auto begin () & -> iterator auto {
50
63
return containers::adapt_iterator (
51
64
::containers::unwrap (m_traits).get_begin(m_range),
52
65
adapt_iterator_traits(m_traits)
53
66
);
54
67
}
55
- constexpr auto begin () && {
68
+ constexpr auto begin () && -> iterator auto {
56
69
return containers::adapt_iterator (
57
70
::containers::unwrap (m_traits).get_begin(std::move(*this ).m_range),
58
71
adapt_iterator_traits(m_traits)
59
72
);
60
73
}
61
- constexpr auto end () const & {
74
+ constexpr auto end () const & -> sentinel_for<decltype(begin())> auto {
62
75
return containers::adapt_iterator (
63
76
::containers::unwrap (m_traits).get_end(m_range),
64
77
adapt_iterator_traits(m_traits)
65
78
);
66
79
}
67
- constexpr auto end () & {
80
+ constexpr auto end () & -> sentinel_for<decltype(begin())> auto {
68
81
return containers::adapt_iterator (
69
82
::containers::unwrap (m_traits).get_end(m_range),
70
83
adapt_iterator_traits(m_traits)
71
84
);
72
85
}
73
- constexpr auto end () && {
86
+ constexpr auto end () && -> sentinel_for<decltype(begin())> auto {
74
87
return containers::adapt_iterator (
75
88
::containers::unwrap (m_traits).get_end(std::move(*this ).m_range),
76
89
adapt_iterator_traits(m_traits)
@@ -92,16 +105,6 @@ struct adapt {
92
105
constexpr auto base () && -> Range && {
93
106
return std::move (m_range);
94
107
}
95
-
96
- private:
97
- using adapt_iterator_traits = std::conditional_t <
98
- std::is_empty_v<Traits> and std::is_copy_assignable_v<Traits>,
99
- Traits,
100
- decltype (std::reference_wrapper(bounded::declval<Traits const &>()))
101
- >;
102
-
103
- [[no_unique_address]] Range m_range;
104
- [[no_unique_address]] Traits m_traits;
105
108
};
106
109
107
110
template <typename Range, typename Traits>
0 commit comments