convert some stuff to variable templates

master
Daniel Kolesa 2016-01-16 18:45:55 +00:00
parent 460cded195
commit bc0c3f7577
2 changed files with 46 additions and 53 deletions

View File

@ -181,99 +181,93 @@ namespace detail {
namespace detail {
template<typename, typename>
struct TupleConvertibleBase: False {};
constexpr bool TupleConvertibleBase = false;
template<typename T, typename ...TT, typename U, typename ...UU>
struct TupleConvertibleBase<TupleTypes<T, TT...>, TupleTypes<U, UU...>>:
Constant<bool, IsConvertible<T, U> &&
TupleConvertibleBase<TupleTypes<TT...>,
TupleTypes<UU...>>::value> {};
constexpr bool TupleConvertibleBase<TupleTypes<T, TT...>, TupleTypes<U, UU...>>
= IsConvertible<T, U> && TupleConvertibleBase<TupleTypes<TT...>,
TupleTypes<UU...>>;
template<>
struct TupleConvertibleBase<TupleTypes<>, TupleTypes<>>: True {};
constexpr bool TupleConvertibleBase<TupleTypes<>, TupleTypes<>> = true;
template<bool, typename, typename>
struct TupleConvertibleApply: False {};
constexpr bool TupleConvertibleApply = false;
template<typename T, typename U>
struct TupleConvertibleApply<true, T, U>: TupleConvertibleBase<
MakeTupleTypes<T>, MakeTupleTypes<U>
> {};
constexpr bool TupleConvertibleApply<true, T, U>
= TupleConvertibleBase<MakeTupleTypes<T>, MakeTupleTypes<U>>;
template<typename T, typename U, bool = IsTupleLike<RemoveReference<T>>::value,
bool = IsTupleLike<U>::value>
struct TupleConvertible: False {};
constexpr bool TupleConvertible = false;
template<typename T, typename U>
struct TupleConvertible<T, U, true, true>: TupleConvertibleApply<
constexpr bool TupleConvertible<T, U, true, true> = TupleConvertibleApply<
TupleSize<RemoveReference<T>>::value == TupleSize<U>::value, T, U
> {};
>;
}
/* tuple constructible */
namespace detail {
template<typename, typename>
struct TupleConstructibleBase: False {};
constexpr bool TupleConstructibleBase = false;
template<typename T, typename ...TT, typename U, typename ...UU>
struct TupleConstructibleBase<TupleTypes<T, TT...>, TupleTypes<U, UU...>>:
Constant<bool, IsConstructible<U, T> &&
TupleConstructibleBase<TupleTypes<TT...>,
TupleTypes<UU...>>::value> {};
constexpr bool TupleConstructibleBase<TupleTypes<T, TT...>, TupleTypes<U, UU...>>
= IsConstructible<U, T> && TupleConstructibleBase<TupleTypes<TT...>,
TupleTypes<UU...>>;
template<>
struct TupleConstructibleBase<TupleTypes<>, TupleTypes<>>: True {};
constexpr bool TupleConstructibleBase<TupleTypes<>, TupleTypes<>> = true;
template<bool, typename, typename>
struct TupleConstructibleApply: False {};
constexpr bool TupleConstructibleApply = false;
template<typename T, typename U>
struct TupleConstructibleApply<true, T, U>: TupleConstructibleBase<
MakeTupleTypes<T>, MakeTupleTypes<U>
> {};
constexpr bool TupleConstructibleApply<true, T, U>
= TupleConstructibleBase<MakeTupleTypes<T>, MakeTupleTypes<U>>;
template<typename T, typename U, bool = IsTupleLike<RemoveReference<T>>::value,
bool = IsTupleLike<U>::value>
struct TupleConstructible: False {};
constexpr bool TupleConstructible = false;
template<typename T, typename U>
struct TupleConstructible<T, U, true, true>: TupleConstructibleApply<
constexpr bool TupleConstructible<T, U, true, true> = TupleConstructibleApply<
TupleSize<RemoveReference<T>>::value == TupleSize<U>::value, T, U
> {};
>;
}
/* tuple assignable */
namespace detail {
template<typename, typename>
struct TupleAssignableBase: False {};
constexpr bool TupleAssignableBase = false;
template<typename T, typename ...TT, typename U, typename ...UU>
struct TupleAssignableBase<TupleTypes<T, TT...>, TupleTypes<U, UU...>>:
Constant<bool, IsAssignable<U &, T> &&
TupleAssignableBase<TupleTypes<TT...>,
TupleTypes<UU...>>::value> {};
constexpr bool TupleAssignableBase<TupleTypes<T, TT...>, TupleTypes<U, UU...>>
= IsAssignable<U &, T> && TupleAssignableBase<TupleTypes<TT...>,
TupleTypes<UU...>>;
template<>
struct TupleAssignableBase<TupleTypes<>, TupleTypes<>>: True {};
constexpr bool TupleAssignableBase<TupleTypes<>, TupleTypes<>> = true;
template<bool, typename, typename>
struct TupleAssignableApply: False {};
constexpr bool TupleAssignableApply = false;
template<typename T, typename U>
struct TupleAssignableApply<true, T, U>: TupleAssignableBase<
MakeTupleTypes<T>, MakeTupleTypes<U>
> {};
constexpr bool TupleAssignableApply<true, T, U>
= TupleAssignableBase<MakeTupleTypes<T>, MakeTupleTypes<U>>;
template<typename T, typename U, bool = IsTupleLike<RemoveReference<T>>::value,
bool = IsTupleLike<U>::value>
struct TupleAssignable: False {};
constexpr bool TupleAssignable = false;
template<typename T, typename U>
struct TupleAssignable<T, U, true, true>: TupleAssignableApply<
constexpr bool TupleAssignable<T, U, true, true> = TupleAssignableApply<
TupleSize<RemoveReference<T>>::value == TupleSize<U>::value, T, U
> {};
>;
}
} /* namespace ostd */

