Blame qtools/qgdict.cpp

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
    }