16 #ifndef OPENKALMAN_COLLECTIONS_VIEWS_SLICE_HPP 17 #define OPENKALMAN_COLLECTIONS_VIEWS_SLICE_HPP 42 #ifdef __cpp_lib_ranges 43 template<collection V, values::index Offset, values::index Extent> requires
44 std::same_as<std::decay_t<Offset>, Offset> and std::same_as<std::decay_t<Extent>, Extent> and
46 ((values::dynamic<Offset> or values::fixed_number_of_v<Offset> <= std::tuple_size_v<std::decay_t<V>>) and
47 (values::dynamic<Extent> or values::fixed_number_of_v<Extent> <= std::tuple_size_v<std::decay_t<V>>) and
48 (values::dynamic<Offset> or values::dynamic<Extent> or values::fixed_number_of_v<Offset> + values::fixed_number_of_v<Extent> <= std::tuple_size_v<std::decay_t<V>>)))
51 template<
typename V,
typename Offset,
typename Extent>
61 template<
bool Enable = true, std::enable_if_t<Enable and std::is_default_constructible_v<V> and
62 std::is_default_constructible_v<Offset> and std::is_default_constructible_v<Extent>,
int> = 0>
72 : v_ {v}, offset_ {std::move(offset)}, extent_ {std::move(extent)} {}
77 : v_ {std::move(v)}, offset_ {std::move(offset)}, extent_ {std::move(extent)} {}
83 #ifdef __cpp_explicit_this_parameter 84 constexpr decltype(
auto)
85 base(
this auto&&
self) noexcept {
return std::forward<decltype(self)>(
self).v_; }
87 constexpr V&
base() & {
return this->v_; }
88 constexpr
const V&
base()
const & {
return this->v_; }
89 constexpr V&&
base() && noexcept {
return std::move(*this).v_; }
90 constexpr
const V&&
base()
const && noexcept {
return std::move(*this).v_; }
95 template<
typename Self>
97 begin_impl(Self&&
self) noexcept
99 #ifdef __cpp_lib_ranges 100 namespace ranges = std::ranges;
104 return ranges::begin(std::forward<Self>(
self).v_);
112 #ifdef __cpp_explicit_this_parameter 114 begin(
this auto&&
self) noexcept
116 return begin_impl(std::forward<decltype(
self)>(
self)) + std::forward<decltype(self)>(
self).offset_;
119 constexpr
auto begin() & {
return begin_impl(*
this) + offset_; }
120 constexpr
auto begin()
const & {
return begin_impl(*
this) + offset_; }
121 constexpr
auto begin() && noexcept {
return begin_impl(std::move(*
this)) + std::move(*this).offset_; }
122 constexpr
auto begin()
const && noexcept {
return begin_impl(std::move(*
this)) + std::move(*this).offset_; }
129 #ifdef __cpp_explicit_this_parameter 131 end(
this auto&&
self) noexcept
133 return begin_impl(std::forward<decltype(
self)>(
self)) +
134 std::forward<decltype(self)>(
self).offset_ + std::forward<decltype(
self)>(
self).extent_;
137 constexpr
auto end() & {
return begin_impl(*
this) + offset_ + extent_; }
138 constexpr
auto end()
const & {
return begin_impl(*
this) + offset_ + extent_; }
139 constexpr
auto end() && noexcept {
return begin_impl(std::move(*
this)) + std::move(*this).offset_ + std::move(*this).extent_; }
140 constexpr
auto end()
const && noexcept {
return begin_impl(std::move(*
this)) + std::move(*this).offset_ + std::move(*this).extent_; }
147 #ifdef __cpp_explicit_this_parameter 149 size(
this auto&&
self) noexcept {
return std::forward<decltype(self)>(
self).extent_; }
152 size() const noexcept {
return extent_; }
159 #ifdef __cpp_explicit_this_parameter 160 template<std::
size_t i>
161 constexpr decltype(
auto)
162 get(
this auto&&
self) noexcept
164 if constexpr (values::fixed<Extent>) static_assert(i < values::fixed_number_of_v<Extent>,
"Index exceeds range");
166 values::operation {std::plus{}, std::forward<decltype(self)>(
self).offset_, std::integral_constant<std::size_t, i>{}});
169 template<std::
size_t i>
170 constexpr decltype(
auto)
173 if constexpr (values::fixed<Extent>) static_assert(i < values::fixed_number_of_v<Extent>,
"Index exceeds range");
175 values::operation {std::plus{}, offset_, std::integral_constant<std::size_t, i>{}});
178 template<std::
size_t i>
179 constexpr decltype(
auto)
182 if constexpr (values::fixed<Extent>) static_assert(i < values::fixed_number_of_v<Extent>,
"Index exceeds range");
184 values::operation {std::plus{}, offset_, std::integral_constant<std::size_t, i>{}});
187 template<std::
size_t i>
188 constexpr decltype(
auto)
191 if constexpr (values::fixed<Extent>) static_assert(i < values::fixed_number_of_v<Extent>,
"Index exceeds range");
193 values::operation {std::plus{}, offset_, std::integral_constant<std::size_t, i>{}});
196 template<std::
size_t i>
197 constexpr decltype(
auto)
198 get()
const && noexcept
200 if constexpr (values::fixed<Extent>) static_assert(i < values::fixed_number_of_v<Extent>,
"Index exceeds range");
218 template<
typename V,
typename O,
typename E>
224 #ifdef __cpp_lib_ranges 225 namespace std::ranges
227 namespace OpenKalman::ranges
230 template<
typename V,
typename O,
typename E>
231 constexpr
bool enable_borrowed_range<OpenKalman::collections::slice_view<V, O, E>> = enable_borrowed_range<V>;
235 #ifndef __cpp_lib_ranges 238 template<std::
size_t i,
typename V,
typename O,
typename =
void>
241 using type = ranges::range_value_t<V>;
244 template<std::
size_t i,
typename V,
typename O>
246 : std::tuple_element<values::fixed_number_of_v<O> + i, std::decay_t<V>> {};
253 template<
typename V,
typename O,
typename E>
257 #ifdef __cpp_lib_ranges 258 template<
size_t i,
typename V, OpenKalman::values::fixed O,
typename E>
260 : tuple_element<OpenKalman::values::fixed_number_of_v<O> + i, std::decay_t<V>> {};
262 template<
size_t i,
typename V,
typename O,
typename E> requires (not OpenKalman::values::fixed<O>)
265 using type = ranges::range_value_t<V>;
268 template<
size_t i,
typename V,
typename O,
typename E>
279 template<
typename O,
typename E>
281 #if __cpp_lib_ranges >= 202202L
282 : std::ranges::range_adaptor_closure<slice_closure<O, E>>
287 constexpr
slice_closure(O o, E e) : offset_ {std::move(o)}, extent_ {std::move(e)} {};
289 #ifdef __cpp_concepts 290 template<viewable_collection R>
292 template<
typename R, std::enable_if_t<viewable_collection<R>,
int> = 0>
295 operator() (R&& r)
const 297 return slice_view {all(std::forward<R>(r)), offset_, extent_};
308 #ifdef __cpp_concepts 309 template<values::index O, values::index E>
311 template<
typename O,
typename E, std::enable_if_t<values::index<O> and values::index<E>,
int> = 0>
314 operator() (O o, E e)
const 320 #ifdef __cpp_concepts 321 template<collection V, values::index O, values::index E>
323 template<
typename V,
typename O,
typename E, std::enable_if_t<collection<V> and values::index<O> and values::index<E>,
int> = 0>
326 operator() (V&& t, O o, E e)
const 328 return slice_view {all(std::forward<V>(t)), std::move(o), std::move(e)};
347 #endif //OPENKALMAN_COLLECTIONS_VIEWS_SLICE_HPP Definition for values::index.
Namespace for collections.
Definition: collections.hpp:27
Definition for collections::get.
Definition for collections::collection.
constexpr auto size() const noexcept
Definition: slice.hpp:152
constexpr slice_view(const V &v, Offset offset, Extent extent)
Construct from a collection.
Definition: slice.hpp:71
decltype(auto) constexpr get(Arg &&arg, I i)
A generalization of std::get.
Definition: get.hpp:62
An operation involving some number of values.
Definition: operation.hpp:69
Definition: view_interface.hpp:32
Definition for collections::sized_random_access_range.
Definition: tuple_reverse.hpp:103
constexpr slice_view()
Default constructor.
Definition: slice.hpp:63
Definition: range-access.hpp:25
slice_view(const V &, const O &, const E &) -> slice_view< V, O, E >
Deduction guide.
Definition: slice.hpp:239
Definition: slice.hpp:306
The fixed number associated with a values::fixed.
Definition: fixed_number_of.hpp:45
constexpr V & base() &
The base view.
Definition: slice.hpp:87
constexpr auto end() &
Definition: slice.hpp:137
Definition: range_adaptor_closure.hpp:35
Namespace for generalized views.
Definition: collections.hpp:33
constexpr detail::slice_adapter slice
a RangeAdapterObject associated with slice_view.
Definition: slice.hpp:342
A view representing a slice of a collection.
Definition: slice.hpp:52
Definition: slice.hpp:280
constexpr bool index
T is an index value.
Definition: index.hpp:56
constexpr auto begin() &
Definition: slice.hpp:119
Definition: gettable.hpp:27
Definition for collections::viewable_collection.
constexpr std::size_t dynamic_size
A constant indicating that a size or index is dynamic.
Definition: global-definitions.hpp:33
decltype(auto) constexpr get() &
Get element i.
Definition: slice.hpp:171
constexpr auto get_size(Arg &&arg)
Get the size of a sized object (e.g, a collection)
Definition: get_size.hpp:191
constexpr slice_view(V &&v, Offset offset, Extent extent)
Definition: slice.hpp:76