00001 #ifndef toplist_h
00002 #define toplist_h
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "typeset.h"
00016
00023 template <class VT, class AVT>
00024 class TopList
00025 {
00026 public:
00027 TopList( int maxsize_, VT undefval_, bool istop_)
00028 : istop( istop_ )
00029 , maxsize( maxsize_ )
00030 , undefval( undefval_ ) { }
00031 virtual ~TopList() {}
00032
00033 inline bool isTop() const;
00034 inline void setTop(bool yn);
00038 inline void reset();
00041 inline VT getValue(int pos) const;
00042 inline AVT getAssociatedValue(int pos) const;
00043
00044 inline virtual int size() const;
00045 inline VT getBottomValue() const;
00046 inline void addValue( VT val, AVT aval );
00047 private:
00048
00049 TypeSet<VT> values;
00050 TypeSet<AVT> avals;
00051 bool istop;
00052 const int maxsize;
00053 VT undefval;
00054
00055 };
00056
00057
00058 template <class VT, class AVT> inline
00059 bool TopList<VT,AVT>::isTop() const { return istop; }
00060
00061
00062 template <class VT, class AVT> inline
00063 void TopList<VT,AVT>::setTop( bool yn )
00064 {
00065 if ( yn==istop ) return;
00066 istop = yn;
00067 reset();
00068 }
00069
00070
00071 template <class VT, class AVT> inline
00072 void TopList<VT,AVT>::reset()
00073 {
00074 values.erase();
00075 avals.erase();
00076 }
00077
00078
00079 template <class VT, class AVT> inline
00080 VT TopList<VT,AVT>::getBottomValue() const
00081 {
00082 if ( size() )
00083 return values[size()-1];
00084 return undefval;
00085 }
00086
00087
00088 template <class VT, class AVT> inline
00089 VT TopList<VT,AVT>::getValue(int pos) const { return values[pos]; }
00090
00091
00092 template <class VT, class AVT> inline
00093 AVT TopList<VT,AVT>::getAssociatedValue(int pos) const { return avals[pos]; }
00094
00095
00096 template <class VT, class AVT> inline
00097 int TopList<VT,AVT>::size() const { return avals.size(); }
00098
00099
00100 template <class VT, class AVT> inline
00101 void TopList<VT,AVT>::addValue( VT val, AVT aval )
00102 {
00103 int pos = 0;
00104 const int mysize = size();
00105 if ( istop )
00106 while ( pos<mysize && values[pos]>val ) pos++;
00107 else
00108 while ( pos<mysize && values[pos]<val ) pos++;
00109
00110 if ( pos==mysize )
00111 {
00112 if ( mysize>=maxsize )
00113 return;
00114
00115 values += val;
00116 avals += aval;
00117 }
00118 else
00119 {
00120 values.insert( pos, val );
00121 avals.insert( pos, aval );
00122
00123 if ( mysize==maxsize )
00124 {
00125 values.remove(mysize);
00126 avals.remove(mysize);
00127 }
00128 }
00129 }
00130 #endif