瀏覽代碼

Cleaning up and streamlining Types.h,

Vincent Gee 11 年之前
父節點
當前提交
cb161ad5ff
共有 1 個文件被更改,包括 51 次插入160 次删除
  1. 51 160
      Engine/source/platform/types.h

+ 51 - 160
Engine/source/platform/types.h

@@ -23,8 +23,9 @@
 #ifndef _TORQUE_TYPES_H_
 #define _TORQUE_TYPES_H_
 
-//------------------------------------------------------------------------------
-//-------------------------------------- Basic Types...
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
+//-----------------------------------------Basic Types--------------------------------------------------//
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
 
 typedef signed char        S8;      ///< Compiler independent Signed Char
 typedef unsigned char      U8;      ///< Compiler independent Unsigned Char
@@ -38,12 +39,13 @@ typedef unsigned int       U32;     ///< Compiler independent Unsigned 32-bit in
 typedef float              F32;     ///< Compiler independent 32-bit float
 typedef double             F64;     ///< Compiler independent 64-bit float
 
-struct EmptyType {};             ///< "Null" type used by templates
+struct EmptyType {};                ///< "Null" type used by templates
 
 #define TORQUE_UNUSED(var) (void)sizeof(var)
 
-//------------------------------------------------------------------------------
-//------------------------------------- String Types
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
+//----------------------------------------String Types--------------------------------------------------//
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
 
 typedef char           UTF8;        ///< Compiler independent 8  bit Unicode encoded character
 typedef unsigned short UTF16;       ///< Compiler independent 16 bit Unicode encoded character
@@ -51,9 +53,10 @@ typedef unsigned int   UTF32;       ///< Compiler independent 32 bit Unicode enc
 
 typedef const char* StringTableEntry;
 
-//------------------------------------------------------------------------------
-//-------------------------------------- Type constants...
-#define __EQUAL_CONST_F F32(0.000001)                             ///< Constant float epsilon used for F32 comparisons
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
+//-------------------------------------- Type constants-------------------------------------------------//
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
+#define __EQUAL_CONST_F F32(0.000001)                                  ///< Constant float epsilon used for F32 comparisons
 
 extern const F32 Float_Inf;
 static const F32 Float_One  = F32(1.0);                           ///< Constant float 1.0
@@ -115,61 +118,22 @@ static const F32 F32_MAX = F32(3.402823466e+38F);                 ///< Constant
    typedef U32 MEM_ADDRESS;
 #endif
 
-//-------------------------------------- Some all-around useful inlines and globals
-//
-
-/// Returns power of 2 number which is as small as possible but
-/// still greater than or equal to input number.  Note: returns 0
-/// for an input of 0 even though that is not a power of 2.
-/// @param num Any U32
-inline U32 getNextPow2(U32 num)
-{
-   // Taken from: http://graphics.stanford.edu/~seander/bithacks.html
-
-   num--;
-   num |= num >> 1;
-   num |= num >> 2;
-   num |= num >> 4;
-   num |= num >> 8;
-   num |= num >> 16;
-   num++;
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
+//---------------------------------------- GeneralMath Helpers ---------------------------------------- //
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-   return num;
-}
-
-/// Return integer log2 of input number (rounding down).  So, e.g.,
-/// getBinLog2(7) == 2 whereas getBinLog2(8) == 3.  If known
-/// @param num Any U32
-/// @param knownPow2 Is num a known power of 2?
-inline U32 getBinLog2(U32 num, bool knownPow2 = false)
+/// Determines if number is a power of two.
+/// Zero is not a power of two. So we want take into account that edge case
+inline bool isPow2(const U32 num)
 {
-   // Taken from: http://graphics.stanford.edu/~seander/bithacks.html
-   
-   static const U32 MultiplyDeBruijnBitPosition[32] = 
-   {
-      0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, 
-      31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9
-   };
-   
-   if (!knownPow2)
-   {
-      num |= num >> 1; // first round down to power of 2 
-      num |= num >> 2;
-      num |= num >> 4;
-      num |= num >> 8;
-      num |= num >> 16;
-      num = (num >> 1) + 1;
-   }
-   
-   return MultiplyDeBruijnBitPosition[(num * 0x077CB531UL) >> 27];
+   return (num != 0) && ((num & (num - 1)) == 0);
 }
 
-///   Determines if the given U32 is some 2^n
-/// @param num Any U32
-///   @returns true if in_num is a power of two, otherwise false
-inline bool isPow2(const U32 num)
+/// Determines the binary logarithm of the input value rounded down to the nearest power of 2.
+inline U32 getBinLog2(U32 value)
 {
-   return (num & (num - 1)) == 0;
+   F32 floatValue = F32(value);
+   return (*((U32 *) &floatValue) >> 23) - 127;
 }
 
 /// Determines the binary logarithm of the next greater power of two of the input number.
@@ -178,115 +142,42 @@ inline U32 getNextBinLog2(U32 number)
    return getBinLog2(number) + (isPow2(number) ? 0 : 1);
 }
 
