OpenKalman
reverse.hpp
Go to the documentation of this file.
1 /* This file is part of OpenKalman, a header-only C++ library for
2  * Kalman filters and other recursive filters.
3  *
4  * Copyright (c) 2025 Christopher Lee Ogden <ogden@gatech.edu>
5  *
6  * This Source Code Form is subject to the terms of the Mozilla Public
7  * License, v. 2.0. If a copy of the MPL was not distributed with this
8  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
9  */
10 
17 #ifndef OPENKALMAN_COMPATIBILITY_VIEWS_REVERSE_HPP
18 #define OPENKALMAN_COMPATIBILITY_VIEWS_REVERSE_HPP
19 
20 #ifndef __cpp_lib_ranges
21 
22 #include<type_traits>
24 #include "basics/compatibility/ranges/range-access.hpp"
26 #include "view-concepts.hpp"
27 #include "view_interface.hpp"
29 #include "all.hpp"
30 
31 namespace OpenKalman::ranges
32 {
36  template<typename V>
37  struct reverse_view : ranges::view_interface<reverse_view<V>>
38  {
39  template<bool Enable = true, std::enable_if_t<Enable and std::is_default_constructible_v<V>, int> = 0>
40  constexpr reverse_view() {}
41 
42  //explicit constexpr reverse_view(V r) : base_ {std::move(r)} {} //- This is what it should be, but doesn't work here
43 
44  explicit constexpr reverse_view(V&& r) : base_ {std::move(r)} {}
45 
46  explicit constexpr reverse_view(V& r) : base_ {r} {}
47 
48 
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_; }
51 
52  constexpr V base() && { return std::move(base_); }
53 
54 
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>>
57  begin()
58  { return std::make_reverse_iterator(ranges::next(ranges::begin(base_), ranges::end(base_))); }
59 
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_)); }
63 
64  template<bool Enable = true, std::enable_if_t<Enable and ranges::common_range<const V>, int> = 0>
65  constexpr auto
66  begin() const { return std::make_reverse_iterator(ranges::end(base_)); }
67 
68 
69  constexpr std::reverse_iterator<ranges::iterator_t<V>>
70  end() { return std::make_reverse_iterator(ranges::begin(base_)); }
71 
72  template<bool Enable = true, std::enable_if_t<Enable and ranges::common_range<const V>, int> = 0>
73  constexpr auto
74  end() const { return std::make_reverse_iterator(ranges::begin(base_)); }
75 
76 
77  template<bool Enable = true, std::enable_if_t<Enable and ranges::sized_range<const V>, int> = 0>
78  constexpr auto
79  size() { return ranges::size(base_); }
80 
81  template<bool Enable = true, std::enable_if_t<Enable and ranges::sized_range<const V>, int> = 0>
82  constexpr auto
83  size() const { return ranges::size(base_); }
84 
85  private:
86 
87  V base_;
88  };
89 
90 
94  template<typename R>
96 
97 }
98 
99 
100 #ifdef __cpp_lib_ranges
101 namespace std::ranges
102 #else
103 namespace OpenKalman::ranges
104 #endif
105 {
106  template<typename T>
107  constexpr bool enable_borrowed_range<OpenKalman::ranges::reverse_view<T>> = enable_borrowed_range<T>;
108 }
109 
110 
112 {
113  namespace detail
114  {
116  : ranges::range_adaptor_closure<reverse_closure>
117  {
118  template<typename R, std::enable_if_t<viewable_range<R>, int> = 0>
119  constexpr auto
120  operator() [[nodiscard]] (R&& r) const
121  {
122  return reverse_view {all(std::forward<R>(r))};
123  }
124 
125 
126  template<typename T>
127  constexpr auto
128  operator() [[nodiscard]] (const reverse_view<T>& r) const
129  {
130  return r.base();
131  }
132 
133 
134  template<typename T>
135  constexpr auto
136  operator() [[nodiscard]] (reverse_view<T>&& r) const
137  {
138  return std::move(r).base();
139  }
140  };
141 
142  }
143 
144 
153 
154 }
155 
156 
157 #endif
158 
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: all.hpp:35