forked from OctaForge/libostd
remove most IntegralConstant usages from type_traits
parent
7d52a75348
commit
abde607016
|
@ -223,16 +223,15 @@ namespace detail {
|
||||||
IsUnion<T> ||
|
IsUnion<T> ||
|
||||||
IsVoid<T> ||
|
IsVoid<T> ||
|
||||||
IsReference<T> ||
|
IsReference<T> ||
|
||||||
IsNullPointer<T>
|
IsNullPointer<T>>
|
||||||
> struct IsFunctionBase: IntegralConstant<bool,
|
constexpr bool IsFunctionBase
|
||||||
sizeof(function_test<T>(function_source<T>(0))) == 1
|
= sizeof(function_test<T>(function_source<T>(0))) == 1;
|
||||||
> {};
|
|
||||||
|
|
||||||
template<typename T> struct IsFunctionBase<T, true>: False {};
|
template<typename T> constexpr bool IsFunctionBase<T, true> = false;
|
||||||
} /* namespace detail */
|
} /* namespace detail */
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr bool IsFunction = detail::IsFunctionBase<T>::value;
|
constexpr bool IsFunction = detail::IsFunctionBase<T>;
|
||||||
|
|
||||||
/* is arithmetic */
|
/* is arithmetic */
|
||||||
|
|
||||||
|
@ -252,45 +251,38 @@ constexpr bool IsCompound = !IsFundamental<T>;
|
||||||
/* is pointer to member */
|
/* is pointer to member */
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
template<typename>
|
template<typename> constexpr bool IsMemberPointerBase = false;
|
||||||
struct IsMemberPointerBase: False {};
|
|
||||||
|
|
||||||
template<typename T, typename U>
|
template<typename T, typename U>
|
||||||
struct IsMemberPointerBase<T U::*>: True {};
|
constexpr bool IsMemberPointerBase<T U::*> = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr bool IsMemberPointer = detail::IsMemberPointerBase<RemoveCv<T>>::value;
|
constexpr bool IsMemberPointer = detail::IsMemberPointerBase<RemoveCv<T>>;
|
||||||
|
|
||||||
/* is pointer to member object */
|
/* is pointer to member object */
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
template<typename>
|
template<typename> constexpr bool IsMemberObjectPointerBase = false;
|
||||||
struct IsMemberObjectPointerBase: False {};
|
|
||||||
|
|
||||||
template<typename T, typename U>
|
template<typename T, typename U>
|
||||||
struct IsMemberObjectPointerBase<T U::*>: IntegralConstant<bool,
|
constexpr bool IsMemberObjectPointerBase<T U::*> = !IsFunction<T>;
|
||||||
!IsFunction<T>
|
|
||||||
> {};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr bool IsMemberObjectPointer = detail::IsMemberObjectPointerBase<RemoveCv<T>>::value;
|
constexpr bool IsMemberObjectPointer = detail::IsMemberObjectPointerBase<RemoveCv<T>>;
|
||||||
|
|
||||||
/* is pointer to member function */
|
/* is pointer to member function */
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
template<typename>
|
template<typename> constexpr bool IsMemberFunctionPointerBase = false;
|
||||||
struct IsMemberFunctionPointerBase: False {};
|
|
||||||
|
|
||||||
template<typename T, typename U>
|
template<typename T, typename U>
|
||||||
struct IsMemberFunctionPointerBase<T U::*>: IntegralConstant<bool,
|
constexpr bool IsMemberFunctionPointerBase<T U::*> = IsFunction<T>;
|
||||||
IsFunction<T>
|
|
||||||
> {};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr bool IsMemberFunctionPointer = detail::IsMemberFunctionPointerBase<RemoveCv<T>>::value;
|
constexpr bool IsMemberFunctionPointer = detail::IsMemberFunctionPointerBase<RemoveCv<T>>;
|
||||||
|
|
||||||
/* is object */
|
/* is object */
|
||||||
|
|
||||||
|
@ -332,34 +324,32 @@ template<typename T> constexpr bool IsPolymorphic = __is_polymorphic(T);
|
||||||
/* is signed */
|
/* is signed */
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
template<typename T>
|
template<typename T> constexpr bool IsSignedCore = T(-1) < T(0);
|
||||||
struct IsSignedCore: IntegralConstant<bool, T(-1) < T(0)> {};
|
|
||||||
|
|
||||||
template<typename T, bool = IsArithmetic<T>>
|
template<typename T, bool = IsArithmetic<T>>
|
||||||
struct IsSignedBase: False {};
|
constexpr bool IsSignedBase = false;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct IsSignedBase<T, true>: detail::IsSignedCore<T> {};
|
constexpr bool IsSignedBase<T, true> = detail::IsSignedCore<T>;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr bool IsSigned = detail::IsSignedBase<T>::value;
|
constexpr bool IsSigned = detail::IsSignedBase<T>;
|
||||||
|
|
||||||
/* is unsigned */
|
/* is unsigned */
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
template<typename T>
|
template<typename T> constexpr bool IsUnsignedCore = T(0) < T(-1);
|
||||||
struct IsUnsignedCore: IntegralConstant<bool, T(0) < T(-1)> {};
|
|
||||||
|
|
||||||
template<typename T, bool = IsArithmetic<T>>
|
template<typename T, bool = IsArithmetic<T>>
|
||||||
struct IsUnsignedBase: False {};
|
constexpr bool IsUnsignedBase = false;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct IsUnsignedBase<T, true>: detail::IsUnsignedCore<T> {};
|
constexpr bool IsUnsignedBase<T, true> = detail::IsUnsignedCore<T>;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr bool IsUnsigned = detail::IsUnsignedBase<T>::value;
|
constexpr bool IsUnsigned = detail::IsUnsignedBase<T>;
|
||||||
|
|
||||||
/* is standard layout */
|
/* is standard layout */
|
||||||
|
|
||||||
|
@ -698,41 +688,37 @@ template<typename F, typename T> constexpr bool IsConvertible
|
||||||
/* extent */
|
/* extent */
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
template<typename T, uint I>
|
template<typename, uint> constexpr Size ExtentBase = 0;
|
||||||
struct ExtentBase: IntegralConstant<Size, 0> {};
|
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct ExtentBase<T[], 0>: IntegralConstant<Size, 0> {};
|
constexpr Size ExtentBase<T[], 0> = 0;
|
||||||
|
|
||||||
template<typename T, uint I>
|
template<typename T, uint I>
|
||||||
struct ExtentBase<T[], I>:
|
constexpr Size ExtentBase<T[], I> = detail::ExtentBase<T, I - 1>;
|
||||||
IntegralConstant<Size, detail::ExtentBase<T, I - 1>::value> {};
|
|
||||||
|
|
||||||
template<typename T, Size N>
|
template<typename T, Size N>
|
||||||
struct ExtentBase<T[N], 0>: IntegralConstant<Size, N> {};
|
constexpr Size ExtentBase<T[N], 0> = N;
|
||||||
|
|
||||||
template<typename T, Size N, uint I>
|
template<typename T, Size N, uint I>
|
||||||
struct ExtentBase<T[N], I>:
|
constexpr Size ExtentBase<T[N], I> = detail::ExtentBase<T, I - 1>;
|
||||||
IntegralConstant<Size, detail::ExtentBase<T, I - 1>::value> {};
|
|
||||||
} /* namespace detail */
|
} /* namespace detail */
|
||||||
|
|
||||||
template<typename T, uint I = 0>
|
template<typename T, uint I = 0>
|
||||||
constexpr Size Extent = detail::ExtentBase<T, I>::value;
|
constexpr Size Extent = detail::ExtentBase<T, I>;
|
||||||
|
|
||||||
/* rank */
|
/* rank */
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
template<typename T> struct RankBase: IntegralConstant<Size, 0> {};
|
template<typename> constexpr Size RankBase = 0;
|
||||||
|
|
||||||
template<typename T> struct RankBase<T[]>:
|
template<typename T>
|
||||||
IntegralConstant<Size, detail::RankBase<T>::value + 1> {};
|
constexpr Size RankBase<T[]> = detail::RankBase<T> + 1;
|
||||||
|
|
||||||
template<typename T, Size N> struct RankBase<T[N]>:
|
template<typename T, Size N>
|
||||||
IntegralConstant<Size, detail::RankBase<T>::value + 1> {};
|
constexpr Size RankBase<T[N]> = detail::RankBase<T> + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T> constexpr Size Rank = detail::RankBase<T>;
|
||||||
constexpr Size Rank = detail::RankBase<T>::value;
|
|
||||||
|
|
||||||
/* remove const, volatile, cv */
|
/* remove const, volatile, cv */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue