00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef flc_genericmap_h
00018 #define flc_genericmap_h
00019
00020 #include <falcon/setup.h>
00021 #include <falcon/types.h>
00022 #include <falcon/traits.h>
00023 #include <falcon/basealloc.h>
00024
00025 namespace Falcon
00026 {
00027
00028
00029 typedef struct tag_MapPage {
00030 uint16 m_count;
00031 uint16 m_allocated;
00032 uint16 m_parentElement;
00033 uint16 m_dummy;
00034 tag_MapPage *m_parent;
00035 tag_MapPage *m_higher;
00036 } MAP_PAGE;
00037
00038 class MapIterator;
00039
00040
00050 class FALCON_DYN_CLASS Map: public BaseAlloc
00051 {
00052 ElementTraits *m_keyTraits;
00053 ElementTraits *m_valueTraits;
00054
00055 uint16 m_treeOrder;
00056 uint16 m_keySize;
00057 uint16 m_valueSize;
00058
00059 uint32 m_size;
00060 MAP_PAGE *m_treeTop;
00061
00062 friend class MapIterator;
00063
00064 MAP_PAGE *allocPage() const;
00065
00066 MAP_PAGE **ptrsOfPage( const MAP_PAGE *ptr ) const;
00067 void *keysOfPage( const MAP_PAGE *ptr ) const;
00068 void *valuesOfPage( const MAP_PAGE *ptr ) const;
00069
00070 MAP_PAGE *ptrInPage( const MAP_PAGE *ptr, uint16 count ) const;
00071 void *keyInPage( const MAP_PAGE *ptr, uint16 count ) const;
00072 void *valueInPage( const MAP_PAGE *ptr, uint16 count ) const ;
00073
00074 bool subFind( const void *key, MapIterator &iter, MAP_PAGE *page ) const;
00075 bool scanPage( const void *key, MAP_PAGE *currentPage, uint16 count, uint16 &pos ) const;
00076
00077 void insertSpaceInPage( MAP_PAGE *page, uint16 pos );
00078 void removeSpaceFromPage( MAP_PAGE *page, uint16 pos );
00079
00080 void splitPage( MAP_PAGE *page );
00081 void rebalanceNode( MAP_PAGE *page, MapIterator *scanner = 0 );
00082 void reshapeChildPointers( MAP_PAGE *page, uint16 startFrom = 0 );
00083
00084 MAP_PAGE *getRightSibling( const MAP_PAGE *page ) const;
00085 MAP_PAGE *getLeftSibling( const MAP_PAGE *page ) const;
00086
00087 public:
00088 Map( ElementTraits *keyt, ElementTraits *valuet, uint16 order = 33 );
00089
00090 ~Map();
00091 void destroyPage( MAP_PAGE *page );
00092
00093 bool insert( const void *key, const void *value);
00094 bool erase( const void *key );
00095 MapIterator erase( const MapIterator &iter );
00096 void *find(const void *key ) const;
00097
00105 bool find( const void *key, MapIterator &iter )const ;
00106
00107 MapIterator begin() const;
00108 MapIterator end() const;
00109
00110 bool empty() const { return m_size == 0; }
00111 void clear();
00112 uint32 size() const { return m_size; }
00113 uint16 order() const { return m_treeOrder; }
00114 };
00115
00116
00117
00118 class FALCON_DYN_CLASS MapIterator: public BaseAlloc
00119 {
00120 const Map *m_map;
00121 MAP_PAGE *m_page;
00122 uint16 m_pagePosition;
00123
00124 friend class Map;
00125
00126 public:
00127
00128 MapIterator()
00129 {}
00130
00131 MapIterator( const Map *m, MAP_PAGE *p, uint16 ppos):
00132 m_map(m),
00133 m_page( p ),
00134 m_pagePosition( ppos )
00135 {}
00136
00137 MapIterator( const MapIterator &other )
00138 {
00139 m_map = other.m_map;
00140 m_page = other.m_page;
00141 m_pagePosition = other.m_pagePosition;
00142 }
00143
00144 bool next();
00145 bool prev();
00146
00147 bool hasCurrent() const {
00148 return m_page != 0 && m_page->m_count > m_pagePosition;
00149 }
00150
00151 bool hasNext() const;
00152
00153 bool hasPrev() const;
00154
00155 void *currentKey() const
00156 {
00157 return m_map->keyInPage( m_page, m_pagePosition );
00158 }
00159
00160 void *currentValue() const
00161 {
00162 return m_map->valueInPage( m_page, m_pagePosition );
00163 }
00164
00165 void currentValue( void* source )
00166 {
00167 m_map->m_valueTraits->copy(
00168 m_map->valueInPage( m_page, m_pagePosition ), source );
00169 }
00170
00171 bool equal( const MapIterator &other ) const;
00172 };
00173
00174 class MapPtrTraits: public ElementTraits
00175 {
00176 public:
00177 virtual ~MapPtrTraits() {}
00178 virtual uint32 memSize() const;
00179 virtual void init( void *itemZone ) const;
00180 virtual void copy( void *targetZone, const void *sourceZone ) const;
00181 virtual int compare( const void *first, const void *second ) const;
00182 virtual void destroy( void *item ) const;
00183 virtual bool owning() const;
00184 };
00185
00186 class MapPtrOwnTraits: public MapPtrTraits
00187 {
00188 public:
00189 virtual ~MapPtrOwnTraits() {}
00190 virtual void destroy( void *item ) const;
00191 virtual bool owning() const;
00192 };
00193
00194 namespace traits
00195 {
00196 extern FALCON_DYN_SYM MapPtrTraits &t_MapPtr();
00197 extern FALCON_DYN_SYM MapPtrOwnTraits &t_MapPtrOwn();
00198 }
00199
00200 }
00201
00202 #endif
00203
00204