• Main Page
  • Namespaces
  • Classes
  • Files
  • File List

toplist.h

00001 #ifndef toplist_h
00002 #define toplist_h
00003 
00004 /*+
00005 ________________________________________________________________________
00006 
00007  (C) dGB Beheer B.V.; (LICENSE) http://opendtect.org/OpendTect_license.txt
00008  Author:        K Tingdahl
00009  Date:          April 2003
00010  RCS:           $Id: toplist.h,v 1.5 2009-07-22 16:01:14 cvsbert Exp $
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

Generated on Tue Nov 30 2010 for Basic by  doxygen 1.7.1