|
Packit |
1c1d7e |
/****************************************************************************
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Implementation of QGDict and QGDictIterator classes
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Created : 920529
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** This file is part of the tools module of the Qt GUI Toolkit.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** This file may be distributed under the terms of the Q Public License
|
|
Packit |
1c1d7e |
** as defined by Trolltech AS of Norway and appearing in the file
|
|
Packit |
1c1d7e |
** LICENSE.QPL included in the packaging of this file.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** This file may be distributed and/or modified under the terms of the
|
|
Packit |
1c1d7e |
** GNU General Public License version 2 as published by the Free Software
|
|
Packit |
1c1d7e |
** Foundation and appearing in the file LICENSE.GPL included in the
|
|
Packit |
1c1d7e |
** packaging of this file.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
|
|
Packit |
1c1d7e |
** licenses may use this file in accordance with the Qt Commercial License
|
|
Packit |
1c1d7e |
** Agreement provided with the Software.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
|
Packit |
1c1d7e |
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
|
|
Packit |
1c1d7e |
** information about Qt Commercial License Agreements.
|
|
Packit |
1c1d7e |
** See http://www.trolltech.com/qpl/ for QPL licensing information.
|
|
Packit |
1c1d7e |
** See http://www.trolltech.com/gpl/ for GPL licensing information.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Contact info@trolltech.com if any conditions of this licensing are
|
|
Packit |
1c1d7e |
** not clear to you.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
**********************************************************************/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include "qgdict.h"
|
|
Packit |
1c1d7e |
#include "qinternallist.h"
|
|
Packit |
1c1d7e |
#include "qstring.h"
|
|
Packit |
1c1d7e |
#include "qdatastream.h"
|
|
Packit |
1c1d7e |
#include <ctype.h>
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// NOT REVISED
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\class QGDict qgdict.h
|
|
Packit |
1c1d7e |
\brief The QGDict class is an internal class for implementing QDict template classes.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QGDict is a strictly internal class that acts as a base class for the
|
|
Packit |
1c1d7e |
\link collection.html collection classes\endlink QDict and QIntDict.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QGDict has some virtual functions that can be reimplemented to customize
|
|
Packit |
1c1d7e |
the subclasses.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
read() reads a collection/dictionary item from a QDataStream.
|
|
Packit |
1c1d7e |
write() writes a collection/dictionary item to a QDataStream.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Normally, you do not have to reimplement any of these functions.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static const int op_find = 0;
|
|
Packit |
1c1d7e |
static const int op_insert = 1;
|
|
Packit |
1c1d7e |
static const int op_replace = 2;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
class QGDItList : public QInternalList<QGDictIterator>
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
QGDItList() : QInternalList<QGDictIterator>() {}
|
|
Packit |
1c1d7e |
QGDItList( const QGDItList &list ) : QInternalList<QGDictIterator>(list) {}
|
|
Packit |
1c1d7e |
~QGDItList() { clear(); }
|
|
Packit |
1c1d7e |
QGDItList &operator=(const QGDItList &list)
|
|
Packit |
1c1d7e |
{ return (QGDItList&)QInternalList<QGDictIterator>::operator=(list); }
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*****************************************************************************
|
|
Packit |
1c1d7e |
Default implementation of special and virtual functions
|
|
Packit |
1c1d7e |
*****************************************************************************/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Returns the hash key for \e key, when key is a string.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int QGDict::hashKeyString( const QString &key )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(CHECK_NULL)
|
|
Packit |
1c1d7e |
if ( key.isNull() )
|
|
Packit |
1c1d7e |
qWarning( "QGDict::hashStringKey: Invalid null key" );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
int i;
|
|
Packit |
1c1d7e |
register uint h=0;
|
|
Packit |
1c1d7e |
uint g;
|
|
Packit |
1c1d7e |
int len = key.length();
|
|
Packit |
1c1d7e |
const QChar *p = key.unicode();
|
|
Packit |
1c1d7e |
if ( cases ) { // case sensitive
|
|
Packit |
1c1d7e |
for ( i=0; i
|
|
Packit |
1c1d7e |
h = (h<<4) + p[i].cell();
|
|
Packit |
1c1d7e |
if ( (g = h & 0xf0000000) )
|
|
Packit |
1c1d7e |
h ^= g >> 24;
|
|
Packit |
1c1d7e |
h &= ~g;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
} else { // case insensitive
|
|
Packit |
1c1d7e |
for ( i=0; i
|
|
Packit |
1c1d7e |
h = (h<<4) + p[i].lower().cell();
|
|
Packit |
1c1d7e |
if ( (g = h & 0xf0000000) )
|
|
Packit |
1c1d7e |
h ^= g >> 24;
|
|
Packit |
1c1d7e |
h &= ~g;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
int index = h;
|
|
Packit |
1c1d7e |
if ( index < 0 ) // adjust index to table size
|
|
Packit |
1c1d7e |
index = -index;
|
|
Packit |
1c1d7e |
return index;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Returns the hash key for \a key, which is a C string.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int QGDict::hashKeyAscii( const char *key )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(CHECK_NULL)
|
|
Packit |
1c1d7e |
if ( key == 0 )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
qWarning( "QGDict::hashAsciiKey: Invalid null key" );
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
register const char *k = key;
|
|
Packit |
1c1d7e |
register uint h=0;
|
|
Packit |
1c1d7e |
uint g;
|
|
Packit |
1c1d7e |
if ( cases ) { // case sensitive
|
|
Packit |
1c1d7e |
while ( *k ) {
|
|
Packit |
1c1d7e |
h = (h<<4) + *k++;
|
|
Packit |
1c1d7e |
if ( (g = h & 0xf0000000) )
|
|
Packit |
1c1d7e |
h ^= g >> 24;
|
|
Packit |
1c1d7e |
h &= ~g;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
} else { // case insensitive
|
|
Packit |
1c1d7e |
while ( *k ) {
|
|
Packit |
1c1d7e |
h = (h<<4) + tolower(*k);
|
|
Packit |
1c1d7e |
if ( (g = h & 0xf0000000) )
|
|
Packit |
1c1d7e |
h ^= g >> 24;
|
|
Packit |
1c1d7e |
h &= ~g;
|
|
Packit |
1c1d7e |
k++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
int index = h;
|
|
Packit |
1c1d7e |
if ( index < 0 ) // adjust index to table size
|
|
Packit |
1c1d7e |
index = -index;
|
|
Packit |
1c1d7e |
return index;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#if 0
|
|
Packit |
1c1d7e |
int QGDict::hashKeyAscii( const char *key )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(CHECK_NULL)
|
|
Packit |
1c1d7e |
if ( key == 0 )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
qWarning( "QGDict::hashAsciiKey: Invalid null key" );
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
unsigned int hash = 5381;
|
|
Packit |
1c1d7e |
int c;
|
|
Packit |
1c1d7e |
// use djb2 by Dan Bernstein
|
|
Packit |
1c1d7e |
if (cases)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
while ((c=*key++)) hash = ((hash<<5)+hash)+c;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
while ((c=*key++)) hash = ((hash<<5)+hash)+tolower(c);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
int index = hash;
|
|
Packit |
1c1d7e |
return index<0 ? -index : index;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#ifndef QT_NO_DATASTREAM
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Reads a collection/dictionary item from the stream \e s and returns a
|
|
Packit |
1c1d7e |
reference to the stream.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
The default implementation sets \e item to 0.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa write()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream& QGDict::read( QDataStream &s, QCollection::Item &item )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
item = 0;
|
|
Packit |
1c1d7e |
return s;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Writes a collection/dictionary item to the stream \e s and returns a
|
|
Packit |
1c1d7e |
reference to the stream.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa read()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream& QGDict::write( QDataStream &s, QCollection::Item ) const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return s;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#endif //QT_NO_DATASTREAM
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*****************************************************************************
|
|
Packit |
1c1d7e |
QGDict member functions
|
|
Packit |
1c1d7e |
*****************************************************************************/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Constructs a dictionary.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QGDict::QGDict( uint len, KeyType kt, bool caseSensitive, bool copyKeys )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
init( len, kt, caseSensitive, copyKeys );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void QGDict::init( uint len, KeyType kt, bool caseSensitive, bool copyKeys )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
vec = new QBaseBucket *[vlen = len]; // allocate hash table
|
|
Packit |
1c1d7e |
CHECK_PTR( vec );
|
|
Packit |
1c1d7e |
memset( (char*)vec, 0, vlen*sizeof(QBaseBucket*) );
|
|
Packit |
1c1d7e |
numItems = 0;
|
|
Packit |
1c1d7e |
iterators = 0;
|
|
Packit |
1c1d7e |
// The caseSensitive and copyKey options don't make sense for
|
|
Packit |
1c1d7e |
// all dict types.
|
|
Packit |
1c1d7e |
switch ( (keytype = (uint)kt) ) {
|
|
Packit |
1c1d7e |
case StringKey:
|
|
Packit |
1c1d7e |
cases = caseSensitive;
|
|
Packit |
1c1d7e |
copyk = FALSE;
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case AsciiKey:
|
|
Packit |
1c1d7e |
cases = caseSensitive;
|
|
Packit |
1c1d7e |
copyk = copyKeys;
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
default:
|
|
Packit |
1c1d7e |
cases = FALSE;
|
|
Packit |
1c1d7e |
copyk = FALSE;
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Constructs a copy of \e dict.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QGDict::QGDict( const QGDict & dict )
|
|
Packit |
1c1d7e |
: QCollection( dict )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
init( dict.vlen, (KeyType)dict.keytype, dict.cases, dict.copyk );
|
|
Packit |
1c1d7e |
QGDictIterator it( dict );
|
|
Packit |
1c1d7e |
while ( it.get() ) { // copy from other dict
|
|
Packit |
1c1d7e |
switch ( keytype ) {
|
|
Packit |
1c1d7e |
case StringKey:
|
|
Packit |
1c1d7e |
look_string( it.getKeyString(), it.get(), op_insert );
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case AsciiKey:
|
|
Packit |
1c1d7e |
look_ascii( it.getKeyAscii(), it.get(), op_insert );
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case IntKey:
|
|
Packit |
1c1d7e |
look_int( it.getKeyInt(), it.get(), op_insert );
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case PtrKey:
|
|
Packit |
1c1d7e |
look_ptr( it.getKeyPtr(), it.get(), op_insert );
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
++it;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Removes all items from the dictionary and destroys it.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QGDict::~QGDict()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
clear(); // delete everything
|
|
Packit |
1c1d7e |
delete [] vec;
|
|
Packit |
1c1d7e |
if ( !iterators ) // no iterators for this dict
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
QGDictIterator *i = iterators->first();
|
|
Packit |
1c1d7e |
while ( i ) { // notify all iterators that
|
|
Packit |
1c1d7e |
i->dict = 0; // this dict is deleted
|
|
Packit |
1c1d7e |
i = iterators->next();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
delete iterators;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Assigns \e dict to this dictionary.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QGDict &QGDict::operator=( const QGDict &dict )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
clear();
|
|
Packit |
1c1d7e |
QGDictIterator it( dict );
|
|
Packit |
1c1d7e |
while ( it.get() ) { // copy from other dict
|
|
Packit |
1c1d7e |
switch ( keytype ) {
|
|
Packit |
1c1d7e |
case StringKey:
|
|
Packit |
1c1d7e |
look_string( it.getKeyString(), it.get(), op_insert );
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case AsciiKey:
|
|
Packit |
1c1d7e |
look_ascii( it.getKeyAscii(), it.get(), op_insert );
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case IntKey:
|
|
Packit |
1c1d7e |
look_int( it.getKeyInt(), it.get(), op_insert );
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case PtrKey:
|
|
Packit |
1c1d7e |
look_ptr( it.getKeyPtr(), it.get(), op_insert );
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
++it;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! \fn QCollection::Item QGDictIterator::get() const
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! \fn QString QGDictIterator::getKeyString() const
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! \fn const char * QGDictIterator::getKeyAscii() const
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! \fn void * QGDictIterator::getKeyPtr() const
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! \fn long QGDictIterator::getKeyInt() const
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn uint QGDict::count() const
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Returns the number of items in the dictionary.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn uint QGDict::size() const
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Returns the size of the hash array.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
The do-it-all function; op is one of op_find, op_insert, op_replace
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCollection::Item QGDict::look_string( const QString &key, QCollection::Item d, int op )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QStringBucket *n;
|
|
Packit |
1c1d7e |
int index = hashKeyString(key) % vlen;
|
|
Packit |
1c1d7e |
if ( op == op_find ) { // find
|
|
Packit |
1c1d7e |
if ( cases ) {
|
|
Packit |
1c1d7e |
for ( n=(QStringBucket*)vec[index]; n;
|
|
Packit |
1c1d7e |
n=(QStringBucket*)n->getNext() ) {
|
|
Packit |
1c1d7e |
if ( key == n->getKey() )
|
|
Packit |
1c1d7e |
return n->getData(); // item found
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
QString k = key.lower();
|
|
Packit |
1c1d7e |
for ( n=(QStringBucket*)vec[index]; n;
|
|
Packit |
1c1d7e |
n=(QStringBucket*)n->getNext() ) {
|
|
Packit |
1c1d7e |
if ( k == n->getKey().lower() )
|
|
Packit |
1c1d7e |
return n->getData(); // item found
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return 0; // not found
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( op == op_replace ) { // replace
|
|
Packit |
1c1d7e |
if ( vec[index] != 0 ) // maybe something there
|
|
Packit |
1c1d7e |
remove_string( key );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// op_insert or op_replace
|
|
Packit |
1c1d7e |
n = new QStringBucket(key,newItem(d),vec[index]);
|
|
Packit |
1c1d7e |
CHECK_PTR( n );
|
|
Packit |
1c1d7e |
#if defined(CHECK_NULL)
|
|
Packit |
1c1d7e |
if ( n->getData() == 0 )
|
|
Packit |
1c1d7e |
qWarning( "QDict: Cannot insert null item" );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
vec[index] = n;
|
|
Packit |
1c1d7e |
numItems++;
|
|
Packit |
1c1d7e |
return n->getData();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! \internal */
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCollection::Item QGDict::look_ascii( const char *key, QCollection::Item d, int op )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QAsciiBucket *n;
|
|
Packit |
1c1d7e |
int index = hashKeyAscii(key) % vlen;
|
|
Packit |
1c1d7e |
if ( op == op_find ) { // find
|
|
Packit |
1c1d7e |
if ( cases ) {
|
|
Packit |
1c1d7e |
for ( n=(QAsciiBucket*)vec[index]; n;
|
|
Packit |
1c1d7e |
n=(QAsciiBucket*)n->getNext() ) {
|
|
Packit |
1c1d7e |
if ( qstrcmp(n->getKey(),key) == 0 )
|
|
Packit |
1c1d7e |
return n->getData(); // item found
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
for ( n=(QAsciiBucket*)vec[index]; n;
|
|
Packit |
1c1d7e |
n=(QAsciiBucket*)n->getNext() ) {
|
|
Packit |
1c1d7e |
if ( qstricmp(n->getKey(),key) == 0 )
|
|
Packit |
1c1d7e |
return n->getData(); // item found
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return 0; // not found
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( op == op_replace ) { // replace
|
|
Packit |
1c1d7e |
if ( vec[index] != 0 ) // maybe something there
|
|
Packit |
1c1d7e |
remove_ascii( key );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// op_insert or op_replace
|
|
Packit |
1c1d7e |
n = new QAsciiBucket(copyk ? qstrdup(key) : key,newItem(d),vec[index]);
|
|
Packit |
1c1d7e |
CHECK_PTR( n );
|
|
Packit |
1c1d7e |
#if defined(CHECK_NULL)
|
|
Packit |
1c1d7e |
if ( n->getData() == 0 )
|
|
Packit |
1c1d7e |
qWarning( "QAsciiDict: Cannot insert null item" );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
vec[index] = n;
|
|
Packit |
1c1d7e |
numItems++;
|
|
Packit |
1c1d7e |
return n->getData();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! \internal */
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCollection::Item QGDict::look_int( long key, QCollection::Item d, int op )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QIntBucket *n;
|
|
Packit |
1c1d7e |
int index = (int)((ulong)key % vlen); // simple hash
|
|
Packit |
1c1d7e |
if ( op == op_find ) { // find
|
|
Packit |
1c1d7e |
for ( n=(QIntBucket*)vec[index]; n;
|
|
Packit |
1c1d7e |
n=(QIntBucket*)n->getNext() ) {
|
|
Packit |
1c1d7e |
if ( n->getKey() == key )
|
|
Packit |
1c1d7e |
return n->getData(); // item found
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return 0; // not found
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( op == op_replace ) { // replace
|
|
Packit |
1c1d7e |
if ( vec[index] != 0 ) // maybe something there
|
|
Packit |
1c1d7e |
remove_int( key );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// op_insert or op_replace
|
|
Packit |
1c1d7e |
n = new QIntBucket(key,newItem(d),vec[index]);
|
|
Packit |
1c1d7e |
CHECK_PTR( n );
|
|
Packit |
1c1d7e |
#if defined(CHECK_NULL)
|
|
Packit |
1c1d7e |
if ( n->getData() == 0 )
|
|
Packit |
1c1d7e |
qWarning( "QIntDict: Cannot insert null item" );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
vec[index] = n;
|
|
Packit |
1c1d7e |
numItems++;
|
|
Packit |
1c1d7e |
return n->getData();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! \internal */
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCollection::Item QGDict::look_ptr( void *key, QCollection::Item d, int op )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QPtrBucket *n;
|
|
Packit |
1c1d7e |
int index = (int)((uintptr_t)key % vlen); // simple hash
|
|
Packit |
1c1d7e |
if ( op == op_find ) { // find
|
|
Packit |
1c1d7e |
for ( n=(QPtrBucket*)vec[index]; n;
|
|
Packit |
1c1d7e |
n=(QPtrBucket*)n->getNext() ) {
|
|
Packit |
1c1d7e |
if ( n->getKey() == key )
|
|
Packit |
1c1d7e |
return n->getData(); // item found
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return 0; // not found
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( op == op_replace ) { // replace
|
|
Packit |
1c1d7e |
if ( vec[index] != 0 ) // maybe something there
|
|
Packit |
1c1d7e |
remove_ptr( key );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// op_insert or op_replace
|
|
Packit |
1c1d7e |
n = new QPtrBucket(key,newItem(d),vec[index]);
|
|
Packit |
1c1d7e |
CHECK_PTR( n );
|
|
Packit |
1c1d7e |
#if defined(CHECK_NULL)
|
|
Packit |
1c1d7e |
if ( n->getData() == 0 )
|
|
Packit |
1c1d7e |
qWarning( "QPtrDict: Cannot insert null item" );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
vec[index] = n;
|
|
Packit |
1c1d7e |
numItems++;
|
|
Packit |
1c1d7e |
return n->getData();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Changes the size of the hashtable.
|
|
Packit |
1c1d7e |
The contents of the dictionary are preserved,
|
|
Packit |
1c1d7e |
but all iterators on the dictionary become invalid.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
void QGDict::resize( uint newsize )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// Save old information
|
|
Packit |
1c1d7e |
QBaseBucket **old_vec = vec;
|
|
Packit |
1c1d7e |
uint old_vlen = vlen;
|
|
Packit |
1c1d7e |
bool old_copyk = copyk;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
vec = new QBaseBucket *[vlen = newsize];
|
|
Packit |
1c1d7e |
CHECK_PTR( vec );
|
|
Packit |
1c1d7e |
memset( (char*)vec, 0, vlen*sizeof(QBaseBucket*) );
|
|
Packit |
1c1d7e |
numItems = 0;
|
|
Packit |
1c1d7e |
copyk = FALSE;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// Reinsert every item from vec, deleting vec as we go
|
|
Packit |
1c1d7e |
for ( uint index = 0; index < old_vlen; index++ ) {
|
|
Packit |
1c1d7e |
switch ( keytype ) {
|
|
Packit |
1c1d7e |
case StringKey:
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QStringBucket *n=(QStringBucket *)old_vec[index];
|
|
Packit |
1c1d7e |
while ( n ) {
|
|
Packit |
1c1d7e |
look_string( n->getKey(), n->getData(), op_insert );
|
|
Packit |
1c1d7e |
QStringBucket *t=(QStringBucket *)n->getNext();
|
|
Packit |
1c1d7e |
delete n;
|
|
Packit |
1c1d7e |
n = t;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case AsciiKey:
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QAsciiBucket *n=(QAsciiBucket *)old_vec[index];
|
|
Packit |
1c1d7e |
while ( n ) {
|
|
Packit |
1c1d7e |
look_ascii( n->getKey(), n->getData(), op_insert );
|
|
Packit |
1c1d7e |
QAsciiBucket *t=(QAsciiBucket *)n->getNext();
|
|
Packit |
1c1d7e |
delete n;
|
|
Packit |
1c1d7e |
n = t;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case IntKey:
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QIntBucket *n=(QIntBucket *)old_vec[index];
|
|
Packit |
1c1d7e |
while ( n ) {
|
|
Packit |
1c1d7e |
look_int( n->getKey(), n->getData(), op_insert );
|
|
Packit |
1c1d7e |
QIntBucket *t=(QIntBucket *)n->getNext();
|
|
Packit |
1c1d7e |
delete n;
|
|
Packit |
1c1d7e |
n = t;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case PtrKey:
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QPtrBucket *n=(QPtrBucket *)old_vec[index];
|
|
Packit |
1c1d7e |
while ( n ) {
|
|
Packit |
1c1d7e |
look_ptr( n->getKey(), n->getData(), op_insert );
|
|
Packit |
1c1d7e |
QPtrBucket *t=(QPtrBucket *)n->getNext();
|
|
Packit |
1c1d7e |
delete n;
|
|
Packit |
1c1d7e |
n = t;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
delete [] old_vec;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// Restore state
|
|
Packit |
1c1d7e |
copyk = old_copyk;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// Invalidate all iterators, since order is lost
|
|
Packit |
1c1d7e |
if ( iterators && iterators->count() ) {
|
|
Packit |
1c1d7e |
QGDictIterator *i = iterators->first();
|
|
Packit |
1c1d7e |
while ( i ) {
|
|
Packit |
1c1d7e |
i->toFirst();
|
|
Packit |
1c1d7e |
i = iterators->next();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Unlinks the bucket with the specified key (and specified data pointer,
|
|
Packit |
1c1d7e |
if it is set).
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void QGDict::unlink_common( int index, QBaseBucket *node, QBaseBucket *prev )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( iterators && iterators->count() ) { // update iterators
|
|
Packit |
1c1d7e |
QGDictIterator *i = iterators->first();
|
|
Packit |
1c1d7e |
while ( i ) { // invalidate all iterators
|
|
Packit |
1c1d7e |
if ( i->curNode == node ) // referring to pending node
|
|
Packit |
1c1d7e |
i->operator++();
|
|
Packit |
1c1d7e |
i = iterators->next();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( prev ) // unlink node
|
|
Packit |
1c1d7e |
prev->setNext( node->getNext() );
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
vec[index] = node->getNext();
|
|
Packit |
1c1d7e |
numItems--;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QStringBucket *QGDict::unlink_string( const QString &key, QCollection::Item d )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( numItems == 0 ) // nothing in dictionary
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
QStringBucket *n;
|
|
Packit |
1c1d7e |
QStringBucket *prev = 0;
|
|
Packit |
1c1d7e |
int index = hashKeyString(key) % vlen;
|
|
Packit |
1c1d7e |
if ( cases ) {
|
|
Packit |
1c1d7e |
for ( n=(QStringBucket*)vec[index]; n;
|
|
Packit |
1c1d7e |
n=(QStringBucket*)n->getNext() ) {
|
|
Packit |
1c1d7e |
bool found = (key == n->getKey());
|
|
Packit |
1c1d7e |
if ( found && d )
|
|
Packit |
1c1d7e |
found = (n->getData() == d);
|
|
Packit |
1c1d7e |
if ( found ) {
|
|
Packit |
1c1d7e |
unlink_common(index,n,prev);
|
|
Packit |
1c1d7e |
return n;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
prev = n;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
QString k = key.lower();
|
|
Packit |
1c1d7e |
for ( n=(QStringBucket*)vec[index]; n;
|
|
Packit |
1c1d7e |
n=(QStringBucket*)n->getNext() ) {
|
|
Packit |
1c1d7e |
bool found = (k == n->getKey().lower());
|
|
Packit |
1c1d7e |
if ( found && d )
|
|
Packit |
1c1d7e |
found = (n->getData() == d);
|
|
Packit |
1c1d7e |
if ( found ) {
|
|
Packit |
1c1d7e |
unlink_common(index,n,prev);
|
|
Packit |
1c1d7e |
return n;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
prev = n;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QAsciiBucket *QGDict::unlink_ascii( const char *key, QCollection::Item d )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( numItems == 0 ) // nothing in dictionary
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
QAsciiBucket *n;
|
|
Packit |
1c1d7e |
QAsciiBucket *prev = 0;
|
|
Packit |
1c1d7e |
int index = hashKeyAscii(key) % vlen;
|
|
Packit |
1c1d7e |
for ( n=(QAsciiBucket *)vec[index]; n; n=(QAsciiBucket *)n->getNext() ) {
|
|
Packit |
1c1d7e |
bool found = (cases ? qstrcmp(n->getKey(),key)
|
|
Packit |
1c1d7e |
: qstricmp(n->getKey(),key)) == 0;
|
|
Packit |
1c1d7e |
if ( found && d )
|
|
Packit |
1c1d7e |
found = (n->getData() == d);
|
|
Packit |
1c1d7e |
if ( found ) {
|
|
Packit |
1c1d7e |
unlink_common(index,n,prev);
|
|
Packit |
1c1d7e |
return n;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
prev = n;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QIntBucket *QGDict::unlink_int( long key, QCollection::Item d )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( numItems == 0 ) // nothing in dictionary
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
QIntBucket *n;
|
|
Packit |
1c1d7e |
QIntBucket *prev = 0;
|
|
Packit |
1c1d7e |
int index = (int)((ulong)key % vlen);
|
|
Packit |
1c1d7e |
for ( n=(QIntBucket *)vec[index]; n; n=(QIntBucket *)n->getNext() ) {
|
|
Packit |
1c1d7e |
bool found = (n->getKey() == key);
|
|
Packit |
1c1d7e |
if ( found && d )
|
|
Packit |
1c1d7e |
found = (n->getData() == d);
|
|
Packit |
1c1d7e |
if ( found ) {
|
|
Packit |
1c1d7e |
unlink_common(index,n,prev);
|
|
Packit |
1c1d7e |
return n;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
prev = n;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QPtrBucket *QGDict::unlink_ptr( void *key, QCollection::Item d )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( numItems == 0 ) // nothing in dictionary
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
QPtrBucket *n;
|
|
Packit |
1c1d7e |
QPtrBucket *prev = 0;
|
|
Packit |
1c1d7e |
int index = (int)((uintptr_t)key % vlen);
|
|
Packit |
1c1d7e |
for ( n=(QPtrBucket *)vec[index]; n; n=(QPtrBucket *)n->getNext() ) {
|
|
Packit |
1c1d7e |
bool found = (n->getKey() == key);
|
|
Packit |
1c1d7e |
if ( found && d )
|
|
Packit |
1c1d7e |
found = (n->getData() == d);
|
|
Packit |
1c1d7e |
if ( found ) {
|
|
Packit |
1c1d7e |
unlink_common(index,n,prev);
|
|
Packit |
1c1d7e |
return n;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
prev = n;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Removes the item with the specified key. If item is non-null,
|
|
Packit |
1c1d7e |
the remove will match the \a item as well (used to remove an
|
|
Packit |
1c1d7e |
item when several items have the same key).
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool QGDict::remove_string( const QString &key, QCollection::Item item )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QStringBucket *n = unlink_string( key, item );
|
|
Packit |
1c1d7e |
if ( n ) {
|
|
Packit |
1c1d7e |
deleteItem( n->getData() );
|
|
Packit |
1c1d7e |
delete n;
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! \internal */
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool QGDict::remove_ascii( const char *key, QCollection::Item item )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QAsciiBucket *n = unlink_ascii( key, item );
|
|
Packit |
1c1d7e |
if ( n ) {
|
|
Packit |
1c1d7e |
if ( copyk )
|
|
Packit |
1c1d7e |
delete [] (char *)n->getKey();
|
|
Packit |
1c1d7e |
deleteItem( n->getData() );
|
|
Packit |
1c1d7e |
delete n;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return n != 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! \internal */
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool QGDict::remove_int( long key, QCollection::Item item )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QIntBucket *n = unlink_int( key, item );
|
|
Packit |
1c1d7e |
if ( n ) {
|
|
Packit |
1c1d7e |
deleteItem( n->getData() );
|
|
Packit |
1c1d7e |
delete n;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return n != 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! \internal */
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool QGDict::remove_ptr( void *key, QCollection::Item item )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QPtrBucket *n = unlink_ptr( key, item );
|
|
Packit |
1c1d7e |
if ( n ) {
|
|
Packit |
1c1d7e |
deleteItem( n->getData() );
|
|
Packit |
1c1d7e |
delete n;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return n != 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! \internal */
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCollection::Item QGDict::take_string( const QString &key )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QStringBucket *n = unlink_string( key );
|
|
Packit |
1c1d7e |
Item d;
|
|
Packit |
1c1d7e |
if ( n ) {
|
|
Packit |
1c1d7e |
d = n->getData();
|
|
Packit |
1c1d7e |
delete n;
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
d = 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return d;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! \internal */
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCollection::Item QGDict::take_ascii( const char *key )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QAsciiBucket *n = unlink_ascii( key );
|
|
Packit |
1c1d7e |
Item d;
|
|
Packit |
1c1d7e |
if ( n ) {
|
|
Packit |
1c1d7e |
if ( copyk )
|
|
Packit |
1c1d7e |
delete [] (char *)n->getKey();
|
|
Packit |
1c1d7e |
d = n->getData();
|
|
Packit |
1c1d7e |
delete n;
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
d = 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return d;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! \internal */
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCollection::Item QGDict::take_int( long key )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QIntBucket *n = unlink_int( key );
|
|
Packit |
1c1d7e |
Item d;
|
|
Packit |
1c1d7e |
if ( n ) {
|
|
Packit |
1c1d7e |
d = n->getData();
|
|
Packit |
1c1d7e |
delete n;
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
d = 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return d;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! \internal */
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCollection::Item QGDict::take_ptr( void *key )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QPtrBucket *n = unlink_ptr( key );
|
|
Packit |
1c1d7e |
Item d;
|
|
Packit |
1c1d7e |
if ( n ) {
|
|
Packit |
1c1d7e |
d = n->getData();
|
|
Packit |
1c1d7e |
delete n;
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
d = 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return d;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Removes all items from the dictionary.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void QGDict::clear()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( !numItems )
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
numItems = 0; // disable remove() function
|
|
Packit |
1c1d7e |
for ( uint j=0; j
|
|
Packit |
1c1d7e |
if ( vec[j] ) {
|
|
Packit |
1c1d7e |
switch ( keytype ) {
|
|
Packit |
1c1d7e |
case StringKey:
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QStringBucket *n=(QStringBucket *)vec[j];
|
|
Packit |
1c1d7e |
while ( n ) {
|
|
Packit |
1c1d7e |
QStringBucket *next = (QStringBucket*)n->getNext();
|
|
Packit |
1c1d7e |
deleteItem( n->getData() );
|
|
Packit |
1c1d7e |
delete n;
|
|
Packit |
1c1d7e |
n = next;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case AsciiKey:
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QAsciiBucket *n=(QAsciiBucket *)vec[j];
|
|
Packit |
1c1d7e |
while ( n ) {
|
|
Packit |
1c1d7e |
QAsciiBucket *next = (QAsciiBucket*)n->getNext();
|
|
Packit |
1c1d7e |
if ( copyk )
|
|
Packit |
1c1d7e |
delete [] (char *)n->getKey();
|
|
Packit |
1c1d7e |
deleteItem( n->getData() );
|
|
Packit |
1c1d7e |
delete n;
|
|
Packit |
1c1d7e |
n = next;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case IntKey:
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QIntBucket *n=(QIntBucket *)vec[j];
|
|
Packit |
1c1d7e |
while ( n ) {
|
|
Packit |
1c1d7e |
QIntBucket *next = (QIntBucket*)n->getNext();
|
|
Packit |
1c1d7e |
deleteItem( n->getData() );
|
|
Packit |
1c1d7e |
delete n;
|
|
Packit |
1c1d7e |
n = next;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case PtrKey:
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QPtrBucket *n=(QPtrBucket *)vec[j];
|
|
Packit |
1c1d7e |
while ( n ) {
|
|
Packit |
1c1d7e |
QPtrBucket *next = (QPtrBucket*)n->getNext();
|
|
Packit |
1c1d7e |
deleteItem( n->getData() );
|
|
Packit |
1c1d7e |
delete n;
|
|
Packit |
1c1d7e |
n = next;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
vec[j] = 0; // detach list of buckets
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( iterators && iterators->count() ) { // invalidate all iterators
|
|
Packit |
1c1d7e |
QGDictIterator *i = iterators->first();
|
|
Packit |
1c1d7e |
while ( i ) {
|
|
Packit |
1c1d7e |
i->curNode = 0;
|
|
Packit |
1c1d7e |
i = iterators->next();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Outputs debug statistics.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void QGDict::statistics() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(DEBUG)
|
|
Packit |
1c1d7e |
QString line;
|
|
Packit |
1c1d7e |
line.fill( '-', 60 );
|
|
Packit |
1c1d7e |
double real, ideal;
|
|
Packit |
1c1d7e |
qDebug( "%s",line.ascii() );
|
|
Packit |
1c1d7e |
qDebug( "DICTIONARY STATISTICS:" );
|
|
Packit |
1c1d7e |
if ( count() == 0 ) {
|
|
Packit |
1c1d7e |
qDebug( "Empty!" );
|
|
Packit |
1c1d7e |
qDebug( "%s", line.ascii() );
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
real = 0.0;
|
|
Packit |
1c1d7e |
ideal = (float)count()/(2.0*size())*(count()+2.0*size()-1);
|
|
Packit |
1c1d7e |
uint i = 0;
|
|
Packit |
1c1d7e |
while ( i
|
|
Packit |
1c1d7e |
QBaseBucket *n = vec[i];
|
|
Packit |
1c1d7e |
int b = 0;
|
|
Packit |
1c1d7e |
while ( n ) { // count number of buckets
|
|
Packit |
1c1d7e |
b++;
|
|
Packit |
1c1d7e |
n = n->getNext();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
real = real + (double)b * ((double)b+1.0)/2.0;
|
|
Packit |
1c1d7e |
char buf[80], *pbuf;
|
|
Packit |
1c1d7e |
if ( b > 78 )
|
|
Packit |
1c1d7e |
b = 78;
|
|
Packit |
1c1d7e |
pbuf = buf;
|
|
Packit |
1c1d7e |
while ( b-- )
|
|
Packit |
1c1d7e |
*pbuf++ = '*';
|
|
Packit |
1c1d7e |
*pbuf = '\0';
|
|
Packit |
1c1d7e |
qDebug( "%s", buf );
|
|
Packit |
1c1d7e |
i++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
qDebug( "Array size = %d", size() );
|
|
Packit |
1c1d7e |
qDebug( "# items = %d", count() );
|
|
Packit |
1c1d7e |
qDebug( "Real dist = %g", real );
|
|
Packit |
1c1d7e |
qDebug( "Rand dist = %g", ideal );
|
|
Packit |
1c1d7e |
qDebug( "Real/Rand = %g", real/ideal );
|
|
Packit |
1c1d7e |
qDebug( "%s",line.ascii() );
|
|
Packit |
1c1d7e |
#endif // DEBUG
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*****************************************************************************
|
|
Packit |
1c1d7e |
QGDict stream functions
|
|
Packit |
1c1d7e |
*****************************************************************************/
|
|
Packit |
1c1d7e |
#ifndef QT_NO_DATASTREAM
|
|
Packit |
1c1d7e |
QDataStream &operator>>( QDataStream &s, QGDict &dict )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return dict.read( s );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream &operator<<( QDataStream &s, const QGDict &dict )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return dict.write( s );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#if defined(_CC_DEC_) && defined(__alpha) && (__DECCXX_VER >= 50190001)
|
|
Packit |
1c1d7e |
#pragma message disable narrowptr
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Reads a dictionary from the stream \e s.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream &QGDict::read( QDataStream &s )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
uint num;
|
|
Packit |
1c1d7e |
s >> num; // read number of items
|
|
Packit |
1c1d7e |
clear(); // clear dict
|
|
Packit |
1c1d7e |
while ( num-- ) { // read all items
|
|
Packit |
1c1d7e |
Item d;
|
|
Packit |
1c1d7e |
switch ( keytype ) {
|
|
Packit |
1c1d7e |
case StringKey:
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString k;
|
|
Packit |
1c1d7e |
s >> k;
|
|
Packit |
1c1d7e |
read( s, d );
|
|
Packit |
1c1d7e |
look_string( k, d, op_insert );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case AsciiKey:
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
char *k;
|
|
Packit |
1c1d7e |
s >> k;
|
|
Packit |
1c1d7e |
read( s, d );
|
|
Packit |
1c1d7e |
look_ascii( k, d, op_insert );
|
|
Packit |
1c1d7e |
if ( copyk )
|
|
Packit |
1c1d7e |
delete [] k;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case IntKey:
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Q_UINT32 k;
|
|
Packit |
1c1d7e |
s >> k;
|
|
Packit |
1c1d7e |
read( s, d );
|
|
Packit |
1c1d7e |
look_int( k, d, op_insert );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case PtrKey:
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Q_UINT32 k;
|
|
Packit |
1c1d7e |
s >> k;
|
|
Packit |
1c1d7e |
read( s, d );
|
|
Packit |
1c1d7e |
// ### cannot insert 0 - this renders the thing
|
|
Packit |
1c1d7e |
// useless since all pointers are written as 0,
|
|
Packit |
1c1d7e |
// but hey, serializing pointers? can it be done
|
|
Packit |
1c1d7e |
// at all, ever?
|
|
Packit |
1c1d7e |
if ( k )
|
|
Packit |
1c1d7e |
look_ptr( (void *)(uintptr_t)k, d, op_insert );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return s;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Writes the dictionary to the stream \e s.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QDataStream& QGDict::write( QDataStream &s ) const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
s << count(); // write number of items
|
|
Packit |
1c1d7e |
uint i = 0;
|
|
Packit |
1c1d7e |
while ( i
|
|
Packit |
1c1d7e |
QBaseBucket *n = vec[i];
|
|
Packit |
1c1d7e |
while ( n ) { // write all buckets
|
|
Packit |
1c1d7e |
switch ( keytype ) {
|
|
Packit |
1c1d7e |
case StringKey:
|
|
Packit |
1c1d7e |
s << ((QStringBucket*)n)->getKey();
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case AsciiKey:
|
|
Packit |
1c1d7e |
s << ((QAsciiBucket*)n)->getKey();
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case IntKey:
|
|
Packit |
1c1d7e |
s << (Q_UINT32)((QIntBucket*)n)->getKey();
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case PtrKey:
|
|
Packit |
1c1d7e |
s << (Q_UINT32)0; // ### cannot serialize a pointer
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
write( s, n->getData() ); // write data
|
|
Packit |
1c1d7e |
n = n->getNext();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
i++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return s;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#endif //QT_NO_DATASTREAM
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*****************************************************************************
|
|
Packit |
1c1d7e |
QGDictIterator member functions
|
|
Packit |
1c1d7e |
*****************************************************************************/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\class QGDictIterator qgdict.h
|
|
Packit |
1c1d7e |
\brief An internal class for implementing QDictIterator and QIntDictIterator.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QGDictIterator is a strictly internal class that does the heavy work for
|
|
Packit |
1c1d7e |
QDictIterator and QIntDictIterator.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Constructs an iterator that operates on the dictionary \e d.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QGDictIterator::QGDictIterator( const QGDict &d )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
dict = (QGDict *)&d; // get reference to dict
|
|
Packit |
1c1d7e |
toFirst(); // set to first noe
|
|
Packit |
1c1d7e |
if ( !dict->iterators ) {
|
|
Packit |
1c1d7e |
dict->iterators = new QGDItList; // create iterator list
|
|
Packit |
1c1d7e |
CHECK_PTR( dict->iterators );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
dict->iterators->append( this ); // attach iterator to dict
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Constructs a copy of the iterator \e it.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QGDictIterator::QGDictIterator( const QGDictIterator &it )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
dict = it.dict;
|
|
Packit |
1c1d7e |
curNode = it.curNode;
|
|
Packit |
1c1d7e |
curIndex = it.curIndex;
|
|
Packit |
1c1d7e |
if ( dict )
|
|
Packit |
1c1d7e |
dict->iterators->append( this ); // attach iterator to dict
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Assigns a copy of the iterator \e it and returns a reference to this
|
|
Packit |
1c1d7e |
iterator.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QGDictIterator &QGDictIterator::operator=( const QGDictIterator &it )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( dict ) // detach from old dict
|
|
Packit |
1c1d7e |
dict->iterators->removeRef( this );
|
|
Packit |
1c1d7e |
dict = it.dict;
|
|
Packit |
1c1d7e |
curNode = it.curNode;
|
|
Packit |
1c1d7e |
curIndex = it.curIndex;
|
|
Packit |
1c1d7e |
if ( dict )
|
|
Packit |
1c1d7e |
dict->iterators->append( this ); // attach to new list
|
|
Packit |
1c1d7e |
return *this;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Destroys the iterator.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QGDictIterator::~QGDictIterator()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( dict ) // detach iterator from dict
|
|
Packit |
1c1d7e |
dict->iterators->removeRef( this );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Sets the iterator to point to the first item in the dictionary.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCollection::Item QGDictIterator::toFirst()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( !dict ) {
|
|
Packit |
1c1d7e |
#if defined(CHECK_NULL)
|
|
Packit |
1c1d7e |
qWarning( "QGDictIterator::toFirst: Dictionary has been deleted" );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( dict->count() == 0 ) { // empty dictionary
|
|
Packit |
1c1d7e |
curNode = 0;
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
register uint i = 0;
|
|
Packit |
1c1d7e |
register QBaseBucket **v = dict->vec;
|
|
Packit |
1c1d7e |
while ( !(*v++) )
|
|
Packit |
1c1d7e |
i++;
|
|
Packit |
1c1d7e |
curNode = dict->vec[i];
|
|
Packit |
1c1d7e |
curIndex = i;
|
|
Packit |
1c1d7e |
return curNode->getData();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Moves to the next item (postfix).
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCollection::Item QGDictIterator::operator()()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( !dict ) {
|
|
Packit |
1c1d7e |
#if defined(CHECK_NULL)
|
|
Packit |
1c1d7e |
qWarning( "QGDictIterator::operator(): Dictionary has been deleted" );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( !curNode )
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
QCollection::Item d = curNode->getData();
|
|
Packit |
1c1d7e |
this->operator++();
|
|
Packit |
1c1d7e |
return d;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Moves to the next item (prefix).
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCollection::Item QGDictIterator::operator++()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( !dict ) {
|
|
Packit |
1c1d7e |
#if defined(CHECK_NULL)
|
|
Packit |
1c1d7e |
qWarning( "QGDictIterator::operator++: Dictionary has been deleted" );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( !curNode )
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
curNode = curNode->getNext();
|
|
Packit |
1c1d7e |
if ( !curNode ) { // no next bucket
|
|
Packit |
1c1d7e |
register uint i = curIndex + 1; // look from next vec element
|
|
Packit |
1c1d7e |
register QBaseBucket **v = &dict->vec[i];
|
|
Packit |
1c1d7e |
while ( i < dict->size() && !(*v++) )
|
|
Packit |
1c1d7e |
i++;
|
|
Packit |
1c1d7e |
if ( i == dict->size() ) { // nothing found
|
|
Packit |
1c1d7e |
curNode = 0;
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
curNode = dict->vec[i];
|
|
Packit |
1c1d7e |
curIndex = i;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return curNode->getData();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Moves \e jumps positions forward.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCollection::Item QGDictIterator::operator+=( uint jumps )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
while ( curNode && jumps-- )
|
|
Packit |
1c1d7e |
operator++();
|
|
Packit |
1c1d7e |
return curNode ? curNode->getData() : 0;
|
|
Packit |
1c1d7e |
}
|