"L. Spiro Engine"
|
00001 00016 #ifndef __LSSTD_SEARCH_H__ 00017 #define __LSSTD_SEARCH_H__ 00018 00019 #include "../LSSTDStandardLib.h" 00020 00021 namespace lsstd { 00022 00029 class CSearch { 00030 public : 00031 // == Types. 00035 typedef LSINT32 (LSE_CCALL * PfBSearchFunc)( LSVOID * _pvContext, 00036 const LSVOID * _pvLeft, const LSVOID * _pvRight ); 00037 00041 typedef LSINT32 (LSE_CCALL * PfSortFunc)( LSVOID * _pvContext, 00042 const LSVOID * _pvLeft, const LSVOID * _pvRight ); 00043 00044 00045 // == Functions. 00061 static LSVOID * LSE_CALL BSearch( const LSVOID * _pvKey, 00062 const LSVOID * _pvBase, 00063 LSUINTPTR _uiptrNum, 00064 LSUINTPTR _uiptrWidth, 00065 PfBSearchFunc _pbsfFunc, 00066 LSVOID * _pvContext ); 00067 00080 static LSVOID LSE_CALL QSort( LSVOID * _pvBase, 00081 LSUINTPTR _uiptrNum, 00082 LSUINTPTR _uiptrWidth, 00083 PfSortFunc _psfFunc, 00084 LSVOID * _pvContext ); 00085 00099 static LSVOID LSE_CALL MergeSort( LSVOID * _pvBase, 00100 LSUINTPTR _uiptrNum, 00101 LSUINTPTR _uiptrWidth, 00102 PfSortFunc _psfFunc, 00103 LSVOID * _pvContext ); 00104 00119 static LSVOID LSE_CALL ShortSort( LSUINT8 * _pui8Low, 00120 LSUINT8 * _pui8High, 00121 LSUINTPTR _uiptrWidth, 00122 PfSortFunc _psfFunc, 00123 LSVOID * _pvContext ); 00124 00125 protected : 00126 // == Functions. 00134 static LSVOID LSE_CALL ShortSwap( LSUINT8 * _pui8A, 00135 LSUINT8 * _pui8B, 00136 LSUINTPTR _uiptrSize ); 00137 00153 static LSVOID LSE_CALL Merge( LSUINT8 * _pui8Left, LSUINT32 _ui32LeftTotal, 00154 LSUINT8 * _pui8Right, LSUINT32 _ui32RightTotal, 00155 LSVOID * _pvDest, 00156 LSUINTPTR _uiptrWidth, 00157 PfSortFunc _psfFunc, LSVOID * _pvContext ); 00158 00159 }; 00160 00161 00162 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00163 // DEFINITIONS 00164 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00165 // == Functions. 00173 LSE_INLINE LSVOID LSE_CALL CSearch::ShortSwap( LSUINT8 * _pui8A, 00174 LSUINT8 * _pui8B, 00175 LSUINTPTR _uiptrSize ) { 00176 if ( _pui8A != _pui8B ) { 00177 if ( (_uiptrSize & 0x7) == 0UL ) { 00178 // Copy 64 bits at a time. 00179 LSUINT64 * pui64A = reinterpret_cast<LSUINT64 *>(_pui8A); 00180 LSUINT64 * pui64B = reinterpret_cast<LSUINT64 *>(_pui8B); 00181 while ( _uiptrSize ) { 00182 LSUINT64 ui64Temp = (*pui64A); 00183 (*pui64A++) = (*pui64B); 00184 (*pui64B++) = ui64Temp; 00185 00186 _uiptrSize -= sizeof( LSUINT64 ); 00187 } 00188 } 00189 else if ( (_uiptrSize & 0x3) == 0UL ) { 00190 // Copy 32 bits at a time. 00191 LSUINT32 * pui32A = reinterpret_cast<LSUINT32 *>(_pui8A); 00192 LSUINT32 * pui32B = reinterpret_cast<LSUINT32 *>(_pui8B); 00193 while ( _uiptrSize ) { 00194 LSUINT32 ui32Temp = (*pui32A); 00195 (*pui32A++) = (*pui32B); 00196 (*pui32B++) = ui32Temp; 00197 00198 _uiptrSize -= sizeof( LSUINT32 ); 00199 } 00200 } 00201 else if ( (_uiptrSize & 0x1) == 0UL ) { 00202 // Copy 16 bits at a time. 00203 LSUINT16 * pui16A = reinterpret_cast<LSUINT16 *>(_pui8A); 00204 LSUINT16 * pui16B = reinterpret_cast<LSUINT16 *>(_pui8B); 00205 while ( _uiptrSize ) { 00206 LSUINT16 ui16Temp = (*pui16A); 00207 (*pui16A++) = (*pui16B); 00208 (*pui16B++) = ui16Temp; 00209 00210 _uiptrSize -= sizeof( LSUINT16 ); 00211 } 00212 } 00213 else { 00214 while ( _uiptrSize-- ) { 00215 LSUINT8 ui8Temp = (*_pui8A); 00216 (*_pui8A++) = (*_pui8B); 00217 (*_pui8B++) = ui8Temp; 00218 } 00219 } 00220 } 00221 } 00222 00223 } // namespace lsstd 00224 00225 #endif // __LSSTD_SEARCH_H__