00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef SH_AUTILS_H
00022 #define SH_AUTILS_H
00023
00024 #include <cmath>
00025 #ifndef log2
00026
00027 # define log2(x) (log(x) / log(2.0))
00028 #endif
00029
00034 class AUtils {
00035 public:
00039 template<class T> static T max (T a, T b) ;
00040
00044 template<class T> static T min (T a, T b) ;
00045
00049 template<class T> static T div_roundup (T a, T b) ;
00050
00054 template<class T> static T bminus (T a, T b) ;
00055
00059 template<class T, T top> static T bplus (T a, T b) ;
00060 template<class T> static T bplus (T a, T b, T top) ;
00061
00065 template<class T, class CTYPE> static T modsum (T* s, CTYPE n, T m) ;
00066
00070 template<class IT, class FT> static IT roundup (FT x) ;
00071
00075 template<class T> static T log2_ceil (T n) ;
00076 } ;
00077
00078 template<class T>
00079 T AUtils::max (T a, T b)
00080 {
00081 if (a > b) {
00082 return a ;
00083 }
00084 else {
00085 return b ;
00086 }
00087 }
00088
00089 template<class T>
00090 T AUtils::min (T a, T b)
00091 {
00092 if (a < b) {
00093 return a ;
00094 }
00095 else {
00096 return b ;
00097 }
00098 }
00099
00100 template<class T>
00101 T AUtils::div_roundup (T a, T b)
00102 {
00103 T c = b-- ;
00104 return ((a + b) / c) ;
00105 }
00106
00107 template<class T>
00108 T AUtils::bminus (T a, T b)
00109 {
00110 if (a > b) {
00111 return (a - b) ;
00112 }
00113 else {
00114 return T() ;
00115 }
00116 }
00117
00118 template<class T, T top>
00119 T AUtils::bplus (T a, T b)
00120 {
00121 a += b ;
00122 if (a > top) {
00123 return top ;
00124 }
00125 else {
00126 return a ;
00127 }
00128 }
00129
00130 template<class T>
00131 T AUtils::bplus (T a, T b, T top)
00132 {
00133 a += b ;
00134 if (a > top) {
00135 return top ;
00136 }
00137 else {
00138 return a ;
00139 }
00140 }
00141
00142 template<class T, class CTYPE>
00143 T AUtils::modsum (T* s, CTYPE n, T m)
00144 {
00145 T retval = 0 ;
00146 for (CTYPE i = CTYPE() ; i < n ; ++i) {
00147 retval = (retval + s[i]) % m ;
00148 }
00149 return retval ;
00150 }
00151
00152 template<class IT, class FT>
00153 IT AUtils::roundup (FT x)
00154 {
00155 IT retval = 0 ;
00156 FT intpart = (FT) ((IT) x) ;
00157 if (x - intpart == (FT) 0.0) {
00158 retval = (IT) x ;
00159 }
00160 else {
00161 retval = ((IT) x) + 1 ;
00162 }
00163 return retval ;
00164 }
00165
00166 template<class T>
00167 T AUtils::log2_ceil (T n)
00168 {
00169 T retval = 0 ;
00170 while (n > 1) {
00171 n = div_roundup<T> (n, 2) ;
00172 ++retval ;
00173 }
00174 return retval ;
00175 }
00176
00177 #endif // ndef SH_AUTILS_H