From 292c5a35b7ec7fb3d25222ccaceb2eaa05f1bd79 Mon Sep 17 00:00:00 2001 From: q66 Date: Mon, 13 Apr 2015 22:56:02 +0100 Subject: [PATCH] moar traits + strip qualifiers first --- octa/traits.h | 90 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 71 insertions(+), 19 deletions(-) diff --git a/octa/traits.h b/octa/traits.h index e1f5735..d0e42af 100644 --- a/octa/traits.h +++ b/octa/traits.h @@ -9,6 +9,37 @@ #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; @@ -22,33 +53,54 @@ namespace octa { template const T IntegralConstant::value; - template struct IsInteger: false_t {}; - template struct IsFloat : false_t {}; - template struct IsPointer: false_t {}; + /* is integer */ - template<> struct IsInteger: true_t {}; - template<> struct IsInteger: true_t {}; - template<> struct IsInteger: true_t {}; - template<> struct IsInteger: true_t {}; - template<> struct IsInteger: true_t {}; - template<> struct IsInteger: true_t {}; - template<> struct IsInteger: true_t {}; - template<> struct IsInteger: true_t {}; - template<> struct IsInteger: true_t {}; - template<> struct IsInteger: true_t {}; - template<> struct IsInteger: true_t {}; - template<> struct IsInteger: true_t {}; + template struct IsIntegerBase: false_t {}; - template<> struct IsFloat: true_t {}; - template<> struct IsFloat: true_t {}; - template<> struct IsFloat: 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 IsIntegerBase: true_t {}; - template<> struct IsPointer: 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 { static const bool value = false;