Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

ShStorageType.hpp

00001 // Sh: A GPU metaprogramming language.
00002 //
00003 // Copyright 2003-2005 Serious Hack Inc.
00004 // 
00005 // This software is provided 'as-is', without any express or implied
00006 // warranty. In no event will the authors be held liable for any damages
00007 // arising from the use of this software.
00008 // 
00009 // Permission is granted to anyone to use this software for any purpose,
00010 // including commercial applications, and to alter it and redistribute it
00011 // freely, subject to the following restrictions:
00012 // 
00013 // 1. The origin of this software must not be misrepresented; you must
00014 // not claim that you wrote the original software. If you use this
00015 // software in a product, an acknowledgment in the product documentation
00016 // would be appreciated but is not required.
00017 // 
00018 // 2. Altered source versions must be plainly marked as such, and must
00019 // not be misrepresented as being the original software.
00020 // 
00021 // 3. This notice may not be removed or altered from any source
00022 // distribution.
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   // @todo not sure we want all of these here, since there could be user-defined 
00239   // special types too.  This might be too restrictive if we depend on these. 
00240 
00241   static const char* name; 
00242 
00243   // @todo type include here the ability to set available operations 
00244 
00245   // @todo type include here ShPrograms for transforming from this
00246   // storage type to a set of different ones, allowing the transformers
00247   // to choose the best conversions.
00248 
00249   // once the above two things are complete, than user-defined types should
00250   // work just fine.
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

Generated on Wed Jun 15 18:12:41 2005 for Sh by  doxygen 1.4.3-20050530