Blame qtools/qglist.cpp

Packit Service 50c9f2
/****************************************************************************
Packit Service 50c9f2
** 
Packit Service 50c9f2
**
Packit Service 50c9f2
** Implementation of QGList and QGListIterator classes
Packit Service 50c9f2
**
Packit Service 50c9f2
** Created : 920624
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 "qglist.h"
Packit Service 50c9f2
#include "qgvector.h"
Packit Service 50c9f2
#include "qdatastream.h"
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
// NOT REVISED
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  \class QLNode qglist.h
Packit Service 50c9f2
  \brief The QLNode class is an internal class for the QList template collection.
Packit Service 50c9f2
Packit Service 50c9f2
  QLNode is a doubly linked list node; it has three pointers:
Packit Service 50c9f2
  
    Packit Service 50c9f2
      
  1. Pointer to the previous node.
  2. Packit Service 50c9f2
      
  3. Pointer to the next node.
  4. Packit Service 50c9f2
      
  5. Pointer to the actual data.
  6. Packit Service 50c9f2
      
    Packit Service 50c9f2
    Packit Service 50c9f2
      Sometimes it might be practical to have direct access to the list nodes
    Packit Service 50c9f2
      in a QList, but it is seldom required.
    Packit Service 50c9f2
    Packit Service 50c9f2
      \warning Be very careful if you want to access the list nodes. The heap
    Packit Service 50c9f2
      can easily get corrupted if you make a mistake.
    Packit Service 50c9f2
    Packit Service 50c9f2
      \sa QList::currentNode(), QList::removeNode(), QList::takeNode()
    Packit Service 50c9f2
    */
    Packit Service 50c9f2
    Packit Service 50c9f2
    /*!
    Packit Service 50c9f2
      \fn QCollection::Item QLNode::getData()
    Packit Service 50c9f2
      Returns a pointer (\c void*) to the actual data in the list node.
    Packit Service 50c9f2
    */
    Packit Service 50c9f2
    Packit Service 50c9f2
    Packit Service 50c9f2
    /*!
    Packit Service 50c9f2
      \class QGList qglist.h
    Packit Service 50c9f2
      \brief The QGList class is an internal class for implementing Qt collection classes.
    Packit Service 50c9f2
    Packit Service 50c9f2
      QGList is a strictly internal class that acts as a base class for several
    Packit Service 50c9f2
      \link collection.html collection classes\endlink; QList, QQueue and
    Packit Service 50c9f2
      QStack.
    Packit Service 50c9f2
    Packit Service 50c9f2
      QGList has some virtual functions that can be reimplemented to customize
    Packit Service 50c9f2
      the subclasses.
    Packit Service 50c9f2
      
      Packit Service 50c9f2
        
    • compareItems() compares two collection/list items.
    • Packit Service 50c9f2
        
    • read() reads a collection/list item from a QDataStream.
    • Packit Service 50c9f2
        
    • write() writes a collection/list item to a QDataStream.
    • Packit Service 50c9f2
        
      Packit Service 50c9f2
        Normally, you do not have to reimplement any of these functions.
      Packit Service 50c9f2
        If you still want to reimplement them, see the QStrList class (qstrlist.h),
      Packit Service 50c9f2
        which is a good example.
      Packit Service 50c9f2
      */
      Packit Service 50c9f2
      Packit Service 50c9f2
      Packit Service 50c9f2
      /*****************************************************************************
      Packit Service 50c9f2
        Default implementation of virtual functions
      Packit Service 50c9f2
       *****************************************************************************/
      Packit Service 50c9f2
      Packit Service 50c9f2
      /*!
      Packit Service 50c9f2
        This virtual function compares two list items.
      Packit Service 50c9f2
      Packit Service 50c9f2
        Returns:
      Packit Service 50c9f2
        
        Packit Service 50c9f2
          
      • 0 if \e item1 == \e item2
      • Packit Service 50c9f2
          
      • non-zero if \e item1 != \e item2
      • Packit Service 50c9f2
          
        Packit Service 50c9f2
        Packit Service 50c9f2
          This function returns \e int rather than \e bool so that
        Packit Service 50c9f2
          reimplementations can return three values and use it to sort by:
        Packit Service 50c9f2
        Packit Service 50c9f2
          
          Packit Service 50c9f2
            
        • 0 if \e item1 == \e item2
        • Packit Service 50c9f2
            
        • \> 0 (positive integer) if \e item1 \> \e item2
        • Packit Service 50c9f2
            
        • \< 0 (negative integer) if \e item1 \< \e item2
        • Packit Service 50c9f2
            
          Packit Service 50c9f2
          Packit Service 50c9f2
            The QList::inSort() function requires that compareItems() is implemented
          Packit Service 50c9f2
            as described here.
          Packit Service 50c9f2
          Packit Service 50c9f2
            This function should not modify the list because some const functions
          Packit Service 50c9f2
            call compareItems().
          Packit Service 50c9f2
          Packit Service 50c9f2
            The default implementation compares the pointers:
          Packit Service 50c9f2
            \code
          Packit Service 50c9f2
          Packit Service 50c9f2
            \endcode
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          int QGList::compareItems( QCollection::Item item1, QCollection::Item item2 )
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              return item1 != item2;			// compare pointers
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          #ifndef QT_NO_DATASTREAM
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            Reads a collection/list item from the stream \a s and returns a reference
          Packit Service 50c9f2
            to the stream.
          Packit Service 50c9f2
          Packit Service 50c9f2
            The default implementation sets \a item to 0.
          Packit Service 50c9f2
          Packit Service 50c9f2
            \sa write()
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          QDataStream &QGList::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/list item to the stream \a s and returns a reference
          Packit Service 50c9f2
            to the stream.
          Packit Service 50c9f2
          Packit Service 50c9f2
            The default implementation does nothing.
          Packit Service 50c9f2
          Packit Service 50c9f2
            \sa read()
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          QDataStream &QGList::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
            QGList member functions
          Packit Service 50c9f2
           *****************************************************************************/
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Constructs an empty list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          QGList::QGList()
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              firstNode = lastNode = curNode = 0;		// initialize list
          Packit Service 50c9f2
              numNodes  = 0;
          Packit Service 50c9f2
              curIndex  = -1;
          Packit Service 50c9f2
              iterators = 0;				// initialize iterator list
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Constructs a copy of \e list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          QGList::QGList( const QGList & list )
          Packit Service 50c9f2
              : QCollection( list )
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              firstNode = lastNode = curNode = 0;		// initialize list
          Packit Service 50c9f2
              numNodes  = 0;
          Packit Service 50c9f2
              curIndex  = -1;
          Packit Service 50c9f2
              iterators = 0;				// initialize iterator list
          Packit Service 50c9f2
              QLNode *n = list.firstNode;
          Packit Service 50c9f2
              while ( n ) {				// copy all items from list
          Packit Service 50c9f2
          	append( n->data );
          Packit Service 50c9f2
          	n = n->next;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Removes all items from the list and destroys the list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          QGList::~QGList()
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              clear();
          Packit Service 50c9f2
              if ( !iterators )				// no iterators for this list
          Packit Service 50c9f2
          	return;
          Packit Service 50c9f2
              QGListIterator *i = (QGListIterator*)iterators->first();
          Packit Service 50c9f2
              while ( i ) {				// notify all iterators that
          Packit Service 50c9f2
          	i->list = 0;				// this list is deleted
          Packit Service 50c9f2
          	i->curNode = 0;
          Packit Service 50c9f2
          	i = (QGListIterator*)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 list to this list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          QGList& QGList::operator=( const QGList &list )
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              clear();
          Packit Service 50c9f2
              if ( list.count() > 0 ) {
          Packit Service 50c9f2
          	QLNode *n = list.firstNode;
          Packit Service 50c9f2
          	while ( n ) {				// copy all items from list
          Packit Service 50c9f2
          	    append( n->data );
          Packit Service 50c9f2
          	    n = n->next;
          Packit Service 50c9f2
          	}
          Packit Service 50c9f2
          	curNode	 = firstNode;
          Packit Service 50c9f2
          	curIndex = 0;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              return *this;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            Compares this list with \a list. Retruns TRUE if the lists
          Packit Service 50c9f2
            contain the same data, else FALSE.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          bool QGList::operator==( const QGList &list ) const
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              if ( count() != list.count() )
          Packit Service 50c9f2
          	return FALSE;
          Packit Service 50c9f2
              
          Packit Service 50c9f2
              if ( count() == 0 )
          Packit Service 50c9f2
          	return TRUE;
          Packit Service 50c9f2
              
          Packit Service 50c9f2
              QLNode *n1 = firstNode;
          Packit Service 50c9f2
              QLNode *n2 = list.firstNode;
          Packit Service 50c9f2
              while ( n1 && n2 ) {
          Packit Service 50c9f2
          	// should be mutable
          Packit Service 50c9f2
          	if ( ( (QGList*)this )->compareItems( n1->data, n2->data ) != 0 )
          Packit Service 50c9f2
          	    return FALSE;
          Packit Service 50c9f2
          	n1 = n1->next;
          Packit Service 50c9f2
          	n2 = n2->next;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              
          Packit Service 50c9f2
              return TRUE;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \fn uint QGList::count() const
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Returns the number of items in the list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Returns the node at position \e index.  Sets this node to current.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          QLNode *QGList::locate( uint index )
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              if ( index == (uint)curIndex )		// current node ?
          Packit Service 50c9f2
          	return curNode;
          Packit Service 50c9f2
              if ( !curNode && firstNode ) {		// set current node
          Packit Service 50c9f2
          	curNode	 = firstNode;
          Packit Service 50c9f2
          	curIndex = 0;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              register QLNode *node;
          Packit Service 50c9f2
              int	 distance = index - curIndex;		// node distance to cur node
          Packit Service 50c9f2
              bool forward;				// direction to traverse
          Packit Service 50c9f2
          Packit Service 50c9f2
              if ( index >= numNodes ) {
          Packit Service 50c9f2
          #if defined(CHECK_RANGE)
          Packit Service 50c9f2
          	qWarning( "QGList::locate: Index %d out of range", index );
          Packit Service 50c9f2
          #endif
          Packit Service 50c9f2
          	return 0;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
          Packit Service 50c9f2
              if ( distance < 0 )
          Packit Service 50c9f2
          	distance = -distance;
          Packit Service 50c9f2
              if ( (uint)distance < index && (uint)distance < numNodes - index ) {
          Packit Service 50c9f2
          	node =	curNode;			// start from current node
          Packit Service 50c9f2
          	forward = index > (uint)curIndex;
          Packit Service 50c9f2
              } else if ( index < numNodes - index ) {	// start from first node
          Packit Service 50c9f2
          	node = firstNode;
          Packit Service 50c9f2
          	distance = index;
          Packit Service 50c9f2
          	forward = TRUE;
          Packit Service 50c9f2
              } else {					// start from last node
          Packit Service 50c9f2
          	node = lastNode;
          Packit Service 50c9f2
          	distance = numNodes - index - 1;
          Packit Service 50c9f2
          	if ( distance < 0 )
          Packit Service 50c9f2
          	    distance = 0;
          Packit Service 50c9f2
          	forward = FALSE;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              if ( forward ) {				// now run through nodes
          Packit Service 50c9f2
          	while ( distance-- )
          Packit Service 50c9f2
          	    node = node->next;
          Packit Service 50c9f2
              } else {
          Packit Service 50c9f2
          	while ( distance-- )
          Packit Service 50c9f2
          	    node = node->prev;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              curIndex = index;				// must update index
          Packit Service 50c9f2
              return curNode = node;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Inserts an item at its sorted position in the list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          void QGList::inSort( QCollection::Item d )
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              int index = 0;
          Packit Service 50c9f2
              register QLNode *n = firstNode;
          Packit Service 50c9f2
              while ( n && compareItems(n->data,d) < 0 ){ // find position in list
          Packit Service 50c9f2
          	n = n->next;
          Packit Service 50c9f2
          	index++;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              insertAt( index, d );
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Inserts an item at the start of the list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          void QGList::prepend( QCollection::Item d )
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              register QLNode *n = new QLNode( newItem(d) );
          Packit Service 50c9f2
              CHECK_PTR( n );
          Packit Service 50c9f2
              n->prev = 0;
          Packit Service 50c9f2
              if ( (n->next = firstNode) )		// list is not empty
          Packit Service 50c9f2
          	firstNode->prev = n;
          Packit Service 50c9f2
              else					// initialize list
          Packit Service 50c9f2
          	lastNode = n;
          Packit Service 50c9f2
              firstNode = curNode = n;			// curNode affected
          Packit Service 50c9f2
              numNodes++;
          Packit Service 50c9f2
              curIndex = 0;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Inserts an item at the end of the list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          void QGList::append( QCollection::Item d )
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              register QLNode *n = new QLNode( newItem(d) );
          Packit Service 50c9f2
              CHECK_PTR( n );
          Packit Service 50c9f2
              n->next = 0;
          Packit Service 50c9f2
              if ( (n->prev = lastNode) )			// list is not empty
          Packit Service 50c9f2
          	lastNode->next = n;
          Packit Service 50c9f2
              else					// initialize list
          Packit Service 50c9f2
          	firstNode = n;
          Packit Service 50c9f2
              lastNode = curNode = n;			// curNode affected
          Packit Service 50c9f2
              curIndex = numNodes;
          Packit Service 50c9f2
              numNodes++;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Inserts an item at position \e index in the list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          bool QGList::insertAt( uint index, QCollection::Item d )
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              if ( index == 0 ) {				// insert at head of list
          Packit Service 50c9f2
          	prepend( d );
          Packit Service 50c9f2
          	return TRUE;
          Packit Service 50c9f2
              } else if ( index == numNodes ) {		// append at tail of list
          Packit Service 50c9f2
          	append( d );
          Packit Service 50c9f2
          	return TRUE;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              QLNode *nextNode = locate( index );
          Packit Service 50c9f2
              if ( !nextNode )				// illegal position
          Packit Service 50c9f2
          	return FALSE;
          Packit Service 50c9f2
              QLNode *prevNode = nextNode->prev;
          Packit Service 50c9f2
              register QLNode *n = new QLNode( newItem(d) );
          Packit Service 50c9f2
              CHECK_PTR( n );
          Packit Service 50c9f2
              nextNode->prev = n;
          Packit Service 50c9f2
              prevNode->next = n;
          Packit Service 50c9f2
              n->prev = prevNode;				// link new node into list
          Packit Service 50c9f2
              n->next = nextNode;
          Packit Service 50c9f2
              curNode = n;				// curIndex set by locate()
          Packit Service 50c9f2
              numNodes++;
          Packit Service 50c9f2
              return TRUE;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Relinks node \e n and makes it the first node in the list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          void QGList::relinkNode( QLNode *n )
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              if ( n == firstNode )			// already first
          Packit Service 50c9f2
          	return;
          Packit Service 50c9f2
              curNode = n;
          Packit Service 50c9f2
              unlink();
          Packit Service 50c9f2
              n->prev = 0;
          Packit Service 50c9f2
              if ( (n->next = firstNode) )		// list is not empty
          Packit Service 50c9f2
          	firstNode->prev = n;
          Packit Service 50c9f2
              else					// initialize list
          Packit Service 50c9f2
          	lastNode = n;
          Packit Service 50c9f2
              firstNode = curNode = n;			// curNode affected
          Packit Service 50c9f2
              numNodes++;
          Packit Service 50c9f2
              curIndex = 0;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Unlinks the current list node and returns a pointer to this node.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          QLNode *QGList::unlink()
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              if ( curNode == 0 )				// null current node
          Packit Service 50c9f2
          	return 0;
          Packit Service 50c9f2
              register QLNode *n = curNode;		// unlink this node
          Packit Service 50c9f2
              if ( n == firstNode ) {			// removing first node ?
          Packit Service 50c9f2
          	if ( (firstNode = n->next) ) {
          Packit Service 50c9f2
          	    firstNode->prev = 0;
          Packit Service 50c9f2
          	} else {
          Packit Service 50c9f2
          	    lastNode = curNode = 0;		// list becomes empty
          Packit Service 50c9f2
          	    curIndex = -1;
          Packit Service 50c9f2
          	}
          Packit Service 50c9f2
              } else {
          Packit Service 50c9f2
          	if ( n == lastNode ) {			// removing last node ?
          Packit Service 50c9f2
          	    lastNode = n->prev;
          Packit Service 50c9f2
          	    lastNode->next = 0;
          Packit Service 50c9f2
          	} else {				// neither last nor first node
          Packit Service 50c9f2
          	    n->prev->next = n->next;
          Packit Service 50c9f2
          	    n->next->prev = n->prev;
          Packit Service 50c9f2
          	}
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              if ( n->next ) {				// change current node
          Packit Service 50c9f2
          	curNode = n->next;
          Packit Service 50c9f2
              } else if ( n->prev ) {
          Packit Service 50c9f2
          	curNode = n->prev;
          Packit Service 50c9f2
          	curIndex--;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              if ( iterators && iterators->count() ) {	// update iterators
          Packit Service 50c9f2
          	QGListIterator *i = (QGListIterator*)iterators->first();
          Packit Service 50c9f2
          	while ( i ) {				// fix all iterators that
          Packit Service 50c9f2
          	    if ( i->curNode == n )		// refers to pending node
          Packit Service 50c9f2
          		i->curNode = curNode;
          Packit Service 50c9f2
          	    i = (QGListIterator*)iterators->next();
          Packit Service 50c9f2
          	}
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              numNodes--;
          Packit Service 50c9f2
              return n;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Removes the node \e n from the list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          bool QGList::removeNode( QLNode *n )
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
          #if defined(CHECK_NULL)
          Packit Service 50c9f2
              if ( n == 0 || (n->prev && n->prev->next != n) ||
          Packit Service 50c9f2
          	 (n->next && n->next->prev != n) ) {
          Packit Service 50c9f2
          	qWarning( "QGList::removeNode: Corrupted node" );
          Packit Service 50c9f2
          	return FALSE;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
          #endif
          Packit Service 50c9f2
              curNode = n;
          Packit Service 50c9f2
              unlink();					// unlink node
          Packit Service 50c9f2
              deleteItem( n->data );			// deallocate this node
          Packit Service 50c9f2
              delete n;
          Packit Service 50c9f2
              curNode  = firstNode;
          Packit Service 50c9f2
              curIndex = curNode ? 0 : -1;
          Packit Service 50c9f2
              return TRUE;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Removes the item \e d from the list.	Uses compareItems() to find the item.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          bool QGList::remove( QCollection::Item d )
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              if ( d ) {					// find the item
          Packit Service 50c9f2
          	if ( find(d) == -1 )
          Packit Service 50c9f2
          	    return FALSE;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              QLNode *n = unlink();			// unlink node
          Packit Service 50c9f2
              if ( !n )
          Packit Service 50c9f2
          	return FALSE;
          Packit Service 50c9f2
              deleteItem( n->data );			// deallocate this node
          Packit Service 50c9f2
              delete n;
          Packit Service 50c9f2
              return TRUE;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Removes the item \e d from the list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          bool QGList::removeRef( QCollection::Item d )
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              if ( d ) {					// find the item
          Packit Service 50c9f2
          	if ( findRef(d) == -1 )
          Packit Service 50c9f2
          	    return FALSE;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              QLNode *n = unlink();			// unlink node
          Packit Service 50c9f2
              if ( !n )
          Packit Service 50c9f2
          	return FALSE;
          Packit Service 50c9f2
              deleteItem( n->data );			// deallocate this node
          Packit Service 50c9f2
              delete n;
          Packit Service 50c9f2
              return TRUE;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \fn bool QGList::removeFirst()
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Removes the first item in the list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \fn bool QGList::removeLast()
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Removes the last item in the list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Removes the item at position \e index from the list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          bool QGList::removeAt( uint index )
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              if ( !locate(index) )
          Packit Service 50c9f2
          	return FALSE;
          Packit Service 50c9f2
              QLNode *n = unlink();			// unlink node
          Packit Service 50c9f2
              if ( !n )
          Packit Service 50c9f2
          	return FALSE;
          Packit Service 50c9f2
              deleteItem( n->data );			// deallocate this node
          Packit Service 50c9f2
              delete n;
          Packit Service 50c9f2
              return TRUE;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Takes the node \e n out of the list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          QCollection::Item QGList::takeNode( QLNode *n )
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
          #if defined(CHECK_NULL)
          Packit Service 50c9f2
              if ( n == 0 || (n->prev && n->prev->next != n) ||
          Packit Service 50c9f2
          	 (n->next && n->next->prev != n) ) {
          Packit Service 50c9f2
          	qWarning( "QGList::takeNode: Corrupted node" );
          Packit Service 50c9f2
          	return 0;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
          #endif
          Packit Service 50c9f2
              curNode = n;
          Packit Service 50c9f2
              unlink();					// unlink node
          Packit Service 50c9f2
              Item d = n->data;
          Packit Service 50c9f2
              delete n;					// delete the node, not data
          Packit Service 50c9f2
              curNode  = firstNode;
          Packit Service 50c9f2
              curIndex = curNode ? 0 : -1;
          Packit Service 50c9f2
              return d;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Takes the current item out of the list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          QCollection::Item QGList::take()
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              QLNode *n = unlink();			// unlink node
          Packit Service 50c9f2
              Item d = n ? n->data : 0;
          Packit Service 50c9f2
              delete n;					// delete node, keep contents
          Packit Service 50c9f2
              return d;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Takes the item at position \e index out of the list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          QCollection::Item QGList::takeAt( uint index )
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              if ( !locate(index) )
          Packit Service 50c9f2
          	return 0;
          Packit Service 50c9f2
              QLNode *n = unlink();			// unlink node
          Packit Service 50c9f2
              Item d = n ? n->data : 0;
          Packit Service 50c9f2
              delete n;					// delete node, keep contents
          Packit Service 50c9f2
              return d;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Takes the first item out of the list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          QCollection::Item QGList::takeFirst()
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              first();
          Packit Service 50c9f2
              QLNode *n = unlink();			// unlink node
          Packit Service 50c9f2
              Item d = n ? n->data : 0;
          Packit Service 50c9f2
              delete n;
          Packit Service 50c9f2
              return d;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Takes the last item out of the list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          QCollection::Item QGList::takeLast()
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              last();
          Packit Service 50c9f2
              QLNode *n = unlink();			// unlink node
          Packit Service 50c9f2
              Item d = n ? n->data : 0;
          Packit Service 50c9f2
              delete n;
          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 list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          void QGList::clear()
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              register QLNode *n = firstNode;
          Packit Service 50c9f2
          Packit Service 50c9f2
              firstNode = lastNode = curNode = 0;		// initialize list
          Packit Service 50c9f2
              numNodes = 0;
          Packit Service 50c9f2
              curIndex = -1;
          Packit Service 50c9f2
          Packit Service 50c9f2
              if ( iterators && iterators->count() ) {
          Packit Service 50c9f2
          	QGListIterator *i = (QGListIterator*)iterators->first();
          Packit Service 50c9f2
          	while ( i ) {				// notify all iterators that
          Packit Service 50c9f2
          	    i->curNode = 0;			// this list is empty
          Packit Service 50c9f2
          	    i = (QGListIterator*)iterators->next();
          Packit Service 50c9f2
          	}
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
          Packit Service 50c9f2
              QLNode *prevNode;
          Packit Service 50c9f2
              while ( n ) {				// for all nodes ...
          Packit Service 50c9f2
          	deleteItem( n->data );			// deallocate data
          Packit Service 50c9f2
          	prevNode = n;
          Packit Service 50c9f2
          	n = n->next;
          Packit Service 50c9f2
          	delete prevNode;			// deallocate node
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Finds an item in the list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          int QGList::findRef( QCollection::Item d, bool fromStart )
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              register QLNode *n;
          Packit Service 50c9f2
              int	     index;
          Packit Service 50c9f2
              if ( fromStart ) {				// start from first node
          Packit Service 50c9f2
          	n = firstNode;
          Packit Service 50c9f2
          	index = 0;
          Packit Service 50c9f2
              } else {					// start from current node
          Packit Service 50c9f2
          	n = curNode;
          Packit Service 50c9f2
          	index = curIndex;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              while ( n && n->data != d ) {		// find exact match
          Packit Service 50c9f2
          	n = n->next;
          Packit Service 50c9f2
          	index++;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              curNode = n;
          Packit Service 50c9f2
              curIndex = n ? index : -1;
          Packit Service 50c9f2
              return curIndex;				// return position of item
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Finds an item in the list.  Uses compareItems().
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          int QGList::find( QCollection::Item d, bool fromStart )
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              register QLNode *n;
          Packit Service 50c9f2
              int	     index;
          Packit Service 50c9f2
              if ( fromStart ) {				// start from first node
          Packit Service 50c9f2
          	n = firstNode;
          Packit Service 50c9f2
          	index = 0;
          Packit Service 50c9f2
              } else {					// start from current node
          Packit Service 50c9f2
          	n = curNode;
          Packit Service 50c9f2
          	index = curIndex;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              while ( n && compareItems(n->data,d) ){	// find equal match
          Packit Service 50c9f2
          	n = n->next;
          Packit Service 50c9f2
          	index++;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              curNode = n;
          Packit Service 50c9f2
              curIndex = n ? index : -1;
          Packit Service 50c9f2
              return curIndex;				// return position of item
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Counts the number an item occurs in the list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          uint QGList::containsRef( QCollection::Item d ) const
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              register QLNode *n = firstNode;
          Packit Service 50c9f2
              uint     count = 0;
          Packit Service 50c9f2
              while ( n ) {				// for all nodes...
          Packit Service 50c9f2
          	if ( n->data == d )			// count # exact matches
          Packit Service 50c9f2
          	    count++;
          Packit Service 50c9f2
          	n = n->next;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              return count;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Counts the number an item occurs in the list.	 Uses compareItems().
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          uint QGList::contains( QCollection::Item d ) const
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              register QLNode *n = firstNode;
          Packit Service 50c9f2
              uint     count = 0;
          Packit Service 50c9f2
              QGList  *that = (QGList*)this;		// mutable for compareItems()
          Packit Service 50c9f2
              while ( n ) {				// for all nodes...
          Packit Service 50c9f2
          	if ( !that->compareItems(n->data,d) )	// count # equal matches
          Packit Service 50c9f2
          	    count++;
          Packit Service 50c9f2
          	n = n->next;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              return count;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \fn QCollection::Item QGList::at( uint index )
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Sets the item at position \e index to the current item.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \fn int QGList::at() const
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Returns the current index.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \fn QLNode *QGList::currentNode() const
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Returns the current node.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \fn QCollection::Item QGList::get() const
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Returns the current item.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \fn QCollection::Item QGList::cfirst() const
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Returns the first item in the list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \fn QCollection::Item QGList::clast() const
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Returns the last item in the list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Returns the first list item.	Sets this to current.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          QCollection::Item QGList::first()
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              if ( firstNode ) {
          Packit Service 50c9f2
          	curIndex = 0;
          Packit Service 50c9f2
          	return (curNode=firstNode)->data;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              return 0;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Returns the last list item.  Sets this to current.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          QCollection::Item QGList::last()
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              if ( lastNode ) {
          Packit Service 50c9f2
          	curIndex = numNodes-1;
          Packit Service 50c9f2
          	return (curNode=lastNode)->data;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              return 0;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Returns the next list item (after current).  Sets this to current.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          QCollection::Item QGList::next()
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              if ( curNode ) {
          Packit Service 50c9f2
          	if ( curNode->next ) {
          Packit Service 50c9f2
          	    curIndex++;
          Packit Service 50c9f2
          	    curNode = curNode->next;
          Packit Service 50c9f2
          	    return curNode->data;
          Packit Service 50c9f2
          	}
          Packit Service 50c9f2
          	curIndex = -1;
          Packit Service 50c9f2
          	curNode = 0;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              return 0;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Returns the previous list item (before current).  Sets this to current.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          QCollection::Item QGList::prev()
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              if ( curNode ) {
          Packit Service 50c9f2
          	if ( curNode->prev ) {
          Packit Service 50c9f2
          	    curIndex--;
          Packit Service 50c9f2
          	    curNode = curNode->prev;
          Packit Service 50c9f2
          	    return curNode->data;
          Packit Service 50c9f2
          	}
          Packit Service 50c9f2
          	curIndex = -1;
          Packit Service 50c9f2
          	curNode = 0;
          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
            Converts the list to a vector.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          void QGList::toVector( QGVector *vector ) const
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              vector->clear();
          Packit Service 50c9f2
              if ( !vector->resize( count() ) )
          Packit Service 50c9f2
          	return;
          Packit Service 50c9f2
              register QLNode *n = firstNode;
          Packit Service 50c9f2
              uint i = 0;
          Packit Service 50c9f2
              while ( n ) {
          Packit Service 50c9f2
          	vector->insert( i, n->data );
          Packit Service 50c9f2
          	n = n->next;
          Packit Service 50c9f2
          	i++;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          void QGList::heapSortPushDown( QCollection::Item* heap, int first, int last )
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              int r = first;
          Packit Service 50c9f2
              while( r <= last/2 ) {
          Packit Service 50c9f2
          	// Node r has only one child ?
          Packit Service 50c9f2
          	if ( last == 2*r ) {
          Packit Service 50c9f2
          	    // Need for swapping ?
          Packit Service 50c9f2
          	    if ( compareItems( heap[r], heap[ 2*r ] ) > 0 ) {
          Packit Service 50c9f2
          		QCollection::Item tmp = heap[r];
          Packit Service 50c9f2
          		heap[ r ] = heap[ 2*r ];
          Packit Service 50c9f2
          		heap[ 2*r ] = tmp;
          Packit Service 50c9f2
          	    }
          Packit Service 50c9f2
          	    // That's it ...
          Packit Service 50c9f2
          	    r = last;
          Packit Service 50c9f2
          	} else {
          Packit Service 50c9f2
          	    // Node has two children
          Packit Service 50c9f2
          	    if ( compareItems( heap[r], heap[ 2*r ] ) > 0 &&
          Packit Service 50c9f2
          		 compareItems( heap[ 2*r ], heap[ 2*r+1 ] ) <= 0 ) {
          Packit Service 50c9f2
          		// Swap with left child
          Packit Service 50c9f2
          		QCollection::Item tmp = heap[r];
          Packit Service 50c9f2
          		heap[ r ] = heap[ 2*r ];
          Packit Service 50c9f2
          		heap[ 2*r ] = tmp;
          Packit Service 50c9f2
          		r *= 2;
          Packit Service 50c9f2
          	    } else if ( compareItems( heap[r], heap[ 2*r+1 ] ) > 0 &&
          Packit Service 50c9f2
          			compareItems( heap[ 2*r+1 ], heap[ 2*r ] ) < 0 ) {
          Packit Service 50c9f2
          		// Swap with right child
          Packit Service 50c9f2
          		QCollection::Item tmp = heap[r];
          Packit Service 50c9f2
          		heap[ r ] = heap[ 2*r+1 ];
          Packit Service 50c9f2
          		heap[ 2*r+1 ] = tmp;
          Packit Service 50c9f2
          		r = 2*r+1;
          Packit Service 50c9f2
          	    } else {
          Packit Service 50c9f2
          		// We are done
          Packit Service 50c9f2
          		r = last;
          Packit Service 50c9f2
          	    }
          Packit Service 50c9f2
          	}
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*! Sorts the list by the result of the virtual compareItems() function.
          Packit Service 50c9f2
          Packit Service 50c9f2
            The Heap-Sort algorithm is used for sorting.  It sorts n items with
          Packit Service 50c9f2
            O(n*log n) compares.  This is the asymptotic optimal solution of the
          Packit Service 50c9f2
            sorting problem.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          void QGList::sort()
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              uint n = count();
          Packit Service 50c9f2
              if ( n < 2 )
          Packit Service 50c9f2
          	return;
          Packit Service 50c9f2
          Packit Service 50c9f2
              // Create the heap
          Packit Service 50c9f2
              QCollection::Item* realheap = new QCollection::Item[ n ];
          Packit Service 50c9f2
              // Wow, what a fake. But I want the heap to be indexed as 1...n
          Packit Service 50c9f2
              QCollection::Item* heap = realheap - 1;
          Packit Service 50c9f2
              int size = 0;
          Packit Service 50c9f2
              QLNode* insert = firstNode;
          Packit Service 50c9f2
              for( ; insert != 0; insert = insert->next ) {
          Packit Service 50c9f2
          	heap[++size] = insert->data;
          Packit Service 50c9f2
          	int i = size;
          Packit Service 50c9f2
          	while( i > 1 && compareItems( heap[i], heap[ i / 2 ] ) < 0 ) {
          Packit Service 50c9f2
          	    QCollection::Item tmp = heap[ i ];
          Packit Service 50c9f2
          	    heap[ i ] = heap[ i/2 ];
          Packit Service 50c9f2
          	    heap[ i/2 ] = tmp;
          Packit Service 50c9f2
          	    i /= 2;
          Packit Service 50c9f2
          	}
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
          Packit Service 50c9f2
              insert = firstNode;
          Packit Service 50c9f2
              // Now do the sorting
          Packit Service 50c9f2
              for ( int i = n; i > 0; i-- ) {
          Packit Service 50c9f2
          	insert->data = heap[1];
          Packit Service 50c9f2
          	insert = insert->next;
          Packit Service 50c9f2
          	if ( i > 1 ) {
          Packit Service 50c9f2
          	    heap[1] = heap[i];
          Packit Service 50c9f2
          	    heapSortPushDown( heap, 1, i - 1 );
          Packit Service 50c9f2
          	}
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
          Packit Service 50c9f2
              delete [] realheap;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*****************************************************************************
          Packit Service 50c9f2
            QGList stream functions
          Packit Service 50c9f2
           *****************************************************************************/
          Packit Service 50c9f2
          Packit Service 50c9f2
          #ifndef QT_NO_DATASTREAM
          Packit Service 50c9f2
          QDataStream &operator>>( QDataStream &s, QGList &list )
          Packit Service 50c9f2
          {						// read list
          Packit Service 50c9f2
              return list.read( s );
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          QDataStream &operator<<( QDataStream &s, const QGList &list )
          Packit Service 50c9f2
          {						// write list
          Packit Service 50c9f2
              return list.write( s );
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Reads a list from the stream \e s.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          QDataStream &QGList::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 list
          Packit Service 50c9f2
              while ( num-- ) {				// read all items
          Packit Service 50c9f2
          	Item d;
          Packit Service 50c9f2
          	read( s, d );
          Packit Service 50c9f2
          	CHECK_PTR( d );
          Packit Service 50c9f2
          	if ( !d )				// no memory
          Packit Service 50c9f2
          	    break;
          Packit Service 50c9f2
          	QLNode *n = new QLNode( d );
          Packit Service 50c9f2
          	CHECK_PTR( n );
          Packit Service 50c9f2
          	if ( !n )				// no memory
          Packit Service 50c9f2
          	    break;
          Packit Service 50c9f2
          	n->next = 0;
          Packit Service 50c9f2
          	if ( (n->prev = lastNode) )		// list is not empty
          Packit Service 50c9f2
          	    lastNode->next = n;
          Packit Service 50c9f2
          	else					// initialize list
          Packit Service 50c9f2
          	    firstNode = n;
          Packit Service 50c9f2
          	lastNode = n;
          Packit Service 50c9f2
          	numNodes++;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              curNode  = firstNode;
          Packit Service 50c9f2
              curIndex = curNode ? 0 : -1;
          Packit Service 50c9f2
              return s;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Writes the list to the stream \e s.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          QDataStream &QGList::write( QDataStream &s ) const
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              s << count();				// write number of items
          Packit Service 50c9f2
              QLNode *n = firstNode;
          Packit Service 50c9f2
              while ( n ) {				// write all items
          Packit Service 50c9f2
          	write( s, n->data );
          Packit Service 50c9f2
          	n = n->next;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              return s;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          #endif // QT_NO_DATASTREAM
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*****************************************************************************
          Packit Service 50c9f2
            QGListIterator member functions
          Packit Service 50c9f2
           *****************************************************************************/
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \class QGListIterator qglist.h
          Packit Service 50c9f2
            \brief The QGListIterator class is an internal class for implementing QListIterator.
          Packit Service 50c9f2
          Packit Service 50c9f2
            QGListIterator is a strictly internal class that does the heavy work for
          Packit Service 50c9f2
            QListIterator.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Constructs an iterator that operates on the list \e l.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          QGListIterator::QGListIterator( const QGList &l )
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              list = (QGList *)&l;			// get reference to list
          Packit Service 50c9f2
              curNode = list->firstNode;			// set to first node
          Packit Service 50c9f2
              if ( !list->iterators ) {
          Packit Service 50c9f2
          	list->iterators = new QGList;		// create iterator list
          Packit Service 50c9f2
          	CHECK_PTR( list->iterators );
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              list->iterators->append( this );		// attach iterator to list
          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
          QGListIterator::QGListIterator( const QGListIterator &it )
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              list = it.list;
          Packit Service 50c9f2
              curNode = it.curNode;
          Packit Service 50c9f2
              if ( list )
          Packit Service 50c9f2
          	list->iterators->append( this );	// attach iterator to list
          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
          QGListIterator &QGListIterator::operator=( const QGListIterator &it )
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              if ( list )					// detach from old list
          Packit Service 50c9f2
          	list->iterators->removeRef( this );
          Packit Service 50c9f2
              list = it.list;
          Packit Service 50c9f2
              curNode = it.curNode;
          Packit Service 50c9f2
              if ( list )
          Packit Service 50c9f2
          	list->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
          QGListIterator::~QGListIterator()
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              if ( list )					// detach iterator from list
          Packit Service 50c9f2
          	list->iterators->removeRef(this);
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \fn bool QGListIterator::atFirst() const
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Returns TRUE if the iterator points to the first item, otherwise FALSE.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \fn bool QGListIterator::atLast() const
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Returns TRUE if the iterator points to the last item, otherwise FALSE.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Sets the list iterator to point to the first item in the list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          QCollection::Item QGListIterator::toFirst()
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              if ( !list ) {
          Packit Service 50c9f2
          #if defined(CHECK_NULL)
          Packit Service 50c9f2
          	qWarning( "QGListIterator::toFirst: List has been deleted" );
          Packit Service 50c9f2
          #endif
          Packit Service 50c9f2
          	return 0;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              return list->firstNode ? (curNode = list->firstNode)->getData() : 0;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Sets the list iterator to point to the last item in the list.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          QCollection::Item QGListIterator::toLast()
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              if ( !list ) {
          Packit Service 50c9f2
          #if defined(CHECK_NULL)
          Packit Service 50c9f2
          	qWarning( "QGListIterator::toLast: List has been deleted" );
          Packit Service 50c9f2
          #endif
          Packit Service 50c9f2
          	return 0;
          Packit Service 50c9f2
              }
          Packit Service 50c9f2
              return list->lastNode ? (curNode = list->lastNode)->getData() : 0;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \fn QCollection::Item QGListIterator::get() const
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Returns the iterator item.
          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 QGListIterator::operator()()
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              if ( !curNode )
          Packit Service 50c9f2
          	return 0;
          Packit Service 50c9f2
              QCollection::Item d = curNode->getData();
          Packit Service 50c9f2
              curNode = curNode->next;
          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 QGListIterator::operator++()
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              if ( !curNode )
          Packit Service 50c9f2
          	return 0;
          Packit Service 50c9f2
              curNode = curNode->next;
          Packit Service 50c9f2
              return curNode ? curNode->getData() : 0;
          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 QGListIterator::operator+=( uint jumps )
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              while ( curNode && jumps-- )
          Packit Service 50c9f2
          	curNode = curNode->next;
          Packit Service 50c9f2
              return curNode ? curNode->getData() : 0;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Moves to the previous item (prefix).
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          QCollection::Item QGListIterator::operator--()
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              if ( !curNode )
          Packit Service 50c9f2
          	return 0;
          Packit Service 50c9f2
              curNode = curNode->prev;
          Packit Service 50c9f2
              return curNode ? curNode->getData() : 0;
          Packit Service 50c9f2
          }
          Packit Service 50c9f2
          Packit Service 50c9f2
          /*!
          Packit Service 50c9f2
            \internal
          Packit Service 50c9f2
            Moves \e jumps positions backward.
          Packit Service 50c9f2
          */
          Packit Service 50c9f2
          Packit Service 50c9f2
          QCollection::Item QGListIterator::operator-=( uint jumps )
          Packit Service 50c9f2
          {
          Packit Service 50c9f2
              while ( curNode && jumps-- )
          Packit Service 50c9f2
          	curNode = curNode->prev;
          Packit Service 50c9f2
              return curNode ? curNode->getData() : 0;
          Packit Service 50c9f2
          }