View File

@ -218,13 +218,13 @@ namespace detail {
{}
template<typename T, typename = EnableIf<
TupleConstructible<T, Tuple<A...>>::value
TupleConstructible<T, Tuple<A...>>
>> TupleBase(T &&t): TupleLeaf<I, A>(forward<
TupleElement<I, MakeTupleTypes<T>>
>(get<I>(t)))... {}
template<typename Alloc, typename T, typename = EnableIf<
TupleConvertible<T, Tuple<A...>>::value
TupleConvertible<T, Tuple<A...>>
>> TupleBase(AllocatorArg, const Alloc &a, T &&t):
TupleLeaf<I, A>(UsesAllocatorConstructor<
A, Alloc, TupleElement<I, MakeTupleTypes<T>>
@ -232,7 +232,7 @@ namespace detail {
{}
template<typename T>
EnableIf<TupleAssignable<T, Tuple<A...>>::value, TupleBase &>
EnableIf<TupleAssignable<T, Tuple<A...>>, TupleBase &>
operator=(T &&t) {
tuple_swallow(TupleLeaf<I, A>::operator=(forward<
TupleElement<I, MakeTupleTypes<T>>
@ -302,7 +302,7 @@ public:
(sizeof...(T) < sizeof...(A)) ? sizeof...(T)
: sizeof...(A)
>
>::value &&
> &&
detail::TupleAllDefaultConstructible<
detail::MakeTupleTypes<Tuple, sizeof...(A),
(sizeof...(T) < sizeof...(A)) ? sizeof...(T)
@ -325,14 +325,14 @@ public:
(sizeof...(T) < sizeof...(A)) ? sizeof...(T)
: sizeof...(A)
>
>::value &&
> &&
!detail::TupleConvertible<
Tuple<T...>,
detail::MakeTupleTypes<Tuple,
(sizeof...(T) < sizeof...(A)) ? sizeof...(T)
: sizeof...(A)
>
>::value &&
> &&
detail::TupleAllDefaultConstructible<
detail::MakeTupleTypes<Tuple, sizeof...(A),
(sizeof...(T) < sizeof...(A)) ? sizeof...(T)
@ -355,7 +355,7 @@ public:
(sizeof...(T) < sizeof...(A)) ? sizeof...(T)
: sizeof...(A)
>
>::value &&
> &&
detail::TupleAllDefaultConstructible<
detail::MakeTupleTypes<Tuple, sizeof...(A),
(sizeof...(T) < sizeof...(A)) ? sizeof...(T)
@ -370,22 +370,21 @@ public:
forward<T>(t)...) {}
template<typename T, EnableIf<
detail::TupleConvertible<T, Tuple>::value, bool
detail::TupleConvertible<T, Tuple>, bool
> = true> Tuple(T &&t): p_base(forward<T>(t)) {}
template<typename T, EnableIf<
detail::TupleConstructible<T, Tuple>::value &&
!detail::TupleConvertible<T, Tuple>::value, bool
detail::TupleConstructible<T, Tuple> &&
!detail::TupleConvertible<T, Tuple>, bool
> = true> Tuple(T &&t): p_base(forward<T>(t)) {}
template<typename Alloc, typename T, typename = EnableIf<
detail::TupleConvertible<T, Tuple>::value
detail::TupleConvertible<T, Tuple>
>> Tuple(AllocatorArg, const Alloc &a, T &&t):
p_base(allocator_arg, a, forward<T>(t)) {}
template<typename T, typename = EnableIf<
detail::TupleAssignable<T, Tuple>::value
>> Tuple &operator=(T &&t) {
template<typename T, typename = EnableIf<detail::TupleAssignable<T, Tuple>>>
Tuple &operator=(T &&t) {
p_base.operator=(forward<T>(t));
return *this;
}