00001
00002
00003
00004
00005
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 #ifndef IO_UTIL_INCLUDED
00031 #define IO_UTIL_INCLUDED
00032
00033 #pragma warning ( disable : 4786 )
00034 #include "gltypes.h"
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 template <class T> inline T GlMin( T a, T b ) { return ( a < b ) ? a : b; }
00052 template <class T> inline T GlMax( T a, T b ) { return ( a > b ) ? a : b; }
00053 template <class T> inline T GlMin( T a, T b, T c ) { return GlMin( a, GlMin( b, c ) ); }
00054 template <class T> inline T GlMax( T a, T b, T c ) { return GlMax( a, GlMax( b, c ) ); }
00055
00056
00057 template <class T> inline void GlSwap( T& a, T& b ) { T temp; temp = a; a = b; b = temp; }
00058 template <class T> inline bool GlInRange( T a, T lower, T upper ) { return a >= lower && a <= upper; }
00059 template <class T> inline T GlClamp( const T& a, T lower, T upper )
00060 {
00061 if ( a < lower )
00062 return lower;
00063 else if ( a > upper )
00064 return upper;
00065 return a;
00066 }
00067 template <class T> inline T GlInterpolate( T rangeLow, T rangeHigh, T rangeVal,
00068 T low, T high )
00069 {
00070 return ( ( ( rangeVal - rangeLow ) * ( high - low ) / ( rangeHigh - rangeLow ) ) ) + low;
00071 }
00072
00073
00074
00075
00076
00077 template < class T >
00078 class GlFlag
00079 {
00080 public:
00081 GlFlag() { store = 0; }
00082
00083 inline void Set( T flag ) { store |= flag; }
00084 inline void Clear( T flag ) { store &= ~flag; }
00085 inline bool IsSet( T flag ) const { return ( store & flag ) != 0; }
00086
00087 inline U32 ToU32() const { return store; }
00088 inline void FromU32( U32 s ) { store = (T) s; }
00089
00090 inline void ClearAll() { store = 0; }
00091
00092 private:
00093 T store;
00094 };
00095
00096
00097
00098
00099
00100
00101 template < class T >
00102 class GlHighBitWriter
00103 {
00104 public:
00105 enum
00106 {
00107 MAXBIT = ( sizeof(T)*8-1 ),
00108 NUMBIT = ( sizeof(T)*8 ),
00109 ALLSET = T( -1 )
00110 };
00111
00112 GlHighBitWriter( T* _data ) : data( _data ), bitPos( MAXBIT ) {}
00113
00114 void Skip()
00115 {
00116 if ( bitPos == 0 )
00117 {
00118 ++data;
00119 bitPos = MAXBIT;
00120 }
00121 else
00122 {
00123 --bitPos;
00124 }
00125 }
00126
00127 void Skip_N( unsigned n )
00128 {
00129 bitPos -= n % NUMBIT;
00130 if ( bitPos < 0 )
00131 {
00132 bitPos += NUMBIT;
00133 ++data;
00134 }
00135 data += n / NUMBIT;
00136 }
00137
00138 void Push_1()
00139 {
00140 *data |= ( 1 << bitPos );
00141 Skip();
00142 }
00143
00144 void Push_1N( unsigned n )
00145 {
00146
00147 while( n && bitPos != MAXBIT )
00148 {
00149 Push_1();
00150 --n;
00151 }
00152
00153
00154 while( n >= NUMBIT )
00155 {
00156 *data = ALLSET;
00157 ++data;
00158 n -= NUMBIT;
00159 }
00160
00161
00162 while ( n )
00163 {
00164 Push_1();
00165 --n;
00166 }
00167 }
00168
00169 private:
00170 T* data;
00171 int bitPos;
00172 };
00173
00174
00175
00176
00177 #endif