1
0
Fork 0
mirror of https://github.com/bolero-MURAKAMI/Sprout synced 2025-08-03 12:49:50 +00:00

reimplementation types::tuple_element, types::tuple_size

This commit is contained in:
bolero-MURAKAMI 2014-08-06 00:00:43 +09:00
parent 609f0b6f8a
commit 39bb8e8ada
8 changed files with 350 additions and 196 deletions

View file

@ -12,6 +12,9 @@
#include <tuple>
#include <sprout/config.hpp>
#include <sprout/workaround/std/cstddef.hpp>
#include <sprout/type_traits/integral_constant.hpp>
#include <sprout/type_traits/has_type.hpp>
#include <sprout/type_traits/has_value.hpp>
#include <sprout/detail/nil_base.hpp>
namespace sprout {
@ -20,7 +23,18 @@ namespace sprout {
// tuple_element
//
namespace detail {
template<std::size_t I, typename T, bool = (I < std::tuple_size<T>::value)>
template<std::size_t I, typename T, bool = sprout::has_value<std::tuple_size<T> >::value>
struct valid_tuple_index;
template<std::size_t I, typename T>
struct valid_tuple_index<I, T, false>
: public sprout::false_type
{};
template<std::size_t I, typename T>
struct valid_tuple_index<I, T, true>
: public sprout::integral_constant<bool, (I < std::tuple_size<T>::value)>
{};
template<std::size_t I, typename T, bool = sprout::has_type<std::tuple_element<I, T> >::value && sprout::tuples::detail::valid_tuple_index<I, T>::value>
struct tuple_element_default;
template<std::size_t I, typename T>
struct tuple_element_default<I, T, false>

View file

@ -12,15 +12,29 @@
#include <sprout/config.hpp>
#include <sprout/workaround/std/cstddef.hpp>
#include <sprout/type_traits/detail/type_traits_wrapper.hpp>
#include <sprout/type_traits/has_value.hpp>
#include <sprout/detail/nil_base.hpp>
namespace sprout {
namespace tuples {
//
// tuple_size
//
namespace detail {
template<typename T, bool = sprout::has_value<std::tuple_size<T> >::value>
struct tuple_size_default;
template<typename T>
struct tuple_size_default<T, false>
: public sprout::detail::nil_base
{};
template<typename T>
struct tuple_size_default<T, true>
: public sprout::detail::type_traits_wrapper<std::tuple_size<T> >
{};
} // namespace detail
template<typename T>
struct tuple_size
: public sprout::detail::type_traits_wrapper<std::tuple_size<T> >
: public sprout::tuples::detail::tuple_size_default<T>
{};
template<typename T>
struct tuple_size<T const>