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

📄 qglist.cpp

📁 doxygen(一个自动从源代码生成文档的工具)的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    Item d = n ? n->data : 0;    delete n;					// delete node, keep contents    return d;}/*!  \internal  Takes the first item out of the list.*/QCollection::Item QGList::takeFirst(){    first();    QLNode *n = unlink();			// unlink node    Item d = n ? n->data : 0;    delete n;    return d;}/*!  \internal  Takes the last item out of the list.*/QCollection::Item QGList::takeLast(){    last();    QLNode *n = unlink();			// unlink node    Item d = n ? n->data : 0;    delete n;    return d;}/*!  \internal  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->count() ) {	QGListIterator *i = (QGListIterator*)iterators->first();	while ( i ) {				// notify all iterators that	    i->curNode = 0;			// this list is empty	    i = (QGListIterator*)iterators->next();	}    }    QLNode *prevNode;    while ( n ) {				// for all nodes ...	deleteItem( n->data );			// deallocate data	prevNode = n;	n = n->next;	delete prevNode;			// deallocate node    }}/*!  \internal  Finds an item in the list.*/int QGList::findRef( QCollection::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}/*!  \internal  Finds an item in the list.  Uses compareItems().*/int QGList::find( QCollection::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}/*!  \internal  Counts the number an item occurs in the list.*/uint QGList::containsRef( QCollection::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;}/*!  \internal  Counts the number an item occurs in the list.	 Uses compareItems().*/uint QGList::contains( QCollection::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;}/*!  \fn QCollection::Item QGList::at( uint index )  \internal  Sets the item at position \e index to the current item.*//*!  \fn int QGList::at() const  \internal  Returns the current index.*//*!  \fn QLNode *QGList::currentNode() const  \internal  Returns the current node.*//*!  \fn QCollection::Item QGList::get() const  \internal  Returns the current item.*//*!  \fn QCollection::Item QGList::cfirst() const  \internal  Returns the first item in the list.*//*!  \fn QCollection::Item QGList::clast() const  \internal  Returns the last item in the list.*//*!  \internal  Returns the first list item.	Sets this to current.*/QCollection::Item QGList::first(){    if ( firstNode ) {	curIndex = 0;	return (curNode=firstNode)->data;    }    return 0;}/*!  \internal  Returns the last list item.  Sets this to current.*/QCollection::Item QGList::last(){    if ( lastNode ) {	curIndex = numNodes-1;	return (curNode=lastNode)->data;    }    return 0;}/*!  \internal  Returns the next list item (after current).  Sets this to current.*/QCollection::Item QGList::next(){    if ( curNode ) {	if ( curNode->next ) {	    curIndex++;	    curNode = curNode->next;	    return curNode->data;	}	curIndex = -1;	curNode = 0;    }    return 0;}/*!  \internal  Returns the previous list item (before current).  Sets this to current.*/QCollection::Item QGList::prev(){    if ( curNode ) {	if ( curNode->prev ) {	    curIndex--;	    curNode = curNode->prev;	    return curNode->data;	}	curIndex = -1;	curNode = 0;    }    return 0;}/*!  \internal  Converts the list to 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( QCollection::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 ) {		QCollection::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		QCollection::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		QCollection::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    QCollection::Item* realheap = new QCollection::Item[ n ];    // Wow, what a fake. But I want the heap to be indexed as 1...n    QCollection::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 ) {	    QCollection::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 );}/*!  \internal  Reads a list from the stream \e 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 );	CHECK_PTR( d );	if ( !d )				// no memory	    break;	QLNode *n = new QLNode( d );	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;}/*!  \internal  Writes the list to the stream \e 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/*****************************************************************************  QGListIterator member functions *****************************************************************************//*!  \class QGListIterator qglist.h  \brief The QGListIterator class is an internal class for implementing QListIterator.  QGListIterator is a strictly internal class that does the heavy work for  QListIterator.*//*!  \internal  Constructs an iterator that operates on the list \e 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 QGList;		// create iterator list	CHECK_PTR( list->iterators );    }    list->iterators->append( this );		// attach iterator to list}/*!  \internal  Constructs a copy of the iterator \e it.*/QGListIterator::QGListIterator( const QGListIterator &it ){    list = it.list;    curNode = it.curNode;    if ( list )	list->iterators->append( this );	// attach iterator to list}/*!  \internal  Assigns a copy of the iterator \e it and returns a reference to this  iterator.*/QGListIterator &QGListIterator::operator=( const QGListIterator &it ){    if ( list )					// detach from old list	list->iterators->removeRef( this );    list = it.list;    curNode = it.curNode;    if ( list )	list->iterators->append( this );	// attach to new list    return *this;}/*!  \internal  Destroys the iterator.*/QGListIterator::~QGListIterator(){    if ( list )					// detach iterator from list	list->iterators->removeRef(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.*/QCollection::Item QGListIterator::toFirst(){    if ( !list ) {#if defined(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.*/QCollection::Item QGListIterator::toLast(){    if ( !list ) {#if defined(CHECK_NULL)	qWarning( "QGListIterator::toLast: List has been deleted" );#endif	return 0;    }    return list->lastNode ? (curNode = list->lastNode)->getData() : 0;}/*!  \fn QCollection::Item QGListIterator::get() const  \internal  Returns the iterator item.*//*!  \internal  Moves to the next item (postfix).*/QCollection::Item QGListIterator::operator()(){    if ( !curNode )	return 0;    QCollection::Item d = curNode->getData();    curNode = curNode->next;    return  d;}/*!  \internal  Moves to the next item (prefix).*/QCollection::Item QGListIterator::operator++(){    if ( !curNode )	return 0;    curNode = curNode->next;    return curNode ? curNode->getData() : 0;}/*!  \internal  Moves \e jumps positions forward.*/QCollection::Item QGListIterator::operator+=( uint jumps ){    while ( curNode && jumps-- )	curNode = curNode->next;    return curNode ? curNode->getData() : 0;}/*!  \internal  Moves to the previous item (prefix).*/QCollection::Item QGListIterator::operator--(){    if ( !curNode )	return 0;    curNode = curNode->prev;    return curNode ? curNode->getData() : 0;}/*!  \internal  Moves \e jumps positions backward.*/QCollection::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 + -