00001
00004 #ifndef FBXFILESDK_COMPONENTS_KBASELIB_KLIB_ITYPE_H
00005 #define FBXFILESDK_COMPONENTS_KBASELIB_KLIB_ITYPE_H
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
00033
00034
00035
00036
00037
00038
00039
00040
00041 #include <fbxfilesdk/components/kbaselib/karch/types.h>
00042
00043 #define K_INTERNAL
00044
00045 #define K_BIT0 (0x1)
00046 #define K_BIT1 (0x2)
00047 #define K_BIT2 (0x4)
00048 #define K_BIT3 (0x8)
00049 #define K_BIT4 (0x10)
00050 #define K_BIT5 (0x20)
00051 #define K_BIT6 (0x40)
00052 #define K_BIT7 (0x80)
00053 #define K_BIT8 (0x100)
00054 #define K_BIT9 (0x200)
00055 #define K_BIT10 (0x400)
00056 #define K_BIT11 (0x800)
00057 #define K_BIT12 (0x1000)
00058 #define K_BIT13 (0x2000)
00059 #define K_BIT14 (0x4000)
00060 #define K_BIT15 (0x8000)
00061 #define K_BIT16 (0x10000)
00062 #define K_BIT17 (0x20000)
00063 #define K_BIT18 (0x40000)
00064 #define K_BIT19 (0x80000)
00065 #define K_BIT20 (0x100000)
00066 #define K_BIT21 (0x200000)
00067 #define K_BIT22 (0x400000)
00068 #define K_BIT23 (0x800000)
00069 #define K_BIT24 (0x1000000)
00070 #define K_BIT25 (0x2000000)
00071 #define K_BIT26 (0x4000000)
00072 #define K_BIT27 (0x8000000)
00073 #define K_BIT28 (0x10000000)
00074 #define K_BIT29 (0x20000000)
00075 #define K_BIT30 (0x40000000)
00076 #define K_BIT31 (0x80000000)
00077
00078 #define K_BITS8(b7, b6, b5, b4, b3, b2, b1, b0) \
00079 ((kUInt8(b7) << 7) | (kUInt8(b6) << 6) | (kUInt8(b5) << 5) | (kUInt8(b4) << 4) | \
00080 (kUInt8(b3) << 3) | (kUInt8(b2) << 2) | (kUInt8(b1) << 1) | kUInt8(b0))
00081
00082 #define K_BITS16( \
00083 b15, b14, b13, b12, b11, b10, b9, b8, \
00084 b7, b6, b5, b4, b3, b2, b1, b0) \
00085 \
00086 ((kUInt16(b15) << 15) | (kUInt16(b14) << 14) | (kUInt16(b13) << 13) | (kUInt16(b12) << 12) | \
00087 (kUInt16(b11) << 11) | (kUInt16(b10) << 10) | (kUInt16(b9) << 9) | (kUInt16(b8) << 8) | \
00088 (kUInt16(b7) << 7) | (kUInt16(b6) << 6) | (kUInt16(b5) << 5) | (kUInt16(b4) << 4) | \
00089 (kUInt16(b3) << 3) | (kUInt16(b2) << 2) | (kUInt16(b1) << 1) | kUInt16(b0))
00090
00091 #define K_BITS32( \
00092 b31, b30, b29, b28, b27, b26, b25, b24, \
00093 b23, b22, b21, b20, b19, b18, b17, b16, \
00094 b15, b14, b13, b12, b11, b10, b9, b8, \
00095 b7, b6, b5, b4, b3, b2, b1, b0) \
00096 \
00097 ((kUInt32(b31) << 31) | (kUInt32(b30) << 30) | (kUInt32(b29) << 29) | (kUInt32(b28) << 28) | \
00098 (kUInt32(b27) << 27) | (kUInt32(b26) << 26) | (kUInt32(b25) << 25) | (kUInt32(b24) << 24) | \
00099 (kUInt32(b23) << 23) | (kUInt32(b22) << 22) | (kUInt32(b21) << 21) | (kUInt32(b20) << 20) | \
00100 (kUInt32(b19) << 19) | (kUInt32(b18) << 18) | (kUInt32(b17) << 17) | (kUInt32(b16) << 16) | \
00101 (kUInt32(b15) << 15) | (kUInt32(b14) << 14) | (kUInt32(b13) << 13) | (kUInt32(b12) << 12) | \
00102 (kUInt32(b11) << 11) | (kUInt32(b10) << 10) | (kUInt32(b9) << 9) | (kUInt32(b8) << 8) | \
00103 (kUInt32(b7) << 7) | (kUInt32(b6) << 6) | (kUInt32(b5) << 5) | (kUInt32(b4) << 4) | \
00104 (kUInt32(b3) << 3) | (kUInt32(b2) << 2) | (kUInt32(b1) << 1) | kUInt32(b0))
00105
00106 #define K_BITS64( \
00107 b63, b62, b61, b60, b59, b58, b57, b56, \
00108 b55, b54, b53, b52, b51, b50, b49, b48, \
00109 b47, b46, b45, b44, b43, b42, b41, b40, \
00110 b39, b38, b37, b36, b35, b34, b33, b32, \
00111 b31, b30, b29, b28, b27, b26, b25, b24, \
00112 b23, b22, b21, b20, b19, b18, b17, b16, \
00113 b15, b14, b13, b12, b11, b10, b9, b8, \
00114 b7, b6, b5, b4, b3, b2, b1, b0) \
00115 \
00116 ((kUInt64(b63) << 63) | (kUInt64(b62) << 62) | (kUInt64(b61) << 61) | (kUInt64(b60) << 60) | \
00117 (kUInt64(b59) << 59) | (kUInt64(b58) << 58) | (kUInt64(b57) << 57) | (kUInt64(b56) << 56) | \
00118 (kUInt64(b55) << 55) | (kUInt64(b54) << 54) | (kUInt64(b53) << 53) | (kUInt64(b52) << 52) | \
00119 (kUInt64(b51) << 51) | (kUInt64(b50) << 50) | (kUInt64(b49) << 49) | (kUInt64(b48) << 48) | \
00120 (kUInt64(b47) << 47) | (kUInt64(b46) << 46) | (kUInt64(b45) << 45) | (kUInt64(b44) << 44) | \
00121 (kUInt64(b43) << 43) | (kUInt64(b42) << 42) | (kUInt64(b41) << 41) | (kUInt64(b40) << 40) | \
00122 (kUInt64(b39) << 39) | (kUInt64(b38) << 38) | (kUInt64(b37) << 37) | (kUInt64(b36) << 36) | \
00123 (kUInt64(b35) << 35) | (kUInt64(b34) << 34) | (kUInt64(b33) << 33) | (kUInt64(b32) << 32) | \
00124 (kUInt64(b31) << 31) | (kUInt64(b30) << 30) | (kUInt64(b29) << 29) | (kUInt64(b28) << 28) | \
00125 (kUInt64(b27) << 27) | (kUInt64(b26) << 26) | (kUInt64(b25) << 25) | (kUInt64(b24) << 24) | \
00126 (kUInt64(b23) << 23) | (kUInt64(b22) << 22) | (kUInt64(b21) << 21) | (kUInt64(b20) << 20) | \
00127 (kUInt64(b19) << 19) | (kUInt64(b18) << 18) | (kUInt64(b17) << 17) | (kUInt64(b16) << 16) | \
00128 (kUInt64(b15) << 15) | (kUInt64(b14) << 14) | (kUInt64(b13) << 13) | (kUInt64(b12) << 12) | \
00129 (kUInt64(b11) << 11) | (kUInt64(b10) << 10) | (kUInt64(b9) << 9) | (kUInt64(b8) << 8) | \
00130 (kUInt64(b7) << 7) | (kUInt64(b6) << 6) | (kUInt64(b5) << 5) | (kUInt64(b4) << 4) | \
00131 (kUInt64(b3) << 3) | (kUInt64(b2) << 2) | (kUInt64(b1) << 1) | kUInt64(b0))
00132
00133 #define K_BYTES2(b1, b0) \
00134 ((kUInt16(b1) << 8) | kUInt16(b0))
00135
00136 #define K_BYTES4(b3, b2, b1, b0) \
00137 ((kUInt32(b3) << 24) | (kUInt32(b2) << 16) | (kUInt32(b1) << 8) | kUInt32(b0))
00138
00139 #define K_BYTES8(b7, b6, b5, b4, b3, b2, b1, b0) \
00140 ((kUInt64(b7) << 56) | (kUInt64(b6) << 48) | (kUInt64(b5) << 40) | (kUInt64(b4) << 32) | \
00141 (kUInt64(b3) << 24) | (kUInt64(b2) << 16) | (kUInt64(b1) << 8) | kUInt64(b0))
00142
00143
00144
00145 #define K_MEMPAD(var, n) \
00146 var; \
00147 kInt8 _##var##_pad[n] \
00148
00149
00150 #define K_THIS(ptr, type, member) \
00151 ((type *) (kOffset(ptr) - kOffset(&((type *) 0)->member)))
00152
00153 #define K_LENGTHOF(array) int(sizeof(array) / sizeof(array[0]))
00154
00155 #define kSwap(x, y, t) t = x; x = y; y = t
00156
00157
00158
00159
00160
00161
00162
00163
00164 template<class T> K_INLINE T *kInc(T *p, kOffset i)
00165 {
00166 return (T *) (((kInt8 *) p) + i);
00167 }
00168
00169
00170 template<class T> K_INLINE T *kDec(T *p, kOffset i)
00171 {
00172 return (T *) (((kInt8 *) p) - i);
00173 }
00174
00175
00176 template<class T> K_INLINE kOffset kDiff(T *p, T *q)
00177 {
00178 return kOffset(p) - kOffset(q);
00179 }
00180
00181
00182
00183
00184
00185
00186
00187
00188 template<class T> K_INLINE T kMin(T);
00189
00190 K_TEMPLATE_SPEC(kSChar) K_INLINE kSChar kMin(kSChar)
00191 {
00192 return K_SCHAR_MIN;
00193 }
00194 K_TEMPLATE_SPEC(kUChar) K_INLINE kUChar kMin(kUChar)
00195 {
00196 return K_UCHAR_MIN;
00197 }
00198 K_TEMPLATE_SPEC(kShort) K_INLINE kShort kMin(kShort)
00199 {
00200 return K_SHORT_MIN;
00201 }
00202 K_TEMPLATE_SPEC(kUShort) K_INLINE kUShort kMin(kUShort)
00203 {
00204 return K_USHORT_MIN;
00205 }
00206 K_TEMPLATE_SPEC(int) K_INLINE int kMin(int)
00207 {
00208 return K_INT_MIN;
00209 }
00210 K_TEMPLATE_SPEC(kUInt) K_INLINE kUInt kMin(kUInt)
00211 {
00212 return K_UINT_MIN;
00213 }
00214
00215 K_TEMPLATE_SPEC(kLongLong) K_INLINE kLongLong kMin(kLongLong)
00216 {
00217 return K_LONGLONG_MIN;
00218 }
00219 K_TEMPLATE_SPEC(kULongLong) K_INLINE kULongLong kMin(kULongLong)
00220 {
00221 return K_ULONGLONG_MIN;
00222 }
00223
00224
00225 template<class T> K_INLINE T kMax(T);
00226
00227 K_TEMPLATE_SPEC(kSChar) K_INLINE kSChar kMax(kSChar)
00228 {
00229 return K_SCHAR_MAX;
00230 }
00231 K_TEMPLATE_SPEC(kUChar) K_INLINE kUChar kMax(kUChar)
00232 {
00233 return K_UCHAR_MAX;
00234 }
00235 K_TEMPLATE_SPEC(kShort) K_INLINE kShort kMax(kShort)
00236 {
00237 return K_SHORT_MAX;
00238 }
00239 K_TEMPLATE_SPEC(kUShort) K_INLINE kUShort kMax(kUShort)
00240 {
00241 return K_USHORT_MAX;
00242 }
00243 K_TEMPLATE_SPEC(int) K_INLINE int kMax(int)
00244 {
00245 return K_INT_MAX;
00246 }
00247 K_TEMPLATE_SPEC(kUInt) K_INLINE kUInt kMax(kUInt)
00248 {
00249 return K_UINT_MAX;
00250 }
00251
00252 K_TEMPLATE_SPEC(kLongLong) K_INLINE kLongLong kMax(kLongLong)
00253 {
00254 return K_LONGLONG_MAX;
00255 }
00256 K_TEMPLATE_SPEC(kULongLong) K_INLINE kULongLong kMax(kULongLong)
00257 {
00258 return K_ULONGLONG_MAX;
00259 }
00260
00261
00262
00263
00264
00265
00266
00267
00268 template<class T> K_INLINE T kShl(T x)
00269 {
00270 return x << 1;
00271 }
00272 template<class T> K_INLINE T kShl(T x, int y)
00273 {
00274 return x << y;
00275 }
00276
00277
00278 template<class T> K_INLINE T kShr(T x)
00279 {
00280 return x >> 1;
00281 }
00282
00283 K_TEMPLATE_SPEC(kSChar) K_INLINE kSChar kShr(kSChar x)
00284 {
00285 return kSChar(kUChar(x) >> 1);
00286 }
00287 K_TEMPLATE_SPEC(kShort) K_INLINE kShort kShr(kShort x)
00288 {
00289 return kShort(kUShort(x) >> 1);
00290 }
00291 K_TEMPLATE_SPEC(int) K_INLINE int kShr(int x)
00292 {
00293 return int(kUInt(x) >> 1);
00294 }
00295
00296 K_TEMPLATE_SPEC(kLongLong) K_INLINE kLongLong kShr(kLongLong x)
00297 {
00298 return kLongLong(kULongLong(x) >> 1);
00299 }
00300
00301 template<class T> K_INLINE T kShr(T x, int y)
00302 {
00303 return x >> y;
00304 }
00305
00306 K_TEMPLATE_SPEC(kSChar) K_INLINE kSChar kShr(kSChar x, int y)
00307 {
00308 return kSChar(kUChar(x) >> y);
00309 }
00310 K_TEMPLATE_SPEC(kShort) K_INLINE kShort kShr(kShort x, int y)
00311 {
00312 return kShort(kUShort(x) >> y);
00313 }
00314 K_TEMPLATE_SPEC(int) K_INLINE int kShr(int x, int y)
00315 {
00316 return int(kUInt(x) >> y);
00317 }
00318
00319 K_TEMPLATE_SPEC(kLongLong) K_INLINE kLongLong kShr(kLongLong x, int y)
00320 {
00321 return kLongLong(kULongLong(x) >> y);
00322 }
00323
00324
00325 template<class T> K_INLINE T kRotl(T x)
00326 {
00327 return kShl(x) | kShr(x, (sizeof(x) << 3) - 1);
00328 }
00329 template<class T> K_INLINE T kRotl(T x, int y)
00330 {
00331 y &= ((sizeof(x) << 3) - 1);
00332
00333 return kShl(x, y) | kShr(x, (sizeof(x) << 3) - y);
00334 }
00335
00336
00337 template<class T> K_INLINE T kRotr(T x)
00338 {
00339 return kShr(x) | kShl(x, (sizeof(x) << 3) - 1);
00340 }
00341 template<class T> K_INLINE T kRotr(T x, int y)
00342 {
00343 y &= ((sizeof(x) << 3) - 1);
00344
00345 return kShr(x, y) | kShl(x, (sizeof(x) << 3) - y);
00346 }
00347
00348
00349 template<class T> K_INLINE T kFlip(T x, T y)
00350 {
00351 T z = 0;
00352
00353 while(y) { z = (z << 1) | (x & 1); x = kShr(x); y = kShr(y); }
00354
00355 return z;
00356 }
00357
00358
00359 template<class T> K_INLINE int kMSB(T x)
00360 {
00361 int n = -1;
00362
00363 while(x) { x = kShr(x); n++; }
00364
00365 return n;
00366 }
00367
00368
00369 template<class T> K_INLINE int kLSB(T x)
00370 {
00371 int n = sizeof(x) << 3;
00372
00373 while(x) { x = kShl(x); n--; }
00374
00375 return (n == (sizeof(x) << 3)) ? -1 : n;
00376 }
00377
00378
00379 template<class T> K_INLINE int kBCount(T x)
00380 {
00381 int n = 0;
00382
00383 while(x) { n += int(x & 1); x = kShr(x); }
00384
00385 return n;
00386 }
00387
00388
00389 template<class T> K_INLINE T kSwab(T x)
00390 {
00391 switch(sizeof(x)) {
00392 case 2:
00393 {
00394 kUInt8 t[2];
00395
00396 t[0] = ((kUInt8 *) &x)[1];
00397 t[1] = ((kUInt8 *) &x)[0];
00398
00399 return *(T *) &t;
00400 }
00401 case 4:
00402 {
00403 kUInt8 t[4];
00404
00405 t[0] = ((kUInt8 *) &x)[3];
00406 t[1] = ((kUInt8 *) &x)[2];
00407 t[2] = ((kUInt8 *) &x)[1];
00408 t[3] = ((kUInt8 *) &x)[0];
00409
00410 return *(T *) &t;
00411 }
00412 case 8:
00413 {
00414 kUInt8 t[8];
00415
00416 t[0] = ((kUInt8 *) &x)[7];
00417 t[1] = ((kUInt8 *) &x)[6];
00418 t[2] = ((kUInt8 *) &x)[5];
00419 t[3] = ((kUInt8 *) &x)[4];
00420 t[4] = ((kUInt8 *) &x)[3];
00421 t[5] = ((kUInt8 *) &x)[2];
00422 t[6] = ((kUInt8 *) &x)[1];
00423 t[7] = ((kUInt8 *) &x)[0];
00424
00425 return *(T *) &t;
00426 }
00427 default:
00428 return x;
00429 }
00430 }
00431
00432 K_TEMPLATE_SPEC(kSChar) K_INLINE kSChar kSwab(kSChar x)
00433 {
00434 return x;
00435 }
00436 K_TEMPLATE_SPEC(kUChar) K_INLINE kUChar kSwab(kUChar x)
00437 {
00438 return x;
00439 }
00440
00441
00442
00443
00444
00445
00446
00447
00448 template<class T> K_INLINE T kMod(T x, T y)
00449 {
00450 return x % y;
00451 }
00452
00453
00454 template<class T> K_INLINE T kNeg(T x)
00455 {
00456 return -x;
00457 }
00458
00459 K_TEMPLATE_SPEC(kUChar) K_INLINE kUChar kNeg(kUChar x)
00460 {
00461 return kUChar(-kSChar(x));
00462 }
00463 K_TEMPLATE_SPEC(kUShort) K_INLINE kUShort kNeg(kUShort x)
00464 {
00465 return kUShort(-kShort(x));
00466 }
00467 K_TEMPLATE_SPEC(kUInt) K_INLINE kUInt kNeg(kUInt x)
00468 {
00469 return kUInt(-int(x));
00470 }
00471
00472 K_TEMPLATE_SPEC(kULongLong) K_INLINE kULongLong kNeg(kULongLong x)
00473 {
00474 return kULongLong(-kLongLong(x));
00475 }
00476
00477
00478 template<class T> K_INLINE T kAbs(T x)
00479 {
00480 return (x >= 0) ? x : ((x > kMin(x)) ? -x : kMax(x));
00481 }
00482
00483 K_TEMPLATE_SPEC(kUChar) K_INLINE kUChar kAbs(kUChar x)
00484 {
00485 return x;
00486 }
00487 K_TEMPLATE_SPEC(kUShort) K_INLINE kUShort kAbs(kUShort x)
00488 {
00489 return x;
00490 }
00491 K_TEMPLATE_SPEC(kUInt) K_INLINE kUInt kAbs(kUInt x)
00492 {
00493 return x;
00494 }
00495
00496 K_TEMPLATE_SPEC(kULongLong) K_INLINE kULongLong kAbs(kULongLong x)
00497 {
00498 return x;
00499 }
00500
00501
00502 template<class T> K_INLINE T kCond(int c, T t, T f)
00503 {
00504 return c ? t : f;
00505 }
00506
00507
00508 template<class T> K_INLINE T kMin(T x, T y)
00509 {
00510 return (x < y) ? x : y;
00511 }
00512
00513
00514 template<class T> K_INLINE T kMax(T x, T y)
00515 {
00516 return (x > y) ? x : y;
00517 }
00518
00519
00520 template<class T> K_INLINE T kMinMax( T x, T y, T *z)
00521 {
00522 return (*z = kMax(x, y)), kMin(x, y);
00523 }
00524
00525
00526 template<class T> K_INLINE T kClamp( T value, T min, T max)
00527 {
00528 return (value<min)?min:((value>max)?max:value);
00529 }
00530
00531
00532 template<class T> K_INLINE bool kIsIncl( T x, T y, T z)
00533 {
00534 return (x >= y) && (x <= z);
00535 }
00536 template<class T> K_INLINE bool kIsExcl( T x, T y, T z)
00537 {
00538 return (x < y) || (x > z);
00539 }
00540
00541
00542
00543
00544
00545
00546
00547
00548 template<class T> K_INLINE T kFloor(T x)
00549 {
00550 return x;
00551 }
00552 template<class T> K_INLINE T kFloor(T x, T y)
00553 {
00554 return y * (kFloor(x / y));
00555 }
00556
00557
00558 template<class T> K_INLINE T kFloor2(T x)
00559 {
00560 return 1 << kMSB(x);
00561 }
00562 template<class T> K_INLINE T kFloor2(T x, T y)
00563 {
00564 return x & ~(y - 1);
00565 }
00566
00567
00568 template<class T> K_INLINE T kCeil(T x)
00569 {
00570 return x;
00571 }
00572 template<class T> K_INLINE T kCeil(T x, T y)
00573 {
00574 return kFloor(T(x + y - 1), y);
00575 }
00576
00577
00578 template<class T> K_INLINE T kCeil2(T x)
00579 {
00580 return kFloor2(2 * x - 1);
00581 }
00582 template<class T> K_INLINE T kCeil2(T x, T y)
00583 {
00584 return x + (kNeg(x) & (y - 1));
00585 }
00586
00587
00588 template<class T> K_INLINE T kAlign(T x, T y)
00589 {
00590 return kCeil(x, y);
00591 }
00592
00593
00594 template<class T> K_INLINE T kAlign2(T x)
00595 {
00596 return kCeil2(x);
00597 }
00598 template<class T> K_INLINE T kAlign2(T x, T y)
00599 {
00600 return kCeil2(x, y);
00601 }
00602
00603
00604
00605
00606
00607
00608
00609 typedef int kBSet;
00610
00611
00612 K_INLINE kBSet kBSetUnion(kBSet x, kBSet y)
00613 {
00614 return x | y;
00615 }
00616
00617
00618 K_INLINE kBSet kBSetInter(kBSet x, kBSet y)
00619 {
00620 return x & y;
00621 }
00622
00623
00624 K_INLINE kBSet kBSetDiff(kBSet x, kBSet y)
00625 {
00626 return x & ~y;
00627 }
00628
00629
00630 K_INLINE bool kBSetIsSub(kBSet x, kBSet y)
00631 {
00632 return (x & y) == x;
00633 }
00634
00635
00636 K_INLINE kBSet kBSetCond(kBSet x, int c)
00637 {
00638 return kBSet(!c - 1) & x;
00639 }
00640
00641
00642 K_INLINE kBSet kBSetAnd(kBSet x, kBSet y, kBSet z)
00643 {
00644 return (x & ~z) | (x & y & z);
00645 }
00646
00647
00648 K_INLINE kBSet kBSetOr(kBSet x, kBSet y, kBSet z)
00649 {
00650 return x | ((x | y) & z);
00651 }
00652
00653
00654 K_INLINE int kBSetLast(kBSet x)
00655 {
00656 return kMSB(x);
00657 }
00658
00659
00660 K_INLINE int kBSetFirst(kBSet x)
00661 {
00662 return kLSB(x);
00663 }
00664
00665
00666 K_INLINE int kBSetSize(kBSet x)
00667 {
00668 return kBCount(x);
00669 }
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683 K_TEMPLATE_SPEC(kSChar) K_INLINE kSChar kMin(kSChar x, kSChar y)
00684 {
00685 kSChar m = kSChar(x > y) - 1; return (m & x) | (~m & y);
00686 }
00687
00688 K_TEMPLATE_SPEC(kUChar) K_INLINE kUChar kMin(kUChar x, kUChar y)
00689 {
00690 kUChar m = kUChar(x > y) - 1; return (m & x) | (~m & y);
00691 }
00692
00693 K_TEMPLATE_SPEC(kShort) K_INLINE kShort kMin(kShort x, kShort y)
00694 {
00695 kShort m = kShort(x > y) - 1; return (m & x) | (~m & y);
00696 }
00697
00698 K_TEMPLATE_SPEC(kUShort) K_INLINE kUShort kMin(kUShort x, kUShort y)
00699 {
00700 kUShort m = kUShort(x > y) - 1; return (m & x) | (~m & y);
00701 }
00702
00703 K_TEMPLATE_SPEC(int) K_INLINE int kMin(int x, int y)
00704 {
00705 int m = int(x > y) - 1; return (m & x) | (~m & y);
00706 }
00707
00708 K_TEMPLATE_SPEC(kUInt) K_INLINE kUInt kMin(kUInt x, kUInt y)
00709 {
00710 kUInt m = kUInt(x > y) - 1; return (m & x) | (~m & y);
00711 }
00712
00713 K_TEMPLATE_SPEC(kLongLong) K_INLINE kLongLong kMin(kLongLong x, kLongLong y)
00714 {
00715 kLongLong m = kLongLong(x > y) - 1; return (m & x) | (~m & y);
00716 }
00717
00718 K_TEMPLATE_SPEC(kULongLong) K_INLINE kULongLong kMin(kULongLong x, kULongLong y)
00719 {
00720 kULongLong m = kULongLong(x > y) - 1; return (m & x) | (~m & y);
00721 }
00722
00723
00724 K_TEMPLATE_SPEC(kSChar) K_INLINE kSChar kMax(kSChar x, kSChar y)
00725 {
00726 kSChar m = kSChar(x < y) - 1; return (m & x) | (~m & y);
00727 }
00728
00729 K_TEMPLATE_SPEC(kUChar) K_INLINE kUChar kMax(kUChar x, kUChar y)
00730 {
00731 kUChar m = kUChar(x < y) - 1; return (m & x) | (~m & y);
00732 }
00733
00734 K_TEMPLATE_SPEC(kShort) K_INLINE kShort kMax(kShort x, kShort y)
00735 {
00736 kShort m = kShort(x < y) - 1; return (m & x) | (~m & y);
00737 }
00738
00739 K_TEMPLATE_SPEC(kUShort) K_INLINE kUShort kMax(kUShort x, kUShort y)
00740 {
00741 kUShort m = kUShort(x < y) - 1; return (m & x) | (~m & y);
00742 }
00743
00744 K_TEMPLATE_SPEC(int) K_INLINE int kMax(int x, int y)
00745 {
00746 int m = int(x < y) - 1; return (m & x) | (~m & y);
00747 }
00748
00749 K_TEMPLATE_SPEC(kUInt) K_INLINE kUInt kMax(kUInt x, kUInt y)
00750 {
00751 kUInt m = kUInt(x < y) - 1; return (m & x) | (~m & y);
00752 }
00753
00754 K_TEMPLATE_SPEC(kLongLong) K_INLINE kLongLong kMax(kLongLong x, kLongLong y)
00755 {
00756 kLongLong m = kLongLong(x < y) - 1; return (m & x) | (~m & y);
00757 }
00758
00759 K_TEMPLATE_SPEC(kULongLong) K_INLINE kULongLong kMax(kULongLong x, kULongLong y)
00760 {
00761 kULongLong m = kULongLong(x < y) - 1; return (m & x) | (~m & y);
00762 }
00763
00764
00765 K_TEMPLATE_SPEC(kSChar) K_INLINE kSChar kMinMax(kSChar x, kSChar y, kSChar *z)
00766 {
00767 kSChar m = kSChar(x > y) - 1; return (*z = (x & ~m) | (y & m)), (x & m) | (y & ~m);
00768 }
00769
00770 K_TEMPLATE_SPEC(kUChar) K_INLINE kUChar kMinMax(kUChar x, kUChar y, kUChar *z)
00771 {
00772 kUChar m = kUChar(x > y) - 1; return (*z = (x & ~m) | (y & m)), (x & m) | (y & ~m);
00773 }
00774
00775 K_TEMPLATE_SPEC(kShort) K_INLINE kShort kMinMax(kShort x, kShort y, kShort *z)
00776 {
00777 kShort m = kShort(x > y) - 1; return (*z = (x & ~m) | (y & m)), (x & m) | (y & ~m);
00778 }
00779
00780 K_TEMPLATE_SPEC(kUShort) K_INLINE kUShort kMinMax(kUShort x, kUShort y, kUShort *z)
00781 {
00782 kUShort m = kUShort(x > y) - 1; return (*z = (x & ~m) | (y & m)), (x & m) | (y & ~m);
00783 }
00784
00785 K_TEMPLATE_SPEC(int) K_INLINE int kMinMax(int x, int y, int *z)
00786 {
00787 int m = int(x > y) - 1; return (*z = (x & ~m) | (y & m)), (x & m) | (y & ~m);
00788 }
00789
00790 K_TEMPLATE_SPEC(kUInt) K_INLINE kUInt kMinMax(kUInt x, kUInt y, kUInt *z)
00791 {
00792 kUInt m = kUInt(x > y) - 1; return (*z = (x & ~m) | (y & m)), (x & m) | (y & ~m);
00793 }
00794
00795 K_TEMPLATE_SPEC(kLongLong) K_INLINE kLongLong kMinMax(kLongLong x, kLongLong y, kLongLong *z)
00796 {
00797 kLongLong m = kLongLong(x > y) - 1; return (*z = (x & ~m) | (y & m)), (x & m) | (y & ~m);
00798 }
00799
00800 K_TEMPLATE_SPEC(kULongLong) K_INLINE kULongLong kMinMax(kULongLong x, kULongLong y, kULongLong *z)
00801 {
00802 kULongLong m = kULongLong(x > y) - 1; return (*z = (x & ~m) | (y & m)), (x & m) | (y & ~m);
00803 }
00804
00805
00806 K_TEMPLATE_SPEC(kSChar) K_INLINE kSChar kClamp(kSChar x, kSChar y, kSChar z)
00807 {
00808 kSChar m = kSChar(x < y) - 1; m = kSChar((x = (m & x) | (~m & y)) > z) - 1; return (m & x) | (~m & z);
00809 }
00810
00811 K_TEMPLATE_SPEC(kUChar) K_INLINE kUChar kClamp(kUChar x, kUChar y, kUChar z)
00812 {
00813 kUChar m = kUChar(x < y) - 1; m = kUChar((x = (m & x) | (~m & y)) > z) - 1; return (m & x) | (~m & z);
00814 }
00815
00816 K_TEMPLATE_SPEC(kShort) K_INLINE kShort kClamp(kShort x, kShort y, kShort z)
00817 {
00818 kShort m = kShort(x < y) - 1; m = kShort((x = (m & x) | (~m & y)) > z) - 1; return (m & x) | (~m & z);
00819 }
00820
00821 K_TEMPLATE_SPEC(kUShort) K_INLINE kUShort kClamp(kUShort x, kUShort y, kUShort z)
00822 {
00823 kUShort m = kUShort(x < y) - 1; m = kUShort((x = (m & x) | (~m & y)) > z) - 1; return (m & x) | (~m & z);
00824 }
00825
00826 K_TEMPLATE_SPEC(int) K_INLINE int kClamp(int x, int y, int z)
00827 {
00828 int m = int(x < y) - 1; m = int((x = (m & x) | (~m & y)) > z) - 1; return (m & x) | (~m & z);
00829 }
00830
00831 K_TEMPLATE_SPEC(kUInt) K_INLINE kUInt kClamp(kUInt x, kUInt y, kUInt z)
00832 {
00833 kUInt m = kUInt(x < y) - 1; m = kUInt((x = (m & x) | (~m & y)) > z) - 1; return (m & x) | (~m & z);
00834 }
00835
00836 K_TEMPLATE_SPEC(kLongLong) K_INLINE kLongLong kClamp(kLongLong x, kLongLong y, kLongLong z)
00837 {
00838 kLongLong m = kLongLong(x < y) - 1; m = kLongLong((x = (m & x) | (~m & y)) > z) - 1; return (m & x) | (~m & z);
00839 }
00840
00841 K_TEMPLATE_SPEC(kULongLong) K_INLINE kULongLong kClamp(kULongLong x, kULongLong y, kULongLong z)
00842 {
00843 kULongLong m = kULongLong(x < y) - 1; m = kULongLong((x = (m & x) | (~m & y)) > z) - 1; return (m & x) | (~m & z);
00844 }
00845
00846 K_TEMPLATE_SPEC(kSChar) K_INLINE bool kIsIncl(kSChar x, kSChar y, kSChar z)
00847 {
00848 return (x >= y) & (x <= z);
00849 }
00850
00851 K_TEMPLATE_SPEC(kUChar) K_INLINE bool kIsIncl(kUChar x, kUChar y, kUChar z)
00852 {
00853 return (x >= y) & (x <= z);
00854 }
00855
00856 K_TEMPLATE_SPEC(kShort) K_INLINE bool kIsIncl(kShort x, kShort y, kShort z)
00857 {
00858 return (x >= y) & (x <= z);
00859 }
00860
00861 K_TEMPLATE_SPEC(kUShort) K_INLINE bool kIsIncl(kUShort x, kUShort y, kUShort z)
00862 {
00863 return (x >= y) & (x <= z);
00864 }
00865
00866 K_TEMPLATE_SPEC(int) K_INLINE bool kIsIncl(int x, int y, int z)
00867 {
00868 return (x >= y) & (x <= z);
00869 }
00870
00871 K_TEMPLATE_SPEC(kUInt) K_INLINE bool kIsIncl(kUInt x, kUInt y, kUInt z)
00872 {
00873 return (x >= y) & (x <= z);
00874 }
00875
00876 K_TEMPLATE_SPEC(kSChar) K_INLINE bool kIsExcl(kSChar x, kSChar y, kSChar z)
00877 {
00878 return (x < y) & (x > z);
00879 }
00880
00881 K_TEMPLATE_SPEC(kUChar) K_INLINE bool kIsExcl(kUChar x, kUChar y, kUChar z)
00882 {
00883 return (x < y) & (x > z);
00884 }
00885
00886 K_TEMPLATE_SPEC(kShort) K_INLINE bool kIsExcl(kShort x, kShort y, kShort z)
00887 {
00888 return (x < y) & (x > z);
00889 }
00890
00891 K_TEMPLATE_SPEC(kUShort) K_INLINE bool kIsExcl(kUShort x, kUShort y, kUShort z)
00892 {
00893 return (x < y) & (x > z);
00894 }
00895
00896 K_TEMPLATE_SPEC(int) K_INLINE bool kIsExcl(int x, int y, int z)
00897 {
00898 return (x < y) & (x > z);
00899 }
00900
00901 K_TEMPLATE_SPEC(kUInt) K_INLINE bool kIsExcl(kUInt x, kUInt y, kUInt z)
00902 {
00903 return (x < y) & (x > z);
00904 }
00905
00906
00907 #ifdef KARCH_LITTLE_ENDIAN
00908 #define kBigEndianToNative( x ) x = kSwab( x )
00909 #define kLittleEndianToNative( x )
00910 #else
00911 #define kBigEndianToNative( x )
00912 #define kLittleEndianToNative( x ) x = kSwab( x )
00913 #endif
00914
00915 #endif // FBXFILESDK_COMPONENTS_KBASELIB_KLIB_ITYPE_H
00916