16 #ifndef OPENKALMAN_DIAGONAL_OF_HPP 17 #define OPENKALMAN_DIAGONAL_OF_HPP 30 template<indexible Arg> requires (index_count_v<Arg> == stdex::dynamic_extent) or (index_count_v<Arg> <= 2)
33 template<
typename Arg, std::enable_if_t<(index_count_v<Arg> == stdex::dynamic_extent or index_count_v<Arg> <= 2),
int> = 0>
34 constexpr decltype(auto)
36 diagonal_of(Arg&& arg)
38 if constexpr (diagonal_matrix<Arg> and
internal::has_nested_vector<Arg>)
40 return nested_
object(std::forward<Arg>(arg));
42 else if constexpr (diagonal_matrix<Arg> and
internal::has_nested_vector<Arg, 1>)
44 return transpose(nested_
object(std::forward<Arg>(arg)));
46 else if constexpr (one_dimensional<Arg>)
48 return std::forward<Arg>(arg);
50 else if constexpr (constant_
object<Arg>)
52 auto ds = get_pattern_collection(std::forward<Arg>(arg));
53 if constexpr (pattern_collection<decltype(ds)>)
55 return
internal::make_constant_diagonal_from_descriptors<Arg>(
56 constant_value {std::forward<Arg>(arg)},
57 std::tuple_cat(ds, std::tuple{coordinates::Axis{}, coordinates::Axis{}}));
61 return
internal::make_constant_diagonal_from_descriptors<Arg>(constant_value {std::forward<Arg>(arg)}, ds);
64 else if constexpr (constant_diagonal_
object<Arg>)
66 auto ds = get_pattern_collection(std::forward<Arg>(arg));
67 if constexpr (pattern_collection<decltype(ds)>)
69 return
internal::make_constant_diagonal_from_descriptors<Arg>(
70 constant_diagonal_value {std::forward<Arg>(arg)},
71 std::tuple_cat(get_pattern_collection(std::forward<Arg>(arg)), std::tuple{coordinates::Axis{}, coordinates::Axis{}}));
75 return
internal::make_constant_diagonal_from_descriptors<Arg>(constant_diagonal_value {std::forward<Arg>(arg)}, ds);
80 return
interface::library_
interface<stdex::remove_cvref_t<Arg>>::diagonal_of(std::forward<Arg>(arg));
Definition for constant_object.
constexpr bool indexible
T is a multidimensional array type.
Definition: indexible.hpp:32
The root namespace for OpenKalman.
Definition: basics.hpp:34