00001
00004 #ifndef _FBXSDK_KLIB_ITYPE_H_
00005 #define _FBXSDK_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 <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 K_INLINE void *kInc(void *p, size_t i)
00165 {
00166 return (void *) (((size_t *) p) + i);
00167 }
00168
00169
00170
00171
00172
00173
00174
00175
00176 template<class T> K_INLINE T kMin(T);
00177
00178 K_TEMPLATE_SPEC(kSChar) K_INLINE kSChar kMin(kSChar)
00179 {
00180 return K_SCHAR_MIN;
00181 }
00182 K_TEMPLATE_SPEC(kUChar) K_INLINE kUChar kMin(kUChar)
00183 {
00184 return K_UCHAR_MIN;
00185 }
00186 K_TEMPLATE_SPEC(kShort) K_INLINE kShort kMin(kShort)
00187 {
00188 return K_SHORT_MIN;
00189 }
00190 K_TEMPLATE_SPEC(kUShort) K_INLINE kUShort kMin(kUShort)
00191 {
00192 return K_USHORT_MIN;
00193 }
00194 K_TEMPLATE_SPEC(int) K_INLINE int kMin(int)
00195 {
00196 return K_INT_MIN;
00197 }
00198 K_TEMPLATE_SPEC(kUInt) K_INLINE kUInt kMin(kUInt)
00199 {
00200 return K_UINT_MIN;
00201 }
00202
00203 K_TEMPLATE_SPEC(kLongLong) K_INLINE kLongLong kMin(kLongLong)
00204 {
00205 return K_LONGLONG_MIN;
00206 }
00207 K_TEMPLATE_SPEC(kULongLong) K_INLINE kULongLong kMin(kULongLong)
00208 {
00209 return K_ULONGLONG_MIN;
00210 }
00211
00212
00213 template<class T> K_INLINE T kMax(T);
00214
00215 K_TEMPLATE_SPEC(kSChar) K_INLINE kSChar kMax(kSChar)
00216 {
00217 return K_SCHAR_MAX;
00218 }
00219 K_TEMPLATE_SPEC(kUChar) K_INLINE kUChar kMax(kUChar)
00220 {
00221 return K_UCHAR_MAX;
00222 }
00223 K_TEMPLATE_SPEC(kShort) K_INLINE kShort kMax(kShort)
00224 {
00225 return K_SHORT_MAX;
00226 }
00227 K_TEMPLATE_SPEC(kUShort) K_INLINE kUShort kMax(kUShort)
00228 {
00229 return K_USHORT_MAX;
00230 }
00231 K_TEMPLATE_SPEC(int) K_INLINE int kMax(int)
00232 {
00233 return K_INT_MAX;
00234 }
00235 K_TEMPLATE_SPEC(kUInt) K_INLINE kUInt kMax(kUInt)
00236 {
00237 return K_UINT_MAX;
00238 }
00239
00240 K_TEMPLATE_SPEC(kLongLong) K_INLINE kLongLong kMax(kLongLong)
00241 {
00242 return K_LONGLONG_MAX;
00243 }
00244 K_TEMPLATE_SPEC(kULongLong) K_INLINE kULongLong kMax(kULongLong)
00245 {
00246 return K_ULONGLONG_MAX;
00247 }
00248
00249
00250
00251
00252
00253
00254
00255
00256 template<class T> K_INLINE T kShl(T x)
00257 {
00258 return x << 1;
00259 }
00260 template<class T> K_INLINE T kShl(T x, int y)
00261 {
00262 return x << y;
00263 }
00264
00265
00266 template<class T> K_INLINE T kShr(T x)
00267 {
00268 return x >> 1;
00269 }
00270
00271 K_TEMPLATE_SPEC(kSChar) K_INLINE kSChar kShr(kSChar x)
00272 {
00273 return kSChar(kUChar(x) >> 1);
00274 }
00275 K_TEMPLATE_SPEC(kShort) K_INLINE kShort kShr(kShort x)
00276 {
00277 return kShort(kUShort(x) >> 1);
00278 }
00279 K_TEMPLATE_SPEC(int) K_INLINE int kShr(int x)
00280 {
00281 return int(kUInt(x) >> 1);
00282 }
00283
00284 K_TEMPLATE_SPEC(kLongLong) K_INLINE kLongLong kShr(kLongLong x)
00285 {
00286 return kLongLong(kULongLong(x) >> 1);
00287 }
00288
00289 template<class T> K_INLINE T kShr(T x, int y)
00290 {
00291 return x >> y;
00292 }
00293
00294 K_TEMPLATE_SPEC(kSChar) K_INLINE kSChar kShr(kSChar x, int y)
00295 {
00296 return kSChar(kUChar(x) >> y);
00297 }
00298 K_TEMPLATE_SPEC(kShort) K_INLINE kShort kShr(kShort x, int y)
00299 {
00300 return kShort(kUShort(x) >> y);
00301 }
00302 K_TEMPLATE_SPEC(int) K_INLINE int kShr(int x, int y)
00303 {
00304 return int(kUInt(x) >> y);
00305 }
00306
00307 K_TEMPLATE_SPEC(kLongLong) K_INLINE kLongLong kShr(kLongLong x, int y)
00308 {
00309 return kLongLong(kULongLong(x) >> y);
00310 }
00311
00312
00313 template<class T> K_INLINE T kRotl(T x)
00314 {
00315 return kShl(x) | kShr(x, (sizeof(x) << 3) - 1);
00316 }
00317 template<class T> K_INLINE T kRotl(T x, int y)
00318 {
00319 y &= ((sizeof(x) << 3) - 1);
00320
00321 return kShl(x, y) | kShr(x, (sizeof(x) << 3) - y);
00322 }
00323
00324
00325 template<class T> K_INLINE T kRotr(T x)
00326 {
00327 return kShr(x) | kShl(x, (sizeof(x) << 3) - 1);
00328 }
00329 template<class T> K_INLINE T kRotr(T x, int y)
00330 {
00331 y &= ((sizeof(x) << 3) - 1);
00332
00333 return kShr(x, y) | kShl(x, (sizeof(x) << 3) - y);
00334 }
00335
00336
00337 template<class T> K_INLINE T kFlip(T x, T y)
00338 {
00339 T z = 0;
00340
00341 while(y) { z = (z << 1) | (x & 1); x = kShr(x); y = kShr(y); }
00342
00343 return z;
00344 }
00345
00346
00347 template<class T> K_INLINE int kMSB(T x)
00348 {
00349 int n = -1;
00350
00351 while(x) { x = kShr(x); n++; }
00352
00353 return n;
00354 }
00355
00356
00357 template<class T> K_INLINE int kLSB(T x)
00358 {
00359 int n = sizeof(x) << 3;
00360
00361 while(x) { x = kShl(x); n--; }
00362
00363 return (n == (sizeof(x) << 3)) ? -1 : n;
00364 }
00365
00366
00367 template<class T> K_INLINE int kBCount(T x)
00368 {
00369 int n = 0;
00370
00371 while(x) { n += int(x & 1); x = kShr(x); }
00372
00373 return n;
00374 }
00375
00376
00377 template<class T> K_INLINE T kSwab(T x)
00378 {
00379 switch(sizeof(x)) {
00380 case 2:
00381 {
00382 kUInt8 t[2];
00383
00384 t[0] = ((kUInt8 *) &x)[1];
00385 t[1] = ((kUInt8 *) &x)[0];
00386
00387 return *(T *) &t;
00388 }
00389 case 4:
00390 {
00391 kUInt8 t[4];
00392
00393 t[0] = ((kUInt8 *) &x)[3];
00394 t[1] = ((kUInt8 *) &x)[2];
00395 t[2] = ((kUInt8 *) &x)[1];
00396 t[3] = ((kUInt8 *) &x)[0];
00397
00398 return *(T *) &t;
00399 }
00400 case 8:
00401 {
00402 kUInt8 t[8];
00403
00404 t[0] = ((kUInt8 *) &x)[7];
00405 t[1] = ((kUInt8 *) &x)[6];
00406 t[2] = ((kUInt8 *) &x)[5];
00407 t[3] = ((kUInt8 *) &x)[4];
00408 t[4] = ((kUInt8 *) &x)[3];
00409 t[5] = ((kUInt8 *) &x)[2];
00410 t[6] = ((kUInt8 *) &x)[1];
00411 t[7] = ((kUInt8 *) &x)[0];
00412
00413 return *(T *) &t;
00414 }
00415 default:
00416 return x;
00417 }
00418 }
00419
00420 K_TEMPLATE_SPEC(kSChar) K_INLINE kSChar kSwab(kSChar x)
00421 {
00422 return x;
00423 }
00424 K_TEMPLATE_SPEC(kUChar) K_INLINE kUChar kSwab(kUChar x)
00425 {
00426 return x;
00427 }
00428
00429
00430
00431
00432
00433
00434
00435
00436 template<class T> K_INLINE T kMod(T x, T y)
00437 {
00438 return x % y;
00439 }
00440
00441
00442 template<class T> K_INLINE T kNeg(T x)
00443 {
00444 return -x;
00445 }
00446
00447 K_TEMPLATE_SPEC(kUChar) K_INLINE kUChar kNeg(kUChar x)
00448 {
00449 return kUChar(-kSChar(x));
00450 }
00451 K_TEMPLATE_SPEC(kUShort) K_INLINE kUShort kNeg(kUShort x)
00452 {
00453 return kUShort(-kShort(x));
00454 }
00455 K_TEMPLATE_SPEC(kUInt) K_INLINE kUInt kNeg(kUInt x)
00456 {
00457 return kUInt(-int(x));
00458 }
00459
00460 K_TEMPLATE_SPEC(kULongLong) K_INLINE kULongLong kNeg(kULongLong x)
00461 {
00462 return kULongLong(-kLongLong(x));
00463 }
00464
00465
00466 template<class T> K_INLINE T kAbs(T x)
00467 {
00468 return (x >= 0) ? x : ((x > kMin(x)) ? -x : kMax(x));
00469 }
00470
00471 K_TEMPLATE_SPEC(kUChar) K_INLINE kUChar kAbs(kUChar x)
00472 {
00473 return x;
00474 }
00475 K_TEMPLATE_SPEC(kUShort) K_INLINE kUShort kAbs(kUShort x)
00476 {
00477 return x;
00478 }
00479 K_TEMPLATE_SPEC(kUInt) K_INLINE kUInt kAbs(kUInt x)
00480 {
00481 return x;
00482 }
00483
00484 K_TEMPLATE_SPEC(kULongLong) K_INLINE kULongLong kAbs(kULongLong x)
00485 {
00486 return x;
00487 }
00488
00489
00490 template<class T> K_INLINE T kMin(T x, T y)
00491 {
00492 return (x < y) ? x : y;
00493 }
00494
00495
00496 template<class T> K_INLINE T kMax(T x, T y)
00497 {
00498 return (x > y) ? x : y;
00499 }
00500
00501
00502 template<class T> K_INLINE T kMinMax( T x, T y, T *z)
00503 {
00504 return (*z = kMax(x, y)), kMin(x, y);
00505 }
00506
00507
00508 template<class T> K_INLINE T kClamp( T value, T min, T max)
00509 {
00510 return (value<min)?min:((value>max)?max:value);
00511 }
00512
00513
00514 template<class T> K_INLINE bool kIsIncl( T x, T y, T z)
00515 {
00516 return (x >= y) && (x <= z);
00517 }
00518 template<class T> K_INLINE bool kIsExcl( T x, T y, T z)
00519 {
00520 return (x < y) || (x > z);
00521 }
00522
00523
00524
00525
00526
00527
00528
00529
00530 template<class T> K_INLINE T kFloor(T x)
00531 {
00532 return x;
00533 }
00534 template<class T> K_INLINE T kFloor(T x, T y)
00535 {
00536 return y * (kFloor(x / y));
00537 }
00538
00539
00540 template<class T> K_INLINE T kFloor2(T x)
00541 {
00542 return 1 << kMSB(x);
00543 }
00544 template<class T> K_INLINE T kFloor2(T x, T y)
00545 {
00546 return x & ~(y - 1);
00547 }
00548
00549
00550 template<class T> K_INLINE T kCeil(T x)
00551 {
00552 return x;
00553 }
00554 template<class T> K_INLINE T kCeil(T x, T y)
00555 {
00556 return kFloor(T(x + y - 1), y);
00557 }
00558
00559
00560 template<class T> K_INLINE T kCeil2(T x)
00561 {
00562 return kFloor2(2 * x - 1);
00563 }
00564 template<class T> K_INLINE T kCeil2(T x, T y)
00565 {
00566 return x + (kNeg(x) & (y - 1));
00567 }
00568
00569
00570 template<class T> K_INLINE T kAlign(T x, T y)
00571 {
00572 return kCeil(x, y);
00573 }
00574
00575
00576 template<class T> K_INLINE T kAlign2(T x)
00577 {
00578 return kCeil2(x);
00579 }
00580 template<class T> K_INLINE T kAlign2(T x, T y)
00581 {
00582 return kCeil2(x, y);
00583 }
00584
00585
00586
00587
00588
00589
00590
00591 typedef kEnum kBSet;
00592
00593
00594 K_INLINE kBSet kBSetUnion(kBSet x, kBSet y)
00595 {
00596 return x | y;
00597 }
00598
00599
00600 K_INLINE kBSet kBSetInter(kBSet x, kBSet y)
00601 {
00602 return x & y;
00603 }
00604
00605
00606 K_INLINE kBSet kBSetDiff(kBSet x, kBSet y)
00607 {
00608 return x & ~y;
00609 }
00610
00611
00612 K_INLINE bool kBSetIsSub(kBSet x, kBSet y)
00613 {
00614 return (x & y) == x;
00615 }
00616
00617
00618 K_INLINE kBSet kBSetCond(kBSet x, int c)
00619 {
00620 return kBSet(!c - 1) & x;
00621 }
00622
00623
00624 K_INLINE kBSet kBSetAnd(kBSet x, kBSet y, kBSet z)
00625 {
00626 return (x & ~z) | (x & y & z);
00627 }
00628
00629
00630 K_INLINE kBSet kBSetOr(kBSet x, kBSet y, kBSet z)
00631 {
00632 return x | ((x | y) & z);
00633 }
00634
00635
00636 K_INLINE int kBSetLast(kBSet x)
00637 {
00638 return kMSB(x);
00639 }
00640
00641
00642 K_INLINE int kBSetFirst(kBSet x)
00643 {
00644 return kLSB(x);
00645 }
00646
00647
00648 K_INLINE int kBSetSize(kBSet x)
00649 {
00650 return kBCount(x);
00651 }
00652
00653 #if defined(KARCH_ARCH_IA32)
00654 #include <klib/itype-ia32.h>
00655 #elif defined(KARCH_ARCH_IA64) || defined(KARCH_ARCH_X64)
00656 #include <klib/itype-generic.h>
00657 #elif defined(KARCH_ARCH_AMD64)
00658 #include <klib/itype-generic.h>
00659 #elif defined(KARCH_ARCH_MIPS)
00660 #include <klib/itype-mips.h>
00661 #elif defined(KARCH_ARCH_EE)
00662 #include <klib/itype-generic.h>
00663 #elif defined(KARCH_ARCH_POWERPC)
00664 #include <klib/itype-generic.h>
00665 #else
00666 #error architecture not supported
00667 #endif
00668
00669
00670 #ifdef KARCH_LITTLE_ENDIAN
00671 #define kBigEndianToNative( x ) x = kSwab( x )
00672 #define kLittleEndianToNative( x )
00673 #else
00674 #define kBigEndianToNative( x )
00675 #define kLittleEndianToNative( x ) x = kSwab( x )
00676 #endif
00677
00678 #endif