diff --git a/octa/traits.h b/octa/traits.h index cad3ca4..b927dc9 100644 --- a/octa/traits.h +++ b/octa/traits.h @@ -12,18 +12,6 @@ #include "octa/utility.h" namespace octa { - /* conditional */ - - template - struct Conditional { - typedef T type; - }; - - template - struct Conditional { - typedef U type; - }; - /* removers */ template using RemoveReference = internal::RemoveReference; @@ -57,61 +45,13 @@ namespace octa { template constexpr const T IntegralConstant::value; - /* is integer */ + /* is void */ - template struct IsIntegerBase: false_t {}; - - template<> struct IsIntegerBase: true_t {}; - template<> struct IsIntegerBase: true_t {}; - template<> struct IsIntegerBase: true_t {}; - template<> struct IsIntegerBase: true_t {}; - template<> struct IsIntegerBase: true_t {}; - template<> struct IsIntegerBase: true_t {}; - template<> struct IsIntegerBase: true_t {}; - template<> struct IsIntegerBase: true_t {}; - template<> struct IsIntegerBase: true_t {}; - template<> struct IsIntegerBase: true_t {}; - template<> struct IsIntegerBase: true_t {}; - template<> struct IsIntegerBase: true_t {}; + template struct IsVoidBase : false_t {}; + template< > struct IsVoidBase: true_t {}; template - struct IsInteger: IsIntegerBase::type> {}; - - /* is floating point */ - - template struct IsFloatBase : false_t {}; - - template<> struct IsFloatBase: true_t {}; - template<> struct IsFloatBase: true_t {}; - template<> struct IsFloatBase: true_t {}; - - template - struct IsFloat: IsFloatBase::type> {}; - - /* is number */ - - template struct IsNumber: IntegralConstant::value || IsFloat::value) - > {}; - - /* is pointer */ - - template struct IsPointerBase : false_t {}; - template struct IsPointerBase: true_t {}; - - template - struct IsPointer: IsPointerBase::type> {}; - - /* is pointer to member function */ - - template struct IsMemberPointerBase: false_t {}; - template - struct IsMemberPointerBase: true_t {}; - - template - struct IsMemberPointer: IsMemberPointerBase< - typename RemoveConstVolatile::type - > {}; + struct IsVoid: IsVoidBase::type> {}; /* is null pointer */ @@ -123,28 +63,50 @@ namespace octa { typename RemoveConstVolatile::type > {}; - /* is POD: currently wrong */ + /* is integer */ - template struct IsPOD: IntegralConstant::value || IsFloat::value || IsPointer::value) - > {}; + template struct IsIntegralBase: false_t {}; - /* is class */ - - struct IsClassBase { - template static char test(void (T::*)(void)); - template static int test(...); - }; + template<> struct IsIntegralBase: true_t {}; + template<> struct IsIntegralBase: true_t {}; + template<> struct IsIntegralBase: true_t {}; + template<> struct IsIntegralBase: true_t {}; + template<> struct IsIntegralBase: true_t {}; + template<> struct IsIntegralBase: true_t {}; + template<> struct IsIntegralBase: true_t {}; + template<> struct IsIntegralBase: true_t {}; + template<> struct IsIntegralBase: true_t {}; + template<> struct IsIntegralBase: true_t {}; + template<> struct IsIntegralBase: true_t {}; + template<> struct IsIntegralBase: true_t {}; template - struct IsClass: IntegralConstant(0)) == 1 - > {}; + struct IsIntegral: IsIntegralBase::type> {}; - /* type equality */ + /* is floating point */ - template struct IsEqual : false_t {}; - template struct IsEqual: true_t {}; + template struct IsFloatingPointBase : false_t {}; + + template<> struct IsFloatingPointBase: true_t {}; + template<> struct IsFloatingPointBase: true_t {}; + template<> struct IsFloatingPointBase: true_t {}; + + template + struct IsFloatingPoint: IsFloatingPointBase::type> {}; + + /* is array */ + + template struct IsArray : false_t {}; + template struct IsArray: true_t {}; + template struct IsArray: true_t {}; + + /* is pointer */ + + template struct IsPointerBase : false_t {}; + template struct IsPointerBase: true_t {}; + + template + struct IsPointer: IsPointerBase::type> {}; /* is lvalue reference */ @@ -156,6 +118,46 @@ namespace octa { template struct IsRvalueReference : false_t {}; template struct IsRvalueReference: true_t {}; + /* is enum */ + + template struct IsEnum: IntegralConstant {}; + + /* is union */ + + template struct IsUnion: IntegralConstant {}; + + /* is class */ + + template struct IsClass: IntegralConstant {}; + + /* is number */ + + template struct IsNumber: IntegralConstant::value || IsFloatingPoint::value) + > {}; + + /* is pointer to member */ + + template struct IsMemberPointerBase: false_t {}; + template + struct IsMemberPointerBase: true_t {}; + + template + struct IsMemberPointer: IsMemberPointerBase< + typename RemoveConstVolatile::type + > {}; + + /* is POD: currently wrong */ + + template struct IsPOD: IntegralConstant::value || IsFloatingPoint::value || IsPointer::value) + > {}; + + /* type equality */ + + template struct IsEqual : false_t {}; + template struct IsEqual: true_t {}; + /* is reference */ template struct IsReference: IntegralConstant using AddRvalueReference = internal::AddRvalueReference; - /* is array */ + /* extent */ - template struct IsArray : false_t {}; - template struct IsArray: true_t {}; - template struct IsArray: true_t {}; + template + struct Extent: IntegralConstant {}; + + template + struct Extent: IntegralConstant {}; + + template + struct Extent: IntegralConstant::value> {}; + + template + struct Extent: IntegralConstant {}; + + template + struct Extent: IntegralConstant::value> {}; + + /* remove extent */ + + template struct RemoveExtent { typedef T type; }; + template struct RemoveExtent { typedef T type; }; + template struct RemoveExtent { typedef T type; }; + + /* remove all extents */ + + template struct RemoveAllExtents { typedef T type; }; + + template struct RemoveAllExtents { + typedef typename RemoveAllExtents::type type; + }; + + template struct RemoveAllExtents { + typedef typename RemoveAllExtents::type type; + }; + + /* conditional */ + + template + struct Conditional { + typedef T type; + }; + + template + struct Conditional { + typedef U type; + }; /* result of call at compile time */ @@ -222,10 +265,9 @@ namespace octa { template struct ResultOf {}; template - struct ResultOf(), declval()...)))> { - using type = decltype(internal::result_of_invoke(declval(), - declval()...)); + struct ResultOf(), + declval()...)))> { + using type = decltype(result_of_invoke(declval(), declval()...)); }; } @@ -237,6 +279,24 @@ namespace octa { template struct enable_if {}; template struct enable_if { typedef T type; }; + + /* decay */ + +#if 0 + template + struct Decay { + private: + typedef typename RemoveReference::type U; + public: + typedef typename Conditional::value, + typename RemoveExtent::type *, + typename Conditional::value, + typename AddPointer::type, + typename RemoveConstVolatile::type + >::type + >::type type; + }; +#endif } #endif \ No newline at end of file