view: disable rbegin/rend when in_place for single type views

This commit is contained in:
Michele Caini
2024-07-03 10:30:56 +02:00
parent d1073bb181
commit d233a40c3d

View File

@@ -648,7 +648,7 @@ public:
/*! @brief Random access iterator type. */
using iterator = typename common_type::iterator;
/*! @brief Reverse iterator type. */
using reverse_iterator = typename common_type::reverse_iterator;
using reverse_iterator = std::conditional_t<Policy == deletion_policy::in_place, void, typename common_type::reverse_iterator>;
/**
* @brief Returns the leading storage of a view, if any.
@@ -720,19 +720,23 @@ public:
*
* If the view is empty, the returned iterator will be equal to `rend()`.
*
* @tparam Pol Dummy template parameter used for sfinae purposes only.
* @return An iterator to the first entity of the reversed view.
*/
[[nodiscard]] reverse_iterator rbegin() const noexcept {
template<typename..., deletion_policy Pol = Policy>
[[nodiscard]] std::enable_if_t<Pol != deletion_policy::in_place, reverse_iterator> rbegin() const noexcept {
return leading ? leading->rbegin() : reverse_iterator{};
}
/**
* @brief Returns an iterator that is past the last entity of the reversed
* view.
* @tparam Pol Dummy template parameter used for sfinae purposes only.
* @return An iterator to the entity following the last entity of the
* reversed view.
*/
[[nodiscard]] reverse_iterator rend() const noexcept {
template<typename..., deletion_policy Pol = Policy>
[[nodiscard]] std::enable_if_t<Pol != deletion_policy::in_place, reverse_iterator> rend() const noexcept {
if constexpr(Policy == deletion_policy::swap_and_pop) {
return leading ? leading->rend() : reverse_iterator{};
} else {