arbeit
Main Page | Namespace List | Class Hierarchy | Alphabetical List | Compound List | File List | Namespace Members | Compound Members | File Members

mm.h

Go to the documentation of this file.
00001 /*
00002  * $Id: mm.h,v 1.5 2003/09/05 04:20:11 jmk Exp $
00003  */
00004 ///////////////////////////////////////////////////////////////////////////
00005 //              _____________  ______________________    __   __  _____
00006 //             /  ________  |  |   ___   ________   /   |  \ /  \   |
00007 //            |  |       |  |_ |  |_ |  |       /  /    \__  |      |
00008 //            |  |  ___  |  || |  || |  |      /  /        | |      |
00009 //            |  | |   \ |  || |  || |  |     /  /      \__/ \__/ __|__
00010 //            |  | |_@  ||  || |  || |  |    /  /          Institute
00011 //            |  |___/  ||  ||_|  || |  |   /  /_____________________
00012 //             \_______/  \______/ | |__|  /___________________________
00013 //                        |  |__|  |
00014 //                         \______/
00015 //                    University of Utah       
00016 //                           2002
00017 ///////////////////////////////////////////////////////////////////////////
00018 
00019 #ifndef mm_h
00020 #define mm_h
00021 
00022 #define __win32 WIN32
00023 
00024 #if __sgi
00025 #include <math.h>
00026 #include <float.h>
00027 #include <assert.h>
00028 #else
00029 #include <cassert>
00030 #include <cmath>
00031 #include <cfloat>
00032 #endif
00033 #include <string>
00034 //#if __win32
00035 //#include <windows.h>
00036 //#endif
00037 
00038 #include <sstream>
00039 // type shorthand
00040 typedef unsigned char   uchar;
00041 typedef unsigned char   ubyte;
00042 typedef unsigned short  ushort;
00043 typedef unsigned int    uint;
00044 typedef unsigned long   ulong;
00045 #if __win32
00046 typedef __int64 llong;
00047 typedef unsigned __int64 ullong;
00048 #else // __real_os
00049 typedef long long llong;
00050 typedef unsigned long long ullong;
00051 #endif // __win32
00052 
00053 namespace gutz{ 
00054 
00055 #if __win32
00056 #if VC6 
00057 // these are missing from math.h
00058 #define M_E        2.71828182845904523536 
00059 #define M_LOG2E    1.44269504088896340736 
00060 #define M_LOG10E   0.434294481903251827651 
00061 #define M_LN2      0.693147180559945309417 
00062 #define M_LN10     2.30258509299404568402 
00063 #define M_PI       3.14159265358979323846 
00064 #define M_PI_2     1.57079632679489661923 
00065 #define M_PI_4     0.785398163397448309616 
00066 #define M_1_PI     0.318309886183790671538 
00067 #define M_2_PI     0.636619772367581343076 
00068 #define M_2_SQRTPI 1.12837916709551257390 
00069 #define M_SQRT2    1.41421356237309504880 
00070 #define M_SQRT1_2  0.707106781186547524401 
00071 // and these are screwed up
00072 #define mm_abs(x) ((x < 0 ? -x : x))
00073 
00074 #else // VC7
00075 #define mm_abs(x) ((x < 0 ? -x : x))
00076 #endif // VC6
00077 // some useful functions
00078 #define cbrt(x) pow((x), 1.0/3.0)
00079 #define drand48() (rand()/(double)RAND_MAX)
00080 #else // __real_os
00081 #define mm_abs(x) ((x < 0 ? -x : x))
00082 #endif // __win32
00083 
00084 
00085 // a bit better naming
00086 #define MM_EPSF FLT_EPSILON
00087 #define MM_MINF FLT_MIN
00088 #define MM_MAXF FLT_MAX
00089 #define MM_EPSD DBL_EPSILON
00090 #define MM_MIND DBL_MIN
00091 #define MM_MAXD DBL_MAX
00092 
00093 // useful macros
00094 #define mm_rad2deg(x) (180.0/M_PI*(x))
00095 #define mm_deg2rad(x) (M_PI/180.0*(x))
00096 #define mm_sgn(x) ((x)>0 ? 1.0 : ((x)<0 ? -1.0 : 0))
00097 #define mm_sq(x) ((x)*(x))
00098 
00099 /*
00100  * cast defines
00101  */
00102 #ifndef __win32
00103 #define mm_castf2d mm_cast<float,double>
00104 #define mm_castd2f mm_cast<double,float>
00105 #define mm_castf2i mm_cast<float,int>
00106 #define mm_casti2f mm_cast<int,float>
00107 #define mm_castd2i mm_cast<double,int>
00108 #define mm_casti2d mm_cast<int,double>
00109 #endif
00110 
00111 // Extra boolean operators
00112 /*template <class T1, class T2>
00113 inline bool xor( T1 a, T2 b ) {
00114         return( (a || b) && !(a && b) );
00115 }*/
00116 
00117 template <class T1, class T2>
00118 inline bool nand( T1 a, T2 b ) {
00119         return( !( a && b ) );
00120 }
00121 
00122 template <class T1, class T2>
00123 inline bool nor( T1 a, T2 b ) {
00124         return( !( a || b ) );
00125 }
00126 
00127 // Bit Operators
00128 // - Many of these are taken from "http://www.sjbaker.org/steve/software/cute_code.html"
00129 
00130 // Zero the least signficant '1' be in 'n'
00131 inline uint zeroLeastSigOneBit(uint n) { 
00132         return (n&(n-1)); 
00133 }
00134 
00135 // Is 'n' a power of 2 integer?
00136 // - Zero and One are considered to be powers of two
00137 // - A power-of-two int has only one '1' bit, so zero'ing it should give zero back
00138 inline bool isPowOfTwo(uint n) { 
00139         return (zeroLeastSigOneBit(n)==0); 
00140 }
00141 
00142 // How many 1's are in 'n'?
00143 // This trick was found at:
00144 // http://graphics.stanford.edu/~seander/bithacks.html
00145 inline uint numOnesInWord(unsigned int n) {
00146         const uint S[] = {1, 2, 4, 8, 16}; // Magic Numbers
00147         const uint B[] = {0x55555555, 0x33333333, 0x0F0F0F0F, 0x00FF00FF, 0x0000FFFF};
00148 
00149         n = ((n >> S[0]) & B[0]) + (n & B[0]);//Use magic to find out how many 1's are set in this word
00150         n = ((n >> S[1]) & B[1]) + (n & B[1]);
00151         n = ((n >> S[2]) & B[2]) + (n & B[2]);
00152         n = ((n >> S[3]) & B[3]) + (n & B[3]);
00153         n = ((n >> S[4]) & B[4]) + (n & B[4]);
00154 
00155         return n;
00156 }
00157 
00158 // Compute val % pow(2,powOf2) w/out divides
00159 // WARNING: Do NOT use on vals larger than sizeof(uint)!!
00160 inline uint modPowOf2( uint val, uint powOf2 )
00161 {
00162         unsigned int d = 1 << powOf2; // So d will be one of: 1, 2, 4, 8, 16, 32, ...
00163         return val & (d - 1); 
00164 }
00165 
00166 // Compute (a % b) w/out divides
00167 // WARNING: 'b' MUST be a power of two!!!!!
00168 // WARNING: Do NOT use on vals larger than sizeof(uint)!!
00169 inline uint mod_fast( uint a, uint b )
00170 {
00171         return a & (b - 1); 
00172 }
00173 
00174 // Return lg-base 2 of 'v'
00175 // - If 'v' is power-of-two, 'lg2_fast(v)' is faster
00176 inline uint lg2( uint v )
00177 {
00178   assert( sizeof(v) == 4 );//Ensure 32-bit integer
00179 
00180   const uint b[] = {0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0, 0xFF00FF00, 0xFFFF0000};
00181   const uint S[] = {1, 2, 4, 8, 16};
00182   int i;
00183 
00184   register uint c = 0;          // result of log2(v) will go here
00185   for (i = 4; i >= 0; i--)      // unroll for speed... 
00186   {
00187     if (v & b[i])
00188     {
00189       v >>= S[i];
00190       c |= S[i];
00191     } 
00192   }
00193 
00194   return c;
00195 }
00196 
00197 // Return lg-base 2 of 'v'
00198 // - WARNING: 'v' MUST be a power of 2!
00199 // - If 'v' is non-pow-of-two, use 'lg2(v)'      
00200 inline uint lg2_fast( int v )
00201 {
00202   const uint b[] = {0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0, 0xFF00FF00, 0xFFFF0000};
00203         
00204   register uint c = ((v & b[0]) != 0);
00205   c |= ((v & b[4]) != 0) << 4;
00206   c |= ((v & b[3]) != 0) << 3;
00207   c |= ((v & b[2]) != 0) << 2;
00208   c |= ((v & b[1]) != 0) << 1;
00209 
00210   return c;
00211 }
00212 
00213 #ifdef WIN32 //We have to define this b/c VC++ doesn't have it
00214         inline double rint( double x ) //Round 'x' to the nearest integer
00215         {
00216                 return (double)(int)(x + (x<0.0 ? -0.5 : +0.5));
00217         }
00218 #endif
00219 
00220 // minimum of 2 values
00221 template <class T>
00222 inline
00223 T
00224 min2 (const T x, const T y)
00225 {
00226     return (x <= y ? x : y);
00227 }
00228 
00229 #define min2c min2<char>
00230 #define min2uc min2<uchar>
00231 #define min2b min2<char>
00232 #define min2ub min2<uchar>
00233 #define min2s min2<short>
00234 #define min2us min2<ushort>
00235 #define min2i min2<int>
00236 #define min2ui min2<uint>
00237 #define min2l min2<long>
00238 #define min2ul min2<ulong>
00239 #define min2ll min2<llong>
00240 #define min2ull min2<ullong>
00241 #define min2f min2<float>
00242 #define min2d min2<double>
00243 
00244 // minimum index of 2 values
00245 template <class T>
00246 inline
00247 int
00248 mini2 (const T x, const T y)
00249 {
00250     return (x <= y ? 0 : 1);
00251 }
00252 
00253 #define mini2c mini2<char>
00254 #define mini2uc mini2<uchar>
00255 #define mini2b mini2<char>
00256 #define mini2ub mini2<uchar>
00257 #define mini2s mini2<short>
00258 #define mini2us mini2<ushort>
00259 #define mini2i mini2<int>
00260 #define mini2ui mini2<uint>
00261 #define mini2l mini2<long>
00262 #define mini2ul mini2<ulong>
00263 #define mini2ll mini2<llong>
00264 #define mini2ull mini2<ullong>
00265 #define mini2f mini2<float>
00266 #define mini2d mini2<double>
00267 
00268 // maximum of 2 values
00269 template <class T>
00270 inline
00271 T
00272 max2 (const T x, const T y)
00273 {
00274     return (x >= y ? x : y);
00275 }
00276 
00277 #define max2c max2<char>
00278 #define max2uc max2<uchar>
00279 #define max2b max2<char>
00280 #define max2ub max2<uchar>
00281 #define max2s max2<short>
00282 #define max2us max2<ushort>
00283 #define max2i max2<int>
00284 #define max2ui max2<uint>
00285 #define max2l max2<long>
00286 #define max2ul max2<ulong>
00287 #define max2ll max2<llong>
00288 #define max2ull max2<ullong>
00289 #define max2f max2<float>
00290 #define max2d max2<double>
00291 
00292 // maximum index of 2 values
00293 template <class T>
00294 inline
00295 int
00296 maxi2 (const T x, const T y)
00297 {
00298     return (x >= y ? 0 : 1);
00299 }
00300 
00301 #define maxi2c maxi2<char>
00302 #define maxi2uc maxi2<uchar>
00303 #define maxi2b maxi2<char>
00304 #define maxi2ub maxi2<uchar>
00305 #define maxi2s maxi2<short>
00306 #define maxi2us maxi2<ushort>
00307 #define maxi2i maxi2<int>
00308 #define maxi2ui maxi2<uint>
00309 #define maxi2l maxi2<long>
00310 #define maxi2ul maxi2<ulong>
00311 #define maxi2ll maxi2<llong>
00312 #define maxi2ull maxi2<ullong>
00313 #define maxi2f maxi2<float>
00314 #define maxi2d maxi2<double>
00315 
00316 // minimum of 3 values
00317 template <class T>
00318 inline
00319 T
00320 min3 (const T x, const T y, const T z)
00321 {
00322     return (x <= y ?
00323             (x <= z ? x : z) : 
00324             (y <= z ? y : z));
00325 }
00326 
00327 #define min3c min3<char>
00328 #define min3uc min3<uchar>
00329 #define min3b min3<char>
00330 #define min3ub min3<uchar>
00331 #define min3s min3<short>
00332 #define min3us min3<ushort>
00333 #define min3i min3<int>
00334 #define min3ui min3<uint>
00335 #define min3l min3<long>
00336 #define min3ul min3<ulong>
00337 #define min3ll min3<llong>
00338 #define min3ull min3<ullong>
00339 #define min3f min3<float>
00340 #define min3d min3<double>
00341 
00342 // minimum index of 3 values
00343 template <class T>
00344 inline
00345 int
00346 mini3 (const T x, const T y, const T z)
00347 {
00348     return (x <= y ? 
00349             (x <= z ? 0 : 2) : 
00350             (y <= z ? 1 : 2));
00351 }
00352 
00353 #define mini3c mini3<char>
00354 #define mini3uc mini3<uchar>
00355 #define mini3b mini3<char>
00356 #define mini3ub mini3<uchar>
00357 #define mini3s mini3<short>
00358 #define mini3us mini3<ushort>
00359 #define mini3i mini3<int>
00360 #define mini3ui mini3<uint>
00361 #define mini3l mini3<long>
00362 #define mini3ul mini3<ulong>
00363 #define mini3ll mini3<llong>
00364 #define mini3ull mini3<ullong>
00365 #define mini3f mini3<float>
00366 #define mini3d mini3<double>
00367 
00368 // maximum of 3 values
00369 template <class T>
00370 inline
00371 T
00372 max3 (const T x, const T y, const T z)
00373 {
00374     return (x >= y ? 
00375             (x >= z ? x : z) : 
00376             (y >= z ? y : z));
00377 }
00378 
00379 #define max3c max3<char>
00380 #define max3uc max3<uchar>
00381 #define max3b max3<char>
00382 #define max3ub max3<uchar>
00383 #define max3s max3<short>
00384 #define max3us max3<ushort>
00385 #define max3i max3<int>
00386 #define max3ui max3<uint>
00387 #define max3l max3<long>
00388 #define max3ul max3<ulong>
00389 #define max3ll max3<llong>
00390 #define max3ull max3<ullong>
00391 #define max3f max3<float>
00392 #define max3d max3<double>
00393 
00394 // maximum index of 3 values
00395 template <class T>
00396 inline
00397 int
00398 maxi3 (const T x, const T y, const T z)
00399 {
00400     return (x >= y ? 
00401             (x >= z ? 0 : 2) : 
00402             (y >= z ? 1 : 2));
00403 }
00404 
00405 #define maxi3c maxi3<char>
00406 #define maxi3uc maxi3<uchar>
00407 #define maxi3b maxi3<char>
00408 #define maxi3ub maxi3<uchar>
00409 #define maxi3s maxi3<short>
00410 #define maxi3us maxi3<ushort>
00411 #define maxi3i maxi3<int>
00412 #define maxi3ui maxi3<uint>
00413 #define maxi3l maxi3<long>
00414 #define maxi3ul maxi3<ulong>
00415 #define maxi3ll maxi3<llong>
00416 #define maxi3ull maxi3<ullong>
00417 #define maxi3f maxi3<float>
00418 #define maxi3d maxi3<double>
00419 
00420 // minimum of 4 values
00421 template <class T>
00422 inline
00423 T
00424 min4 (const T x, const T y, const T z, const T w)
00425 {
00426     return (x <= y ? 
00427             (x <= z ? 
00428              (x <= w ? x : w) : 
00429              (z <= w ? z : w)) : 
00430             (y <= z ? 
00431              (y <= w ? y : w) : 
00432              (z <= w ? z : w)));
00433 }
00434 
00435 #define min4c min4<char>
00436 #define min4uc min4<uchar>
00437 #define min4b min4<char>
00438 #define min4ub min4<uchar>
00439 #define min4s min4<short>
00440 #define min4us min4<ushort>
00441 #define min4i min4<int>
00442 #define min4ui min4<uint>
00443 #define min4l min4<long>
00444 #define min4ul min4<ulong>
00445 #define min4ll min4<llong>
00446 #define min4ull min4<ullong>
00447 #define min4f min4<float>
00448 #define min4d min4<double>
00449 
00450 // minimum index of 4 values
00451 template <class T>
00452 inline
00453 int
00454 mini4 (const T x, const T y, const T z, const T w)
00455 {
00456     return (x <= y ? 
00457             (x <= z ? 
00458              (x <= w ? 0 : 3) : 
00459              (z <= w ? 2 : 3)) : 
00460             (y <= z ? 
00461              (y <= w ? 1 : 3) 
00462              : (z <= w ? 2 : 3)));
00463 }
00464 
00465 #define mini4c mini4<char>
00466 #define mini4uc mini4<uchar>
00467 #define mini4b mini4<char>
00468 #define mini4ub mini4<uchar>
00469 #define mini4s mini4<short>
00470 #define mini4us mini4<ushort>
00471 #define mini4i mini4<int>
00472 #define mini4ui mini4<uint>
00473 #define mini4l mini4<long>
00474 #define mini4ul mini4<ulong>
00475 #define mini4ll mini4<llong>
00476 #define mini4ull mini4<ullong>
00477 #define mini4f mini4<float>
00478 #define mini4d mini4<double>
00479 
00480 // maximum of 4 values
00481 template <class T>
00482 inline
00483 T
00484 max4 (const T x, const T y, const T z, const T w)
00485 {
00486     return (x >= y ? 
00487             (x >= z ? 
00488              (x >= w ? x : w) : 
00489              (z >= w ? z : w)) : 
00490             (y >= z ? 
00491              (y >= w ? y : w) : 
00492              (z >= w ? z : w)));
00493 }
00494 
00495 #define max4c max4<char>
00496 #define max4uc max4<uchar>
00497 #define max4b max4<char>
00498 #define max4ub max4<uchar>
00499 #define max4s max4<short>
00500 #define max4us max4<ushort>
00501 #define max4i max4<int>
00502 #define max4ui max4<uint>
00503 #define max4l max4<long>
00504 #define max4ul max4<ulong>
00505 #define max4ll max4<llong>
00506 #define max4ull max4<ullong>
00507 #define max4f max4<float>
00508 #define max4d max4<double>
00509 
00510 // maximum index of 4 values
00511 template <class T>
00512 inline
00513 int
00514 maxi4 (const T x, const T y, const T z, const T w)
00515 {
00516     return (x >= y ? 
00517             (x >= z ? 
00518              (x >= w ? 0 : 3) : 
00519              (z >= w ? 2 : 3)) : 
00520             (y >= z ? 
00521              (y >= w ? 1 : 3) 
00522              : (z >= w ? 2 : 3)));
00523 }
00524 
00525 #define maxi4c maxi4<char>
00526 #define maxi4uc maxi4<uchar>
00527 #define maxi4b maxi4<char>
00528 #define maxi4ub maxi4<uchar>
00529 #define maxi4s maxi4<short>
00530 #define maxi4us maxi4<ushort>
00531 #define maxi4i maxi4<int>
00532 #define maxi4ui maxi4<uint>
00533 #define maxi4l maxi4<long>
00534 #define maxi4ul maxi4<ulong>
00535 #define maxi4ll maxi4<llong>
00536 #define maxi4ull maxi4<ullong>
00537 #define maxi4f maxi4<float>
00538 #define maxi4d maxi4<double>
00539 
00540 // minimum of 5 values
00541 template <class T>
00542 inline
00543 T
00544 min5 (T x, T y, T z, T w, T u)
00545 {
00546     return (x <= y ? 
00547             (x <= z ? 
00548              (x <= w ? 
00549               (x <= u ? x : u) : 
00550               (w <= u ? w : u)) :
00551              (z <= w ? 
00552               (z <= u ? z : u) :
00553               (w <= u ? w : u))) : 
00554             (y <= z ? 
00555              (y <= w ? 
00556               (y <= u ? y : u) : 
00557               (w <= u ? w : u)) :
00558              (z <= w ? 
00559               (z <= u ? z : u) :
00560               (w <= u ? w : u))));
00561 }
00562 
00563 #define min5c min5<char>
00564 #define min5uc min5<uchar>
00565 #define min5b min5<char>
00566 #define min5ub min5<uchar>
00567 #define min5s min5<short>
00568 #define min5us min5<ushort>
00569 #define min5i min5<int>
00570 #define min5ui min5<uint>
00571 #define min5l min5<long>
00572 #define min5ul min5<ulong>
00573 #define min5ll min5<llong>
00574 #define min5ull min5<ullong>
00575 #define min5f min5<float>
00576 #define min5d min5<double>
00577 
00578 // minimum index of 5 values
00579 template <class T>
00580 inline
00581 int
00582 mini5 (T x, T y, T z, T w, T u)
00583 {
00584     return (x <= y ? 
00585             (x <= z ? 
00586              (x <= w ? 
00587               (x <= u ? 0 : 4) : 
00588               (w <= u ? 3 : 4)) :
00589              (z <= w ? 
00590               (z <= u ? 2 : 4) :
00591               (w <= u ? 3 : 4))) : 
00592             (y <= z ? 
00593              (y <= w ? 
00594               (y <= u ? 1 : 4) : 
00595               (w <= u ? 3 : 4)) :
00596              (z <= w ? 
00597               (z <= u ? 2 : 4) :
00598               (w <= u ? 3 : 4))));
00599 }
00600 
00601 #define mini5c mini5<char>
00602 #define mini5uc mini5<uchar>
00603 #define mini5b mini5<char>
00604 #define mini5ub mini5<uchar>
00605 #define mini5s mini5<short>
00606 #define mini5us mini5<ushort>
00607 #define mini5i mini5<int>
00608 #define mini5ui mini5<uint>
00609 #define mini5l mini5<long>
00610 #define mini5ul mini5<ulong>
00611 #define mini5ll mini5<llong>
00612 #define mini5ull mini5<ullong>
00613 #define mini5f mini5<float>
00614 #define mini5d mini5<double>
00615 
00616 // maximum of 5 values
00617 template <class T>
00618 inline
00619 T
00620 max5 (T x, T y, T z, T w, T u)
00621 {
00622     return (x >= y ? 
00623             (x >= z ? 
00624              (x >= w ? 
00625               (x >= u ? x : u) : 
00626               (w >= u ? w : u)) :
00627              (z >= w ? 
00628               (z >= u ? z : u) :
00629               (w >= u ? w : u))) : 
00630             (y >= z ? 
00631              (y >= w ? 
00632               (y >= u ? y : u) : 
00633               (w >= u ? w : u)) :
00634              (z >= w ? 
00635               (z >= u ? z : u) :
00636               (w >= u ? w : u))));
00637 }
00638 
00639 #define max5c max5<char>
00640 #define max5uc max5<uchar>
00641 #define max5b max5<char>
00642 #define max5ub max5<uchar>
00643 #define max5s max5<short>
00644 #define max5us max5<ushort>
00645 #define max5i max5<int>
00646 #define max5ui max5<uint>
00647 #define max5l max5<long>
00648 #define max5ul max5<ulong>
00649 #define max5ll max5<llong>
00650 #define max5ull max5<ullong>
00651 #define max5f max5<float>
00652 #define max5d max4<double>
00653 
00654 // maximum index of 5 values
00655 template <class T>
00656 inline
00657 int
00658 maxi5 (T x, T y, T z, T w, T u)
00659 {
00660     return (x >= y ? 
00661             (x >= z ? 
00662              (x >= w ? 
00663               (x >= u ? 0 : 4) : 
00664               (w >= u ? 3 : 4)) :
00665              (z >= w ? 
00666               (z >= u ? 2 : 4) :
00667               (w >= u ? 3 : 4))) : 
00668             (y >= z ? 
00669              (y >= w ? 
00670               (y >= u ? 1 : 4) : 
00671               (w >= u ? 3 : 4)) :
00672              (z >= w ? 
00673               (z >= u ? 2 : 4) :
00674               (w >= u ? 3 : 4))));
00675 }
00676 
00677 #define maxi5c maxi5<char>
00678 #define maxi5uc maxi5<uchar>
00679 #define maxi5b maxi5<char>
00680 #define maxi5ub maxi5<uchar>
00681 #define maxi5s maxi5<short>
00682 #define maxi5us maxi5<ushort>
00683 #define maxi5i maxi5<int>
00684 #define maxi5ui maxi5<uint>
00685 #define maxi5l maxi5<long>
00686 #define maxi5ul maxi5<ulong>
00687 #define maxi5ll maxi5<llong>
00688 #define maxi5ull maxi5<ullong>
00689 #define maxi5f maxi5<float>
00690 #define maxi5d maxi5<double>
00691 
00692 // minimum of 6 values
00693 template <class T>
00694 inline
00695 T
00696 min6 (T x, T y, T z, T w, T u, T v)
00697 {
00698     return (x <= y ? 
00699             (x <= z ? 
00700              (x <= w ? 
00701               (x <= u ? 
00702                (x <= v ? x : v) : 
00703                (u <= v ? u : v)) :
00704               (w <= u ? 
00705                (w <= v ? w : v) : 
00706                (u <= v ? u : v))) :
00707             (y <= z ? 
00708              (y <= w ? 
00709               (y <= u ? 
00710                (y <= v ? y : v) : 
00711                (u <= v ? u : v)) :
00712               (w <= u ? 
00713                (w <= v ? w : v) : 
00714                (u <= v ? u : v))) :
00715              (z <= w ? 
00716               (z <= u ? 
00717                (z <= v ? z : v) : 
00718                (u <= v ? u : v)) :
00719               (w <= u ? 
00720                (w <= v ? w : v) : 
00721                (u <= v ? u : v))))) :
00722             (y <= z ? 
00723              (y <= w ? 
00724               (y <= u ? 
00725                (y <= v ? y : v) : 
00726                (u <= v ? u : v)) :
00727               (w <= u ? 
00728                (w <= v ? w : v) : 
00729                (u <= v ? u : v))) :
00730 
00731              (z <= w ? 
00732               (z <= u ? 
00733                (z <= v ? z : v) : 
00734                (u <= v ? u : v)) :
00735               (w <= u ? 
00736                (w <= v ? w : v) : 
00737                (u <= v ? u : v)))));
00738 }
00739 
00740 #define min6c min6<char>
00741 #define min6uc min6<uchar>
00742 #define min6b min6<char>
00743 #define min6ub min6<uchar>
00744 #define min6s min6<short>
00745 #define min6us min6<ushort>
00746 #define min6i min6<int>
00747 #define min6ui min6<uint>
00748 #define min6l min6<long>
00749 #define min6ul min6<ulong>
00750 #define min6ll min6<llong>
00751 #define min6ull min6<ullong>
00752 #define min6f min6<float>
00753 #define min6d min6<double>
00754 
00755 // minimum index of 6 values
00756 template <class T>
00757 inline
00758 int
00759 mini6 (T x, T y, T z, T w, T u, T v)
00760 {
00761     return (x <= y ? 
00762             (x <= z ? 
00763              (x <= w ? 
00764               (x <= u ? 
00765                (x <= v ? 0 : 5) : 
00766                (u <= v ? 4 : 5)) :
00767               (w <= u ? 
00768                (w <= v ? 3 : 5) : 
00769                (u <= v ? 4 : 5))) :
00770             (y <= z ? 
00771              (y <= w ? 
00772               (y <= u ? 
00773                (y <= v ? 1 : 5) : 
00774                (u <= v ? 4 : 5)) :
00775               (w <= u ? 
00776                (w <= v ? 3 : 5) : 
00777                (u <= v ? 4 : 5))) :
00778              (z <= w ? 
00779               (z <= u ? 
00780                (z <= v ? 2 : 5) : 
00781                (u <= v ? 4 : 5)) :
00782               (w <= u ? 
00783                (w <= v ? 3 : 5) : 
00784                (u <= v ? 4 : 5))))) :
00785             (y <= z ? 
00786              (y <= w ? 
00787               (y <= u ? 
00788                (y <= v ? 1 : 5) : 
00789                (u <= v ? 4 : 5)) :
00790               (w <= u ? 
00791                (w <= v ? 3 : 5) : 
00792                (u <= v ? 4 : 5))) :
00793 
00794              (z <= w ? 
00795               (z <= u ? 
00796                (z <= v ? 2 : 5) : 
00797                (u <= v ? 4 : 5)) :
00798               (w <= u ? 
00799                (w <= v ? 3 : 5) : 
00800                (u <= v ? 4 : 5)))));
00801 }
00802 
00803 #define mini6c   mini6<char>
00804 #define mini6uc  mini6<uchar>
00805 #define mini6b   mini6<char>
00806 #define mini6ub  mini6<uchar>
00807 #define mini6s   mini6<short>
00808 #define mini6us  mini6<ushort>
00809 #define mini6i   mini6<int>
00810 #define mini6ui  mini6<uint>
00811 #define mini6l   mini6<long>
00812 #define mini6ul  mini6<ulong>
00813 #define mini6ll  mini6<llong>
00814 #define mini6ull mini6<ullong>
00815 #define mini6f   mini6<float>
00816 #define mini6d   mini6<double>
00817 
00818 // maximum of 6 values
00819 template <class T>
00820 inline
00821 T
00822 max6 (T x, T y, T z, T w, T u, T v)
00823 {
00824     return (x >= y ? 
00825             (x >= z ? 
00826              (x >= w ? 
00827               (x >= u ? 
00828                (x >= v ? x : v) : 
00829                (u >= v ? u : v)) :
00830               (w >= u ? 
00831                (w >= v ? w : v) : 
00832                (u >= v ? u : v))) :
00833             (y >= z ? 
00834              (y >= w ? 
00835               (y >= u ? 
00836                (y >= v ? y : v) : 
00837                (u >= v ? u : v)) :
00838               (w >= u ? 
00839                (w >= v ? w : v) : 
00840                (u >= v ? u : v))) :
00841              (z >= w ? 
00842               (z >= u ? 
00843                (z >= v ? z : v) : 
00844                (u >= v ? u : v)) :
00845               (w >= u ? 
00846                (w >= v ? w : v) : 
00847                (u >= v ? u : v))))) :
00848             (y >= z ? 
00849              (y >= w ? 
00850               (y >= u ? 
00851                (y >= v ? y : v) : 
00852                (u >= v ? u : v)) :
00853               (w >= u ? 
00854                (w >= v ? w : v) : 
00855                (u >= v ? u : v))) :
00856 
00857              (z >= w ? 
00858               (z >= u ? 
00859                (z >= v ? z : v) : 
00860                (u >= v ? u : v)) :
00861               (w >= u ? 
00862                (w >= v ? w : v) : 
00863                (u >= v ? u : v)))));
00864 }
00865 
00866 #define max6c max6<char>
00867 #define max6uc max6<uchar>
00868 #define max6b max6<char>
00869 #define max6ub max6<uchar>
00870 #define max6s max6<short>
00871 #define max6us max6<ushort>
00872 #define max6i max6<int>
00873 #define max6ui max6<uint>
00874 #define max6l max6<long>
00875 #define max6ul max6<ulong>
00876 #define max6ll max6<llong>
00877 #define max6ull max6<ullong>
00878 #define max6f max6<float>
00879 #define max6d max6<double>
00880 
00881 // maximum index of 6 values
00882 template <class T>
00883 inline
00884 int
00885 maxi6 (T x, T y, T z, T w, T u, T v)
00886 {
00887     return (x >= y ? 
00888             (x >= z ? 
00889              (x >= w ? 
00890               (x >= u ? 
00891                (x >= v ? 0 : 5) : 
00892                (u >= v ? 4 : 5)) :
00893               (w >= u ? 
00894                (w >= v ? 3 : 5) : 
00895                (u >= v ? 4 : 5))) :
00896             (y >= z ? 
00897              (y >= w ? 
00898               (y >= u ? 
00899                (y >= v ? 1 : 5) : 
00900                (u >= v ? 4 : 5)) :
00901               (w >= u ? 
00902                (w >= v ? 3 : 5) : 
00903                (u >= v ? 4 : 5))) :
00904              (z >= w ? 
00905               (z >= u ? 
00906                (z >= v ? 2 : 5) : 
00907                (u >= v ? 4 : 5)) :
00908               (w >= u ? 
00909                (w >= v ? 3 : 5) : 
00910                (u >= v ? 4 : 5))))) :
00911             (y >= z ? 
00912              (y >= w ? 
00913               (y >= u ? 
00914                (y >= v ? 1 : 5) : 
00915                (u >= v ? 4 : 5)) :
00916               (w >= u ? 
00917                (w >= v ? 3 : 5) : 
00918                (u >= v ? 4 : 5))) :
00919 
00920              (z >= w ? 
00921               (z >= u ? 
00922                (z >= v ? 2 : 5) : 
00923                (u >= v ? 4 : 5)) :
00924               (w >= u ? 
00925                (w >= v ? 3 : 5) : 
00926                (u >= v ? 4 : 5)))));
00927 }
00928 
00929 #define maxi6c maxi6<char>
00930 #define maxi6uc maxi6<uchar>
00931 #define maxi6b maxi6<char>
00932 #define maxi6ub maxi6<uchar>
00933 #define maxi6s maxi6<short>
00934 #define maxi6us maxi6<ushort>
00935 #define maxi6i maxi6<int>
00936 #define maxi6ui maxi6<uint>
00937 #define maxi6l maxi6<long>
00938 #define maxi6ul maxi6<ulong>
00939 #define maxi6ll maxi6<llong>
00940 #define maxi6ull maxi6<ullong>
00941 #define maxi6f maxi6<float>
00942 #define maxi6d maxi6<double>
00943 
00944 // NaN
00945 inline
00946 float
00947 nanf ()
00948 {
00949     char b[4];
00950 #if __sgi
00951     b[0] = (char)0x7f;
00952     b[1] = (char)0xc0;
00953     b[2] = 0;
00954     b[3] = 0;    
00955 #else
00956     b[0] = 0;
00957     b[1] = 0;
00958     b[2] = (char)0xc0;
00959     b[3] = (char)0x7f;
00960 #endif
00961     return *((float*)b);
00962 }
00963 
00964 // check for NaN
00965 template <class T>
00966 inline
00967 bool
00968 isnan (T x)
00969 {
00970     return x - x;
00971 }
00972 
00973 #define isnanf isnan<float>
00974 #define isnand isnan<double>
00975 
00976 // string conversion routines
00977 template <class T>
00978 bool
00979 str2 (const std::string& s, T* v, int n = 1)
00980 {
00981     std::istringstream z(s);
00982     bool status = false;
00983     int i = 0;
00984     while (i < n && !status)
00985     {
00986         status = status || z.eof();
00987         z >> v[i];
00988         status = status || z.fail();
00989         i++;
00990     }
00991     return status;
00992 }
00993 
00994 template <class T>
00995 bool
00996 str2 (const std::string* s, T* v, int n = 1)
00997 {
00998     if (!s) return true;
00999     return str2<T>(*s, v, n);
01000 }
01001 
01002 #define str2c str2<char>
01003 #define str2uc str2<uchar>
01004 #define str2b str2<char>
01005 #define str2ub str2<uchar>
01006 #define str2s str2<short>
01007 #define str2us str2<ushort>
01008 #define str2i str2<int>
01009 #define str2ui str2<uint>
01010 #define str2l str2<long>
01011 #define str2ul str2<ulong>
01012 #define str2ll str2<llong>
01013 #define str2ull str2<ullong>
01014 #define str2f str2<float>
01015 #define str2d str2<double>
01016 
01017 // integer exponential
01018 inline
01019 int
01020 expi (int base, int exp)
01021 {
01022     int i = 1;
01023     for (int j = 0; j<exp; j++)
01024         i *= base;
01025     return i;
01026 }
01027 
01028 // integer logarithm
01029 inline
01030 int
01031 logi (int base, int num)
01032 {
01033     int i = 0;
01034     while (num > 1)
01035     {
01036         num /= base;
01037         i++;
01038     }
01039     return i;
01040 }
01041 
01042 } // End of namespace gutz
01043 #endif // mm_h

Send questions, comments, and bug reports to:
jmk