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
00026
00027
00028
00029
00030
00031
00032 #ifndef EMU_UTILITY_MATH_H
00033 #define EMU_UTILITY_MATH_H
00034
00035
00036 namespace Onikiri {
00037 namespace EmulatorUtility {
00038
00039 template < typename T >
00040 static bool IsNAN( T value )
00041 {
00042 return boost::math::isnan( value );
00043 }
00044
00045
00046
00047 template <typename T, bool Signed>
00048 struct signed_unsigned_type;
00049
00050 template <typename T>
00051 struct signed_type
00052 {
00053 typedef typename signed_unsigned_type<T, true>::type type;
00054 };
00055
00056 template <typename T>
00057 struct unsigned_type
00058 {
00059 typedef typename signed_unsigned_type<T, false>::type type;
00060 };
00061
00062 #define IMPLEMENT_SIGNED_UNSIGNED_TYPE(Type) \
00063 template <> \
00064 struct signed_unsigned_type<signed Type, true> { \
00065 typedef signed Type type; \
00066 }; \
00067 template <> \
00068 struct signed_unsigned_type<signed Type, false> { \
00069 typedef unsigned Type type; \
00070 }; \
00071 template <> \
00072 struct signed_unsigned_type<unsigned Type, true> { \
00073 typedef signed Type type; \
00074 }; \
00075 template <> \
00076 struct signed_unsigned_type<unsigned Type, false> { \
00077 typedef unsigned Type type; \
00078 };
00079 #define IMPLEMENT_SIGNED_UNSIGNED_TYPE_FLOAT(Type) \
00080 template <bool Sign> \
00081 struct signed_unsigned_type<Type, Sign> { \
00082 typedef Type type; \
00083 };
00084
00085 IMPLEMENT_SIGNED_UNSIGNED_TYPE(char)
00086 IMPLEMENT_SIGNED_UNSIGNED_TYPE(short)
00087 IMPLEMENT_SIGNED_UNSIGNED_TYPE(int)
00088 IMPLEMENT_SIGNED_UNSIGNED_TYPE(long)
00089 IMPLEMENT_SIGNED_UNSIGNED_TYPE(long long)
00090 IMPLEMENT_SIGNED_UNSIGNED_TYPE_FLOAT(float)
00091 IMPLEMENT_SIGNED_UNSIGNED_TYPE_FLOAT(double)
00092 IMPLEMENT_SIGNED_UNSIGNED_TYPE_FLOAT(long double)
00093
00094 #undef IMPLEMENT_SIGNED_UNSIGNED_TYPE
00095 #undef IMPLEMENT_SIGNED_UNSIGNED_TYPE_FLOAT
00096
00097
00098 template <typename T>
00099 inline typename unsigned_type<T>::type cast_to_unsigned(T x)
00100 {
00101 return static_cast< typename unsigned_type<T>::type > (x);
00102 }
00103
00104
00105 template <typename T>
00106 inline typename signed_type<T>::type cast_to_signed(T x)
00107 {
00108 return static_cast< typename signed_type<T>::type > (x);
00109 }
00110
00111 }
00112 }
00113
00114 #endif // #ifndef EMU_UTILITY_MATH_H
00115
00116