@@ -44,27 +44,27 @@ template<typename T>
44
44
using unwrapped_t = decltype (::containers::unwrap(bounded::declval<T>()));
45
45
46
46
template <typename Iterator, typename Traits>
47
- concept adapted_dereferenceable = requires (Iterator const it, unwrapped_t <Traits> const traits) {
47
+ concept adapted_dereferenceable = requires (Iterator const & it, unwrapped_t <Traits> const traits) {
48
48
traits.dereference (it);
49
49
};
50
50
51
51
template <typename Offset, typename Iterator, typename Traits>
52
- concept adapted_addable = requires (Offset const offset, Iterator const it, unwrapped_t <Traits> const traits) {
53
- adapt_iterator<Iterator, Traits>(traits.add (it , offset), traits);
52
+ concept adapted_addable = requires (Offset const offset, Iterator it, unwrapped_t <Traits> const traits) {
53
+ adapt_iterator<Iterator, Traits>(traits.add (std::move (it) , offset), traits);
54
54
};
55
55
56
56
template <typename RHSIterator, typename LHSIterator, typename Traits>
57
- concept adapted_subtractable = requires (LHSIterator const lhs, RHSIterator const rhs, unwrapped_t <Traits> const traits) {
58
- traits.subtract (lhs, rhs);
57
+ concept adapted_subtractable = requires (LHSIterator lhs, RHSIterator rhs, unwrapped_t <Traits> const traits) {
58
+ traits.subtract (std::move ( lhs), std::move ( rhs) );
59
59
};
60
60
61
61
template <typename RHSIterator, typename LHSIterator, typename Traits>
62
- concept adapted_ordered = requires (LHSIterator const lhs, RHSIterator const rhs, unwrapped_t <Traits> const traits) {
62
+ concept adapted_ordered = requires (LHSIterator const & lhs, RHSIterator const & rhs, unwrapped_t <Traits> const traits) {
63
63
traits.compare (lhs, rhs);
64
64
};
65
65
66
66
template <typename RHSIterator, typename LHSIterator, typename Traits>
67
- concept adapted_equality_comparable = requires (LHSIterator const lhs, RHSIterator const rhs, unwrapped_t <Traits> const traits) {
67
+ concept adapted_equality_comparable = requires (LHSIterator const & lhs, RHSIterator const & rhs, unwrapped_t <Traits> const traits) {
68
68
traits.equal (lhs, rhs);
69
69
};
70
70
@@ -99,37 +99,40 @@ struct adapt_iterator : iterator_category_base<Iterator>, adapted_difference_typ
99
99
{
100
100
}
101
101
102
- constexpr auto base () const {
102
+ constexpr auto base () const & -> Iterator const & {
103
103
return m_base;
104
104
}
105
+ constexpr auto base () && -> Iterator && {
106
+ return std::move (m_base);
107
+ }
105
108
106
109
constexpr auto && traits() const {
107
110
return ::containers::unwrap (m_traits);
108
111
}
109
112
110
113
OPERATORS_ARROW_DEFINITIONS
111
114
112
- friend constexpr auto operator *(adapt_iterator const it) -> decltype (auto ) requires adapted_dereferenceable<Iterator, Traits> {
115
+ friend constexpr auto operator *(adapt_iterator const & it) -> decltype (auto ) requires adapted_dereferenceable<Iterator, Traits> {
113
116
return it.traits ().dereference (it.base ());
114
117
}
115
118
116
- friend constexpr auto operator +(adapt_iterator const lhs, adapted_addable<Iterator, Traits> auto const rhs) -> adapt_iterator {
117
- return adapt_iterator (lhs.traits ().add (lhs.base (), rhs), lhs.traits ());
119
+ friend constexpr auto operator +(adapt_iterator lhs, adapted_addable<Iterator, Traits> auto const rhs) -> adapt_iterator {
120
+ return adapt_iterator (lhs.traits ().add (std::move ( lhs) .base (), rhs), lhs.traits ());
118
121
}
119
122
120
123
121
124
template <adapted_subtractable<Iterator, Traits> RHSIterator>
122
- friend constexpr auto operator -(adapt_iterator const lhs, adapt_iterator<RHSIterator, Traits> const rhs) {
123
- return lhs.traits ().subtract (lhs.base (), rhs.base ());
125
+ friend constexpr auto operator -(adapt_iterator lhs, adapt_iterator<RHSIterator, Traits> rhs) {
126
+ return lhs.traits ().subtract (std::move ( lhs) .base (), std::move ( rhs) .base ());
124
127
}
125
128
126
129
template <adapted_ordered<Iterator, Traits> RHSIterator>
127
- friend constexpr auto operator <=>(adapt_iterator const lhs, adapt_iterator<RHSIterator, Traits> const rhs) {
130
+ friend constexpr auto operator <=>(adapt_iterator const & lhs, adapt_iterator<RHSIterator, Traits> const & rhs) {
128
131
return lhs.traits ().compare (lhs.base (), rhs.base ());
129
132
}
130
133
131
134
template <adapted_equality_comparable<Iterator, Traits> RHSIterator>
132
- friend constexpr auto operator ==(adapt_iterator const lhs, adapt_iterator<RHSIterator, Traits> const rhs) -> bool {
135
+ friend constexpr auto operator ==(adapt_iterator const & lhs, adapt_iterator<RHSIterator, Traits> const & rhs) -> bool {
133
136
return lhs.traits ().equal (lhs.base (), rhs.base ());
134
137
}
135
138
0 commit comments