diff --git a/sprout/index_tuple/tuple.hpp b/sprout/index_tuple/tuple.hpp index f7dd15e0..417d2197 100644 --- a/sprout/index_tuple/tuple.hpp +++ b/sprout/index_tuple/tuple.hpp @@ -35,7 +35,7 @@ namespace std { struct tuple_element > { static_assert(I < sizeof...(Is), "tuple_element<>: index out of range"); public: - typedef typename sprout::tppack_c_at::type type; + typedef typename sprout::pack_element_c::type type; }; #if !SPROUT_USE_TEMPLATE_ALIASES diff --git a/sprout/optional/optional.hpp b/sprout/optional/optional.hpp index bef97967..889ff6d4 100644 --- a/sprout/optional/optional.hpp +++ b/sprout/optional/optional.hpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -53,7 +54,7 @@ namespace sprout { public: template struct is_constructible_args - : public std::is_constructible + : public sprout::is_constructible {}; public: static SPROUT_CONSTEXPR reference_type get(optional& t) SPROUT_NOEXCEPT { diff --git a/sprout/tuple/tuple/tuple_decl.hpp b/sprout/tuple/tuple/tuple_decl.hpp index ca5e1ba1..a5e9fe38 100644 --- a/sprout/tuple/tuple/tuple_decl.hpp +++ b/sprout/tuple/tuple/tuple_decl.hpp @@ -267,8 +267,8 @@ namespace sprout { struct is_flexibly_convert_constructible_impl, Utypes...> : public sprout::tpp::all_of< sprout::is_convert_constructible< - typename sprout::tppack_at::type, - typename sprout::tppack_at::type + typename sprout::pack_element::type, + typename sprout::pack_element::type >... > {}; @@ -466,20 +466,6 @@ namespace sprout { { lhs.swap(rhs); } - - namespace detail { - template - struct tuple_element_impl; - template - struct tuple_element_impl<0, sprout::tuples::tuple > { - public: - typedef Head type; - }; - template - struct tuple_element_impl > - : public sprout::tuples::detail::tuple_element_impl > - {}; - } // namespace detail } // namespace tuples using sprout::tuples::tuple; @@ -504,7 +490,7 @@ namespace std { // template struct tuple_element > - : public sprout::tuples::detail::tuple_element_impl > + : public sprout::pack_element {}; #if defined(__clang__) # pragma clang diagnostic pop diff --git a/sprout/tuple/tuple/tuple_size.hpp b/sprout/tuple/tuple/tuple_size.hpp index eb9dc7b8..0c5fd843 100644 --- a/sprout/tuple/tuple/tuple_size.hpp +++ b/sprout/tuple/tuple/tuple_size.hpp @@ -10,6 +10,7 @@ #include #include +#include namespace sprout { namespace tuples { @@ -18,7 +19,7 @@ namespace sprout { // template struct tuple_size - : public std::tuple_size + : public sprout::detail::type_traits_wrapper > {}; template struct tuple_size diff --git a/sprout/type/tuple.hpp b/sprout/type/tuple.hpp index debc2287..290e63c6 100644 --- a/sprout/type/tuple.hpp +++ b/sprout/type/tuple.hpp @@ -11,6 +11,7 @@ #include #include #include +#include namespace sprout { namespace types { @@ -34,7 +35,7 @@ namespace sprout { // template struct tuple_size - : public std::tuple_size + : public sprout::detail::type_traits_wrapper > {}; // // tuple_element diff --git a/sprout/type/type_tuple.hpp b/sprout/type/type_tuple.hpp index eda80fb2..c1a35962 100644 --- a/sprout/type/type_tuple.hpp +++ b/sprout/type/type_tuple.hpp @@ -10,12 +10,14 @@ #include #include +#include #include #include #include #include #include #include +#include namespace sprout { namespace types { @@ -48,16 +50,41 @@ namespace sprout { }; namespace detail { - template - struct tuple_element_impl; + template + struct tuple_head; template - struct tuple_element_impl<0, sprout::types::type_tuple > { - public: - typedef Head type; - }; - template - struct tuple_element_impl > - : public sprout::types::detail::tuple_element_impl > + struct tuple_head > + : public sprout::identity + {}; + + template + struct tuple_skip; + template + struct tuple_skip< + I, N, sprout::types::type_tuple, + typename std::enable_if<(I == 0)>::type + > + : public sprout::identity > + {}; + template + struct tuple_skip< + I, N, sprout::types::type_tuple, + typename std::enable_if<(I != 0 && I < N / 2)>::type + > + : public sprout::types::detail::tuple_skip< + I - 1, N / 2 - 1, + sprout::types::type_tuple + > + {}; + template + struct tuple_skip< + I, N, sprout::types::type_tuple, + typename std::enable_if<(I != 0 && I >= N / 2)>::type + > + : public sprout::types::detail::tuple_skip< + I - N / 2, N - N / 2, + typename sprout::types::detail::tuple_skip >::type + > {}; } // namespace detail } // namespace types @@ -84,7 +111,9 @@ namespace std { // template struct tuple_element > - : public sprout::types::detail::tuple_element_impl > + : public sprout::types::detail::tuple_head< + typename sprout::types::detail::tuple_skip >::type + > {}; #if defined(__clang__) # pragma clang diagnostic pop diff --git a/sprout/type_traits/integral_constant.hpp b/sprout/type_traits/integral_constant.hpp index 47ee3cdd..96a05660 100644 --- a/sprout/type_traits/integral_constant.hpp +++ b/sprout/type_traits/integral_constant.hpp @@ -27,6 +27,10 @@ namespace sprout { operator value_type() const SPROUT_NOEXCEPT { return std::integral_constant::value; } + SPROUT_CONSTEXPR bool + operator!() const SPROUT_NOEXCEPT { + return !std::integral_constant::value; + } SPROUT_CONSTEXPR value_type operator()() const SPROUT_NOEXCEPT { return std::integral_constant::value; diff --git a/sprout/utility/pack.hpp b/sprout/utility/pack.hpp index 44b0e390..5df9ef2d 100644 --- a/sprout/utility/pack.hpp +++ b/sprout/utility/pack.hpp @@ -11,45 +11,29 @@ #include #include #include +#include #include #include namespace sprout { // - // tppack_at + // pack_element // - namespace detail { - template - struct tppack_at_impl_1 - : public sprout::detail::tppack_at_impl_1 - {}; - template - struct tppack_at_impl_1<0, Head, Tail...> { - public: - typedef Head type; - }; - template - struct tppack_at_impl - : public sprout::detail::tppack_at_impl_1 - { - static_assert(I < sizeof...(Args), "I < sizeof...(Args)"); - }; - } // namespace detail template - struct tppack_at - : public sprout::detail::tppack_at_impl + struct pack_element + : public std::tuple_element > {}; // - // tppack_c_at + // pack_element_c // template - struct tppack_c_at - : public sprout::tppack_at...>::type + struct pack_element_c + : public sprout::pack_element...>::type {}; // - // fppack_at + // pack_get // namespace detail { template< @@ -57,7 +41,7 @@ namespace sprout { typename sprout::enabler_if::type = sprout::enabler > inline SPROUT_CONSTEXPR R - fppack_at_impl(Head&& head, Tail&&...) { + pack_get_impl(Head&& head, Tail&&...) { return sprout::forward(head); } template< @@ -65,16 +49,16 @@ namespace sprout { typename sprout::enabler_if::type = sprout::enabler > inline SPROUT_CONSTEXPR R - fppack_at_impl(Head&&, Tail&&... tail) { - return sprout::detail::fppack_at_impl(sprout::forward(tail)...); + pack_get_impl(Head&&, Tail&&... tail) { + return sprout::detail::pack_get_impl(sprout::forward(tail)...); } } // namespace detail template - inline SPROUT_CONSTEXPR typename sprout::tppack_at::type - fppack_at(Args&&... args) { - return sprout::detail::fppack_at_impl< + inline SPROUT_CONSTEXPR typename sprout::pack_element::type + pack_get(Args&&... args) { + return sprout::detail::pack_get_impl< I, - typename sprout::tppack_at::type + typename sprout::pack_element::type >(sprout::forward(args)...); } } // namespace sprout diff --git a/sprout/utility/value_holder/value_holder.hpp b/sprout/utility/value_holder/value_holder.hpp index 245d2718..80b41d27 100644 --- a/sprout/utility/value_holder/value_holder.hpp +++ b/sprout/utility/value_holder/value_holder.hpp @@ -14,6 +14,7 @@ #include #include #include +#include #include namespace sprout { @@ -184,7 +185,7 @@ namespace sprout { public: template struct is_constructible_args - : public std::is_constructible + : public sprout::is_constructible {}; public: static SPROUT_CONSTEXPR reference get(value_holder& t) SPROUT_NOEXCEPT {