00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00027 #ifndef SHTYPEINFO_HPP
00028 #define SHTYPEINFO_HPP
00029
00030 #include <string>
00031 #include <vector>
00032 #include "ShHashMap.hpp"
00033 #include "ShVariableType.hpp"
00034 #include "ShDataType.hpp"
00035 #include "ShRefCount.hpp"
00036 #include "ShInterval.hpp"
00037 #include "ShFraction.hpp"
00038 #include "ShHalf.hpp"
00039
00040 namespace SH {
00041
00043 class ShVariantFactory;
00044
00045
00049 struct
00050 SH_DLLEXPORT
00051 ShTypeInfo {
00052 virtual ~ShTypeInfo() {}
00053
00055 virtual const char* name() const = 0;
00056
00058 virtual int datasize() const = 0;
00059
00061 virtual const ShVariantFactory* variantFactory() const = 0;
00062
00066 static void init();
00067
00069 static const ShTypeInfo* get(ShValueType valueType, ShDataType dataType);
00070
00071 typedef ShPairHashMap<ShValueType, ShDataType, const ShTypeInfo*> TypeInfoMap;
00072 private:
00074 static TypeInfoMap m_valueTypes;
00075
00077 static void addCasts();
00078
00080 static void addOps();
00081 };
00082
00083
00084
00085 template<typename T, ShDataType DT>
00086 struct ShDataTypeInfo: public ShTypeInfo {
00087 public:
00088 typedef typename ShDataTypeCppType<T, DT>::type type;
00089 static const type Zero;
00090 static const type One;
00091
00092 const char* name() const;
00093 int datasize() const;
00094 const ShVariantFactory* variantFactory() const;
00095
00096 static const ShDataTypeInfo* instance();
00097
00098 protected:
00099 static ShDataTypeInfo *m_instance;
00100 ShDataTypeInfo() {}
00101 };
00102
00103
00104 SH_DLLEXPORT
00105 extern const ShTypeInfo* shTypeInfo(ShValueType valueType, ShDataType dataType = SH_HOST);
00106
00107 SH_DLLEXPORT
00108 extern const ShVariantFactory* shVariantFactory(ShValueType valueType, ShDataType dataType = SH_HOST);
00109
00110 SH_DLLEXPORT
00111 extern const char* shValueTypeName(ShValueType valueType);
00112 }
00113
00114 #include "ShTypeInfoImpl.hpp"
00115
00116 #endif