ISLEman
qgdict.h
1 /****************************************************************************
2 **
3 **
4 ** Definition of QGDict and QGDictIterator classes
5 **
6 ** Created : 920529
7 **
8 ** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
9 **
10 ** This file is part of the tools module of the Qt GUI Toolkit.
11 **
12 ** This file may be distributed under the terms of the Q Public License
13 ** as defined by Trolltech AS of Norway and appearing in the file
14 ** LICENSE.QPL included in the packaging of this file.
15 **
16 ** This file may be distributed and/or modified under the terms of the
17 ** GNU General Public License version 2 as published by the Free Software
18 ** Foundation and appearing in the file LICENSE.GPL included in the
19 ** packaging of this file.
20 **
21 ** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
22 ** licenses may use this file in accordance with the Qt Commercial License
23 ** Agreement provided with the Software.
24 **
25 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
26 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
27 **
28 ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
29 ** information about Qt Commercial License Agreements.
30 ** See http://www.trolltech.com/qpl/ for QPL licensing information.
31 ** See http://www.trolltech.com/gpl/ for GPL licensing information.
32 **
33 ** Contact info@trolltech.com if any conditions of this licensing are
34 ** not clear to you.
35 **
36 **********************************************************************/
37 
38 #ifndef QGDICT_H
39 #define QGDICT_H
40 
41 #ifndef QT_H
42 #include "qcollection.h"
43 #include "qstring.h"
44 #endif // QT_H
45 
46 class QGDictIterator;
47 class QGDItList;
48 
49 
50 class QBaseBucket // internal dict node
51 {
52 public:
53  QCollection::Item getData() { return data; }
54  QCollection::Item setData( QCollection::Item d ) { return data = d; }
55  QBaseBucket *getNext() { return next; }
56  void setNext( QBaseBucket *n) { next = n; }
57 protected:
58  QBaseBucket( QCollection::Item d, QBaseBucket *n ) : data(d), next(n) {}
59  QCollection::Item data;
60  QBaseBucket *next;
61 };
62 
63 class QStringBucket : public QBaseBucket
64 {
65 public:
66  QStringBucket( const QString &k, QCollection::Item d, QBaseBucket *n )
67  : QBaseBucket(d,n), key(k) {}
68  const QString &getKey() const { return key; }
69 private:
70  QString key;
71 };
72 
73 class QAsciiBucket : public QBaseBucket
74 {
75 public:
76  QAsciiBucket( const char *k, QCollection::Item d, QBaseBucket *n )
77  : QBaseBucket(d,n), key(k) {}
78  const char *getKey() const { return key; }
79 private:
80  const char *key;
81 };
82 
83 class QIntBucket : public QBaseBucket
84 {
85 public:
86  QIntBucket( intptr_t k, QCollection::Item d, QBaseBucket *n )
87  : QBaseBucket(d,n), key(k) {}
88  intptr_t getKey() const { return key; }
89 private:
90  intptr_t key;
91 };
92 
93 class QPtrBucket : public QBaseBucket
94 {
95 public:
96  QPtrBucket( void *k, QCollection::Item d, QBaseBucket *n )
97  : QBaseBucket(d,n), key(k) {}
98  void *getKey() const { return key; }
99 private:
100  void *key;
101 };
102 
103 
104 class Q_EXPORT QGDict : public QCollection // generic dictionary class
105 {
106 public:
107  uint count() const { return numItems; }
108  uint size() const { return vlen; }
109  QCollection::Item look_string( const QString& key, QCollection::Item,
110  int );
111  QCollection::Item look_ascii( const char *key, QCollection::Item, int );
112  QCollection::Item look_int( long key, QCollection::Item, int );
113  QCollection::Item look_ptr( void *key, QCollection::Item, int );
114 #ifndef QT_NO_DATASTREAM
115  QDataStream &read( QDataStream & );
116  QDataStream &write( QDataStream & ) const;
117 #endif
118 protected:
119  enum KeyType { StringKey, AsciiKey, IntKey, PtrKey };
120 
121  QGDict( uint len, KeyType kt, bool cs, bool ck );
122  QGDict( const QGDict & );
123  ~QGDict();
124 
125  QGDict &operator=( const QGDict & );
126 
127  bool remove_string( const QString &key, QCollection::Item item=0 );
128  bool remove_ascii( const char *key, QCollection::Item item=0 );
129  bool remove_int( long key, QCollection::Item item=0 );
130  bool remove_ptr( void *key, QCollection::Item item=0 );
131  QCollection::Item take_string( const QString &key );
132  QCollection::Item take_ascii( const char *key );
133  QCollection::Item take_int( long key );
134  QCollection::Item take_ptr( void *key );
135 
136  void clear();
137  void resize( uint );
138 
139  int hashKeyString( const QString & );
140  int hashKeyAscii( const char * );
141 
142  void statistics() const;
143 
144 #ifndef QT_NO_DATASTREAM
145  virtual QDataStream &read( QDataStream &, QCollection::Item & );
146  virtual QDataStream &write( QDataStream &, QCollection::Item ) const;
147 #endif
148 private:
149  QBaseBucket **vec;
150  uint vlen;
151  uint numItems;
152  uint keytype : 2;
153  uint cases : 1;
154  uint copyk : 1;
155  QGDItList *iterators;
156  void unlink_common( int, QBaseBucket *, QBaseBucket * );
157  QStringBucket *unlink_string( const QString &,
158  QCollection::Item item = 0 );
159  QAsciiBucket *unlink_ascii( const char *, QCollection::Item item = 0 );
160  QIntBucket *unlink_int( long, QCollection::Item item = 0 );
161  QPtrBucket *unlink_ptr( void *, QCollection::Item item = 0 );
162  void init( uint, KeyType, bool, bool );
163  friend class QGDictIterator;
164 };
165 
166 
167 class Q_EXPORT QGDictIterator // generic dictionary iterator
168 {
169 friend class QGDict;
170 public:
171  QGDictIterator( const QGDict & );
172  QGDictIterator( const QGDictIterator & );
173  QGDictIterator &operator=( const QGDictIterator & );
174  ~QGDictIterator();
175 
176  QCollection::Item toFirst();
177 
178  QCollection::Item get() const;
179  QString getKeyString() const;
180  const char *getKeyAscii() const;
181  intptr_t getKeyInt() const;
182  void *getKeyPtr() const;
183 
184  QCollection::Item operator()();
185  QCollection::Item operator++();
186  QCollection::Item operator+=(uint);
187 
188 protected:
189  QGDict *dict;
190 
191 private:
192  QBaseBucket *curNode;
193  uint curIndex;
194 };
195 
196 inline QCollection::Item QGDictIterator::get() const
197 {
198  return curNode ? curNode->getData() : 0;
199 }
200 
201 inline QString QGDictIterator::getKeyString() const
202 {
203  return curNode ? ((QStringBucket*)curNode)->getKey() : QString::null;
204 }
205 
206 inline const char *QGDictIterator::getKeyAscii() const
207 {
208  return curNode ? ((QAsciiBucket*)curNode)->getKey() : 0;
209 }
210 
211 inline intptr_t QGDictIterator::getKeyInt() const
212 {
213  return curNode ? ((QIntBucket*)curNode)->getKey() : 0;
214 }
215 
216 inline void *QGDictIterator::getKeyPtr() const
217 {
218  return curNode ? ((QPtrBucket*)curNode)->getKey() : 0;
219 }
220 
221 
222 #endif // QGDICT_H
Definition: qgdict.h:50
Definition: qgdict.h:73
Definition: qgdict.h:83
The QString class provides an abstraction of Unicode text and the classic C null-terminated char arra...
Definition: qstring.h:350
Definition: qgdict.h:93
Definition: qgdict.h:63
uint count() const
Definition: qgdict.h:107
Definition: qgdict.cpp:66
The QCollection class is the base class of all Qt collections.
Definition: qcollection.h:51
An internal class for implementing QDictIterator and QIntDictIterator.
Definition: qgdict.h:167
The QGDict class is an internal class for implementing QDict template classes.
Definition: qgdict.h:104
The QDataStream class provides serialization of binary data to a QIODevice.
Definition: qdatastream.h:47