00001
00002
00003 #ifndef TYPE_TRAITS_H
00004 #define TYPE_TRAITS_H
00005
00006 #include "Object.h"
00007 #include <complex>
00008
00009 namespace FD {
00010
00011 class TTraits {
00012 public:
00013 enum Kind {Object=0, Basic=1, Unknown=2, ObjectPointer=3, BasicPointer=4, UnknownPointer=5};
00014 };
00015
00016 template<class T>
00017 struct TypeTraits {
00018 enum {kind=TTraits::Unknown};
00019 };
00020
00021 #define _DEF_OBJECT_TYPE(type) template<>struct TypeTraits<type> {enum {kind=TTraits::Object};};
00022 #define _DEF_OBJECTPTR_TYPE(type) template<>struct TypeTraits<type> {enum {kind=TTraits::ObjectPointer};};
00023 #define _DEF_C_TYPE(type) template<>struct TypeTraits<type> {enum {kind=TTraits::Basic};};
00024
00025
00026
00027
00028
00029 _DEF_C_TYPE(int)
00030 _DEF_C_TYPE(float)
00031 _DEF_C_TYPE(double)
00032 _DEF_C_TYPE(bool)
00033 _DEF_C_TYPE(unsigned int)
00034 _DEF_C_TYPE(char)
00035 _DEF_C_TYPE(unsigned char)
00036 _DEF_C_TYPE(long)
00037 _DEF_C_TYPE(unsigned long)
00038
00039 _DEF_OBJECTPTR_TYPE(ObjectRef)
00040
00041
00042
00043 template<class T>
00044 struct TypeTraits<std::complex<T> >
00045 {
00046 enum {kind=TTraits::Basic};
00047 };
00048
00049 template<class T>
00050 struct TypeTraits<RCPtr<T> >
00051 {
00052 enum {kind=TTraits::ObjectPointer};
00053 };
00054
00055
00056 template<class T>
00057 struct TypeTraits<T*>
00058 {
00059 enum {kind=TTraits::ObjectPointer+TypeTraits<T>::kind};
00060 };
00061
00062 }
00063 #endif