16 #ifndef OPENKALMAN_OBJECT_TRAITS_DEFINED_HPP 17 #define OPENKALMAN_OBJECT_TRAITS_DEFINED_HPP 19 #include <type_traits> 33 concept scalar_type_defined_for = values::number<typename indexible_object_traits<std::decay_t<T>>::scalar_type>;
37 template<
typename T,
typename =
void>
56 concept count_indices_defined_for = requires (T t) {
62 template<
typename T,
typename =
void>
67 values::index<decltype(indexible_object_traits<std::decay_t<T>>::count_indices(std::declval<T>()))>>>
82 concept get_vector_space_descriptor_defined_for = requires (T t) {
84 t, std::integral_constant<std::size_t, 0>{})} -> coordinates::coordinates::pattern;
89 template<
typename T,
typename =
void>
94 decltype(indexible_object_traits<std::decay_t<T>>::get_vector_space_descriptor(
95 std::declval<T>(), std::integral_constant<std::size_t, 0>{}))>>>
108 #ifdef __cpp_concepts 110 concept nested_object_defined_for = requires (T&& t) {
116 template<
typename T,
typename =
void>
121 count_indices_defined_for<decltype(indexible_object_traits<std::decay_t<T>>::nested_object(std::declval<T&&>()))>>>
134 #ifdef __cpp_concepts 137 template<
typename T,
typename =
void>
142 #ifdef __cpp_concepts 147 struct get_constant_result_type<T,
std::void_t<
148 decltype(indexible_object_traits<std::decay_t<T>>::get_constant(std::declval<T>()))>>
159 #ifdef __cpp_concepts 162 template<
typename T,
typename =
void>
167 #ifdef __cpp_concepts 172 struct get_constant_diagonal_result_type<T,
std::void_t<
173 decltype(indexible_object_traits<std::decay_t<T>>::get_constant_diagonal(std::declval<T>()))>>
184 #ifdef __cpp_concepts 185 template<
typename T, Applicability b = Applicability::guaranteed>
186 concept one_dimensional_defined_for = std::convertible_to<
191 template<
typename T, Applicability b,
typename =
void>
194 template<
typename T, Applicability b>
196 decltype(indexible_object_traits<std::decay_t<T>>::template one_dimensional<b>), bool>>>
200 template<
typename T, Applicability b = Applicability::guaranteed>
204 template<
typename T, Applicability b,
typename =
void>
207 template<
typename T, Applicability b>
217 #ifdef __cpp_concepts 218 template<
typename T, Applicability b = Applicability::guaranteed>
219 concept is_square_defined_for = std::convertible_to<
224 template<
typename T, Applicability b,
typename =
void>
227 template<
typename T, Applicability b>
229 decltype(indexible_object_traits<std::decay_t<T>>::template is_square<b>), bool>>>
233 template<
typename T, Applicability b = Applicability::guaranteed>
242 #ifdef __cpp_concepts 243 template<
typename T, TriangleType t>
248 template<
typename T, TriangleType t,
typename =
void>
251 template<
typename T, TriangleType t>
256 template<
typename T, TriangleType t>
265 #ifdef __cpp_concepts 267 concept is_triangular_adapter_defined_for = std::convertible_to<
272 template<
typename T,
typename =
void>
277 decltype(indexible_object_traits<std::decay_t<T>>::is_triangular_adapter), bool>>>
290 #ifdef __cpp_concepts 292 concept is_hermitian_defined_for = std::convertible_to<
297 template<
typename T,
typename =
void>
302 decltype(indexible_object_traits<std::decay_t<T>>::is_hermitian), bool>>>
310 template<
typename T,
typename =
void>
323 #ifdef __cpp_concepts 325 concept hermitian_adapter_type_defined_for = std::convertible_to<
330 template<
typename T,
typename =
void>
335 decltype(indexible_object_traits<std::decay_t<T>>::hermitian_adapter_type), HermitianAdapterType>>>
348 #ifdef __cpp_concepts 350 concept is_writable_defined_for = std::convertible_to<
355 template<
typename T,
typename =
void>
360 decltype(indexible_object_traits<std::decay_t<T>>::is_writable), bool>>>
368 template<
typename T,
typename =
void>
372 struct is_explicitly_writable<T, std::enable_if_t<indexible_object_traits<std::decay_t<T>>::is_writable>> : std::true_type {};
380 #ifdef __cpp_concepts 386 template<
typename T,
typename =
void>
391 values::value<decltype(*indexible_object_traits<std::decay_t<T>>::raw_data(std::declval<T>()))>>>
404 #ifdef __cpp_concepts 406 concept layout_defined_for = requires(T t) {
412 template<
typename T,
typename =
void>
417 std::decay_t<decltype(indexible_object_traits<std::decay_t<T>>::layout)>, const Layout>>>
430 #ifdef __cpp_concepts 436 template<
typename T,
typename =
void>
452 #endif //OPENKALMAN_OBJECT_TRAITS_DEFINED_HPP Definition: object-traits-defined.hpp:273
constexpr auto count_indices(const T &t)
Get the number of indices available to address the components of an indexible object.
Definition: count_indices.hpp:33
Definition for values::index.
Forward declaration of indexible_object_traits, which must be defined for all objects used in OpenKal...
Definition: object-traits-defined.hpp:331
Definition: object-traits-defined.hpp:356
Definition: indexible_object_traits.hpp:36
Definition: basics.hpp:41
Definition: object-traits-defined.hpp:139
Definition: object-traits-defined.hpp:225
Definition: object-traits-defined.hpp:63
Definition: tuple_reverse.hpp:103
Definition: object-traits-defined.hpp:387
HermitianAdapterType
The type of a hermitian adapter, indicating which triangle of the nested matrix is used...
Definition: global-definitions.hpp:78
constexpr bool value
T is numerical value or is reducible to a numerical value.
Definition: value.hpp:31
Definition: object-traits-defined.hpp:311
Definition: object-traits-defined.hpp:249
Definition: object-traits-defined.hpp:90
Definition: object-traits-defined.hpp:192
Definition: object-traits-defined.hpp:413
Definition: object-traits-defined.hpp:205
Definition: object-traits-defined.hpp:164
constexpr bool index
T is an index value.
Definition: index.hpp:56
Definition: object-traits-defined.hpp:38
Definition: object-traits-defined.hpp:298
Definition: object-traits-defined.hpp:369
Definition for values::number.
decltype(auto) constexpr nested_object(Arg &&arg)
Retrieve a nested object of Arg, if it exists.
Definition: nested_object.hpp:34
Definition: object-traits-defined.hpp:117
Global definitions for OpenKalman.
Definition: object-traits-defined.hpp:437
constexpr auto get_vector_space_descriptor(const T &t, const N &n)
Get the coordinates::pattern object for index N of indexible object T.
Definition: get_vector_space_descriptor.hpp:56