00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00024 #ifndef SHSTORAGETYPE_HPP
00025 #define SHSTORAGETYPE_HPP
00026
00027 #include "ShUtility.hpp"
00028 #include "ShVariableType.hpp"
00029 #include "ShHalf.hpp"
00030 #include "ShFraction.hpp"
00031
00038 namespace SH {
00039
00041 struct ShInvalidStorageType {};
00042
00055 typedef unsigned int ShValueType;
00056 enum __ShValueTypeEnum {
00057 SH_HALF = 0x0001,
00058 SH_FLOAT = 0x0002,
00059 SH_DOUBLE = 0x0003,
00060
00061 SH_BYTE = 0x0010,
00062 SH_SHORT = 0x0011,
00063 SH_INT = 0x0012,
00064
00065 SH_UBYTE = 0x0018,
00066 SH_USHORT = 0x0019,
00067 SH_UINT = 0x001A,
00068
00069 SH_FBYTE = 0x0020,
00070 SH_FSHORT = 0x0021,
00071 SH_FINT = 0x0022,
00072
00073 SH_FUBYTE = 0x0028,
00074 SH_FUSHORT = 0x0029,
00075 SH_FUINT = 0x002A,
00076
00077 SH_I_HALF = 0x0101,
00078 SH_I_FLOAT = 0x0102,
00079 SH_I_DOUBLE = 0x0103,
00080
00081 SH_A_HALF = 0x0201,
00082 SH_A_FLOAT = 0x0202,
00083 SH_A_DOUBLE = 0x0203,
00084
00085 SH_VALUETYPE_SIZE_MASK = 0x0007,
00086
00087 SH_VALUETYPE_SIGNED_MASK = 0x0008,
00088 SH_VALUETYPE_SIGNED = 0x0000,
00089
00090 SH_VALUETYPE_TYPE_MASK = 0x00F0,
00091 SH_VALUETYPE_TYPE_FLOAT = 0x0000,
00092 SH_VALUETYPE_TYPE_INT = 0x0010,
00093 SH_VALUETYPE_TYPE_FRAC = 0x0020,
00094
00095 SH_VALUETYPE_SPECIAL_MASK = 0x7F00,
00096 SH_VALUETYPE_SPECIAL_NONE = 0x0000,
00097 SH_VALUETYPE_SPECIAL_I = 0x0100,
00098 SH_VALUETYPE_SPECIAL_A = 0x0200,
00099
00100 SH_VALUETYPE_END = 0xFFFF
00101 };
00102
00103
00109 bool shIsFloat(ShValueType value_type);
00110 bool shIsInteger(ShValueType value_type);
00111 bool shIsFraction(ShValueType value_type);
00112
00113 bool shIsSigned(ShValueType value_type);
00114
00115 bool shIsRegularValueType(ShValueType value_type);
00116
00117 bool shIsInvalidValueType(ShValueType value_type);
00118
00119
00122 template<ShValueType V> struct __ShValueToStorageType { typedef ShInvalidStorageType type; };
00123 template<typename T> struct __ShStorageToValueType { static const ShValueType type = SH_VALUETYPE_END; };
00124
00125 #define SH_VALUE_STORAGE_TYPE_MAPPING(V, T)\
00126 template<> struct __ShValueToStorageType<V > { typedef T type; }; \
00127 template<> struct __ShStorageToValueType<T > { static const ShValueType type = V; };
00128
00129 SH_VALUE_STORAGE_TYPE_MAPPING(SH_HALF, ShHalf);
00130 SH_VALUE_STORAGE_TYPE_MAPPING(SH_FLOAT, float);
00131 SH_VALUE_STORAGE_TYPE_MAPPING(SH_DOUBLE, double);
00132
00133 SH_VALUE_STORAGE_TYPE_MAPPING(SH_BYTE, char);
00134 SH_VALUE_STORAGE_TYPE_MAPPING(SH_SHORT, short);
00135 SH_VALUE_STORAGE_TYPE_MAPPING(SH_INT, int);
00136 SH_VALUE_STORAGE_TYPE_MAPPING(SH_UBYTE, unsigned char);
00137 SH_VALUE_STORAGE_TYPE_MAPPING(SH_USHORT, unsigned short);
00138 SH_VALUE_STORAGE_TYPE_MAPPING(SH_UINT, unsigned int);
00139
00140 SH_VALUE_STORAGE_TYPE_MAPPING(SH_FBYTE, ShFracByte);
00141 SH_VALUE_STORAGE_TYPE_MAPPING(SH_FSHORT, ShFracShort);
00142 SH_VALUE_STORAGE_TYPE_MAPPING(SH_FINT, ShFracInt);
00143 SH_VALUE_STORAGE_TYPE_MAPPING(SH_FUBYTE, ShFracUByte);
00144 SH_VALUE_STORAGE_TYPE_MAPPING(SH_FUSHORT, ShFracUShort);
00145 SH_VALUE_STORAGE_TYPE_MAPPING(SH_FUINT, ShFracUInt);
00146
00147
00148
00151 template<typename T> struct __ShStorageTypeName { static const char* name; };
00152 template<typename T> const char* __ShStorageTypeName<T>::name = "unknown";
00153
00154 #define SH_STORAGETYPE_NAME_SPEC(T)\
00155 template<> struct SH_DLLEXPORT __ShStorageTypeName<T > { static const char* name; };
00156
00157 SH_STORAGETYPE_NAME_SPEC(ShHalf);
00158 SH_STORAGETYPE_NAME_SPEC(float);
00159 SH_STORAGETYPE_NAME_SPEC(double);
00160
00161 SH_STORAGETYPE_NAME_SPEC(char);
00162 SH_STORAGETYPE_NAME_SPEC(short);
00163 SH_STORAGETYPE_NAME_SPEC(int);
00164 SH_STORAGETYPE_NAME_SPEC(unsigned char);
00165 SH_STORAGETYPE_NAME_SPEC(unsigned short);
00166 SH_STORAGETYPE_NAME_SPEC(unsigned int);
00167
00168 SH_STORAGETYPE_NAME_SPEC(ShFracByte);
00169 SH_STORAGETYPE_NAME_SPEC(ShFracShort);
00170 SH_STORAGETYPE_NAME_SPEC(ShFracInt);
00171 SH_STORAGETYPE_NAME_SPEC(ShFracUByte);
00172 SH_STORAGETYPE_NAME_SPEC(ShFracUShort);
00173 SH_STORAGETYPE_NAME_SPEC(ShFracUInt);
00174
00175 #undef SH_STORAGETYPE_NAME_SPEC
00176
00177
00178
00179
00182 template<typename T>
00183 struct ShIsFraction: public MatchTemplateType<T, ShFraction> {};
00185
00189 template<ShValueType V>
00190 struct __ShRegularValueType
00191 {
00192 static const ShValueType type = (V & ~SH_VALUETYPE_SPECIAL_MASK);
00193 };
00194
00195 template<typename T>
00196 struct __ShRegularStorageType
00197 {
00198 static const ShValueType range_value_type = __ShStorageToValueType<T>::type;
00199 static const ShValueType value_type = __ShRegularValueType<range_value_type>::type;
00200 typedef typename __ShValueToStorageType<value_type>::type type;
00201 };
00202
00203 inline
00204 ShValueType shRegularValueType(ShValueType value_type);
00205
00206
00210 template<typename T1, typename T2>
00211 struct ShCommonType;
00212
00213 template<typename T1, typename T2, typename T3>
00214 struct ShCommonType3 {
00215 typedef typename ShCommonType<typename ShCommonType<T1, T2>::type, T3>::type type;
00216 };
00217
00218 template<typename T1, typename T2, typename T3, typename T4>
00219 struct ShCommonType4 {
00220 typedef typename ShCommonType<typename ShCommonType<T1, T2>::type,
00221 typename ShCommonType<T3, T4>::type>::type type;
00222 };
00223
00224
00228 template<typename T>
00229 struct ShStorageTypeInfo {
00230 typedef T storage_type;
00231 static const ShValueType value_type = __ShStorageToValueType<T>::type;
00232
00233
00235 typedef typename __ShRegularStorageType<T>::type RegularType;
00236 static const ShValueType RegularValueType = __ShStorageToValueType<RegularType>::type;
00237
00238
00239
00240
00241 static const char* name;
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251 };
00252
00253 template<typename T>
00254 const char* ShStorageTypeInfo<T>::name = __ShStorageTypeName<T>::name;
00255
00256
00258
00262 template<ShValueType V>
00263 struct ShValueTypeInfo: public ShStorageTypeInfo<typename __ShValueToStorageType<V>::type> {
00264 };
00265
00266 }
00267
00268 #include "ShStorageTypeImpl.hpp"
00269
00270 #endif