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;
|
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 */
|
/* is void */
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
@ -1193,6 +1237,7 @@ namespace detail {
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
using UnderlyingType = typename detail::UnderlyingTypeBase<T>::Type;
|
using UnderlyingType = typename detail::UnderlyingTypeBase<T>::Type;
|
||||||
|
|
||||||
} /* namespace octa */
|
} /* namespace octa */
|
||||||
|
|
||||||
#endif
|
#endif
|
Loading…
Reference in a new issue