16 #ifndef OPENKALMAN_MAKE_DENSE_OBJECT_FROM_HPP 17 #define OPENKALMAN_MAKE_DENSE_OBJECT_FROM_HPP 36 template<indexible T,
internal::layout_mapping_policy layout = stdex::layout_right, values::number Scalar = element_type_of_t<T>, coordinates::pattern...Ds, std::convertible_to<const Scalar> ... Args>
37 requires (std::same_as<layout, stdex::layout_right> or std::same_as<layout, stdex::layout_left>) and
38 (((coordinates::dimension_of_v<Ds> == 0) or ...) ?
sizeof...(Args) == 0 :
39 (
sizeof...(Args) % ((dynamic_pattern<Ds> ? 1 : coordinates::dimension_of_v<Ds>) * ... * 1) == 0))
42 template<
typename T,
typename layout = stdex::layout_right,
typename Scalar = element_type_of_t<T>,
typename...Ds,
typename...Args, std::enable_if_t<
43 indexible<T> and values::number<Scalar> and (coordinates::pattern<Ds> and ...) and
44 (stdex::convertible_to<Args, const Scalar> and ...) and
45 (stdex::same_as<layout, stdex::layout_right> or stdex::same_as<layout, stdex::layout_left>) and
46 (((coordinates::dimension_of<Ds>::value == 0) or ...) ? sizeof...(Args) == 0 :
47 (sizeof...(Args) % ((dynamic_pattern<Ds> ? 1 : coordinates::dimension_of<Ds>::value) * ... * 1) == 0)),
int> = 0>
52 auto m = make_dense_object<T, layout, Scalar>(d_tup);
53 if constexpr (
sizeof...(Args) > 0)
55 return fill_components<layout>(m,
static_cast<const Scalar
>(args)...);
63 template<
typename T, std::size_t...Is>
66 return ((dimension_size_of_index_is<T, Is, 0> ? 1 : 0) + ... + 0);
72 zero_dimension_count_impl<T>(std::make_index_sequence<index_count_v<T>>{})> {};
75 template<
typename T,
typename layout,
typename Scalar, std::size_t...I,
typename...Args>
79 if constexpr (dynamic_dimension<T, I>)
81 constexpr
auto dims = ((dynamic_dimension<T, I> ? 1 : index_dimension_of_v<T, I>) * ... * 1);
85 else return std::decay_t<decltype(get_pattern_collection(std::declval<T>(), std::integral_constant<std::size_t, I>{}))> {};
87 return make_dense_object_from<T, layout, Scalar>(d_tup, args...);
103 #ifdef __cpp_concepts 104 template<indexible T,
internal::layout_mapping_policy layout = stdex::layout_right, values::number Scalar = element_type_of_t<T>, std::convertible_to<const Scalar> ... Args>
105 requires (std::same_as<layout, stdex::layout_right> or std::same_as<layout, stdex::layout_left>) and internal::may_hold_components<T, Args...> and
109 template<
typename T,
typename layout = std::compat::layout_right,
typename Scalar = element_type_of_t<T>,
typename ... Args, std::enable_if_t<
110 indexible<T> and values::number<Scalar> and (stdex::convertible_to<Args, const Scalar> and ...) and
111 (stdex::same_as<layout, stdex::layout_right> or stdex::same_as<layout, stdex::layout_left>) and
112 internal::may_hold_components<T, Args...> and
113 (dynamic_index_count_v<T> + detail::zero_dimension_count<T>::value <= 1),
int> = 0>
116 make_dense_
object_from(Args...args)
118 constexpr std::make_index_sequence<index_count_v<T>> seq;
119 return detail::make_dense_
object_from_impl<T, layout, Scalar>(seq, args...);
Definition for layout_mapping_policy.
The root namespace for OpenKalman.
Definition: basics.hpp:34
A structure representing the dimensions associated with of a particular index.
Definition: Dimensions.hpp:42
Definition: trait_backports.hpp:64
Definition: make_dense_object_from.hpp:71
auto make_dense_object_from(const std::tuple< Ds... > &d_tup, Args...args)
Create a dense, writable matrix from the library of which dummy type T is a member, filled with a set of scalar components.
Definition: make_dense_object_from.hpp:50