/* Type traits for OctaSTD. * * This file is part of OctaSTD. See COPYING.md for futher information. */ #ifndef OCTA_TRAITS_H #define OCTA_TRAITS_H #include #include "octa/types.h" namespace octa { /* conditional */ template struct Conditional { typedef T type; }; template struct Conditional { typedef U type; }; /* removers */ template struct RemoveReference { typedef T type; }; template struct RemoveReference { typedef T type; }; template struct RemoveReference { typedef T type; }; template struct RemoveConst { typedef T type; }; template struct RemoveConst { typedef T type; }; template struct RemoveVolatile { typedef T type; }; template struct RemoveVolatile { typedef T type; }; template struct RemoveConstVolatile { typedef typename RemoveVolatile::type>::type type; }; /* integral constant */ template struct IntegralConstant { static const T value = val; typedef T value_type; typedef IntegralConstant type; }; typedef IntegralConstant true_t; typedef IntegralConstant false_t; template const T IntegralConstant::value; /* is integer */ 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 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 pointer */ template struct IsPointerBase : false_t {}; template struct IsPointerBase: true_t {}; template struct IsPointer: IsPointerBase::type> {}; /* is POD: currently wrong */ template struct IsPOD: IntegralConstant::value || IsFloat::value || IsPointer::value) > {}; /* type equality */ template struct IsEqual : false_t {}; template struct IsEqual: true_t {}; /* is lvalue reference */ template struct IsLvalueReference : false_t {}; template struct IsLvalueReference: true_t {}; /* is rvalue reference */ template struct IsRvalueReference : false_t {}; template struct IsRvalueReference: true_t {}; /* is reference */ template struct IsReference: IntegralConstant::value || IsRvalueReference::value) > {}; /* is array */ template struct IsArray : false_t {}; template struct IsArray: true_t {}; template struct IsArray: true_t {}; } #endif