17 #ifndef OPENKALMAN_COORDINATES_GET_DESCRIPTOR_COLLECTION_ELEMENT_HPP 18 #define OPENKALMAN_COORDINATES_GET_DESCRIPTOR_COLLECTION_ELEMENT_HPP 20 #include <type_traits> 21 #include "linear-algebra/coordinates/interfaces/coordinate_descriptor_traits.hpp" 29 template<values::number Scalar>
31 template<
typename Scalar>
41 template<
typename T1,
typename T2>
44 template<
typename Scalar1,
typename Scalar2>
47 template<
typename Scalar,
typename T>
50 template<
typename T,
typename Scalar>
55 template<
typename T1,
typename T2>
57 template<
typename T1,
typename T2,
typename =
void>
62 template<
typename T1, std::common_with<T1> T2>
65 template<typename T1, typename T2>
68 : std::common_type<T1, T2> {};
72 template<
typename Tup, std::
size_t i = 0>
74 template<
typename Tup, std::
size_t i = 0,
typename =
void>
79 template<
typename Tup, std::
size_t i> requires (i + 1 == std::tuple_size_v<Tup>)
82 template<typename Tup, std::size_t i>
86 using type = std::decay_t<std::tuple_element_t<i, Tup>>;
90 template<
typename Tup, std::
size_t i> requires (i + 1 < std::tuple_size_v<Tup>)
93 template<typename Tup, std::size_t i>
97 using type = typename common_descriptor_tuple_element_impl<std::tuple_element_t<i, Tup>,
98 typename common_descriptor_tuple_element<Tup, i + 1>::type>::type;
108 #ifdef __cpp_concepts
109 template<descriptor_collection Arg, values::index I>
111 template<typename Arg, typename I, std::enable_if_t<descriptor_collection<Arg> and values::index<I>, int> = 0>
114 get_descriptor_collection_element(Arg&& arg, const I i)
116 if constexpr (collections::sized_random_access_range<Arg>)
118 return collections::get(std::forward<Arg>(arg), std::move(i));
120 else if constexpr (std::tuple_size_v<std::decay_t<Arg>> == 0)
122 return std::integral_constant<std::size_t, 0>{};
124 else if constexpr (std::tuple_size_v<std::decay_t<Arg>> == 1)
126 return collections::get(std::forward<Arg>(arg), std::move(i));
130 using Common = typename detail::common_descriptor_tuple_element<std::decay_t<Arg>>::type;
131 return collections::get(static_cast<Common>(std::forward<Arg>(arg)), std::move(i));
Definition: get_component_start_indices.hpp:29
Definition: tuple_reverse.hpp:103
Definition: get_descriptor_collection_element.hpp:42
Definition: get_descriptor_collection_element.hpp:76
Definition for coordinates::descriptor.
Definition: compares_with.hpp:28
Definition for pattern_range.
Definition: get_descriptor_collection_element.hpp:59
Definition for coordinates::descriptor_collection.