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
00031
00032
00033 #ifndef BASESORTER_H
00034 #define BASESORTER_H
00035
00036 #include <boost/utility.hpp>
00037
00038 namespace permlib {
00039
00041 template<class ORDER>
00042 class OrderedSorter : public std::binary_function<ulong, ulong, bool> {
00043 public:
00045 bool operator() (ulong a, ulong b) const {
00046 BOOST_ASSERT(a < m_size && b < m_size);
00047 return m_order[a] < m_order[b];
00048 }
00049 protected:
00051
00054 explicit OrderedSorter(uint size)
00055 : m_size(size),
00056
00057 m_order(m_size, m_size)
00058 {}
00059
00061 explicit OrderedSorter(ORDER order)
00062 : m_size(order.size()), m_order(order)
00063 {}
00064
00066 uint m_size;
00068 ORDER m_order;
00069 };
00070
00072
00076 class BaseSorter : public OrderedSorter<std::vector<ulong> > {
00077 public:
00079
00084 template <class InputIterator>
00085 BaseSorter(uint size, InputIterator begin, InputIterator end)
00086 : OrderedSorter<std::vector<ulong> >(size)
00087 {
00088 fillOrder(begin, end, m_order);
00089 }
00090
00092
00097 template <class InputIterator>
00098 static void fillOrder(InputIterator begin, InputIterator end, std::vector<ulong>& order) {
00099 InputIterator it;
00100 uint i = 0;
00101
00102 for (it = begin; it != end; ++it) {
00103 order[*it] = ++i;
00104 }
00105 }
00106 };
00107
00108
00110
00113 class BaseSorterByReference : public OrderedSorter<const std::vector<ulong>&> {
00114 public:
00116 explicit BaseSorterByReference(const std::vector<ulong>& order) : OrderedSorter<const std::vector<ulong>& >(order)
00117 { }
00118
00120 template <class InputIterator>
00121 static std::vector<ulong> createOrder(uint size, InputIterator begin, InputIterator end) {
00122 std::vector<ulong> order(size,size);
00123 BaseSorter::fillOrder(begin, end, order);
00124 return order;
00125 }
00126 };
00127
00128 }
00129
00130 #endif // -- BASESORTER_H