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 SHDATATYPEIMPL_HPP
00028 #define SHDATATYPEIMPL_HPP
00029
00030 #include <climits>
00031 #include <cmath>
00032 #include <algorithm>
00033 #include "ShDataType.hpp"
00034
00035 namespace SH {
00036
00038 template<typename T, ShDataType DT>
00039 inline
00040 typename ShDataTypeCppType<T, DT>::type shDataTypeCond(bool cond)
00041 {
00042 return cond ? ShDataTypeConstant<T, DT>::One : ShDataTypeConstant<T, DT>::Zero;
00043 }
00044
00049 template<typename T>
00050 inline
00051 bool shDataTypeEqual(const T &a,
00052 const T &b)
00053 {
00054 return a == b;
00055 }
00056
00057 template<typename T>
00058 inline
00059 bool shDataTypeEqual(const ShInterval<T> &a, const ShInterval<T> &b)
00060 {
00061 return (a.lo() == b.lo()) && (a.hi() == b.hi());
00062 }
00063
00064
00068 template<typename T>
00069 inline
00070 bool shDataTypeIsPositive(const T &a)
00071 {
00072 return a > 0;
00073 }
00074
00075 template<typename T>
00076 inline
00077 bool shDataTypeIsPositive(const ShInterval<T> &a)
00078 {
00079 return (a.lo() > 0);
00080 }
00081
00083
00088 template<typename T1, ShDataType DT1, typename T2, ShDataType DT2>
00089 void shDataTypeCast(typename ShDataTypeCppType<T1, DT1>::type &dest,
00090 const typename ShDataTypeCppType<T2, DT2>::type &src)
00091 {
00092 typedef typename ShDataTypeCppType<T1, DT1>::type desttype;
00093 dest = (desttype)(src);
00094 }
00095
00096
00097 }
00098
00099 #endif