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 #ifndef MLN_MATH_ABS_HH
00027 # define MLN_MATH_ABS_HH
00028
00032
00033 # include <cmath>
00034 # include <cstdlib>
00035
00036 # include <mln/value/int_u.hh>
00037
00038
00039 namespace mln
00040 {
00041
00042 namespace math
00043 {
00044
00046 template <typename T>
00047 T abs(const T& v);
00048
00056 int abs(int v);
00057 long abs(long v);
00058
00059 float abs(float v);
00060 double abs(double v);
00061 long double abs(long double v);
00063
00065 template <unsigned n>
00066 value::int_u<n> abs(const value::int_u<n>& v);
00067
00068
00069
00070 # ifndef MLN_INCLUDE_ONLY
00071
00072 template <typename T>
00073 inline
00074 T abs(const T& v)
00075 {
00076 return v >= 0 ? v : static_cast<T>(-v);
00077 }
00078
00079 inline int abs(int v) { return std::abs(v); }
00080 inline long abs(long v) { return std::abs(v); }
00081
00082 inline float abs(float v) { return std::abs(v); }
00083 inline double abs(double v) { return std::abs(v); }
00084 inline long double abs(long double v) { return std::abs(v); }
00085
00086 template <unsigned n>
00087 inline
00088 value::int_u<n> abs(const value::int_u<n>& v)
00089 {
00090 return v;
00091 }
00092
00093 # endif // ! MLN_INCLUDE_ONLY
00094
00095 }
00096
00097 }
00098
00099
00100 #endif // ! MLN_MATH_ABS_HH