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:
parent
609f0b6f8a
commit
39bb8e8ada
8 changed files with 350 additions and 196 deletions
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue