mirror of
https://github.com/bolero-MURAKAMI/Sprout.git
synced 2024-12-23 21:25:49 +00:00
fix for clang 4.0.0 or later: template specializations
This commit is contained in:
parent
a79ee37535
commit
55999cff82
1 changed files with 99 additions and 13 deletions
|
@ -20,6 +20,86 @@
|
||||||
namespace sprout {
|
namespace sprout {
|
||||||
namespace types {
|
namespace types {
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
template<typename Tuple>
|
||||||
|
struct is_tuple_like
|
||||||
|
: public sprout::false_type
|
||||||
|
{};
|
||||||
|
template<template<typename...> class TupleClass, typename... Ts>
|
||||||
|
struct is_tuple_like<TupleClass<Ts...> >
|
||||||
|
: public sprout::true_type
|
||||||
|
{};
|
||||||
|
template<typename Tuple>
|
||||||
|
struct is_tuple_like<Tuple const>
|
||||||
|
: public sprout::types::detail::is_tuple_like<Tuple>
|
||||||
|
{};
|
||||||
|
template<typename Tuple>
|
||||||
|
struct is_tuple_like<Tuple volatile>
|
||||||
|
: public sprout::types::detail::is_tuple_like<Tuple>
|
||||||
|
{};
|
||||||
|
template<typename Tuple>
|
||||||
|
struct is_tuple_like<Tuple const volatile>
|
||||||
|
: public sprout::types::detail::is_tuple_like<Tuple>
|
||||||
|
{};
|
||||||
|
|
||||||
|
template<typename IntegerSequence>
|
||||||
|
struct is_integer_sequence_like
|
||||||
|
: public sprout::false_type
|
||||||
|
{};
|
||||||
|
template<template<typename VT, VT...> class IntegerSequenceClass, typename T, T... Vs>
|
||||||
|
struct is_integer_sequence_like<IntegerSequenceClass<T, Vs...> >
|
||||||
|
: public sprout::true_type
|
||||||
|
{};
|
||||||
|
template<typename IntegerSequence>
|
||||||
|
struct is_integer_sequence_like<IntegerSequence const>
|
||||||
|
: public sprout::types::detail::is_integer_sequence_like<IntegerSequence>
|
||||||
|
{};
|
||||||
|
template<typename IntegerSequence>
|
||||||
|
struct is_integer_sequence_like<IntegerSequence volatile>
|
||||||
|
: public sprout::types::detail::is_integer_sequence_like<IntegerSequence>
|
||||||
|
{};
|
||||||
|
template<typename IntegerSequence>
|
||||||
|
struct is_integer_sequence_like<IntegerSequence const volatile>
|
||||||
|
: public sprout::types::detail::is_integer_sequence_like<IntegerSequence>
|
||||||
|
{};
|
||||||
|
|
||||||
|
template<typename SpecificIntegerSequence>
|
||||||
|
struct is_specific_integer_sequence_like
|
||||||
|
: public sprout::false_type
|
||||||
|
{};
|
||||||
|
#define SPROUT_TYPES_DETAIL_IS_SPECIFIC_INTEGER_SEQUENCE_DECL(TYPE) \
|
||||||
|
template<template<TYPE...> class SpecificIntegerSequenceClass, TYPE... Vs> \
|
||||||
|
struct is_specific_integer_sequence_like<SpecificIntegerSequenceClass<Vs...> > \
|
||||||
|
: public sprout::true_type \
|
||||||
|
{}
|
||||||
|
SPROUT_TYPES_DETAIL_IS_SPECIFIC_INTEGER_SEQUENCE_DECL(bool);
|
||||||
|
SPROUT_TYPES_DETAIL_IS_SPECIFIC_INTEGER_SEQUENCE_DECL(char);
|
||||||
|
SPROUT_TYPES_DETAIL_IS_SPECIFIC_INTEGER_SEQUENCE_DECL(signed char);
|
||||||
|
SPROUT_TYPES_DETAIL_IS_SPECIFIC_INTEGER_SEQUENCE_DECL(unsigned char);
|
||||||
|
SPROUT_TYPES_DETAIL_IS_SPECIFIC_INTEGER_SEQUENCE_DECL(char16_t);
|
||||||
|
SPROUT_TYPES_DETAIL_IS_SPECIFIC_INTEGER_SEQUENCE_DECL(char32_t);
|
||||||
|
SPROUT_TYPES_DETAIL_IS_SPECIFIC_INTEGER_SEQUENCE_DECL(wchar_t);
|
||||||
|
SPROUT_TYPES_DETAIL_IS_SPECIFIC_INTEGER_SEQUENCE_DECL(short);
|
||||||
|
SPROUT_TYPES_DETAIL_IS_SPECIFIC_INTEGER_SEQUENCE_DECL(unsigned short);
|
||||||
|
SPROUT_TYPES_DETAIL_IS_SPECIFIC_INTEGER_SEQUENCE_DECL(int);
|
||||||
|
SPROUT_TYPES_DETAIL_IS_SPECIFIC_INTEGER_SEQUENCE_DECL(unsigned int);
|
||||||
|
SPROUT_TYPES_DETAIL_IS_SPECIFIC_INTEGER_SEQUENCE_DECL(long);
|
||||||
|
SPROUT_TYPES_DETAIL_IS_SPECIFIC_INTEGER_SEQUENCE_DECL(unsigned long);
|
||||||
|
SPROUT_TYPES_DETAIL_IS_SPECIFIC_INTEGER_SEQUENCE_DECL(long long);
|
||||||
|
SPROUT_TYPES_DETAIL_IS_SPECIFIC_INTEGER_SEQUENCE_DECL(unsigned long long);
|
||||||
|
#undef SPROUT_TYPES_DETAIL_IS_SPECIFIC_INTEGER_SEQUENCE_DECL
|
||||||
|
template<typename SpecificIntegerSequence>
|
||||||
|
struct is_specific_integer_sequence_like<SpecificIntegerSequence const>
|
||||||
|
: public sprout::types::detail::is_specific_integer_sequence_like<SpecificIntegerSequence>
|
||||||
|
{};
|
||||||
|
template<typename SpecificIntegerSequence>
|
||||||
|
struct is_specific_integer_sequence_like<SpecificIntegerSequence volatile>
|
||||||
|
: public sprout::types::detail::is_specific_integer_sequence_like<SpecificIntegerSequence>
|
||||||
|
{};
|
||||||
|
template<typename SpecificIntegerSequence>
|
||||||
|
struct is_specific_integer_sequence_like<SpecificIntegerSequence const volatile>
|
||||||
|
: public sprout::types::detail::is_specific_integer_sequence_like<SpecificIntegerSequence>
|
||||||
|
{};
|
||||||
|
|
||||||
template<typename Tuple, typename Tup>
|
template<typename Tuple, typename Tup>
|
||||||
struct joint_types_impl {
|
struct joint_types_impl {
|
||||||
private:
|
private:
|
||||||
|
@ -48,28 +128,33 @@ namespace sprout {
|
||||||
{};
|
{};
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename Tuple, typename Tup>
|
template<
|
||||||
|
typename Tuple, typename Tup,
|
||||||
|
bool = sprout::types::detail::is_tuple_like<Tup>::value,
|
||||||
|
bool = sprout::types::detail::is_integer_sequence_like<Tup>::value,
|
||||||
|
bool = sprout::types::detail::is_specific_integer_sequence_like<Tup>::value
|
||||||
|
>
|
||||||
struct joint_types_default_apply;
|
struct joint_types_default_apply;
|
||||||
|
|
||||||
template<
|
template<
|
||||||
template<typename...> class TupleClass, typename... Ts,
|
template<typename...> class TupleClass, typename... Ts,
|
||||||
typename Tup
|
typename Tup
|
||||||
>
|
>
|
||||||
struct joint_types_default_apply<TupleClass<Ts...>, Tup>
|
struct joint_types_default_apply<TupleClass<Ts...>, Tup, false, false, false>
|
||||||
: public sprout::types::detail::joint_types_impl<TupleClass<Ts...>, Tup>
|
: public sprout::types::detail::joint_types_impl<TupleClass<Ts...>, Tup>
|
||||||
{};
|
{};
|
||||||
template<
|
template<
|
||||||
template<typename...> class TupleClass, typename... Ts,
|
template<typename...> class TupleClass, typename... Ts,
|
||||||
template<typename...> class TupClass, typename... Types
|
template<typename...> class TupClass, typename... Types
|
||||||
>
|
>
|
||||||
struct joint_types_default_apply<TupleClass<Ts...>, TupClass<Types...> >
|
struct joint_types_default_apply<TupleClass<Ts...>, TupClass<Types...>, true, false, false>
|
||||||
: public sprout::identity<TupleClass<Ts..., Types...> >
|
: public sprout::identity<TupleClass<Ts..., Types...> >
|
||||||
{};
|
{};
|
||||||
template<
|
template<
|
||||||
template<typename...> class TupleClass, typename... Ts,
|
template<typename...> class TupleClass, typename... Ts,
|
||||||
template<typename VType, VType...> class IntSeqClass, typename Type, Type... Values
|
template<typename VType, VType...> class IntSeqClass, typename Type, Type... Values
|
||||||
>
|
>
|
||||||
struct joint_types_default_apply<TupleClass<Ts...>, IntSeqClass<Type, Values...> >
|
struct joint_types_default_apply<TupleClass<Ts...>, IntSeqClass<Type, Values...>, false, true, false>
|
||||||
: public sprout::identity<TupleClass<Ts..., sprout::integral_constant<Type, Values>...> >
|
: public sprout::identity<TupleClass<Ts..., sprout::integral_constant<Type, Values>...> >
|
||||||
{};
|
{};
|
||||||
#define SPROUT_TYPES_DETAIL_JOINT_TYPES_DEFAULT_APPLY_TUPLE_LIKE_DECL_FOR_CERTAIN_INTEGER_SEQUENCE(TYPE) \
|
#define SPROUT_TYPES_DETAIL_JOINT_TYPES_DEFAULT_APPLY_TUPLE_LIKE_DECL_FOR_CERTAIN_INTEGER_SEQUENCE(TYPE) \
|
||||||
|
@ -77,7 +162,7 @@ namespace sprout {
|
||||||
template<typename...> class TupleClass, typename... Ts, \
|
template<typename...> class TupleClass, typename... Ts, \
|
||||||
template<TYPE...> class IntSeqClass, TYPE... Values \
|
template<TYPE...> class IntSeqClass, TYPE... Values \
|
||||||
> \
|
> \
|
||||||
struct joint_types_default_apply<TupleClass<Ts...>, IntSeqClass<Values...> > \
|
struct joint_types_default_apply<TupleClass<Ts...>, IntSeqClass<Values...>, false, false, true> \
|
||||||
: public sprout::identity<TupleClass<Ts..., sprout::integral_constant<TYPE, Values>...> > \
|
: public sprout::identity<TupleClass<Ts..., sprout::integral_constant<TYPE, Values>...> > \
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
@ -113,21 +198,21 @@ namespace sprout {
|
||||||
template<typename VT, VT...> class IntegerSequenceClass, typename T, T... Vs,
|
template<typename VT, VT...> class IntegerSequenceClass, typename T, T... Vs,
|
||||||
typename Tup
|
typename Tup
|
||||||
>
|
>
|
||||||
struct joint_types_default_apply<IntegerSequenceClass<T, Vs...>, Tup>
|
struct joint_types_default_apply<IntegerSequenceClass<T, Vs...>, Tup, false, false, false>
|
||||||
: public sprout::types::detail::joint_types_impl<IntegerSequenceClass<T, Vs...>, Tup>
|
: public sprout::types::detail::joint_types_impl<IntegerSequenceClass<T, Vs...>, Tup>
|
||||||
{};
|
{};
|
||||||
template<
|
template<
|
||||||
template<typename VT, VT...> class IntegerSequenceClass, typename T, T... Vs,
|
template<typename VT, VT...> class IntegerSequenceClass, typename T, T... Vs,
|
||||||
template<typename...> class TupClass, typename... Types
|
template<typename...> class TupClass, typename... Types
|
||||||
>
|
>
|
||||||
struct joint_types_default_apply<IntegerSequenceClass<T, Vs...>, TupClass<Types...> >
|
struct joint_types_default_apply<IntegerSequenceClass<T, Vs...>, TupClass<Types...>, true, false, false>
|
||||||
: public sprout::identity<IntegerSequenceClass<T, Vs..., Types::value...> >
|
: public sprout::identity<IntegerSequenceClass<T, Vs..., Types::value...> >
|
||||||
{};
|
{};
|
||||||
template<
|
template<
|
||||||
template<typename VT, VT...> class IntegerSequenceClass, typename T, T... Vs,
|
template<typename VT, VT...> class IntegerSequenceClass, typename T, T... Vs,
|
||||||
template<typename VType, VType...> class IntSeqClass, typename Type, Type... Values
|
template<typename VType, VType...> class IntSeqClass, typename Type, Type... Values
|
||||||
>
|
>
|
||||||
struct joint_types_default_apply<IntegerSequenceClass<T, Vs...>, IntSeqClass<Type, Values...> >
|
struct joint_types_default_apply<IntegerSequenceClass<T, Vs...>, IntSeqClass<Type, Values...>, false, true, false>
|
||||||
: public sprout::identity<IntegerSequenceClass<T, Vs..., Values...> >
|
: public sprout::identity<IntegerSequenceClass<T, Vs..., Values...> >
|
||||||
{};
|
{};
|
||||||
#define SPROUT_TYPES_DETAIL_JOINT_TYPES_DEFAULT_APPLY_INTEGER_SEQUENCE_LIKE_DECL_FOR_CERTAIN_INTEGER_SEQUENCE(TYPE) \
|
#define SPROUT_TYPES_DETAIL_JOINT_TYPES_DEFAULT_APPLY_INTEGER_SEQUENCE_LIKE_DECL_FOR_CERTAIN_INTEGER_SEQUENCE(TYPE) \
|
||||||
|
@ -135,7 +220,7 @@ namespace sprout {
|
||||||
template<typename VT, VT...> class IntegerSequenceClass, typename T, T... Vs, \
|
template<typename VT, VT...> class IntegerSequenceClass, typename T, T... Vs, \
|
||||||
template<TYPE...> class IntSeqClass, TYPE... Values \
|
template<TYPE...> class IntSeqClass, TYPE... Values \
|
||||||
> \
|
> \
|
||||||
struct joint_types_default_apply<IntegerSequenceClass<T, Vs...>, IntSeqClass<Values...> > \
|
struct joint_types_default_apply<IntegerSequenceClass<T, Vs...>, IntSeqClass<Values...>, false, false, true> \
|
||||||
: public sprout::identity<IntegerSequenceClass<T, Vs..., Values...> > \
|
: public sprout::identity<IntegerSequenceClass<T, Vs..., Values...> > \
|
||||||
{}
|
{}
|
||||||
SPROUT_TYPES_DETAIL_JOINT_TYPES_DEFAULT_APPLY_INTEGER_SEQUENCE_LIKE_DECL_FOR_CERTAIN_INTEGER_SEQUENCE(bool);
|
SPROUT_TYPES_DETAIL_JOINT_TYPES_DEFAULT_APPLY_INTEGER_SEQUENCE_LIKE_DECL_FOR_CERTAIN_INTEGER_SEQUENCE(bool);
|
||||||
|
@ -154,6 +239,7 @@ namespace sprout {
|
||||||
SPROUT_TYPES_DETAIL_JOINT_TYPES_DEFAULT_APPLY_INTEGER_SEQUENCE_LIKE_DECL_FOR_CERTAIN_INTEGER_SEQUENCE(long long);
|
SPROUT_TYPES_DETAIL_JOINT_TYPES_DEFAULT_APPLY_INTEGER_SEQUENCE_LIKE_DECL_FOR_CERTAIN_INTEGER_SEQUENCE(long long);
|
||||||
SPROUT_TYPES_DETAIL_JOINT_TYPES_DEFAULT_APPLY_INTEGER_SEQUENCE_LIKE_DECL_FOR_CERTAIN_INTEGER_SEQUENCE(unsigned long long);
|
SPROUT_TYPES_DETAIL_JOINT_TYPES_DEFAULT_APPLY_INTEGER_SEQUENCE_LIKE_DECL_FOR_CERTAIN_INTEGER_SEQUENCE(unsigned long long);
|
||||||
#undef SPROUT_TYPES_DETAIL_JOINT_TYPES_DEFAULT_APPLY_INTEGER_SEQUENCE_LIKE_DECL_FOR_CERTAIN_INTEGER_SEQUENCE
|
#undef SPROUT_TYPES_DETAIL_JOINT_TYPES_DEFAULT_APPLY_INTEGER_SEQUENCE_LIKE_DECL_FOR_CERTAIN_INTEGER_SEQUENCE
|
||||||
|
|
||||||
template<template<typename VT, VT...> class IntegerSequenceClass, typename T, T... Vs>
|
template<template<typename VT, VT...> class IntegerSequenceClass, typename T, T... Vs>
|
||||||
struct joint_types_default<IntegerSequenceClass<T, Vs...> > {
|
struct joint_types_default<IntegerSequenceClass<T, Vs...> > {
|
||||||
public:
|
public:
|
||||||
|
@ -168,7 +254,7 @@ namespace sprout {
|
||||||
template<BASE...> class IntegerSequenceClass, BASE... Vs, \
|
template<BASE...> class IntegerSequenceClass, BASE... Vs, \
|
||||||
template<TYPE...> class IntSeqClass, TYPE... Values \
|
template<TYPE...> class IntSeqClass, TYPE... Values \
|
||||||
> \
|
> \
|
||||||
struct joint_types_default_apply<IntegerSequenceClass<Vs...>, IntSeqClass<Values...> > \
|
struct joint_types_default_apply<IntegerSequenceClass<Vs...>, IntSeqClass<Values...>, false, false, true> \
|
||||||
: public sprout::identity<IntegerSequenceClass<Vs..., Values...> > \
|
: public sprout::identity<IntegerSequenceClass<Vs..., Values...> > \
|
||||||
{}
|
{}
|
||||||
#if SPROUT_USE_UNICODE_LITERALS
|
#if SPROUT_USE_UNICODE_LITERALS
|
||||||
|
@ -209,21 +295,21 @@ namespace sprout {
|
||||||
template<BASE...> class IntegerSequenceClass, BASE... Vs, \
|
template<BASE...> class IntegerSequenceClass, BASE... Vs, \
|
||||||
typename Tup \
|
typename Tup \
|
||||||
> \
|
> \
|
||||||
struct joint_types_default_apply<IntegerSequenceClass<Vs...>, Tup> \
|
struct joint_types_default_apply<IntegerSequenceClass<Vs...>, Tup, false, false, false> \
|
||||||
: public sprout::types::detail::joint_types_impl<IntegerSequenceClass<Vs...>, Tup> \
|
: public sprout::types::detail::joint_types_impl<IntegerSequenceClass<Vs...>, Tup> \
|
||||||
{}; \
|
{}; \
|
||||||
template< \
|
template< \
|
||||||
template<BASE...> class IntegerSequenceClass, BASE... Vs, \
|
template<BASE...> class IntegerSequenceClass, BASE... Vs, \
|
||||||
template<typename...> class TupClass, typename... Types \
|
template<typename...> class TupClass, typename... Types \
|
||||||
> \
|
> \
|
||||||
struct joint_types_default_apply<IntegerSequenceClass<Vs...>, TupClass<Types...> > \
|
struct joint_types_default_apply<IntegerSequenceClass<Vs...>, TupClass<Types...>, true, false, false> \
|
||||||
: public sprout::identity<IntegerSequenceClass<Vs..., Types::value...> > \
|
: public sprout::identity<IntegerSequenceClass<Vs..., Types::value...> > \
|
||||||
{}; \
|
{}; \
|
||||||
template< \
|
template< \
|
||||||
template<BASE...> class IntegerSequenceClass, BASE... Vs, \
|
template<BASE...> class IntegerSequenceClass, BASE... Vs, \
|
||||||
template<typename VType, VType...> class IntSeqClass, typename Type, Type... Values \
|
template<typename VType, VType...> class IntSeqClass, typename Type, Type... Values \
|
||||||
> \
|
> \
|
||||||
struct joint_types_default_apply<IntegerSequenceClass<Vs...>, IntSeqClass<Type, Values...> > \
|
struct joint_types_default_apply<IntegerSequenceClass<Vs...>, IntSeqClass<Type, Values...>, false, true, false> \
|
||||||
: public sprout::identity<IntegerSequenceClass<Vs..., Values...> > \
|
: public sprout::identity<IntegerSequenceClass<Vs..., Values...> > \
|
||||||
{}; \
|
{}; \
|
||||||
SPROUT_TYPES_DETAIL_JOINT_TYPES_DEFAULT_APPLY_CERTAIN_INTEGER_SEQUENCE_DECL_(BASE); \
|
SPROUT_TYPES_DETAIL_JOINT_TYPES_DEFAULT_APPLY_CERTAIN_INTEGER_SEQUENCE_DECL_(BASE); \
|
||||||
|
|
Loading…
Reference in a new issue