00001 #ifndef GENERIC_ALGO_H 00002 #define GENERIC_ALGO_H 00003 00004 namespace rs { 00005 00008 namespace gen_algo { 00009 00011 template<class T> inline void swap(T& a, T& b) { T temp = a; a = b; b = temp; } 00012 00014 template <class T> T min(const T& t1, const T& t2) { return t1<t2 ? t1 : t2; } 00016 template <class T> T max(const T& t1, const T& t2) { return t2<t1 ? t1 : t2; } 00017 00019 namespace internal { 00020 template<class T, int I, int J> struct Swap { 00021 static inline void compareAndSwap(T* array) { 00022 if (array[I] > array[J]) swap<T>(array[I], array[J]); 00023 } 00024 }; 00025 00026 template<class T, int I, int J> struct Loop { 00027 static const bool go = (J <= I-2); 00028 static inline void loop(T* array) { 00029 Swap<T,J,J+1>::compareAndSwap(array); 00030 Loop<T, (go ? I : 0), (go ? (J+1) : 0)>::loop(array); 00031 } 00032 }; 00033 template<class T> struct Loop<T,0,0> { static inline void loop(T*) {} }; 00034 }; 00036 00039 template<class T, int N> struct BubbleSort { 00040 static inline void sort(T* array) { 00041 internal::Loop<T, N-1, 0>::loop(array); 00042 BubbleSort<T, N-1>::sort(array); 00043 } 00044 }; 00045 00047 template<class T> struct BubbleSort<T, 1> { static inline void sort(T*) {} }; 00048 00049 }; 00050 00051 }; 00052 00053 #else 00054 #error generic_algo.h included twice 00055 #endif // GENERIC_ALGO_H
Contact me in case of errors or questions. This documentation is powered by ![]() |
(C) 2000-2002 ![]() |