17 #ifndef OPENKALMAN_COORDINATES_VIEWS_COMPARISON_HPP 18 #define OPENKALMAN_COORDINATES_VIEWS_COMPARISON_HPP 42 #ifdef __cpp_lib_ranges 43 template<descriptor_collection T>
47 struct comparison_view : collections::collection_view_interface<comparison_view<T>>
50 constexpr
comparison_view() requires std::default_initializable<T> =
default;
52 template<
typename aT = T, std::enable_if_t<std::is_default_constructible_v<aT>,
int> = 0>
58 template<
typename Arg> requires std::constructible_from<T, Arg&&>
60 template<
typename Arg, std::enable_if_t<std::is_constructible_v<T, Arg&&>,
int> = 0>
62 explicit constexpr
comparison_view(Arg&& arg) : t {std::forward<Arg>(arg)} {}
65 #ifdef __cpp_explicit_this_parameter 66 template<values::index I> requires (values::fixed<I> or sized_random_access_range<T>) and
67 (values::dynamic<I> or collections::dimension_of_v<T> ==
dynamic_size or (values::fixed_number_of_v<I> < collections::dimension_of_v<T>))
68 constexpr decltype(
auto)
69 operator[](
this auto&&
self, I i)
71 return internal::get_descriptor_collection_element(std::forward<decltype(
self)>(
self).t, std::move(i));
74 template<
typename I, std::enable_if_t<values::index<I> and (values::fixed<I> or sized_random_access_range<T>),
int> = 0>
75 constexpr decltype(
auto)
76 operator[](I i)
const &
78 if constexpr(values::fixed<I> and collections::dimension_of_v<T> !=
dynamic_size) static_assert(values::fixed_number_of_v<I> < collections::dimension_of_v<T>);
79 return internal::get_descriptor_collection_element(t, std::move(i));
83 template<
typename I, std::enable_if_t<values::index<I> and (values::fixed<I> or sized_random_access_range<T>),
int> = 0>
84 constexpr decltype(
auto)
87 if constexpr(values::fixed<I> and collections::dimension_of_v<T> !=
dynamic_size) static_assert(values::fixed_number_of_v<I> < collections::dimension_of_v<T>);
88 return internal::get_descriptor_collection_element(std::move(*this).t, std::move(i));
96 constexpr
auto size()
const 111 template<
typename Arg>
117 #ifndef __cpp_concepts 121 struct tuple_size<
OpenKalman::coordinates::comparison_view<T>> : tuple_size<OpenKalman::collection_view_interface<OpenKalman::coordinates::comparison_view<T>>> {};
123 template<
size_t i,
typename T>
124 struct tuple_element<i, OpenKalman::coordinates::comparison_view<T>> : tuple_element<i, OpenKalman::collection_view_interface<OpenKalman::coordinates::comparison_view<T>>> {};
134 #if __cpp_lib_ranges >= 202202L
135 : std::ranges::range_adaptor_closure<comparison_impl>
138 #ifdef __cpp_concepts 139 template<descriptor_collection R>
141 template<
typename R, std::enable_if_t<descriptor_collection<R>,
int> = 0>
144 operator() [[nodiscard]] (R&& r)
const {
return comparison_view<R> {std::forward<R>(r)}; }
161 #endif //OPENKALMAN_COORDINATES_VIEWS_COMPARISON_HPP Definition for values::index.
Definition for collections::sized_random_access_range.
constexpr detail::comparison_impl comparison
a RangeAdapterObject associated with comparison_view.
Definition: comparison.hpp:155
Definition: tuple_reverse.hpp:103
Definition for collections::get_size.
The root namespace for OpenKalman.
Definition: basics.hpp:34
Definition: compares_with.hpp:28
Definition: comparison.hpp:129
constexpr bool index
T is an index value.
Definition: index.hpp:56
constexpr std::size_t dynamic_size
A constant indicating that a size or index is dynamic.
Definition: global-definitions.hpp:33
Definition: comparison.hpp:47
constexpr auto get_size(Arg &&arg)
Get the size of a sized object (e.g, a collection)
Definition: get_size.hpp:191
Definition for coordinates::descriptor_collection.
Definition: comparison.hpp:133