Skip to content

Commit 0fcddbb

Browse files
committed
reversed(reversed(range)) just returns range
1 parent dfea192 commit 0fcddbb

File tree

1 file changed

+26
-4
lines changed

1 file changed

+26
-4
lines changed

source/containers/algorithms/reverse_iterator.cpp

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,34 @@ struct reverse_traits {
7171
}
7272
};
7373

74-
export constexpr auto reverse_iterator(bidirectional_iterator auto it) {
75-
return adapt_iterator(it, value_wrapper<reverse_traits>());
74+
template<typename>
75+
constexpr auto is_reverse_iterator = false;
76+
77+
template<typename Iterator>
78+
constexpr auto is_reverse_iterator<adapt_iterator<Iterator, value_wrapper<reverse_traits>>> = true;
79+
80+
export template<bidirectional_iterator Iterator>
81+
constexpr auto reverse_iterator(Iterator it) {
82+
if constexpr (is_reverse_iterator<Iterator>) {
83+
return it.base();
84+
} else {
85+
return adapt_iterator(it, value_wrapper<reverse_traits>());
86+
}
7687
}
7788

78-
export constexpr auto reversed(range auto && source) {
79-
return adapt(OPERATORS_FORWARD(source), reverse_traits());
89+
template<typename>
90+
constexpr auto is_reversed = false;
91+
92+
template<typename Range>
93+
constexpr auto is_reversed<adapt<Range, reverse_traits>> = true;
94+
95+
export template<range Range>
96+
constexpr auto reversed(Range && source) {
97+
if constexpr (is_reversed<Range>) {
98+
return OPERATORS_FORWARD(source).base();
99+
} else {
100+
return adapt(OPERATORS_FORWARD(source), reverse_traits());
101+
}
80102
}
81103

82104
} // namespace containers

0 commit comments

Comments
 (0)