#pragma once #include "fl/cstddef.h" #include "fl/utility.h" #include "fl/type_traits.h" namespace fl { // Forward declaration template struct tuple; // Empty-tuple specialization template<> struct tuple<> {}; // Recursive tuple: head + tail template struct tuple { Head head; tuple tail; tuple() = default; tuple(const Head& h, const Tail&... t) : head(h), tail(t...) {} tuple(Head&& h, Tail&&... t) : head(fl::move(h)), tail(fl::forward(t)...) {} }; // tuple_size template struct tuple_size; template struct tuple_size< tuple > : integral_constant {}; // tuple_element template struct tuple_element; template struct tuple_element<0, tuple> { using type = Head; }; template struct tuple_element> : tuple_element> {}; // get(tuple) template typename enable_if::type get(tuple& t) { return t.head; } template typename enable_if>::type&>::type get(tuple& t) { return get(t.tail); } // const overloads template typename enable_if::type get(const tuple& t) { return t.head; } template typename enable_if>::type&>::type get(const tuple& t) { return get(t.tail); } // rvalue overloads template typename enable_if::type get(tuple&& t) { return fl::move(t.head); } template typename enable_if>::type&&>::type get(tuple&& t) { return get(fl::move(t.tail)); } // make_tuple template tuple::type...> make_tuple(Ts&&... args) { return tuple::type...>(fl::forward(args)...); } } // namespace fl