#ifndef RFL_INTERNAL_TO_FLATTENED_PTR_TUPLE_HPP_ #define RFL_INTERNAL_TO_FLATTENED_PTR_TUPLE_HPP_ #include "../Tuple.hpp" #include "../tuple_cat.hpp" #include "has_flatten_fields.hpp" #include "is_flatten_field.hpp" #include "to_ptr_tuple.hpp" namespace rfl { namespace internal { template auto flatten_ptr_tuple(PtrTuple&& _t) { if constexpr (!has_flatten_fields()) { return std::forward(_t); } else { const auto get_one = [&](std::integral_constant) { using T = tuple_element_t<_i, std::remove_cvref_t>; if constexpr (is_flatten_field_v) { return flatten_ptr_tuple(to_ptr_tuple(rfl::get<_i>(_t)->get())); } else { return rfl::make_tuple(rfl::get<_i>(_t)); } }; constexpr auto size = rfl::tuple_size_v>; return [&](std::integer_sequence) { return rfl::tuple_cat(get_one(std::integral_constant{})...); } (std::make_integer_sequence()); } } template auto to_flattened_ptr_tuple(T&& _t) { return flatten_ptr_tuple(to_ptr_tuple(_t)); } } // namespace internal } // namespace rfl #endif