X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FUtility.h;h=1969a9644b20e63c9a0e92e5878c6b3df62de375;hb=6283c759b82a2a5764ef77c025aee1d40a77a839;hp=dbe552f02aac940b79c34b2708ae18e4c4201d75;hpb=1eee8628ee22c2382f7617e13eb5039bff7c9258;p=folly.git diff --git a/folly/Utility.h b/folly/Utility.h index dbe552f0..1969a964 100644 --- a/folly/Utility.h +++ b/folly/Utility.h @@ -20,6 +20,8 @@ #include #include +#include + namespace folly { /** @@ -98,14 +100,59 @@ void as_const(T const&&) = delete; #endif +namespace utility_detail { +template +struct make_seq_cat; +template < + template class S, + typename T, + T... Ta, + T... Tb, + T... Tc> +struct make_seq_cat, S, S> { + using type = + S; +}; + +// Not parameterizing by `template class, typename` because +// clang precisely v4.0 fails to compile that. Note that clang v3.9 and v5.0 +// handle that code correctly. +// +// For this to work, `S0` is required to be `Sequence` and `S1` is required +// to be `Sequence`. + +template +struct make_seq { + template + using apply = typename make_seq_cat< + typename make_seq::template apply, + typename make_seq::template apply, + typename make_seq::template apply>::type; +}; +template <> +struct make_seq<1> { + template + using apply = S1; +}; +template <> +struct make_seq<0> { + template + using apply = S0; +}; +} // namespace utility_detail + #if __cpp_lib_integer_sequence || _MSC_VER /* using override */ using std::integer_sequence; /* using override */ using std::index_sequence; -/* using override */ using std::make_index_sequence; #else +// TODO: Remove after upgrading to C++14 baseline + template struct integer_sequence { using value_type = T; @@ -116,22 +163,26 @@ struct integer_sequence { }; template -using index_sequence = folly::integer_sequence; +using index_sequence = integer_sequence; + +#endif -namespace detail { -template -struct make_index_sequence - : detail::make_index_sequence {}; +#if FOLLY_HAS_BUILTIN(__make_integer_seq) || _MSC_FULL_VER >= 190023918 -template -struct make_index_sequence<0, Ints...> : folly::index_sequence {}; -} +template +using make_integer_sequence = __make_integer_seq; + +#else -template -using make_index_sequence = detail::make_index_sequence; +template +using make_integer_sequence = typename utility_detail::make_seq< + Size>::template apply, integer_sequence>; #endif +template +using make_index_sequence = make_integer_sequence; + /** * Backports from C++17 of: * std::in_place_t @@ -261,10 +312,9 @@ class MoveOnly { using MoveOnly = moveonly_::MoveOnly; /** - * Backport from C++17 of std::launder + * A pithy alias for std::integral_constant. */ -template -constexpr T* launder(T* in) { - return (in + 1) - 1; -} +template +using Bool = std::integral_constant; + } // namespace folly