⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qglist.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
QPtrCollection::Item QGList::take(){    QLNode *n = unlink();			// unlink node    Item d = n ? n->data : 0;    delete n;					// delete node, keep contents    return d;}/*!  Takes the item at position \a index out of the list.*/QPtrCollection::Item QGList::takeAt( uint index ){    if ( !locate(index) )	return 0;    QLNode *n = unlink();			// unlink node    Item d = n ? n->data : 0;    delete n;					// delete node, keep contents    return d;}/*!  Takes the first item out of the list.*/QPtrCollection::Item QGList::takeFirst(){    first();    QLNode *n = unlink();			// unlink node    Item d = n ? n->data : 0;    delete n;    return d;}/*!  Takes the last item out of the list.*/QPtrCollection::Item QGList::takeLast(){    last();    QLNode *n = unlink();			// unlink node    Item d = n ? n->data : 0;    delete n;    return d;}/*!  Removes all items from the list.*/void QGList::clear(){    register QLNode *n = firstNode;    firstNode = lastNode = curNode = 0;		// initialize list    numNodes = 0;    curIndex = -1;    if ( iterators )	iterators->notifyClear( FALSE );    QLNode *prevNode;    while ( n ) {				// for all nodes ...	deleteItem( n->data );			// deallocate data	prevNode = n;	n = n->next;	delete prevNode;			// deallocate node    }}/*!  Finds item \a d in the list. If \a fromStart is TRUE the search  begins at the first node; otherwise it begins at the current node.*/int QGList::findRef( QPtrCollection::Item d, bool fromStart ){    register QLNode *n;    int	     index;    if ( fromStart ) {				// start from first node	n = firstNode;	index = 0;    } else {					// start from current node	n = curNode;	index = curIndex;    }    while ( n && n->data != d ) {		// find exact match	n = n->next;	index++;    }    curNode = n;    curIndex = n ? index : -1;    return curIndex;				// return position of item}/*!  Finds item \a d in the list using compareItems(). If \a fromStart is  TRUE the search begins at the first node; otherwise it begins at the  current node.*/int QGList::find( QPtrCollection::Item d, bool fromStart ){    register QLNode *n;    int	     index;    if ( fromStart ) {				// start from first node	n = firstNode;	index = 0;    } else {					// start from current node	n = curNode;	index = curIndex;    }    while ( n && compareItems(n->data,d) ){	// find equal match	n = n->next;	index++;    }    curNode = n;    curIndex = n ? index : -1;    return curIndex;				// return position of item}/*!  Counts the number item \a d occurs in the list.*/uint QGList::containsRef( QPtrCollection::Item d ) const{    register QLNode *n = firstNode;    uint     count = 0;    while ( n ) {				// for all nodes...	if ( n->data == d )			// count # exact matches	    count++;	n = n->next;    }    return count;}/*!  Counts the number of times item \a d occurs in the list. Uses  compareItems().*/uint QGList::contains( QPtrCollection::Item d ) const{    register QLNode *n = firstNode;    uint     count = 0;    QGList  *that = (QGList*)this;		// mutable for compareItems()    while ( n ) {				// for all nodes...	if ( !that->compareItems(n->data,d) )	// count # equal matches	    count++;	n = n->next;    }    return count;}/*!  \overload QPtrCollection::Item QGList::at( uint index )  Sets the item at position \a index to the current item.*//*!  \fn int QGList::at() const  Returns the current index.*//*!  \fn QLNode *QGList::currentNode() const  Returns the current node.*//*!  \fn QPtrCollection::Item QGList::get() const  Returns the current item.*//*!  \fn QPtrCollection::Item QGList::cfirst() const  Returns the first item in the list.*//*!  \fn QPtrCollection::Item QGList::clast() const  Returns the last item in the list.*//*!  Returns the first list item.	Sets this to current.*/QPtrCollection::Item QGList::first(){    if ( firstNode ) {	curIndex = 0;	return (curNode=firstNode)->data;    }    return 0;}/*!  Returns the last list item.  Sets this to current.*/QPtrCollection::Item QGList::last(){    if ( lastNode ) {	curIndex = numNodes-1;	return (curNode=lastNode)->data;    }    return 0;}/*!  Returns the next list item (after current).  Sets this to current.*/QPtrCollection::Item QGList::next(){    if ( curNode ) {	if ( curNode->next ) {	    curIndex++;	    curNode = curNode->next;	    return curNode->data;	}	curIndex = -1;	curNode = 0;    }    return 0;}/*!  Returns the previous list item (before current).  Sets this to current.*/QPtrCollection::Item QGList::prev(){    if ( curNode ) {	if ( curNode->prev ) {	    curIndex--;	    curNode = curNode->prev;	    return curNode->data;	}	curIndex = -1;	curNode = 0;    }    return 0;}/*!  Converts the list to a vector, \a vector.*/void QGList::toVector( QGVector *vector ) const{    vector->clear();    if ( !vector->resize( count() ) )	return;    register QLNode *n = firstNode;    uint i = 0;    while ( n ) {	vector->insert( i, n->data );	n = n->next;	i++;    }}void QGList::heapSortPushDown( QPtrCollection::Item* heap, int first, int last ){    int r = first;    while( r <= last/2 ) {	// Node r has only one child ?	if ( last == 2*r ) {	    // Need for swapping ?	    if ( compareItems( heap[r], heap[ 2*r ] ) > 0 ) {		QPtrCollection::Item tmp = heap[r];		heap[ r ] = heap[ 2*r ];		heap[ 2*r ] = tmp;	    }	    // That's it ...	    r = last;	} else {	    // Node has two children	    if ( compareItems( heap[r], heap[ 2*r ] ) > 0 &&		 compareItems( heap[ 2*r ], heap[ 2*r+1 ] ) <= 0 ) {		// Swap with left child		QPtrCollection::Item tmp = heap[r];		heap[ r ] = heap[ 2*r ];		heap[ 2*r ] = tmp;		r *= 2;	    } else if ( compareItems( heap[r], heap[ 2*r+1 ] ) > 0 &&			compareItems( heap[ 2*r+1 ], heap[ 2*r ] ) < 0 ) {		// Swap with right child		QPtrCollection::Item tmp = heap[r];		heap[ r ] = heap[ 2*r+1 ];		heap[ 2*r+1 ] = tmp;		r = 2*r+1;	    } else {		// We are done		r = last;	    }	}    }}/*! Sorts the list by the result of the virtual compareItems() function.  The Heap-Sort algorithm is used for sorting.  It sorts n items with  O(n*log n) compares.  This is the asymptotic optimal solution of the  sorting problem.*/void QGList::sort(){    uint n = count();    if ( n < 2 )	return;    // Create the heap    QPtrCollection::Item* realheap = new QPtrCollection::Item[ n ];    // Wow, what a fake. But I want the heap to be indexed as 1...n    QPtrCollection::Item* heap = realheap - 1;    int size = 0;    QLNode* insert = firstNode;    for( ; insert != 0; insert = insert->next ) {	heap[++size] = insert->data;	int i = size;	while( i > 1 && compareItems( heap[i], heap[ i / 2 ] ) < 0 ) {	    QPtrCollection::Item tmp = heap[ i ];	    heap[ i ] = heap[ i/2 ];	    heap[ i/2 ] = tmp;	    i /= 2;	}    }    insert = firstNode;    // Now do the sorting    for ( int i = n; i > 0; i-- ) {	insert->data = heap[1];	insert = insert->next;	if ( i > 1 ) {	    heap[1] = heap[i];	    heapSortPushDown( heap, 1, i - 1 );	}    }    delete [] realheap;}/*****************************************************************************  QGList stream functions *****************************************************************************/#ifndef QT_NO_DATASTREAMQDataStream &operator>>( QDataStream &s, QGList &list ){						// read list    return list.read( s );}QDataStream &operator<<( QDataStream &s, const QGList &list ){						// write list    return list.write( s );}/*!  Reads a list from the stream \a s.*/QDataStream &QGList::read( QDataStream &s ){    uint num;    s >> num;					// read number of items    clear();					// clear list    while ( num-- ) {				// read all items	Item d;	read( s, d );	Q_CHECK_PTR( d );	if ( !d )				// no memory	    break;	QLNode *n = new QLNode( d );	Q_CHECK_PTR( n );	if ( !n )				// no memory	    break;	n->next = 0;	if ( (n->prev = lastNode) )		// list is not empty	    lastNode->next = n;	else					// initialize list	    firstNode = n;	lastNode = n;	numNodes++;    }    curNode  = firstNode;    curIndex = curNode ? 0 : -1;    return s;}/*!  Writes the list to the stream \a s.*/QDataStream &QGList::write( QDataStream &s ) const{    s << count();				// write number of items    QLNode *n = firstNode;    while ( n ) {				// write all items	write( s, n->data );	n = n->next;    }    return s;}#endif // QT_NO_DATASTREAM/*! \internal */QLNode* QGList::erase( QLNode* it ){    QLNode* n = it;    it = it->next;    removeNode( n );    return it;}/*****************************************************************************  QGListIterator member functions *****************************************************************************//*!  \class QGListIterator qglist.h  \reentrant  \ingroup collection  \brief The QGListIterator class is an internal class for implementing QPtrListIterator.  \internal  QGListIterator is a strictly internal class that does the heavy work for  QPtrListIterator.*//*!  \internal  Constructs an iterator that operates on the list \a l.*/QGListIterator::QGListIterator( const QGList &l ){    list = (QGList *)&l;			// get reference to list    curNode = list->firstNode;			// set to first node    if ( !list->iterators ) {	list->iterators = new QGListIteratorList;		// create iterator list	Q_CHECK_PTR( list->iterators );    }    list->iterators->add( this );		// attach iterator to list}/*!  \internal  Constructs a copy of the iterator \a it.*/QGListIterator::QGListIterator( const QGListIterator &it ){    list = it.list;    curNode = it.curNode;    if ( list )	list->iterators->add( this );	// attach iterator to list}/*!  \internal  Assigns a copy of the iterator \a it and returns a reference to this  iterator.*/QGListIterator &QGListIterator::operator=( const QGListIterator &it ){    if ( list )					// detach from old list	list->iterators->remove( this );    list = it.list;    curNode = it.curNode;    if ( list )	list->iterators->add( this );	// attach to new list    return *this;}/*!  \internal  Destroys the iterator.*/QGListIterator::~QGListIterator(){    if ( list )					// detach iterator from list	list->iterators->remove(this);}/*!  \fn bool QGListIterator::atFirst() const  \internal  Returns TRUE if the iterator points to the first item, otherwise FALSE.*//*!  \fn bool QGListIterator::atLast() const  \internal  Returns TRUE if the iterator points to the last item, otherwise FALSE.*//*!  \internal  Sets the list iterator to point to the first item in the list.*/QPtrCollection::Item QGListIterator::toFirst(){    if ( !list ) {#if defined(QT_CHECK_NULL)	qWarning( "QGListIterator::toFirst: List has been deleted" );#endif	return 0;    }    return list->firstNode ? (curNode = list->firstNode)->getData() : 0;}/*!  \internal  Sets the list iterator to point to the last item in the list.*/QPtrCollection::Item QGListIterator::toLast(){    if ( !list ) {#if defined(QT_CHECK_NULL)	qWarning( "QGListIterator::toLast: List has been deleted" );#endif	return 0;    }    return list->lastNode ? (curNode = list->lastNode)->getData() : 0;}/*!  \fn QPtrCollection::Item QGListIterator::get() const  \internal  Returns the iterator item.*//*!  \internal  Moves to the next item (postfix).*/QPtrCollection::Item QGListIterator::operator()(){    if ( !curNode )	return 0;    QPtrCollection::Item d = curNode->getData();    curNode = curNode->next;    return  d;}/*!  \internal  Moves to the next item (prefix).*/QPtrCollection::Item QGListIterator::operator++(){    if ( !curNode )	return 0;    curNode = curNode->next;    return curNode ? curNode->getData() : 0;}/*!  \internal  Moves \a jumps positions forward.*/QPtrCollection::Item QGListIterator::operator+=( uint jumps ){    while ( curNode && jumps-- )	curNode = curNode->next;    return curNode ? curNode->getData() : 0;}/*!  \internal  Moves to the previous item (prefix).*/QPtrCollection::Item QGListIterator::operator--(){    if ( !curNode )	return 0;    curNode = curNode->prev;    return curNode ? curNode->getData() : 0;}/*!  \internal  Moves \a jumps positions backward.*/QPtrCollection::Item QGListIterator::operator-=( uint jumps ){    while ( curNode && jumps-- )	curNode = curNode->prev;    return curNode ? curNode->getData() : 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -