00001
00002
00003
00004
00005
00006
00007
00008 #ifndef COUNTEDLIST_H_
00009 #define COUNTEDLIST_H_
00010
00011
00012 template<typename value_type,
00013 typename allocator_type = std::allocator<value_type> >
00014 class CountedList : protected std::list<value_type, allocator_type>
00015 {
00016 public:
00017 typedef std::list<value_type, allocator_type> Base;
00018 typedef typename Base::size_type size_type;
00019 typedef typename Base::iterator iterator;
00020 typedef typename Base::const_iterator const_iterator;
00021 typedef typename Base::reverse_iterator reverse_iterator;
00022 typedef typename Base::const_reverse_iterator const_reverse_iterator;
00023 typedef typename Base::reference reference;
00024 typedef typename Base::const_reference const_reference;
00025
00026 CountedList () : Base (), mCount (0) { }
00027
00028
00029
00030 bool empty () const { return Base::empty (); }
00031 size_type size () const { return mCount; }
00032 size_type max_size() const { return Base::max_size(); }
00033
00034 iterator begin () { return Base::begin (); }
00035 const_iterator begin () const { return Base::begin (); }
00036 iterator end () { return Base::end (); }
00037 const_iterator end () const { return Base::end (); }
00038
00039 reverse_iterator rbegin () { return Base::rbegin (); }
00040 const_reverse_iterator rbegin () const { return Base::rbegin (); }
00041 reverse_iterator rend () { return Base::rend (); }
00042 const_reverse_iterator rend () const { return Base::rend (); }
00043
00044 reference front () { return Base::front (); }
00045 const_reference front () const { return Base::front (); }
00046 reference back () { return Base::back (); }
00047 const_reference back () const { return Base::back (); }
00048
00049 void reverse () { Base::reverse (); }
00050 void sort () { Base::sort (); }
00051
00052 template<typename _StrictWeakOrdering>
00053 void sort(_StrictWeakOrdering __comp) { Base::sort (__comp); }
00054
00055 void resize (size_type __new_size, value_type __x = value_type ())
00056 {
00057 mCount = __new_size;
00058 Base::resize (__new_size, __x);
00059 }
00060 void clear ()
00061 {
00062 mCount = 0;
00063 Base::clear ();
00064 }
00065 void push_front (const value_type& __x)
00066 {
00067 mCount++;
00068 Base::push_front (__x);
00069 }
00070 void push_back (const value_type& __x)
00071 {
00072 mCount++;
00073 Base::push_back (__x);
00074 }
00075 void pop_front ()
00076 {
00077 if (mCount > 0)
00078 mCount--;
00079 Base::pop_front ();
00080 }
00081 void pop_back ()
00082 {
00083 if (mCount > 0)
00084 mCount--;
00085 Base::pop_back ();
00086 }
00087 iterator insert (iterator __position, const value_type& __x)
00088 {
00089 mCount++;
00090 return Base::insert (__position, __x);
00091 }
00092 void insert (iterator __position, size_type __n, const value_type& __x)
00093 {
00094 mCount += __n;
00095 Base::insert (__position, __n, __x);
00096 }
00097 iterator erase (iterator __position)
00098 {
00099 if (mCount > 0)
00100 mCount--;
00101 return Base::erase (__position);
00102 }
00103 void remove (const value_type& __value)
00104 {
00105 if (mCount > 0)
00106 mCount--;
00107 Base::remove (__value);
00108 }
00109
00110 protected:
00111 size_type mCount;
00112 };
00113
00114 #endif