Blame qtools/qgdict.cpp

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