Skip to content

Commit 145f8a4

Browse files
committed
adapt_iterator now works with move-only iterators
1 parent 3ea34a2 commit 145f8a4

File tree

1 file changed

+18
-15
lines changed

1 file changed

+18
-15
lines changed

source/containers/iterator_adapter.cpp

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -44,27 +44,27 @@ template<typename T>
4444
using unwrapped_t = decltype(::containers::unwrap(bounded::declval<T>()));
4545

4646
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) {
4848
traits.dereference(it);
4949
};
5050

5151
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);
5454
};
5555

5656
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));
5959
};
6060

6161
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) {
6363
traits.compare(lhs, rhs);
6464
};
6565

6666
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) {
6868
traits.equal(lhs, rhs);
6969
};
7070

@@ -99,37 +99,40 @@ struct adapt_iterator : iterator_category_base<Iterator>, adapted_difference_typ
9999
{
100100
}
101101

102-
constexpr auto base() const {
102+
constexpr auto base() const & -> Iterator const & {
103103
return m_base;
104104
}
105+
constexpr auto base() && -> Iterator && {
106+
return std::move(m_base);
107+
}
105108

106109
constexpr auto && traits() const {
107110
return ::containers::unwrap(m_traits);
108111
}
109112

110113
OPERATORS_ARROW_DEFINITIONS
111114

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> {
113116
return it.traits().dereference(it.base());
114117
}
115118

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());
118121
}
119122

120123

121124
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());
124127
}
125128

126129
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) {
128131
return lhs.traits().compare(lhs.base(), rhs.base());
129132
}
130133

131134
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 {
133136
return lhs.traits().equal(lhs.base(), rhs.base());
134137
}
135138

0 commit comments

Comments
 (0)