#ifndef RFL_INTERNAL_TUPLE_CONCAT_HPP_ #define RFL_INTERNAL_TUPLE_CONCAT_HPP_ #include #include "../../Tuple.hpp" namespace rfl::internal::tuple { template struct TupleWrapper { rfl::Tuple tuple_; }; template auto wrap_tuple(const rfl::Tuple& _tuple) { return TupleWrapper{_tuple}; } template auto wrap_tuple(rfl::Tuple&& _tuple) { return TupleWrapper{std::forward >(_tuple)}; } template auto concat_two(rfl::Tuple&& _t1, rfl::Tuple&& _t2, std::integer_sequence, std::integer_sequence) { return rfl::Tuple(std::move(rfl::get<_is>(_t1))..., std::move(rfl::get<_js>(_t2))...); } template auto operator+(TupleWrapper&& _t1, TupleWrapper&& _t2) { return TupleWrapper{ .tuple_ = concat_two(std::move(_t1.tuple_), std::move(_t2.tuple_), std::make_integer_sequence(), std::make_integer_sequence())}; } template auto concat(const Head& _head, const Tail&... _tail) { return (wrap_tuple(_head) + ... + wrap_tuple(_tail)); } template auto concat(Head&& _head, Tail&&... _tail) { return (wrap_tuple(std::forward(_head)) + ... + wrap_tuple(std::forward(_tail))) .tuple_; } } // namespace rfl::internal::tuple #endif