add And, Or and Not type traits (for AND/ORing together integral constants in a SFINAE aware way)

master
Daniel Kolesa 2015-07-09 20:23:35 +01:00
parent 1654ee84db
commit 30d57aec7d
1 changed files with 45 additions and 0 deletions

View File

@ -67,6 +67,50 @@ using False = IntegralConstant<bool, false>;
template<typename T, T val> constexpr T IntegralConstant<T, val>::value;
/* and */
namespace detail {
template<bool B, typename ...A> struct AndBase;
template<typename ...A>
struct AndBase<false, A...>: False {};
template<>
struct AndBase<true>: True {};
template<typename T>
struct AndBase<true, T>: IntegralConstant<bool, T::Type::value> {};
template<typename T, typename ...A>
struct AndBase<true, T, A...>: AndBase<T::Type::value, A...> {};
}
template<typename T, typename ...A>
struct And: detail::AndBase<T::Type::value, A...> {};
/* or */
namespace detail {
template<bool B, typename ...A> struct OrBase;
template<>
struct OrBase<false>: False {};
template<typename T, typename ...A>
struct OrBase<false, T, A...>: OrBase<T::Type::value, A...> {};
template<typename ...A>
struct OrBase<true, A...>: True {};
}
template<typename T, typename ...A>
struct Or: detail::OrBase<T::Type::value, A...> {};
/* not */
template<typename T>
struct Not: IntegralConstant<bool, !T::Type::value> {};
/* is void */
namespace detail {
@ -1193,6 +1237,7 @@ namespace detail {
template<typename T>
using UnderlyingType = typename detail::UnderlyingTypeBase<T>::Type;
} /* namespace octa */
#endif