"L. Spiro Engine"

F:/My Projects/LSEngine/Modules/LSStandardLib/Src/Search/LSSTDSearch.h

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__
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator