/*============================================================================= Copyright (c) 2011-2014 Bolero MURAKAMI https://github.com/bolero-MURAKAMI/Sprout Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) =============================================================================*/ #ifndef SPROUT_INDEX_TUPLE_TUPLE_HPP #define SPROUT_INDEX_TUPLE_TUPLE_HPP #include #include #include #include #include #include #include namespace std { #if defined(__clang__) # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wmismatched-tags" #endif // // tuple_size // template struct tuple_size > : public sprout::integral_constant {}; // // tuple_element // template struct tuple_element > { static_assert(I < sizeof...(Is), "tuple_element<>: index out of range"); public: typedef typename sprout::pack_element_c::type type; }; #if !(SPROUT_USE_TEMPLATE_ALIASES && !defined(SPROUT_WORKAROUND_NO_TEMPLATE_ARGUMENT_DEDUCTION_WITH_ALIASES)) // // tuple_size // template struct tuple_size > : public std::tuple_size > {}; // // tuple_element // template struct tuple_element > : public std::tuple_element > {}; // // tuple_size // template struct tuple_size > : public std::tuple_size > {}; // // tuple_element // template struct tuple_element > : public std::tuple_element > {}; #endif // #if !(SPROUT_USE_TEMPLATE_ALIASES && !defined(SPROUT_WORKAROUND_NO_TEMPLATE_ARGUMENT_DEDUCTION_WITH_ALIASES)) #if defined(__clang__) # pragma clang diagnostic pop #endif } // namespace std namespace sprout { // // tuple_get // template inline SPROUT_CONSTEXPR typename std::tuple_element >::type tuple_get(sprout::integer_sequence) SPROUT_NOEXCEPT { static_assert(I < sizeof...(Is), "tuple_get: index out of range"); typedef typename std::tuple_element >::type type; return type(); } #if !(SPROUT_USE_TEMPLATE_ALIASES && !defined(SPROUT_WORKAROUND_NO_TEMPLATE_ARGUMENT_DEDUCTION_WITH_ALIASES)) // // tuple_get // template inline SPROUT_CONSTEXPR typename std::tuple_element >::type tuple_get(sprout::index_tuple) SPROUT_NOEXCEPT { static_assert(I < sizeof...(Indexes), "tuple_get: index out of range"); typedef typename std::tuple_element >::type type; return type(); } // // tuple_get // template inline SPROUT_CONSTEXPR typename std::tuple_element >::type tuple_get(sprout::uindex_tuple) SPROUT_NOEXCEPT { static_assert(I < sizeof...(Indexes), "tuple_get: index out of range"); typedef typename std::tuple_element >::type type; return type(); } #endif // #if !(SPROUT_USE_TEMPLATE_ALIASES && !defined(SPROUT_WORKAROUND_NO_TEMPLATE_ARGUMENT_DEDUCTION_WITH_ALIASES)) } // namespace sprout #endif // #ifndef SPROUT_INDEX_TUPLE_TUPLE_HPP