00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
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
00035
00036
00037
00038 #include <sstream>
00039
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
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
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
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
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
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
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
00112
00113
00114
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
00128
00129
00130
00131 inline uint zeroLeastSigOneBit(uint n) {
00132 return (n&(n-1));
00133 }
00134
00135
00136
00137
00138 inline bool isPowOfTwo(uint n) {
00139 return (zeroLeastSigOneBit(n)==0);
00140 }
00141
00142
00143
00144
00145 inline uint numOnesInWord(unsigned int n) {
00146 const uint S[] = {1, 2, 4, 8, 16};
00147 const uint B[] = {0x55555555, 0x33333333, 0x0F0F0F0F, 0x00FF00FF, 0x0000FFFF};
00148
00149 n = ((n >> S[0]) & B[0]) + (n & B[0]);
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
00159
00160 inline uint modPowOf2( uint val, uint powOf2 )
00161 {
00162 unsigned int d = 1 << powOf2;
00163 return val & (d - 1);
00164 }
00165
00166
00167
00168
00169 inline uint mod_fast( uint a, uint b )
00170 {
00171 return a & (b - 1);
00172 }
00173
00174
00175
00176 inline uint lg2( uint v )
00177 {
00178 assert( sizeof(v) == 4 );
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;
00185 for (i = 4; i >= 0; i--)
00186 {
00187 if (v & b[i])
00188 {
00189 v >>= S[i];
00190 c |= S[i];
00191 }
00192 }
00193
00194 return c;
00195 }
00196
00197
00198
00199
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 )
00215 {
00216 return (double)(int)(x + (x<0.0 ? -0.5 : +0.5));
00217 }
00218 #endif
00219
00220
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 }
01043 #endif // mm_h