17 #ifndef OPENKALMAN_COMPATIBILITY_VIEWS_REVERSE_HPP 18 #define OPENKALMAN_COMPATIBILITY_VIEWS_REVERSE_HPP 20 #ifndef __cpp_lib_ranges 24 #include "basics/compatibility/ranges/range-access.hpp" 39 template<
bool Enable = true, std::enable_if_t<Enable and std::is_default_constructible_v<V>,
int> = 0>
44 explicit constexpr
reverse_view(V&& r) : base_ {std::move(r)} {}
46 explicit constexpr reverse_view(V& r) : base_ {r} {}
49 template<
bool Enable = true, std::enable_if_t<Enable and std::is_copy_constructible_v<V>,
int> = 0>
50 constexpr V base()
const& {
return base_; }
52 constexpr V base() && {
return std::move(base_); }
55 template<
bool Enable = true, std::enable_if_t<Enable and not ranges::common_range<V>,
int> = 0>
56 constexpr std::reverse_iterator<ranges::iterator_t<V>>
58 {
return std::make_reverse_iterator(ranges::next(ranges::begin(base_), ranges::end(base_))); }
60 template<
bool Enable = true, std::enable_if_t<Enable and ranges::common_range<V>,
int> = 0>
61 constexpr std::reverse_iterator<ranges::iterator_t<V>>
62 begin() {
return std::make_reverse_iterator(ranges::end(base_)); }
64 template<
bool Enable = true, std::enable_if_t<Enable and ranges::common_range<const V>,
int> = 0>
66 begin()
const {
return std::make_reverse_iterator(ranges::end(base_)); }
69 constexpr std::reverse_iterator<ranges::iterator_t<V>>
70 end() {
return std::make_reverse_iterator(ranges::begin(base_)); }
72 template<
bool Enable = true, std::enable_if_t<Enable and ranges::common_range<const V>,
int> = 0>
74 end()
const {
return std::make_reverse_iterator(ranges::begin(base_)); }
77 template<
bool Enable = true, std::enable_if_t<Enable and ranges::sized_range<const V>,
int> = 0>
81 template<
bool Enable = true, std::enable_if_t<Enable and ranges::sized_range<const V>,
int> = 0>
100 #ifdef __cpp_lib_ranges 101 namespace std::ranges
107 constexpr
bool enable_borrowed_range<OpenKalman::ranges::reverse_view<T>> = enable_borrowed_range<T>;
118 template<
typename R, std::enable_if_t<viewable_range<R>,
int> = 0>
120 operator() [[nodiscard]] (R&& r)
const 138 return std::move(r).base();
159 #endif //OPENKALMAN_COMPATIBILITY_VIEWS_REVERSE_HPP
Definition: view_interface.hpp:32
constexpr detail::reverse_closure reverse
a RangeAdapterObject associated with reverse_view.
Definition: reverse.hpp:152
The root namespace for OpenKalman.
Definition: basics.hpp:34
Definition: range-access.hpp:25
Definitions relating to the availability of c++ language features.
constexpr bool size
T is either an index representing a size, or void which represents that there is no size...
Definition: size.hpp:32
Definition: range_adaptor_closure.hpp:35
constexpr detail::all_closure all
Equivalent to std::ranges::views::all.
Definition: all.hpp:68
Equivalent to std::ranges::reverse_view.
Definition: reverse.hpp:37
Definition: reverse.hpp:115