17 #ifndef OPENKALMAN_MAKE_FIXED_SIZE_ADAPTER_HPP 18 #define OPENKALMAN_MAKE_FIXED_SIZE_ADAPTER_HPP 24 template<
typename DTup,
typename Arg, std::size_t...Ix>
25 constexpr decltype(
auto)
26 make_fixed_size_adapter_impl(Arg&& arg,
std::index_sequence<Ix...> seq)
28 return FixedSizeAdapter<Arg,
29 std::tuple<decltype(best_vector_space_descriptor(get_vector_space_descriptor(std::declval<Arg>(), Ix),
30 std::get<Ix>(std::declval<DTup>())))...>> {std::forward<Arg>(arg)};
43 template<pattern_tuple Descriptors, compatible_with_vector_space_descriptor_collection<Descriptors> Arg>
45 template<
typename Descriptors,
typename Arg, std::enable_if_t<pattern_tuple<Descriptors> and
46 compatible_with_vector_space_descriptor_collection<Arg, Descriptors>,
int> = 0>
48 constexpr decltype(
auto)
49 make_fixed_size_adapter(Arg&& arg)
51 if constexpr (fixed_size_adapter<Arg>)
53 return make_fixed_size_adapter<Descriptors>(
nested_object(std::forward<Arg>(arg)));
55 else if constexpr (internal::less_fixed_than<Arg, Descriptors>)
57 using DTup = std::decay_t<decltype(remove_trailing_1D_descriptors(std::declval<Descriptors>()))>;
58 std::make_index_sequence<std::tuple_size_v<DTup>> seq {};
59 return detail::make_fixed_size_adapter_impl<DTup>(std::forward<Arg>(arg), seq);
63 return std::forward<Arg>(arg);
74 template<
typename...Ds,
typename Arg, std::enable_if_t<(... and coordinates::pattern<Ds>) and
77 constexpr decltype(
auto)
88 template<indexible Arg, pattern_tuple Descriptors>
89 requires compatible_with_vector_space_descriptor_collection<Arg, Descriptors>
91 template<
typename Arg,
typename Descriptors, std::enable_if_t<indexible<Arg> and pattern_tuple<Descriptors> and
92 compatible_with_vector_space_descriptor_collection<Arg, Descriptors>,
int> = 0>
94 constexpr decltype(
auto)
95 make_fixed_size_adapter(Arg&& arg, Descriptors&&)
97 return make_fixed_size_adapter<Descriptors>(std::forward<Arg>(arg));
103 #endif //OPENKALMAN_MAKE_FIXED_SIZE_ADAPTER_HPP Definition: tuple_reverse.hpp:103
decltype(auto) constexpr make_fixed_size_adapter(Arg &&arg)
Make the best possible FixedSizeAdapter, if applicable, based on a set of vector space descriptors...
Definition: make_fixed_size_adapter.hpp:49
constexpr bool compatible_with_vector_space_descriptor_collection
indexible T is compatible with pattern_collection D.
Definition: compatible_with_vector_space_descriptor_collection.hpp:74
decltype(auto) constexpr nested_object(Arg &&arg)
Retrieve a nested object of Arg, if it exists.
Definition: nested_object.hpp:34
Definition: basics.hpp:48