00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00020 #ifndef FALCON_ITEMSET_H
00021 #define FALCON_ITEMSET_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 ItemSetElement;
00034 class ItemSet;
00035
00037 class FALCON_DYN_CLASS ItemSetElement: public BaseAlloc
00038 {
00039 Item m_item;
00040
00041 ItemSetElement *m_left;
00042 ItemSetElement *m_right;
00043 ItemSetElement *m_parent;
00044 public:
00045
00049 ItemSetElement( const Item &itm, ItemSetElement* p=0, ItemSetElement *l = 0, ItemSetElement *r = 0 ):
00050 m_item( itm ),
00051 m_left( l ),
00052 m_right( r ),
00053 m_parent( p )
00054 {}
00055
00058 ~ItemSetElement()
00059 {
00060 }
00061
00062 const Item &item() const { return m_item; }
00063 Item &item() { return m_item; }
00064
00065 void left( ItemSetElement *n ) { m_left = n; }
00066 ItemSetElement *left() const { return m_left; }
00067
00068 void right( ItemSetElement *p ) { m_right = p; }
00069 ItemSetElement *right() const { return m_right; }
00070
00071 void parent( ItemSetElement *p ) { m_parent = p; }
00072 ItemSetElement *parent() const { return m_parent; }
00073 };
00074
00075
00086 class FALCON_DYN_CLASS ItemSet: public Sequence
00087 {
00088 private:
00089 uint32 m_size;
00090 ItemSetElement *m_root;
00091 uint32 m_mark;
00092
00093
00094 Iterator* m_erasingIter;
00095 ItemSetElement* m_disposingElem;
00096
00097 static ItemSetElement* duplicateSubTree( ItemSetElement* parent, const ItemSetElement* source );
00098 static void clearSubTree( ItemSetElement* source );
00099 static ItemSetElement* smallestInTree( ItemSetElement* e );
00100 static ItemSetElement* largestInTree( ItemSetElement* e );
00101 static bool insertInSubtree( ItemSetElement* elem, const Item& item );
00102 static void markSubTree( ItemSetElement* e );
00103 static ItemSetElement* nextElem( ItemSetElement* e );
00104 static ItemSetElement* prevElem( ItemSetElement* e );
00105 static ItemSetElement* findInTree( ItemSetElement* elem, const Item &item );
00106
00107 public:
00109 ItemSet():
00110 m_size(0),
00111 m_root(0),
00112 m_mark( 0xFFFFFFFF ),
00113 m_erasingIter(0),
00114 m_disposingElem(0)
00115 {}
00116
00118 ItemSet( const ItemSet &l );
00119
00120 virtual ~ItemSet()
00121 {
00122 clear();
00123 }
00124
00128 virtual FalconData *clone() const;
00129
00135 virtual const Item &front() const;
00136
00142 virtual const Item &back() const;
00143
00149 ItemSetElement *first() const;
00150
00156 ItemSetElement *last() const;
00157
00158 virtual void append( const Item& itm ) { insert( itm ); }
00159 virtual void prepend( const Item& itm ) { insert( itm ); }
00160
00161
00163 virtual void clear();
00164
00171 void erase( ItemSetElement *elem );
00172
00177 ItemSetElement* find( const Item &item );
00178
00182 void getIteratorAt( Iterator &tgt, ItemSetElement* elem );
00183
00184
00191 void insert( const Item &item );
00192
00193
00197 virtual bool empty() const { return m_root == 0; }
00198
00202 uint32 size() const { return m_size; }
00203
00206 virtual void gcMark( uint32 mark );
00207
00208
00209 virtual bool onCriterion( Iterator* elem ) const;
00210
00211
00212
00213
00214 protected:
00215
00216 virtual void getIterator( Iterator& tgt, bool tail = false ) const;
00217 virtual void copyIterator( Iterator& tgt, const Iterator& source ) const;
00218
00219 virtual void insert( Iterator &iter, const Item &data );
00220 virtual void erase( Iterator &iter );
00221 virtual bool hasNext( const Iterator &iter ) const;
00222 virtual bool hasPrev( const Iterator &iter ) const;
00223 virtual bool hasCurrent( const Iterator &iter ) const;
00224 virtual bool next( Iterator &iter ) const;
00225 virtual bool prev( Iterator &iter ) const;
00226 virtual Item& getCurrent( const Iterator &iter );
00227 virtual Item& getCurrentKey( const Iterator &iter );
00228 virtual bool equalIterator( const Iterator &first, const Iterator &second ) const;
00229 };
00230
00231
00232 }
00233
00234 #endif
00235
00236