Skip to content

Commit dfea192

Browse files
committed
1 parent df5475b commit dfea192

File tree

3 files changed

+26
-17
lines changed

3 files changed

+26
-17
lines changed

source/containers/adapt_iterator.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,8 @@ struct adapt_iterator :
142142
return it.m_traits.get().dereference(it.base());
143143
}
144144

145-
friend constexpr auto operator+(adapt_iterator lhs, adapted_addable<Iterator, Traits> auto const rhs) -> adapt_iterator {
145+
// `same_as` works around https://github.com/llvm/llvm-project/issues/143918
146+
friend constexpr auto operator+(std::same_as<adapt_iterator> auto lhs, adapted_addable<Iterator, Traits> auto const rhs) -> adapt_iterator {
146147
auto base = lhs.m_traits.get().add(std::move(lhs).base(), rhs);
147148
return adapt_iterator(std::move(base), std::move(lhs).m_traits);
148149
}

source/containers/algorithms/reverse_iterator.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,18 +51,22 @@ struct reverse_traits {
5151
return *::containers::prev(it);
5252
}
5353

54+
// All of these `OPERATORS_RETURNS` are needed to work around
55+
// https://github.com/llvm/llvm-project/issues/154813
56+
5457
static constexpr auto add(random_access_iterator auto it, auto const offset) OPERATORS_RETURNS(
5558
it - offset
5659
)
5760

58-
static constexpr auto subtract(random_access_iterator auto const lhs, random_access_iterator auto const rhs) {
59-
return rhs - lhs;
60-
}
61+
static constexpr auto subtract(random_access_iterator auto const lhs, random_access_iterator auto const rhs) OPERATORS_RETURNS(
62+
rhs - lhs
63+
)
6164

62-
static constexpr auto compare(random_access_iterator auto const lhs, random_access_iterator auto const rhs) {
63-
return rhs <=> lhs;
64-
}
65-
static constexpr auto equal(iterator auto const lhs, iterator auto const rhs) {
65+
static constexpr auto compare(random_access_iterator auto const lhs, random_access_iterator auto const rhs) OPERATORS_RETURNS(
66+
rhs <=> lhs
67+
)
68+
template<iterator LHS, iterator RHS> requires bounded::equality_comparable<LHS, RHS>
69+
static constexpr auto equal(LHS const lhs, RHS const rhs) -> bool {
6670
return rhs == lhs;
6771
}
6872
};

source/containers/iterator_to_sentinel.cpp

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,35 @@
33
// (See accompanying file LICENSE_1_0.txt or copy at
44
// http://www.boost.org/LICENSE_1_0.txt)
55

6+
module;
7+
8+
#include <operators/returns.hpp>
9+
610
export module containers.iterator_to_sentinel;
711

8-
import bounded;
912
import std_module;
1013

1114
namespace containers {
1215

1316
export template<typename Iterator>
1417
struct iterator_to_sentinel {
18+
private:
19+
[[no_unique_address]] Iterator m_base;
20+
public:
1521
iterator_to_sentinel() = default;
1622

1723
constexpr explicit iterator_to_sentinel(Iterator iterator):
1824
m_base(std::move(iterator))
1925
{
2026
}
2127

28+
friend constexpr auto operator==(iterator_to_sentinel const &, iterator_to_sentinel const &) -> bool = default;
2229
friend constexpr auto operator==(
23-
bounded::equality_comparable<Iterator> auto const & lhs,
24-
iterator_to_sentinel const & rhs
25-
) -> bool {
26-
return lhs == rhs.m_base;
27-
}
28-
29-
private:
30-
[[no_unique_address]] Iterator m_base;
30+
iterator_to_sentinel const & lhs,
31+
auto const & rhs
32+
) OPERATORS_RETURNS(
33+
lhs.m_base == rhs
34+
)
3135
};
3236

3337
} // namespace containers

0 commit comments

Comments
 (0)