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 #include <type_traits>
21 #include "view-concepts.hpp"
22 #include "view_interface.hpp"
24 #include "all.hpp"
25 
27 {
28 #ifdef __cpp_lib_ranges
29  using std::ranges::reverse_view;
30  namespace views
31  {
32  using std::ranges::views::reverse;
33  }
34 #else
35 
38  template<typename V>
39  struct reverse_view : stdex::ranges::view_interface<reverse_view<V>>
40  {
41  template<bool Enable = true, std::enable_if_t<Enable and stdex::default_initializable<V>, int> = 0>
42  constexpr reverse_view() {}
43 
44  constexpr reverse_view(V r) : base_ {std::move(r)} {}
45 
46 
47  template<bool Enable = true, std::enable_if_t<Enable and stdex::copy_constructible<V>, int> = 0>
48  constexpr V base() const& { return base_; }
49 
50  constexpr V base() && { return std::move(base_); }
51 
52 
53  template<bool Enable = true, std::enable_if_t<Enable and not stdex::ranges::common_range<V>, int> = 0>
54  constexpr std::reverse_iterator<stdex::ranges::iterator_t<V>>
55  begin()
56  { return std::make_reverse_iterator(stdex::ranges::next(stdex::ranges::begin(base_), stdex::ranges::end(base_))); }
57 
58  template<bool Enable = true, std::enable_if_t<Enable and stdex::ranges::common_range<V>, int> = 0>
59  constexpr std::reverse_iterator<stdex::ranges::iterator_t<V>>
60  begin() { return std::make_reverse_iterator(stdex::ranges::end(base_)); }
61 
62  template<bool Enable = true, std::enable_if_t<Enable and stdex::ranges::common_range<const V>, int> = 0>
63  constexpr auto
64  begin() const { return std::make_reverse_iterator(stdex::ranges::end(base_)); }
65 
66 
67  constexpr std::reverse_iterator<stdex::ranges::iterator_t<V>>
68  end() { return std::make_reverse_iterator(stdex::ranges::begin(base_)); }
69 
70  template<bool Enable = true, std::enable_if_t<Enable and stdex::ranges::common_range<const V>, int> = 0>
71  constexpr auto
72  end() const { return std::make_reverse_iterator(stdex::ranges::begin(base_)); }
73 
74 
75  template<bool Enable = true, std::enable_if_t<Enable and stdex::ranges::sized_range<const V>, int> = 0>
76  constexpr auto
77  size() { return stdex::ranges::size(base_); }
78 
79  template<bool Enable = true, std::enable_if_t<Enable and stdex::ranges::sized_range<const V>, int> = 0>
80  constexpr auto
81  size() const { return stdex::ranges::size(base_); }
82 
83  private:
84 
85  V base_;
86  };
87 
88 
92  template<typename R>
94 
95 
96  template<typename T>
97  constexpr bool enable_borrowed_range<reverse_view<T>> = enable_borrowed_range<T>;
98 
99 
100  namespace views
101  {
102  namespace detail
103  {
105  {
106  template<typename R, std::enable_if_t<viewable_range<R>, int> = 0>
107  constexpr auto
108  operator() [[nodiscard]] (R&& r) const
109  {
110  return reverse_view {all(std::forward<R>(r))};
111  }
112 
113 
114  template<typename T>
115  constexpr auto
116  operator() [[nodiscard]] (const reverse_view<T>& r) const
117  {
118  return r.base();
119  }
120 
121 
122  template<typename T>
123  constexpr auto
124  operator() [[nodiscard]] (reverse_view<T>&& r) const
125  {
126  return std::move(r).base();
127  }
128  };
129 
130  }
131 
132 
141 
142  }
143 
144 #endif
145 }
146 
147 
148 
149 #endif
Equivalent to std::ranges::reverse_view.
Definition: reverse.hpp:39
constexpr detail::all_closure all
Equivalent to std::ranges::views::all.
Definition: all.hpp:64
Definition: view_interface.hpp:32
constexpr detail::reverse_closure reverse
a RangeAdapterObject associated with reverse_view.
Definition: reverse.hpp:140
Definition: common.hpp:200
constexpr bool size
T is either an index representing a size, or unbounded_size_t, which indicates that the size is unbou...
Definition: size.hpp:65
Definition: range_adaptor_closure.hpp:34