FBX SDK Reference Guide: itype.h Source File
Go to the documentation of this file.
00001 
00004 #ifndef _FBXSDK_KLIB_ITYPE_H_
00005 #define _FBXSDK_KLIB_ITYPE_H_
00006 
00007 /**************************************************************************************
00008 
00009  Copyright © 2001 - 2008 Autodesk, Inc. and/or its licensors.
00010  All Rights Reserved.
00011 
00012  The coded instructions, statements, computer programs, and/or related material 
00013  (collectively the "Data") in these files contain unpublished information 
00014  proprietary to Autodesk, Inc. and/or its licensors, which is protected by 
00015  Canada and United States of America federal copyright law and by international 
00016  treaties. 
00017  
00018  The Data may not be disclosed or distributed to third parties, in whole or in
00019  part, without the prior written consent of Autodesk, Inc. ("Autodesk").
00020 
00021  THE DATA IS PROVIDED "AS IS" AND WITHOUT WARRANTY.
00022  ALL WARRANTIES ARE EXPRESSLY EXCLUDED AND DISCLAIMED. AUTODESK MAKES NO
00023  WARRANTY OF ANY KIND WITH RESPECT TO THE DATA, EXPRESS, IMPLIED OR ARISING
00024  BY CUSTOM OR TRADE USAGE, AND DISCLAIMS ANY IMPLIED WARRANTIES OF TITLE, 
00025  NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE OR USE. 
00026  WITHOUT LIMITING THE FOREGOING, AUTODESK DOES NOT WARRANT THAT THE OPERATION
00027  OF THE DATA WILL BE UNINTERRUPTED OR ERROR FREE. 
00028  
00029  IN NO EVENT SHALL AUTODESK, ITS AFFILIATES, PARENT COMPANIES, LICENSORS
00030  OR SUPPLIERS ("AUTODESK GROUP") BE LIABLE FOR ANY LOSSES, DAMAGES OR EXPENSES
00031  OF ANY KIND (INCLUDING WITHOUT LIMITATION PUNITIVE OR MULTIPLE DAMAGES OR OTHER
00032  SPECIAL, DIRECT, INDIRECT, EXEMPLARY, INCIDENTAL, LOSS OF PROFITS, REVENUE
00033  OR DATA, COST OF COVER OR CONSEQUENTIAL LOSSES OR DAMAGES OF ANY KIND),
00034  HOWEVER CAUSED, AND REGARDLESS OF THE THEORY OF LIABILITY, WHETHER DERIVED
00035  FROM CONTRACT, TORT (INCLUDING, BUT NOT LIMITED TO, NEGLIGENCE), OR OTHERWISE,
00036  ARISING OUT OF OR RELATING TO THE DATA OR ITS USE OR ANY OTHER PERFORMANCE,
00037  WHETHER OR NOT AUTODESK HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSS
00038  OR DAMAGE. 
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 // member pad, example: int K_MEMPAD(var, sizeof(int));
00144 
00145 #define K_MEMPAD(var, n) \
00146     var; \
00147     kInt8 _##var##_pad[n] \
00148 
00149 // get this pointer from a member address
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 //  pointer manipulation
00160 //
00161 //******************************************************************************
00162 
00163 // void pointer increment
00164 K_INLINE void *kInc(void *p, size_t i)
00165 {
00166     return (void *) (((size_t *) p) + i);
00167 }
00168 
00169 //******************************************************************************
00170 //
00171 //  basic type information
00172 //
00173 //******************************************************************************
00174 
00175 // upward saturation value
00176 template<class T> K_INLINE T kMin(T);
00177 // common specializations
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 // downward saturation value
00213 template<class T> K_INLINE T kMax(T);
00214 // common specializations
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 //  bit manipulation routines
00252 //
00253 //******************************************************************************
00254 
00255 // logical shift left
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 // logical shift right
00266 template<class T> K_INLINE T kShr(T x)
00267 {
00268     return x >> 1;
00269 }
00270 // common specializations
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 // common specializations
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 // logical roll left
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 // logical roll right
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 // bit flip
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 // most significant bit (-1 for none)
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 // least significant bit (-1 for none)
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 // bit count
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 // swap bytes
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 // common specializations
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 //  basic routines
00432 //
00433 //******************************************************************************
00434 
00435 // modulo
00436 template<class T> K_INLINE T kMod(T x, T y)
00437 {
00438     return x % y;
00439 }
00440 
00441 // two's complement negation
00442 template<class T> K_INLINE T kNeg(T x)
00443 {
00444     return -x;
00445 }
00446 // common specializations
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 // absolute value
00466 template<class T> K_INLINE T kAbs(T x)
00467 {
00468     return (x >= 0) ? x : ((x > kMin(x)) ? -x : kMax(x));
00469 }
00470 // common specializations
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 // minimum value
00490 template<class T> K_INLINE T kMin(T x, T y)
00491 {
00492     return (x < y) ? x : y;
00493 }
00494 
00495 // maximum value
00496 template<class T> K_INLINE T kMax(T x,  T y)
00497 {
00498     return (x > y) ? x : y;
00499 }
00500 
00501 // minimum and maximum value
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 // clamp value
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 // range check
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 //  alignment
00526 //
00527 //******************************************************************************
00528 
00529 // arbitrary floor
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 // power of two floor
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 // arbitrary ceil
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 // power of two ceil
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 // upward alignment
00570 template<class T> K_INLINE T kAlign(T x, T y)
00571 {
00572     return kCeil(x, y);
00573 }
00574 
00575 // power of two alignment
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 //  bit set type
00588 //
00589 //******************************************************************************
00590 
00591 typedef kEnum   kBSet;
00592 
00593 // bit set union
00594 K_INLINE kBSet kBSetUnion(kBSet x, kBSet y)
00595 {
00596     return x | y;
00597 }
00598 
00599 // bit set intersection
00600 K_INLINE kBSet kBSetInter(kBSet x, kBSet y)
00601 {
00602     return x & y;
00603 }
00604 
00605 // bit set difference
00606 K_INLINE kBSet kBSetDiff(kBSet x, kBSet y)
00607 {
00608     return x & ~y;
00609 }
00610 
00611 // bit set subset
00612 K_INLINE bool kBSetIsSub(kBSet x, kBSet y)
00613 {
00614     return (x & y) == x;
00615 }
00616 
00617 // conditional bit set
00618 K_INLINE kBSet kBSetCond(kBSet x, int c)
00619 {
00620     return kBSet(!c - 1) & x;
00621 }
00622 
00623 // bit subset intersection
00624 K_INLINE kBSet kBSetAnd(kBSet x, kBSet y, kBSet z)
00625 {
00626     return (x & ~z) | (x & y & z);
00627 }
00628 
00629 // bit subset union
00630 K_INLINE kBSet kBSetOr(kBSet x, kBSet y, kBSet z)
00631 {
00632     return x | ((x | y) & z);
00633 }
00634 
00635 // bit set last
00636 K_INLINE int kBSetLast(kBSet x)
00637 {
00638     return kMSB(x);
00639 }
00640 
00641 // bit set first
00642 K_INLINE int kBSetFirst(kBSet x)
00643 {
00644     return kLSB(x);
00645 }
00646 
00647 // bit set population
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 // BigEndian to LittleEndian conversions
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 /* _FBXSDK_KLIB_ITYPE_H_ */