1 Index: NRCore/kwiq/KWQDictImpl.cpp
2 ===================================================================
3 --- NRCore/kwiq/KWQDictImpl.cpp 2004/10/18 18:39:48 1.3
4 +++ NRCore/kwiq/KWQDictImpl.cpp 2004/10/25 10:08:30
6 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
7 * OF THE POSSIBILITY OF SUCH DAMAGE.
11 #include "KWQDictImpl.h"
12 +#include "KWQAssertions.h"
14 #include <CoreFoundation/CoreFoundation.h>
16 +typedef void (* DeleteFunction) (void *);
21 + KWQDictPrivate(int size, bool caseSensitive, DeleteFunction);
22 + KWQDictPrivate(const KWQDictPrivate &dp);
25 + QMap<QString,void*> map;
26 + DeleteFunction deleteFunc;
28 + KWQDictIteratorPrivate *iterators;
31 +class KWQDictIteratorPrivate
34 + KWQDictIteratorPrivate(KWQDictPrivate *);
35 + ~KWQDictIteratorPrivate();
37 + void remove(const QString &key);
38 + void dictDestroyed();
44 + KWQDictPrivate *dict;
45 + KWQDictIteratorPrivate *next;
46 + KWQDictIteratorPrivate *prev;
49 +KWQDictPrivate::KWQDictPrivate(int size, bool caseSensitive,
50 + DeleteFunction _deleteFunc)
51 + : deleteFunc(_deleteFunc),
52 + modifyCase(!caseSensitive),
57 +KWQDictPrivate::KWQDictPrivate(const KWQDictPrivate &dp)
59 + deleteFunc(dp.deleteFunc),
60 + modifyCase(dp.modifyCase),
65 +KWQDictPrivate::~KWQDictPrivate()
67 + for (KWQDictIteratorPrivate *it = iterators; it; it = it->next) {
68 + it->dictDestroyed();
74 * No KWQDictImpl::~KWQDictImpl() because QDict::~QDict calls KWQDictImpl::clear()
77 KWQDictImpl::KWQDictImpl(int size, bool caseSensitive, void (*deleteFunc_)(void *))
78 - : deleteFunc(deleteFunc_)
79 - , modifyCase(!caseSensitive)
80 + : d(new KWQDictPrivate(size, caseSensitive, deleteFunc_))
84 +KWQDictImpl::~KWQDictImpl()
89 void KWQDictImpl::insert(const QString &key, const void *value)
92 - map.insert(key.lower(), const_cast<void*>(value));
94 + d->map.insert(key.lower(), const_cast<void*>(value));
96 - map.insert(key, const_cast<void*>(value) );
97 + d->map.insert(key, const_cast<void*>(value) );
100 bool KWQDictImpl::remove(const QString &key, bool deleteItem)
102 QMapIterator<QString, void*> i;
106 - i = map.find(key.lower());
108 + i = d->map.find(key.lower());
111 + i = d->map.find(key);
113 - if (i == map.end())
114 + if (i == d->map.end())
120 - if (deleteItem && deleteFunc) {
123 + if (deleteItem && d->deleteFunc) {
124 + d->deleteFunc(data);
128 + for (KWQDictIteratorPrivate *it = d->iterators; it; it = it->next) {
135 @@ -79,71 +148,159 @@
139 - QMapIterator<QString,void*> i = map.begin();
140 - QMapIterator<QString,void*> end = map.end();
141 + QMapIterator<QString,void*> i = d->map.begin();
142 + QMapIterator<QString,void*> end = d->map.end();
147 - if (deleteFunc) deleteFunc(data);
148 + if (d->deleteFunc) d->deleteFunc(data);
157 uint KWQDictImpl::count() const
159 - return map.count();
160 + return d->map.count();
163 void *KWQDictImpl::find(const QString &key) const
165 QMapConstIterator<QString,void*> i;
167 - i = map.find(key.lower());
169 + i = d->map.find(key.lower());
172 + i = d->map.find(key);
174 - if (i == map.end())
175 + if (i == d->map.end())
180 +void KWQDictImpl::swap(KWQDictImpl &di)
182 + KWQDictPrivate *tmp;
189 +KWQDictImpl &KWQDictImpl::assign(const KWQDictImpl &di, bool deleteItems)
191 + KWQDictImpl tmp(di);
203 +KWQDictIteratorImpl::KWQDictIteratorImpl(const KWQDictImpl &di)
204 + : d(new KWQDictIteratorPrivate(di.d))
208 uint KWQDictIteratorImpl::count() const
210 - return dict->map.count();
214 void* KWQDictIteratorImpl::current() const
216 - if (i == dict->map.end())
219 + if (d->pos >= d->count) {
222 + return d->values[d->pos];
225 void* KWQDictIteratorImpl::toFirst()
227 - i=dict->map.begin();
228 - if (i == dict->map.end())
236 void* KWQDictIteratorImpl::operator++()
239 - if (i==dict->map.end())
246 QString KWQDictIteratorImpl::currentStringKey() const
248 + if (d->pos >= d->count) {
251 + return QString(*d->keys[d->pos]);
255 +KWQDictIteratorPrivate::KWQDictIteratorPrivate(KWQDictPrivate *d) :
256 + count(d->map.count()),
258 + keys(new QString * [count]),
259 + values(new void * [count]),
261 + next(d->iterators),
264 + d->iterators = this;
269 + unsigned int i = 0;
270 + QMap<QString,void*>::Iterator it = d->map.begin();
271 + QMap<QString,void*>::Iterator end = d->map.end();
272 + while (it != end) {
273 + keys[i] = new QString(it.key());
274 + values[i] = it.data();
281 +KWQDictIteratorPrivate::~KWQDictIteratorPrivate()
283 - if (i == dict->map.end() )
288 + dict->iterators = next;
298 - return QString(i.key());
299 +void KWQDictIteratorPrivate::remove(const QString &key)
301 + for (uint i = 0; i < count; ) {
302 + if (*keys[i] != key) {
309 + memmove(&keys[i], &keys[i+1], sizeof(keys[i]) * (count - i));
310 + memmove(&values[i], &values[i+1], sizeof(values[i]) * (count - i));
315 +void KWQDictIteratorPrivate::dictDestroyed()
320 Index: NRCore/kwiq/KWQDictImpl.h
321 ===================================================================
322 --- NRCore/kwiq/KWQDictImpl.h 2004/09/23 08:27:53 1.1.1.1
323 +++ NRCore/kwiq/KWQDictImpl.h 2004/10/25 10:08:30
326 #include "KWQString.h"
328 +class KWQDictPrivate;
329 +class KWQDictIteratorPrivate;
333 KWQDictImpl(int size, bool caseSensitive, void (*deleteFunc)(void *));
335 void insert(const QString &key, const void *value);
336 bool remove(const QString &key, bool deleteItems);
338 void *find(const QString &key) const;
339 void clear(bool deleteItem);
342 - void (*deleteFunc)(void*);
343 - QMap<QString,void*> map;
346 + KWQDictImpl &assign(const KWQDictImpl &pdi, bool deleteItems);
348 + void swap(KWQDictImpl &di);
350 friend class KWQDictIteratorImpl;
353 class KWQDictIteratorImpl {
354 - const KWQDictImpl *dict;
355 - QMapConstIterator<QString,void*> i;
357 - KWQDictIteratorImpl(const KWQDictImpl &di) :dict(&di), i(di.map.begin()) { }
358 + KWQDictIteratorImpl(const KWQDictImpl &di);
360 void *current() const;
369 QString currentStringKey() const;
371 + KWQDictIteratorPrivate *d;