Blame qtools/qgvector.cpp

Packit Service 50c9f2
/****************************************************************************
Packit Service 50c9f2
** 
Packit Service 50c9f2
**
Packit Service 50c9f2
** Implementation of QGVector class
Packit Service 50c9f2
**
Packit Service 50c9f2
** Created : 930907
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
#define	 QGVECTOR_CPP
Packit Service 50c9f2
#include "qgvector.h"
Packit Service 50c9f2
#include "qglist.h"
Packit Service 50c9f2
#include "qstring.h"
Packit Service 50c9f2
#include "qdatastream.h"
Packit Service 50c9f2
#include <stdlib.h>
Packit Service 50c9f2
Packit Service 50c9f2
#define USE_MALLOC				// comment to use new/delete
Packit Service 50c9f2
Packit Service 50c9f2
#undef NEW
Packit Service 50c9f2
#undef DELETE
Packit Service 50c9f2
Packit Service 50c9f2
#if defined(USE_MALLOC)
Packit Service 50c9f2
#define NEW(type,size)	((type*)malloc(size*sizeof(type)))
Packit Service 50c9f2
#define DELETE(array)	(free((char*)array))
Packit Service 50c9f2
#else
Packit Service 50c9f2
#define NEW(type,size)	(new type[size])
Packit Service 50c9f2
#define DELETE(array)	(delete[] array)
Packit Service 50c9f2
#define DONT_USE_REALLOC			// comment to use realloc()
Packit Service 50c9f2
#endif
Packit Service 50c9f2
Packit Service 50c9f2
// NOT REVISED
Packit Service 50c9f2
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  \class QGVector qgvector.h
Packit Service 50c9f2
Packit Service 50c9f2
  \brief The QGVector class is an internal class for implementing Qt
Packit Service 50c9f2
  collection classes.
Packit Service 50c9f2
Packit Service 50c9f2
  QGVector is a strictly internal class that acts as a base class for
Packit Service 50c9f2
  the QVector collection class.
Packit Service 50c9f2
Packit Service 50c9f2
  QGVector has some virtual functions that may be reimplemented in
Packit Service 50c9f2
  subclasses to to customize behavior.
Packit Service 50c9f2
Packit Service 50c9f2
  
    Packit Service 50c9f2
      
  • compareItems() compares two collection/vector items.
  • Packit Service 50c9f2
      
  • read() reads a collection/vector item from a QDataStream.
  • Packit Service 50c9f2
      
  • write() writes a collection/vector item to a QDataStream.
  • 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 \a item1 == \a item2
    • Packit Service 50c9f2
        
    • non-zero if \a item1 != \a 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 one of three values and use it to sort
      Packit Service 50c9f2
        by:
      Packit Service 50c9f2
      Packit Service 50c9f2
        
        Packit Service 50c9f2
          
      • 0 if \e item1 == \e item2
      • Packit Service 50c9f2
          
      • \> 0 (positive integer) if \a item1 \> \a item2
      • Packit Service 50c9f2
          
      • \< 0 (negative integer) if \a item1 \< \a item2
      • Packit Service 50c9f2
          
        Packit Service 50c9f2
        Packit Service 50c9f2
          The QVector::sort() and QVector::bsearch() functions require that
        Packit Service 50c9f2
          compareItems() is implemented as described here.
        Packit Service 50c9f2
        Packit Service 50c9f2
          This function should not modify the vector because some const
        Packit Service 50c9f2
          functions call compareItems().
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        int QGVector::compareItems( Item d1, Item d2 )
        Packit Service 50c9f2
        {
        Packit Service 50c9f2
            return d1 != d2;				// compare pointers
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        #ifndef QT_NO_DATASTREAM
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          Reads a collection/vector 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 \e item to 0.
        Packit Service 50c9f2
        Packit Service 50c9f2
          \sa write()
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        QDataStream &QGVector::read( QDataStream &s, Item &d )
        Packit Service 50c9f2
        {						// read item from stream
        Packit Service 50c9f2
            d = 0;
        Packit Service 50c9f2
            return s;
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          Writes a collection/vector 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 &QGVector::write( QDataStream &s, Item ) const
        Packit Service 50c9f2
        {						// write item to stream
        Packit Service 50c9f2
            return s;
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        #endif // QT_NO_DATASTREAM
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*****************************************************************************
        Packit Service 50c9f2
          QGVector member functions
        Packit Service 50c9f2
         *****************************************************************************/
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        QGVector::QGVector()				// create empty vector
        Packit Service 50c9f2
        {
        Packit Service 50c9f2
            vec = 0;
        Packit Service 50c9f2
            len = numItems = 0;
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        QGVector::QGVector( uint size )			// create vectors with nullptrs
        Packit Service 50c9f2
        {
        Packit Service 50c9f2
            len = size;
        Packit Service 50c9f2
            numItems = 0;
        Packit Service 50c9f2
            if ( len == 0 ) {				// zero length
        Packit Service 50c9f2
        	vec = 0;
        Packit Service 50c9f2
        	return;
        Packit Service 50c9f2
            }
        Packit Service 50c9f2
            vec = NEW(Item,len);
        Packit Service 50c9f2
            CHECK_PTR( vec );
        Packit Service 50c9f2
            memset( (void*)vec, 0, len*sizeof(Item) );	// fill with nulls
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        QGVector::QGVector( const QGVector &a )		// make copy of other vector
        Packit Service 50c9f2
            : QCollection( a )
        Packit Service 50c9f2
        {
        Packit Service 50c9f2
            len = a.len;
        Packit Service 50c9f2
            numItems = a.numItems;
        Packit Service 50c9f2
            vec = NEW(Item,len);
        Packit Service 50c9f2
            CHECK_PTR( vec );
        Packit Service 50c9f2
            for ( uint i=0; i
        Packit Service 50c9f2
        	vec[i] = a.vec[i] ? newItem( a.vec[i] ) : 0;
        Packit Service 50c9f2
        	CHECK_PTR( vec[i] );
        Packit Service 50c9f2
            }
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        QGVector::~QGVector()
        Packit Service 50c9f2
        {
        Packit Service 50c9f2
            clear();
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        QGVector& QGVector::operator=( const QGVector &v )
        Packit Service 50c9f2
        {						// assign from other vector
        Packit Service 50c9f2
            clear();					// first delete old vector
        Packit Service 50c9f2
            len = v.len;
        Packit Service 50c9f2
            numItems = v.numItems;
        Packit Service 50c9f2
            vec = NEW(Item,len);				// create new vector
        Packit Service 50c9f2
            CHECK_PTR( vec );
        Packit Service 50c9f2
            for ( uint i=0; i
        Packit Service 50c9f2
        	vec[i] = v.vec[i] ? newItem( v.vec[i] ) : 0;
        Packit Service 50c9f2
        	CHECK_PTR( vec[i] );
        Packit Service 50c9f2
            }
        Packit Service 50c9f2
            return *this;
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \fn Item *QGVector::data() const
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \fn uint QGVector::size() const
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \fn uint QGVector::count() const
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \fn Item QGVector::at( uint index ) const
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        bool QGVector::insert( uint index, Item d )	// insert item at index
        Packit Service 50c9f2
        {
        Packit Service 50c9f2
        #if defined(CHECK_RANGE)
        Packit Service 50c9f2
            if ( index >= len ) {			// range error
        Packit Service 50c9f2
        	qWarning( "QGVector::insert: Index %d out of range", index );
        Packit Service 50c9f2
        	return FALSE;
        Packit Service 50c9f2
            }
        Packit Service 50c9f2
        #endif
        Packit Service 50c9f2
            if ( vec[index] ) {				// remove old item
        Packit Service 50c9f2
        	deleteItem( vec[index] );
        Packit Service 50c9f2
        	numItems--;
        Packit Service 50c9f2
            }
        Packit Service 50c9f2
            if ( d ) {
        Packit Service 50c9f2
        	vec[index] = newItem( d );
        Packit Service 50c9f2
        	CHECK_PTR( vec[index] );
        Packit Service 50c9f2
        	numItems++;
        Packit Service 50c9f2
        	return vec[index] != 0;
        Packit Service 50c9f2
            } else {
        Packit Service 50c9f2
        	vec[index] = 0;				// reset item
        Packit Service 50c9f2
            }
        Packit Service 50c9f2
            return TRUE;
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        bool QGVector::remove( uint index )		// remove item at index
        Packit Service 50c9f2
        {
        Packit Service 50c9f2
        #if defined(CHECK_RANGE)
        Packit Service 50c9f2
            if ( index >= len ) {			// range error
        Packit Service 50c9f2
        	qWarning( "QGVector::remove: Index %d out of range", index );
        Packit Service 50c9f2
        	return FALSE;
        Packit Service 50c9f2
            }
        Packit Service 50c9f2
        #endif
        Packit Service 50c9f2
            if ( vec[index] ) {				// valid item
        Packit Service 50c9f2
        	deleteItem( vec[index] );		// delete it
        Packit Service 50c9f2
        	vec[index] = 0;				// reset pointer
        Packit Service 50c9f2
        	numItems--;
        Packit Service 50c9f2
            }
        Packit Service 50c9f2
            return TRUE;
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        QCollection::Item QGVector::take( uint index )		// take out item
        Packit Service 50c9f2
        {
        Packit Service 50c9f2
        #if defined(CHECK_RANGE)
        Packit Service 50c9f2
            if ( index >= len ) {			// range error
        Packit Service 50c9f2
        	qWarning( "QGVector::take: Index %d out of range", index );
        Packit Service 50c9f2
        	return 0;
        Packit Service 50c9f2
            }
        Packit Service 50c9f2
        #endif
        Packit Service 50c9f2
            Item d = vec[index];				// don't delete item
        Packit Service 50c9f2
            if ( d )
        Packit Service 50c9f2
        	numItems--;
        Packit Service 50c9f2
            vec[index] = 0;
        Packit Service 50c9f2
            return d;
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        void QGVector::clear()				// clear vector
        Packit Service 50c9f2
        {
        Packit Service 50c9f2
            if ( vec ) {
        Packit Service 50c9f2
        	for ( uint i=0; i
        Packit Service 50c9f2
        	    if ( vec[i] )
        Packit Service 50c9f2
        		deleteItem( vec[i] );
        Packit Service 50c9f2
        	}
        Packit Service 50c9f2
        	DELETE(vec);
        Packit Service 50c9f2
        	vec = 0;
        Packit Service 50c9f2
        	len = numItems = 0;
        Packit Service 50c9f2
            }
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        bool QGVector::resize( uint newsize )		// resize array
        Packit Service 50c9f2
        {
        Packit Service 50c9f2
            if ( newsize == len )			// nothing to do
        Packit Service 50c9f2
        	return TRUE;
        Packit Service 50c9f2
            if ( vec ) {				// existing data
        Packit Service 50c9f2
        	if ( newsize < len ) {			// shrink vector
        Packit Service 50c9f2
        	    uint i = newsize;
        Packit Service 50c9f2
        	    while ( i < len ) {			// delete lost items
        Packit Service 50c9f2
        		if ( vec[i] ) {
        Packit Service 50c9f2
        		    deleteItem( vec[i] );
        Packit Service 50c9f2
        		    numItems--;
        Packit Service 50c9f2
        		}
        Packit Service 50c9f2
        		i++;
        Packit Service 50c9f2
        	    }
        Packit Service 50c9f2
        	}
        Packit Service 50c9f2
        	if ( newsize == 0 ) {			// vector becomes empty
        Packit Service 50c9f2
        	    DELETE(vec);
        Packit Service 50c9f2
        	    vec = 0;
        Packit Service 50c9f2
        	    len = numItems = 0;
        Packit Service 50c9f2
        	    return TRUE;
        Packit Service 50c9f2
        	}
        Packit Service 50c9f2
        #if defined(DONT_USE_REALLOC)
        Packit Service 50c9f2
        	Item *newvec = NEW(Item,newsize);		// manual realloc
        Packit Service 50c9f2
        	memcpy( newvec, vec, (len < newsize ? len : newsize)*sizeof(Item) );
        Packit Service 50c9f2
        	DELETE(vec);
        Packit Service 50c9f2
        	vec = newvec;
        Packit Service 50c9f2
        #else
        Packit Service 50c9f2
        	vec = (Item*)realloc( (char *)vec, newsize*sizeof(Item) );
        Packit Service 50c9f2
        #endif
        Packit Service 50c9f2
            } else {					// create new vector
        Packit Service 50c9f2
        	vec = NEW(Item,newsize);
        Packit Service 50c9f2
        	len = numItems = 0;
        Packit Service 50c9f2
            }
        Packit Service 50c9f2
            CHECK_PTR( vec );
        Packit Service 50c9f2
            if ( !vec )					// no memory
        Packit Service 50c9f2
        	return FALSE;
        Packit Service 50c9f2
            if ( newsize > len )			// init extra space added
        Packit Service 50c9f2
        	memset( (void*)&vec[len], 0, (newsize-len)*sizeof(Item) );
        Packit Service 50c9f2
            len = newsize;
        Packit Service 50c9f2
            return TRUE;
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        bool QGVector::fill( Item d, int flen )		// resize and fill vector
        Packit Service 50c9f2
        {
        Packit Service 50c9f2
            if ( flen < 0 )
        Packit Service 50c9f2
        	flen = len;				// default: use vector length
        Packit Service 50c9f2
            else if ( !resize( flen ) )
        Packit Service 50c9f2
        	return FALSE;
        Packit Service 50c9f2
            for ( uint i=0; i<(uint)flen; i++ )		// insert d at every index
        Packit Service 50c9f2
        	insert( i, d );
        Packit Service 50c9f2
            return TRUE;
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        Packit Service 50c9f2
        static QGVector *sort_vec=0;			// current sort vector
        Packit Service 50c9f2
        Packit Service 50c9f2
        Packit Service 50c9f2
        #if defined(Q_C_CALLBACKS)
        Packit Service 50c9f2
        extern "C" {
        Packit Service 50c9f2
        #endif
        Packit Service 50c9f2
        Packit Service 50c9f2
        static int cmp_vec( const void *n1, const void *n2 )
        Packit Service 50c9f2
        {
        Packit Service 50c9f2
            return sort_vec->compareItems( *((QCollection::Item*)n1), *((QCollection::Item*)n2) );
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        #if defined(Q_C_CALLBACKS)
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        #endif
        Packit Service 50c9f2
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        void QGVector::sort()				// sort vector
        Packit Service 50c9f2
        {
        Packit Service 50c9f2
            if ( count() == 0 )				// no elements
        Packit Service 50c9f2
        	return;
        Packit Service 50c9f2
            register Item *start = &vec[0];
        Packit Service 50c9f2
            register Item *end	= &vec[len-1];
        Packit Service 50c9f2
            Item tmp;
        Packit Service 50c9f2
            while ( TRUE ) {				// put all zero elements behind
        Packit Service 50c9f2
        	while ( start < end && *start != 0 )
        Packit Service 50c9f2
        	    start++;
        Packit Service 50c9f2
        	while ( end > start && *end == 0 )
        Packit Service 50c9f2
        	    end--;
        Packit Service 50c9f2
        	if ( start < end ) {
        Packit Service 50c9f2
        	    tmp = *start;
        Packit Service 50c9f2
        	    *start = *end;
        Packit Service 50c9f2
        	    *end = tmp;
        Packit Service 50c9f2
        	} else {
        Packit Service 50c9f2
        	    break;
        Packit Service 50c9f2
        	}
        Packit Service 50c9f2
            }
        Packit Service 50c9f2
            sort_vec = (QGVector*)this;
        Packit Service 50c9f2
            qsort( vec, count(), sizeof(Item), cmp_vec );
        Packit Service 50c9f2
            sort_vec = 0;
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        int QGVector::bsearch( Item d ) const		// binary search; when sorted
        Packit Service 50c9f2
        {
        Packit Service 50c9f2
            if ( !len )
        Packit Service 50c9f2
        	return -1;
        Packit Service 50c9f2
            if ( !d ) {
        Packit Service 50c9f2
        #if defined(CHECK_NULL)
        Packit Service 50c9f2
        	qWarning( "QGVector::bsearch: Cannot search for null object" );
        Packit Service 50c9f2
        #endif
        Packit Service 50c9f2
        	return -1;
        Packit Service 50c9f2
            }
        Packit Service 50c9f2
            int n1 = 0;
        Packit Service 50c9f2
            int n2 = len - 1;
        Packit Service 50c9f2
            int mid = 0;
        Packit Service 50c9f2
            bool found = FALSE;
        Packit Service 50c9f2
            while ( n1 <= n2 ) {
        Packit Service 50c9f2
        	int  res;
        Packit Service 50c9f2
        	mid = (n1 + n2)/2;
        Packit Service 50c9f2
        	if ( vec[mid] == 0 )			// null item greater
        Packit Service 50c9f2
        	    res = -1;
        Packit Service 50c9f2
        	else
        Packit Service 50c9f2
        	    res = ((QGVector*)this)->compareItems( d, vec[mid] );
        Packit Service 50c9f2
        	if ( res < 0 )
        Packit Service 50c9f2
        	    n2 = mid - 1;
        Packit Service 50c9f2
        	else if ( res > 0 )
        Packit Service 50c9f2
        	    n1 = mid + 1;
        Packit Service 50c9f2
        	else {					// found it
        Packit Service 50c9f2
        	    found = TRUE;
        Packit Service 50c9f2
        	    break;
        Packit Service 50c9f2
        	}
        Packit Service 50c9f2
            }
        Packit Service 50c9f2
            if ( !found )
        Packit Service 50c9f2
        	return -1;
        Packit Service 50c9f2
            // search to first of equal items
        Packit Service 50c9f2
            while ( (mid - 1 >= 0) && !((QGVector*)this)->compareItems(d, vec[mid-1]) )
        Packit Service 50c9f2
        	mid--;
        Packit Service 50c9f2
            return mid;
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        int QGVector::findRef( Item d, uint index) const // find exact item in vector
        Packit Service 50c9f2
        {
        Packit Service 50c9f2
        #if defined(CHECK_RANGE)
        Packit Service 50c9f2
            if ( index >= len ) {			// range error
        Packit Service 50c9f2
        	qWarning( "QGVector::findRef: Index %d out of range", index );
        Packit Service 50c9f2
        	return -1;
        Packit Service 50c9f2
            }
        Packit Service 50c9f2
        #endif
        Packit Service 50c9f2
            for ( uint i=index; i
        Packit Service 50c9f2
        	if ( vec[i] == d )
        Packit Service 50c9f2
        	    return i;
        Packit Service 50c9f2
            }
        Packit Service 50c9f2
            return -1;
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        int QGVector::find( Item d, uint index ) const	// find equal item in vector
        Packit Service 50c9f2
        {
        Packit Service 50c9f2
        #if defined(CHECK_RANGE)
        Packit Service 50c9f2
            if ( index >= len ) {			// range error
        Packit Service 50c9f2
        	qWarning( "QGVector::find: Index %d out of range", index );
        Packit Service 50c9f2
        	return -1;
        Packit Service 50c9f2
            }
        Packit Service 50c9f2
        #endif
        Packit Service 50c9f2
            for ( uint i=index; i
        Packit Service 50c9f2
        	if ( vec[i] == 0 && d == 0 )		// found null item
        Packit Service 50c9f2
        	    return i;
        Packit Service 50c9f2
        	if ( vec[i] && ((QGVector*)this)->compareItems( vec[i], d ) == 0 )
        Packit Service 50c9f2
        	    return i;
        Packit Service 50c9f2
            }
        Packit Service 50c9f2
            return -1;
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        uint QGVector::containsRef( Item d ) const	// get number of exact matches
        Packit Service 50c9f2
        {
        Packit Service 50c9f2
            uint count = 0;
        Packit Service 50c9f2
            for ( uint i=0; i
        Packit Service 50c9f2
        	if ( vec[i] == d )
        Packit Service 50c9f2
        	    count++;
        Packit Service 50c9f2
            }
        Packit Service 50c9f2
            return count;
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        uint QGVector::contains( Item d ) const		// get number of equal matches
        Packit Service 50c9f2
        {
        Packit Service 50c9f2
            uint count = 0;
        Packit Service 50c9f2
            for ( uint i=0; i
        Packit Service 50c9f2
        	if ( vec[i] == 0 && d == 0 )		// count null items
        Packit Service 50c9f2
        	    count++;
        Packit Service 50c9f2
        	if ( vec[i] && ((QGVector*)this)->compareItems( vec[i], d ) == 0 )
        Packit Service 50c9f2
        	    count++;
        Packit Service 50c9f2
            }
        Packit Service 50c9f2
            return count;
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        bool QGVector::insertExpand( uint index, Item d )// insert and grow if necessary
        Packit Service 50c9f2
        {
        Packit Service 50c9f2
            if ( index >= len ) {
        Packit Service 50c9f2
        	if ( !resize( index+1 ) )		// no memory
        Packit Service 50c9f2
        	    return FALSE;
        Packit Service 50c9f2
            }
        Packit Service 50c9f2
            insert( index, d );
        Packit Service 50c9f2
            return TRUE;
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        void QGVector::toList( QGList *list ) const	// store items in list
        Packit Service 50c9f2
        {
        Packit Service 50c9f2
            list->clear();
        Packit Service 50c9f2
            for ( uint i=0; i
        Packit Service 50c9f2
        	if ( vec[i] )
        Packit Service 50c9f2
        	    list->append( vec[i] );
        Packit Service 50c9f2
            }
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        Packit Service 50c9f2
        void QGVector::warningIndexRange( uint i )
        Packit Service 50c9f2
        {
        Packit Service 50c9f2
        #if defined(CHECK_RANGE)
        Packit Service 50c9f2
            qWarning( "QGVector::operator[]: Index %d out of range", i );
        Packit Service 50c9f2
        #else
        Packit Service 50c9f2
            Q_UNUSED( i )
        Packit Service 50c9f2
        #endif
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*****************************************************************************
        Packit Service 50c9f2
          QGVector stream functions
        Packit Service 50c9f2
         *****************************************************************************/
        Packit Service 50c9f2
        #ifndef QT_NO_DATASTREAM
        Packit Service 50c9f2
        QDataStream &operator>>( QDataStream &s, QGVector &vec )
        Packit Service 50c9f2
        {						// read vector
        Packit Service 50c9f2
            return vec.read( s );
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        QDataStream &operator<<( QDataStream &s, const QGVector &vec )
        Packit Service 50c9f2
        {						// write vector
        Packit Service 50c9f2
            return vec.write( s );
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        QDataStream &QGVector::read( QDataStream &s )	// read vector from stream
        Packit Service 50c9f2
        {
        Packit Service 50c9f2
            uint num;
        Packit Service 50c9f2
            s >> num;					// read number of items
        Packit Service 50c9f2
            clear();					// clear vector
        Packit Service 50c9f2
            resize( num );
        Packit Service 50c9f2
            for (uint i=0; i
        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
        	vec[i] = d;
        Packit Service 50c9f2
            }
        Packit Service 50c9f2
            return s;
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        Packit Service 50c9f2
        /*!
        Packit Service 50c9f2
          \internal
        Packit Service 50c9f2
        */
        Packit Service 50c9f2
        Packit Service 50c9f2
        QDataStream &QGVector::write( QDataStream &s ) const
        Packit Service 50c9f2
        {						// write vector to stream
        Packit Service 50c9f2
            uint num = count();
        Packit Service 50c9f2
            s << num;					// number of items to write
        Packit Service 50c9f2
            num = size();
        Packit Service 50c9f2
            for (uint i=0; i
        Packit Service 50c9f2
        	if ( vec[i] )
        Packit Service 50c9f2
        	    write( s, vec[i] );
        Packit Service 50c9f2
            }
        Packit Service 50c9f2
            return s;
        Packit Service 50c9f2
        }
        Packit Service 50c9f2
        #endif // QT_NO_DATASTREAM