forked from OctaForge/libostd
add And, Or and Not type traits (for AND/ORing together integral constants in a SFINAE aware way)
This commit is contained in:
parent
1654ee84db
commit
30d57aec7d
|
@ -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
|
Loading…
Reference in a new issue