17 #ifndef OPENKALMAN_MAKE_CONSTANT_DIAGONAL_FROM_DESCRIPTORS_HPP 18 #define OPENKALMAN_MAKE_CONSTANT_DIAGONAL_FROM_DESCRIPTORS_HPP 30 template<
typename T,
typename C,
typename Descriptors>
31 static constexpr decltype(
auto)
32 make_constant_diagonal_from_descriptors(C&& c, Descriptors&& descriptors)
34 if constexpr (coordinates::pattern_collection<Descriptors>)
36 auto new_descriptors = std::tuple_cat(
37 std::tuple(internal::smallest_pattern<scalar_type_of_t<T>>(
38 std::get<0>(std::forward<Descriptors>(descriptors)), std::get<1>(std::forward<Descriptors>(descriptors)))),
39 internal::tuple_slice<2, collections::size_of_v<Descriptors>>(descriptors));
40 return make_constant<T>(std::forward<C>(c), new_descriptors);
44 #if __cpp_lib_containers_ranges >= 202202L and __cpp_lib_ranges_concat >= 202403L 45 auto new_indices = std::views::concat(
46 internal::smallest_pattern<scalar_type_of_t<T>>(std::ranges::views::take(indices, 2)),
47 indices | std::ranges::views::drop(2));
49 auto it = stdex::ranges::begin(descriptors);
50 auto new_descriptors = std::vector<std::decay_t<decltype(*it)>>{};
53 if (i1 == end(descriptors))
57 else if (i0 != end(descriptors))
59 auto d0 = internal::smallest_pattern<scalar_type_of_t<T>>(*i0, *i1);
60 new_descriptors.emplace_back(d0);
61 std::copy(++it, stdex::ranges::end(descriptors), ++stdex::ranges::begin(new_descriptors));
64 return make_constant<T>(std::forward<C>(c), new_descriptors);
Definition for pattern_collection.
Definition for coordinates::pattern.
Dimensions< 1 > Axis
Alias for a 1D Euclidean coordinates::pattern object.
Definition: Dimensions.hpp:171
Definition: basics.hpp:48