itype.h

Go to the documentation of this file.
00001 
00004 #ifndef FBXFILESDK_COMPONENTS_KBASELIB_KLIB_ITYPE_H
00005 #define FBXFILESDK_COMPONENTS_KBASELIB_KLIB_ITYPE_H
00006 
00007 /**************************************************************************************
00008 
00009  Copyright (C) 2001 - 2009 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 <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 // 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 // pointer increment
00164 template<class T> K_INLINE T *kInc(T *p, kOffset i)
00165 {
00166     return (T *) (((kInt8 *) p) + i);
00167 }
00168 
00169 // pointer decrement
00170 template<class T> K_INLINE T *kDec(T *p, kOffset i)
00171 {
00172     return (T *) (((kInt8 *) p) - i);
00173 }
00174 
00175 // pointer difference
00176 template<class T> K_INLINE kOffset kDiff(T *p, T *q)
00177 {
00178     return kOffset(p) - kOffset(q);
00179 }
00180 
00181 //******************************************************************************
00182 //
00183 //  basic type information
00184 //
00185 //******************************************************************************
00186 
00187 // upward saturation value
00188 template<class T> K_INLINE T kMin(T);
00189 // common specializations
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 // downward saturation value
00225 template<class T> K_INLINE T kMax(T);
00226 // common specializations
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 //  bit manipulation routines
00264 //
00265 //******************************************************************************
00266 
00267 // logical shift left
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 // logical shift right
00278 template<class T> K_INLINE T kShr(T x)
00279 {
00280     return x >> 1;
00281 }
00282 // common specializations
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 // common specializations
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 // logical roll left
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 // logical roll right
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 // bit flip
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 // most significant bit (-1 for none)
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 // least significant bit (-1 for none)
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 // bit count
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 // swap bytes
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 // common specializations
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 //  basic routines
00444 //
00445 //******************************************************************************
00446 
00447 // modulo
00448 template<class T> K_INLINE T kMod(T x, T y)
00449 {
00450     return x % y;
00451 }
00452 
00453 // two's complement negation
00454 template<class T> K_INLINE T kNeg(T x)
00455 {
00456     return -x;
00457 }
00458 // common specializations
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 // absolute value
00478 template<class T> K_INLINE T kAbs(T x)
00479 {
00480     return (x >= 0) ? x : ((x > kMin(x)) ? -x : kMax(x));
00481 }
00482 // common specializations
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 // conditional value
00502 template<class T> K_INLINE T kCond(int c, T t, T f)
00503 {
00504     return c ? t : f;
00505 }
00506 
00507 // minimum value
00508 template<class T> K_INLINE T kMin(T x, T y)
00509 {
00510     return (x < y) ? x : y;
00511 }
00512 
00513 // maximum value
00514 template<class T> K_INLINE T kMax(T x,  T y)
00515 {
00516     return (x > y) ? x : y;
00517 }
00518 
00519 // minimum and maximum value
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 // clamp value
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 // range check
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 //  alignment
00544 //
00545 //******************************************************************************
00546 
00547 // arbitrary floor
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 // power of two floor
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 // arbitrary ceil
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 // power of two ceil
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 // upward alignment
00588 template<class T> K_INLINE T kAlign(T x, T y)
00589 {
00590     return kCeil(x, y);
00591 }
00592 
00593 // power of two alignment
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 //  bit set type
00606 //
00607 //******************************************************************************
00608 
00609 typedef int kBSet;
00610 
00611 // bit set union
00612 K_INLINE kBSet kBSetUnion(kBSet x, kBSet y)
00613 {
00614     return x | y;
00615 }
00616 
00617 // bit set intersection
00618 K_INLINE kBSet kBSetInter(kBSet x, kBSet y)
00619 {
00620     return x & y;
00621 }
00622 
00623 // bit set difference
00624 K_INLINE kBSet kBSetDiff(kBSet x, kBSet y)
00625 {
00626     return x & ~y;
00627 }
00628 
00629 // bit set subset
00630 K_INLINE bool kBSetIsSub(kBSet x, kBSet y)
00631 {
00632     return (x & y) == x;
00633 }
00634 
00635 // conditional bit set
00636 K_INLINE kBSet kBSetCond(kBSet x, int c)
00637 {
00638     return kBSet(!c - 1) & x;
00639 }
00640 
00641 // bit subset intersection
00642 K_INLINE kBSet kBSetAnd(kBSet x, kBSet y, kBSet z)
00643 {
00644     return (x & ~z) | (x & y & z);
00645 }
00646 
00647 // bit subset union
00648 K_INLINE kBSet kBSetOr(kBSet x, kBSet y, kBSet z)
00649 {
00650     return x | ((x | y) & z);
00651 }
00652 
00653 // bit set last
00654 K_INLINE int kBSetLast(kBSet x)
00655 {
00656     return kMSB(x);
00657 }
00658 
00659 // bit set first
00660 K_INLINE int kBSetFirst(kBSet x)
00661 {
00662     return kLSB(x);
00663 }
00664 
00665 // bit set population
00666 K_INLINE int kBSetSize(kBSet x) 
00667 {
00668     return kBCount(x);
00669 }
00670 
00671 //******************************************************************************
00672 //
00673 //  bit manipulation routines
00674 //
00675 //******************************************************************************
00676 
00677 //******************************************************************************
00678 //
00679 //  basic routines
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 // minimum and maximum value
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 // clamp
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 // BigEndian to LittleEndian conversions
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