📄 qglist.cpp
字号:
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 + -