/* Zeta API - Z/classes/Tuple.hpp ______ ______________ ___ |__ / | ___|___ ___|/ \ / /__| __| | | / - \ /______|_____| |__| /__/ \__\ Copyright (C) 2006-2024 Manuel Sainz de Baranda y Goñi. Released under the terms of the GNU Lesser General Public License v3. */ #ifndef Z_classes_Tuple_HPP #define Z_classes_Tuple_HPP #include #if Z_DIALECT_HAS(CPP11, EXTENDED_VARIADIC_TEMPLATE_TEMPLATE_PARAMETERS) /* ¿No es necesario, basta con VARIADIC_TEMPLATE? */ # include # define Z_HAS_Tuple 1 namespace Zeta {namespace ZetaDetail {namespace Tuple { template struct Element; template struct Super { typedef Element, 1>::type> type; }; template struct Element > { typedef t0 type; type value; Z_INLINE Element() Z_DEFAULTED({}) Z_CT(CPP11) Element(typename Zeta::Type::to_forwardable value) : value(value) {} }; template struct Element > : Super::type { typedef tn type; type value; Z_INLINE Element() Z_DEFAULTED({}) Z_CT(CPP11) Element( typename Zeta::Type::to_forwardable... previous, typename Zeta::Type::to_forwardable value ) : Super::type(previous...), value(value) {} }; }}} namespace Zeta {template class Tuple : public ZetaDetail::Tuple::Super::type { private: typedef typename ZetaDetail::Tuple::Super::type Super; public: template class At { private: enum {tail_size = TypeCount::value - (i + 1)}; public: typedef ZetaDetail::Tuple::Element, tail_size>::type, 1 >::type> Element; typedef typename Element::type type; }; # if !Z_DIALECT_HAS(CPP11, INHERITING_CONSTRUCTORS) using Super::Super; # else Z_INLINE Tuple() Z_DEFAULTED({}) Z_CT(CPP11) Tuple(typename Type::to_forwardable... values) : Super(values...) {} # endif template Z_INLINE typename At::type &at() Z_NOTHROW {return At::Element::value;} template Z_CT(CPP11) typename Type::type>::to_forwardable get() const Z_NOTHROW {return At::Element::value;} template Z_INLINE Tuple &set(typename Type::type>::to_forwardable value) { At::Element::value = value; return *this; } };} # if defined(Z_WITH_STD) && \ Z_DIALECT_HAS(CPP17, STRUCTURED_BINDING) && \ defined(__has_include) && \ __has_include() # include # define Z_z_IMPLEMENTATION(qualifiers) \ \ template \ struct std::tuple_size > { \ enum {value = sizeof...(t)}; \ }; \ \ template \ struct std::tuple_element > { \ typedef typename Zeta::Type::template At::type>::add_const type; \ }; Z_z_IMPLEMENTATION(Z_EMPTY ) Z_z_IMPLEMENTATION(const ) Z_z_IMPLEMENTATION(const volatile) Z_z_IMPLEMENTATION( volatile) # undef Z_z_IMPLEMENTATION # endif #endif #endif // Z_classes_Tuple_HPP