sort_func.hpp

Go to the documentation of this file.
00001 /* $Id: sort_func.hpp 13606 2008-06-22 15:21:51Z skidd13 $ */
00002 
00005 #ifndef SORT_FUNC_HPP
00006 #define SORT_FUNC_HPP
00007 
00008 #include <stdlib.h>
00009 #include "math_func.hpp"
00010 #include "mem_func.hpp"
00011 
00023 template <typename T>
00024 static FORCEINLINE void QSortT(T *base, uint num, int (CDECL *comparator)(const T*, const T*), bool desc = false)
00025 {
00026   if (num < 2) return;
00027 
00028   qsort(base, num, sizeof(T), (int (CDECL *)(const void *, const void *))comparator);
00029 
00030   if (desc) MemReverseT(base, num);
00031 }
00032 
00047 template <typename T>
00048 static inline void GSortT(T *base, uint num, int (CDECL *comparator)(const T*, const T*), bool desc = false)
00049 {
00050   if (num < 2) return;
00051 
00052   assert(base != NULL);
00053   assert(comparator != NULL);
00054 
00055   T *a = base;
00056   T *b = base + 1;
00057   uint offset = 0;
00058 
00059   while (num > 1) {
00060     const int diff = comparator(a, b);
00061     if ((!desc && diff <= 0) || (desc && diff >= 0)) {
00062       if (offset != 0) {
00063         /* Jump back to the last direction switch point */
00064         a += offset;
00065         b += offset;
00066         offset = 0;
00067         continue;
00068       }
00069 
00070       a++;
00071       b++;
00072       num--;
00073     } else {
00074       Swap(*a, *b);
00075 
00076       if (a == base) continue;
00077 
00078       a--;
00079       b--;
00080       offset++;
00081     }
00082   }
00083 }
00084 
00085 #endif /* SORT_FUNC_HPP */

Generated on Mon Jun 8 23:04:03 2009 for OpenTTD by  doxygen 1.5.6