lux/api/sorter.h

00001 #ifndef LUX_API_SORTER_H
00002 #define LUX_API_SORTER_H
00003 
00004 #include "lux/lux.h"
00005 #include "condition.h"
00006 #include <vector>
00007 #include <functional>
00008 #include <algorithm>
00009 #include <iostream>
00010 
00011 namespace Lux {
00012 
00013   template <class T>
00014   struct sort_by_score_desc : public std::binary_function<T, T, bool>
00015   {
00016       bool operator()(T &t1, T &t2) {
00017         return t1.score > t2.score;
00018       }
00019   };
00020   template <class T>
00021   struct sort_by_score_asc : public std::binary_function<T, T, bool>
00022   {
00023       bool operator()(T &t1, T &t2) {
00024         return t1.score < t2.score;
00025       }
00026   };
00027   template <class T>
00028   struct sort_by_attr_int_desc : public std::binary_function<T, T, bool>
00029   {
00030       bool operator()(T &t1, T &t2) {
00031         return *(int *) t1.attr > *(int *) t2.attr;
00032       }
00033   };
00034   template <class T>
00035   struct sort_by_attr_int_asc : public std::binary_function<T, T, bool>
00036   {
00037       bool operator()(T &t1, T &t2) {
00038         return *(int *) t1.attr < *(int *) t2.attr;
00039       }
00040   };
00041   template <class T>
00042   struct sort_by_attr_str_desc : public std::binary_function<T, T, bool>
00043   {
00044       bool operator()(T &t1, T &t2) {
00045         return strcmp((char *) t1.attr, (char *) t2.attr) > 0;
00046       }
00047   };
00048   template <class T>
00049   struct sort_by_attr_str_asc : public std::binary_function<T, T, bool>
00050   {
00051       bool operator()(T &t1, T &t2) {
00052         return strcmp((char *) t1.attr, (char *) t2.attr) < 0;
00053       }
00054   };
00055 
00059   template <class T>
00060   class Sorter {
00061 
00062   public:
00068     Sorter(SortCondition sort, uint32_t num_of_sorted)
00069     : sort_(sort), num_of_sorted_(num_of_sorted)
00070     {}
00074     ~Sorter(void) {}
00079     void sort(std::vector<T> &rs)
00080     {
00084       switch (sort_.attr_type) {
00085         case SORT_SCORE:
00086           if (sort_.order_type == DESC) {
00087             partial_sort(rs.begin(),
00088                          rs.begin() + num_of_sorted_,
00089                          rs.end(),
00090                          sort_by_score_desc<T>());
00091           } else {
00092             partial_sort(rs.begin(),
00093                          rs.begin() + num_of_sorted_,
00094                          rs.end(),
00095                          sort_by_score_asc<T>());
00096           }
00097           break;
00098         case SORT_ATTR_INT:
00099           if (sort_.order_type == DESC) {
00100             partial_sort(rs.begin(),
00101                          rs.begin() + num_of_sorted_,
00102                          rs.end(),
00103                          sort_by_attr_int_desc<T>());
00104           } else {
00105             partial_sort(rs.begin(),
00106                          rs.begin() + num_of_sorted_,
00107                          rs.end(),
00108                          sort_by_attr_int_asc<T>());
00109           }
00110           break;
00111         case SORT_ATTR_STR:
00112           if (sort_.order_type == DESC) {
00113             partial_sort(rs.begin(),
00114                          rs.begin() + num_of_sorted_,
00115                          rs.end(),
00116                          sort_by_attr_str_desc<T>());
00117           } else {
00118             partial_sort(rs.begin(),
00119                          rs.begin() + num_of_sorted_,
00120                          rs.end(),
00121                          sort_by_attr_str_asc<T>());
00122           }
00123           break;
00124         default:
00125           partial_sort(rs.begin(),
00126                        rs.begin() + num_of_sorted_,
00127                        rs.end(),
00128                        sort_by_score_desc<T>());
00129       }
00130     }
00131 
00132   private:
00133     SortCondition sort_;
00134     uint32_t num_of_sorted_;
00135   };
00136 
00137 }
00138 
00139 #endif

Generated on Fri Feb 5 15:50:30 2010 for Lux by  doxygen 1.4.7