-//----------------Many versions of min and max-------------
-//---not using template functions because MS VC++ chokes---
-
-/// Returns the lesser of the two parameters: a & b.
-inline U32 getMin(U32 a, U32 b)
-{
-   return a>b ? b : a;
-}
-
-/// Returns the lesser of the two parameters: a & b.
-inline U16 getMin(U16 a, U16 b)
-{
-   return a>b ? b : a;
-}
-
-/// Returns the lesser of the two parameters: a & b.
-inline U8 getMin(U8 a, U8 b)
-{
-   return a>b ? b : a;
-}
-
-/// Returns the lesser of the two parameters: a & b.
-inline S32 getMin(S32 a, S32 b)
-{
-   return a>b ? b : a;
-}
-
-/// Returns the lesser of the two parameters: a & b.
-inline S16 getMin(S16 a, S16 b)
-{
-   return a>b ? b : a;
-}
-
-/// Returns the lesser of the two parameters: a & b.
-inline S8 getMin(S8 a, S8 b)
-{
-   return a>b ? b : a;
-}
-
-/// Returns the lesser of the two parameters: a & b.
-inline F32 getMin(F32 a, F32 b)
-{
-   return a>b ? b : a;
-}
-
-/// Returns the lesser of the two parameters: a & b.
-inline F64 getMin(F64 a, F64 b)
-{
-   return a>b ? b : a;
-}
-
-/// Returns the greater of the two parameters: a & b.
-inline U32 getMax(U32 a, U32 b)
-{
-   return a>b ? a : b;
-}
-
-/// Returns the greater of the two parameters: a & b.
-inline U16 getMax(U16 a, U16 b)
-{
-   return a>b ? a : b;
-}
-
-/// Returns the greater of the two parameters: a & b.
-inline U8 getMax(U8 a, U8 b)
-{
-   return a>b ? a : b;
-}
-
-/// Returns the greater of the two parameters: a & b.
-inline S32 getMax(S32 a, S32 b)
+/// Determines the next greater power of two from the value. If the value is a power of two, it is returned.
+inline U32 getNextPow2(U32 value)
 {
-   return a>b ? a : b;
+   return isPow2(value) ? value : (1 << (getBinLog2(value) + 1));
 }
 
-/// Returns the greater of the two parameters: a & b.
-inline S16 getMax(S16 a, S16 b)
-{
-   return a>b ? a : b;
-}
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
+//------------------------------------Many versions of min and max--------------------------------------//
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-/// Returns the greater of the two parameters: a & b.
-inline S8 getMax(S8 a, S8 b)
-{
-   return a>b ? a : b;
-}
-
-/// Returns the greater of the two parameters: a & b.
-inline F32 getMax(F32 a, F32 b)
-{
-   return a>b ? a : b;
-}
+#define DeclareTemplatizedMinMax(type) \
+  inline type getMin(type a, type b) { return a > b ? b : a; } \
+  inline type getMax(type a, type b) { return a > b ? a : b; }
 
-/// Returns the greater of the two parameters: a & b.
-inline F64 getMax(F64 a, F64 b)
-{
-   return a>b ? a : b;
-}
+DeclareTemplatizedMinMax( U32 )
+DeclareTemplatizedMinMax( S32 )
+DeclareTemplatizedMinMax( U16 )
+DeclareTemplatizedMinMax( S16 )
+DeclareTemplatizedMinMax( U8 )
+DeclareTemplatizedMinMax( S8 )
+DeclareTemplatizedMinMax( F32 )
+DeclareTemplatizedMinMax( F64 )
 
-//-------------------------------------- Use this instead of Win32 FOURCC()
-//                                        macro...
-//
-#define makeFourCCTag(ch0, ch1, ch2, ch3)    \
-   (((U32(ch0) & 0xFF) << 0)  |             \
-    ((U32(ch1) & 0xFF) << 8)  |             \
-    ((U32(ch2) & 0xFF) << 16) |             \
-    ((U32(ch3) & 0xFF) << 24) )
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
+//------------------------------------------------FOURCC------------------------------------------------//
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-#define makeFourCCString(ch0, ch1, ch2, ch3) { ch0, ch1, ch2, ch3 }
+#if defined(TORQUE_BIG_ENDIAN)
+#define makeFourCCTag(c0,c1,c2,c3) ((U32) ((((U32)((U8)(c0)))<<24) + (((U32)((U8)(c1)))<<16) + (((U32)((U8)(c2)))<<8) + ((((U32)((U8)(c3))))))
+#else
+#ifdef TORQUE_LITTLE_ENDIAN
+#define makeFourCCTag(c3,c2,c1,c0) ((U32) ((((U32)((U8)(c0)))<<24) + (((U32)((U8)(c1)))<<16) + (((U32)((U8)(c2)))<<8) + (((U32)((U8)(c3))))))
+#else
+#error BYTE_ORDER not defined
+#endif
+#endif
 
 #define BIT(x) (1 << (x))                       ///< Returns value with bit x set (2^x)