Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members

typetraits.h

00001 // Copyright (C) 1999 Jean-Marc Valin
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 //#define _DEF_UNKNOWN_TYPE(type) template<>struct TypeTraits<type> {enum {isBasic=2};};
00026 
00027 //Those traits definitions are useful for Vectors & Matrixes (I/O)
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 //_DEF_C_TYPE(std::string)
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 //KLUDGE: This is a kludge but it should get the right traits for pointer types
00056 template<class T>
00057 struct TypeTraits<T*> 
00058 {
00059         enum {kind=TTraits::ObjectPointer+TypeTraits<T>::kind};
00060 };
00061 
00062 }//namespace FD
00063 #endif

Generated on Wed Oct 5 14:28:56 2005 for FlowDesigner by  doxygen 1.4.4