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 SHDATATYPE_HPP
00028 #define SHDATATYPE_HPP
00029
00030 #include "ShUtility.hpp"
00031 #include "ShVariableType.hpp"
00032 #include "ShInterval.hpp"
00033 #include "ShHalf.hpp"
00034 #include "ShFraction.hpp"
00035 #include "ShStorageType.hpp"
00036
00043 namespace SH {
00046 enum ShDataType {
00047 SH_HOST,
00048 SH_MEM,
00049 SH_DATATYPE_END
00050 };
00051
00052 SH_DLLEXPORT
00053 extern const char* dataTypeName[];
00054
00064 template<typename T, ShDataType DT> struct ShDataTypeCppType;
00065
00066 template<typename T> struct ShDataTypeCppType<T, SH_HOST> { typedef T type; };
00067 template<typename T> struct ShDataTypeCppType<T, SH_MEM> { typedef T type; };
00068
00069
00070 #define SH_VALUETYPE_DATATYPE(T, hostType, memType)\
00071 template<> struct ShDataTypeCppType<T, SH_HOST> { typedef hostType type; }; \
00072 template<> struct ShDataTypeCppType<T, SH_MEM> { typedef memType type; };
00073
00074 SH_VALUETYPE_DATATYPE(ShHalf, float, ShHalf);
00075
00076 template<typename T> struct ShHostType { typedef typename ShDataTypeCppType<T, SH_HOST>::type type; };
00077 template<typename T> struct ShMemType { typedef typename ShDataTypeCppType<T, SH_MEM>::type type; };
00078
00079
00085 template<typename T, ShDataType DT>
00086 struct ShDataTypeConstant {
00087 typedef typename ShDataTypeCppType<T, DT>::type type;
00088 static const type Zero; \
00089 static const type One; \
00090 };
00091
00092 template<typename T, ShDataType DT>
00093 const typename ShDataTypeCppType<T, DT>::type ShDataTypeConstant<T, DT>::Zero =
00094 (typename ShDataTypeCppType<T, DT>::type)(0.0);
00095
00096 template<typename T, ShDataType DT>
00097 const typename ShDataTypeCppType<T, DT>::type ShDataTypeConstant<T, DT>::One =
00098 (typename ShDataTypeCppType<T, DT>::type)(1.0);
00099
00100
00102 template<typename T, ShDataType DT>
00103 inline
00104 typename ShDataTypeCppType<T, DT>::type shDataTypeCond(bool cond);
00105
00109 template<typename T>
00110 inline
00111 bool shDataTypeEqual(const T &a, const T &b);
00112
00113
00116 template<typename T>
00117 inline
00118 bool shDataTypeIsPositive(const T &a);
00119
00120
00123 template<typename T1, ShDataType DT1, typename T2, ShDataType DT2>
00124 void shDataTypeCast(typename ShDataTypeCppType<T1, DT1>::type &dest,
00125 const typename ShDataTypeCppType<T2, DT2>::type &src);
00126
00127 }
00128
00129 #include "ShDataTypeImpl.hpp"
00130
00131 #endif