16 #ifndef OPENKALMAN_MAKE_DENSE_OBJECT_FROM_HPP 17 #define OPENKALMAN_MAKE_DENSE_OBJECT_FROM_HPP 35 template<indexible T, Layout layout = Layout::none, values::number Scalar = scalar_type_of_t<T>, coordinates::pattern...Ds, std::convertible_to<const Scalar> ... Args>
37 (((coordinates::dimension_of_v<Ds> == 0) or ...) ?
sizeof...(Args) == 0 :
38 (
sizeof...(Args) % ((dynamic_pattern<Ds> ? 1 : coordinates::dimension_of_v<Ds>) * ... * 1) == 0))
41 template<
typename T, Layout layout = Layout::none,
typename Scalar = scalar_type_of_t<T>,
typename...Ds,
typename...Args, std::enable_if_t<
42 indexible<T> and values::number<Scalar> and (coordinates::pattern<Ds> and ...) and
43 (std::is_convertible_v<Args, const Scalar> and ...) and (layout != Layout::str
ide) and
44 (((coordinates::dimension_of<Ds>::value == 0) or ...) ? sizeof...(Args) == 0 :
45 (sizeof...(Args) % ((dynamic_pattern<Ds> ? 1 : coordinates::dimension_of<Ds>::value) * ... * 1) == 0)),
int> = 0>
50 auto m = make_dense_object<T, layout, Scalar>(d_tup);
51 if constexpr (
sizeof...(Args) > 0)
54 return fill_components<l>(m,
static_cast<const Scalar
>(args)...);
62 template<
typename T, std::size_t...Is>
63 constexpr
bool zero_dimension_count_impl(std::index_sequence<Is...>)
65 return ((dimension_size_of_index_is<T, Is, 0> ? 1 : 0) + ... + 0);
71 zero_dimension_count_impl<T>(std::make_index_sequence<index_count_v<T>>{})> {};
74 template<
typename T,
Layout layout,
typename Scalar, std::size_t...I,
typename...Args>
75 inline auto make_dense_object_from_impl(std::index_sequence<I...>, Args...args)
78 if constexpr (dynamic_dimension<T, I>)
80 constexpr
auto dims = ((dynamic_dimension<T, I> ? 1 : index_dimension_of_v<T, I>) * ... * 1);
86 return make_dense_object_from<T, layout, Scalar>(d_tup, args...);
103 #ifdef __cpp_concepts 104 template<indexible T, Layout layout = Layout::none, values::number Scalar = scalar_type_of_t<T>, std::convertible_to<const Scalar> ... Args>
105 requires (layout !=
Layout::stride) and internal::may_hold_components<T, Args...> and
109 template<
typename T, Layout layout = Layout::none,
typename Scalar = scalar_type_of_t<T>,
typename ... Args, std::enable_if_t<
110 indexible<T> and values::number<Scalar> and (std::is_convertible_v<Args, const Scalar> and ...) and
111 (layout != Layout::str
ide) and
internal::may_hold_components<T, Args...> and
112 (dynamic_index_count_v<T> + detail::zero_dimension_count<T>::value <= 1),
int> = 0>
115 make_dense_
object_from(Args...args)
117 constexpr std::make_index_sequence<index_count_v<T>> seq;
118 return detail::make_dense_
object_from_impl<T, layout, Scalar>(seq, args...);
Row-major storage (C or C++ style): contiguous storage in which the right-most index has a stride of ...
No storage layout (e.g., if the elements are calculated rather than stored).
The root namespace for OpenKalman.
Definition: basics.hpp:34
A generalization of the above: a custom stride is specified for each index.
typename vector_space_descriptor_of< T, N >::type vector_space_descriptor_of_t
helper template for vector_space_descriptor_of.
Definition: vector_space_descriptor_of.hpp:56
Layout
The layout format of a multidimensional array.
Definition: global-definitions.hpp:47
A structure representing the dimensions associated with of a particular index.
Definition: Dimensions.hpp:42
Definition: make_dense_object_from.hpp:70
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:48