00001
00002 #ifndef __vector_index_sorter_h
00003 #define __vector_index_sorter_h
00004 #include <boost/shared_ptr.hpp>
00005 #include <stdint.h>
00006 #include <vector>
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 namespace Moses
00019 {
00020
00021 template<typename VAL,
00022 typename COMP = std::greater<VAL>,
00023 typename IDX_T=size_t>
00024 class
00025 VectorIndexSorter
00026 : public std::binary_function<IDX_T const&, IDX_T const&, bool>
00027 {
00028 std::vector<VAL> const& m_vecref;
00029 boost::shared_ptr<COMP> m_comp;
00030 public:
00031
00032 COMP const& Compare;
00033 VectorIndexSorter(std::vector<VAL> const& v, COMP const& comp)
00034 : m_vecref(v), Compare(comp)
00035 { }
00036
00037 VectorIndexSorter(std::vector<VAL> const& v)
00038 : m_vecref(v), m_comp(new COMP()), Compare(*m_comp)
00039 { }
00040
00041 bool
00042 operator()(IDX_T const & a, IDX_T const & b) const
00043 {
00044 bool fwd = Compare(m_vecref.at(a), m_vecref.at(b));
00045 bool bwd = Compare(m_vecref[b], m_vecref[a]);
00046 return (fwd == bwd ? a < b : fwd);
00047 }
00048
00049 boost::shared_ptr<std::vector<IDX_T> >
00050 GetOrder() const;
00051
00052 void
00053 GetOrder(std::vector<IDX_T> & order) const;
00054
00055 };
00056
00057 template<typename VAL, typename COMP, typename IDX_T>
00058 boost::shared_ptr<std::vector<IDX_T> >
00059 VectorIndexSorter<VAL,COMP,IDX_T>::
00060 GetOrder() const
00061 {
00062 boost::shared_ptr<std::vector<IDX_T> > ret(new std::vector<IDX_T>(m_vecref.size()));
00063 GetOrder(*ret);
00064 return ret;
00065 }
00066
00067 template<typename VAL, typename COMP, typename IDX_T>
00068 void
00069 VectorIndexSorter<VAL,COMP,IDX_T>::
00070 GetOrder(std::vector<IDX_T> & order) const
00071 {
00072 order.resize(m_vecref.size());
00073 for (IDX_T i = 0; i < IDX_T(m_vecref.size()); ++i) order[i] = i;
00074 sort(order.begin(), order.end(), *this);
00075 }
00076
00077 }
00078 #endif