00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00020 #ifndef flc_itemlist_H
00021 #define flc_itemlist_H
00022
00023 #include <falcon/setup.h>
00024 #include <falcon/basealloc.h>
00025 #include <falcon/falcondata.h>
00026 #include <falcon/sequence.h>
00027 #include <falcon/item.h>
00028 #include <falcon/iterator.h>
00029 #include <falcon/mt.h>
00030
00031 namespace Falcon {
00032
00033 class ItemListElement;
00034 class ItemList;
00035 class Iterator;
00036
00038 class FALCON_DYN_CLASS ItemListElement: public BaseAlloc
00039 {
00040 Item m_item;
00041
00042 ItemListElement *m_next;
00043 ItemListElement *m_prev;
00044
00045
00046 public:
00047
00051 ItemListElement( const Item &itm, ItemListElement *p = 0, ItemListElement *n = 0 ):
00052 m_item( itm ),
00053 m_next( n ),
00054 m_prev( p )
00055 {}
00056
00060 ~ItemListElement()
00061 {
00062 }
00063
00064 const Item &item() const { return m_item; }
00065 Item &item() { return m_item; }
00066
00067 void next( ItemListElement *n ) { m_next = n; }
00068 ItemListElement *next() const { return m_next; }
00069
00070 void prev( ItemListElement *p ) { m_prev = p; }
00071 ItemListElement *prev() const { return m_prev; }
00072 };
00073
00074
00081 class FALCON_DYN_CLASS ItemList: public Sequence
00082 {
00083 private:
00084 uint32 m_size;
00085 ItemListElement *m_head;
00086 ItemListElement *m_tail;
00087
00088
00089 Iterator* m_erasingIter;
00090 ItemListElement* m_disposingElem;
00091
00092 public:
00094 ItemList():
00095 m_size(0),
00096 m_head(0),
00097 m_tail(0),
00098 m_erasingIter(0),
00099 m_disposingElem(0)
00100 {}
00101
00103 ItemList( const ItemList &l );
00104
00105 virtual ~ItemList()
00106 {
00107 clear();
00108 }
00109
00113 virtual FalconData *clone() const;
00114
00120 virtual const Item &front() const;
00121
00127 virtual const Item &back() const;
00128
00134 ItemListElement *first() const;
00135
00141 ItemListElement *last() const;
00142
00143 virtual void append( const Item& itm ) { push_back( itm ); }
00144 virtual void prepend( const Item& itm ) { push_front( itm ); }
00145
00149 void push_back( const Item &itm );
00150
00155 void pop_back();
00156
00160 void push_front( const Item &itm );
00161
00166 void pop_front();
00167
00169 virtual void clear();
00170
00177 ItemListElement *erase( ItemListElement *elem );
00178
00179
00187 void insert( ItemListElement *elem, const Item &item );
00188
00189
00193 virtual bool empty() const { return m_size == 0; }
00194
00198 uint32 size() const { return m_size; }
00199
00202 virtual void gcMark( uint32 mark );
00203
00204
00205 virtual bool onCriterion( Iterator* elem ) const;
00206
00207
00208
00209
00210 protected:
00211
00212 virtual void getIterator( Iterator& tgt, bool tail = false ) const;
00213 virtual void copyIterator( Iterator& tgt, const Iterator& source ) const;
00214
00215 virtual void insert( Iterator &iter, const Item &data );
00216 virtual void erase( Iterator &iter );
00217 virtual bool hasNext( const Iterator &iter ) const;
00218 virtual bool hasPrev( const Iterator &iter ) const;
00219 virtual bool hasCurrent( const Iterator &iter ) const;
00220 virtual bool next( Iterator &iter ) const;
00221 virtual bool prev( Iterator &iter ) const;
00222 virtual Item& getCurrent( const Iterator &iter );
00223 virtual Item& getCurrentKey( const Iterator &iter );
00224 virtual bool equalIterator( const Iterator &first, const Iterator &second ) const;
00225 };
00226
00227
00228 }
00229
00230 #endif
00231
00232