|
|
|
@ -43,6 +43,10 @@
|
|
|
|
|
#include "qdatastream.h"
|
|
|
|
|
#include "qvaluelist.h"
|
|
|
|
|
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
#include "qmutex.h"
|
|
|
|
|
#endif // defined(QT_THREAD_SUPPORT)
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
\class QLNode qglist.h
|
|
|
|
|
\reentrant
|
|
|
|
@ -221,6 +225,9 @@ QDataStream &QGList::write( QDataStream &s, QPtrCollection::Item ) const
|
|
|
|
|
|
|
|
|
|
QGList::QGList()
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex = new QMutex(true);
|
|
|
|
|
#endif
|
|
|
|
|
firstNode = lastNode = curNode = 0; // initialize list
|
|
|
|
|
numNodes = 0;
|
|
|
|
|
curIndex = -1;
|
|
|
|
@ -234,6 +241,9 @@ QGList::QGList()
|
|
|
|
|
QGList::QGList( const QGList & list )
|
|
|
|
|
: QPtrCollection( list )
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex = new QMutex(true);
|
|
|
|
|
#endif
|
|
|
|
|
firstNode = lastNode = curNode = 0; // initialize list
|
|
|
|
|
numNodes = 0;
|
|
|
|
|
curIndex = -1;
|
|
|
|
@ -258,6 +268,9 @@ QGList::~QGList()
|
|
|
|
|
// twice on the same address! This is insane but let's try not to crash
|
|
|
|
|
// here.
|
|
|
|
|
iterators = 0;
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//delete mutex;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -290,11 +303,13 @@ QGList& QGList::operator=( const QGList &list )
|
|
|
|
|
|
|
|
|
|
bool QGList::operator==( const QGList &list ) const
|
|
|
|
|
{
|
|
|
|
|
if ( count() != list.count() )
|
|
|
|
|
if ( count() != list.count() ) {
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( count() == 0 )
|
|
|
|
|
if ( count() == 0 ) {
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QLNode *n1 = firstNode;
|
|
|
|
|
QLNode *n2 = list.firstNode;
|
|
|
|
@ -322,8 +337,15 @@ bool QGList::operator==( const QGList &list ) const
|
|
|
|
|
|
|
|
|
|
QLNode *QGList::locate( uint index )
|
|
|
|
|
{
|
|
|
|
|
if ( index == (uint)curIndex ) // current node ?
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
if ( index == (uint)curIndex ) { // current node ?
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return curNode;
|
|
|
|
|
}
|
|
|
|
|
if ( !curNode && firstNode ) { // set current node
|
|
|
|
|
curNode = firstNode;
|
|
|
|
|
curIndex = 0;
|
|
|
|
@ -332,13 +354,18 @@ QLNode *QGList::locate( uint index )
|
|
|
|
|
int distance = index - curIndex; // node distance to cur node
|
|
|
|
|
bool forward; // direction to traverse
|
|
|
|
|
|
|
|
|
|
if ( index >= numNodes )
|
|
|
|
|
if ( index >= numNodes ) {
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( distance < 0 )
|
|
|
|
|
if ( distance < 0 ) {
|
|
|
|
|
distance = -distance;
|
|
|
|
|
}
|
|
|
|
|
if ( (uint)distance < index && (uint)distance < numNodes - index ) {
|
|
|
|
|
node = curNode; // start from current node
|
|
|
|
|
node = curNode; // start from current node
|
|
|
|
|
forward = index > (uint)curIndex;
|
|
|
|
|
} else if ( index < numNodes - index ) { // start from first node
|
|
|
|
|
node = firstNode;
|
|
|
|
@ -352,13 +379,18 @@ QLNode *QGList::locate( uint index )
|
|
|
|
|
forward = FALSE;
|
|
|
|
|
}
|
|
|
|
|
if ( forward ) { // now run through nodes
|
|
|
|
|
while ( distance-- )
|
|
|
|
|
while ( distance-- ) {
|
|
|
|
|
node = node->next;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
while ( distance-- )
|
|
|
|
|
while ( distance-- ) {
|
|
|
|
|
node = node->prev;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
curIndex = index; // must update index
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return curNode = node;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -369,6 +401,9 @@ QLNode *QGList::locate( uint index )
|
|
|
|
|
|
|
|
|
|
void QGList::inSort( QPtrCollection::Item d )
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
int index = 0;
|
|
|
|
|
register QLNode *n = firstNode;
|
|
|
|
|
while ( n && compareItems(n->data,d) < 0 ){ // find position in list
|
|
|
|
@ -376,6 +411,9 @@ void QGList::inSort( QPtrCollection::Item d )
|
|
|
|
|
index++;
|
|
|
|
|
}
|
|
|
|
|
insertAt( index, d );
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -385,6 +423,9 @@ void QGList::inSort( QPtrCollection::Item d )
|
|
|
|
|
|
|
|
|
|
void QGList::prepend( QPtrCollection::Item d )
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
register QLNode *n = new QLNode( newItem(d) );
|
|
|
|
|
Q_CHECK_PTR( n );
|
|
|
|
|
n->prev = 0;
|
|
|
|
@ -395,6 +436,9 @@ void QGList::prepend( QPtrCollection::Item d )
|
|
|
|
|
firstNode = curNode = n; // curNode affected
|
|
|
|
|
numNodes++;
|
|
|
|
|
curIndex = 0;
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -404,16 +448,24 @@ void QGList::prepend( QPtrCollection::Item d )
|
|
|
|
|
|
|
|
|
|
void QGList::append( QPtrCollection::Item d )
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
register QLNode *n = new QLNode( newItem(d) );
|
|
|
|
|
Q_CHECK_PTR( n );
|
|
|
|
|
n->next = 0;
|
|
|
|
|
if ( (n->prev = lastNode) ) // list is not empty
|
|
|
|
|
if ( (n->prev = lastNode) ) { // list is not empty
|
|
|
|
|
lastNode->next = n;
|
|
|
|
|
else // initialize list
|
|
|
|
|
}
|
|
|
|
|
else { // initialize list
|
|
|
|
|
firstNode = n;
|
|
|
|
|
}
|
|
|
|
|
lastNode = curNode = n; // curNode affected
|
|
|
|
|
curIndex = numNodes;
|
|
|
|
|
numNodes++;
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -423,25 +475,43 @@ void QGList::append( QPtrCollection::Item d )
|
|
|
|
|
|
|
|
|
|
bool QGList::insertAt( uint index, QPtrCollection::Item d )
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
if ( index == 0 ) {
|
|
|
|
|
prepend( d );
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return TRUE;
|
|
|
|
|
} else if ( index == numNodes ) {
|
|
|
|
|
}
|
|
|
|
|
else if ( index == numNodes ) {
|
|
|
|
|
append( d );
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
QLNode *nextNode = locate( index );
|
|
|
|
|
if ( !nextNode )
|
|
|
|
|
if ( !nextNode ) {
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
QLNode *prevNode = nextNode->prev;
|
|
|
|
|
register QLNode *n = new QLNode( newItem(d) );
|
|
|
|
|
Q_CHECK_PTR( n );
|
|
|
|
|
nextNode->prev = n;
|
|
|
|
|
Q_ASSERT( (!((curIndex > 0) && (!prevNode))) );
|
|
|
|
|
prevNode->next = n;
|
|
|
|
|
n->prev = prevNode; // link new node into list
|
|
|
|
|
n->next = nextNode;
|
|
|
|
|
curNode = n; // curIndex set by locate()
|
|
|
|
|
numNodes++;
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -452,18 +522,30 @@ bool QGList::insertAt( uint index, QPtrCollection::Item d )
|
|
|
|
|
|
|
|
|
|
void QGList::relinkNode( QLNode *n )
|
|
|
|
|
{
|
|
|
|
|
if ( n == firstNode ) // already first
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
if ( n == firstNode ) { // already first
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
curNode = n;
|
|
|
|
|
unlink();
|
|
|
|
|
n->prev = 0;
|
|
|
|
|
if ( (n->next = firstNode) ) // list is not empty
|
|
|
|
|
if ( (n->next = firstNode) ) { // list is not empty
|
|
|
|
|
firstNode->prev = n;
|
|
|
|
|
else // initialize list
|
|
|
|
|
}
|
|
|
|
|
else { // initialize list
|
|
|
|
|
lastNode = n;
|
|
|
|
|
}
|
|
|
|
|
firstNode = curNode = n; // curNode affected
|
|
|
|
|
numNodes++;
|
|
|
|
|
curIndex = 0;
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -473,8 +555,15 @@ void QGList::relinkNode( QLNode *n )
|
|
|
|
|
|
|
|
|
|
QLNode *QGList::unlink()
|
|
|
|
|
{
|
|
|
|
|
if ( curNode == 0 ) // null current node
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
if ( curNode == 0 ) { // null current node
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
register QLNode *n = curNode; // unlink this node
|
|
|
|
|
if ( n == firstNode ) { // removing first node ?
|
|
|
|
|
if ( (firstNode = n->next) ) {
|
|
|
|
@ -500,9 +589,13 @@ QLNode *QGList::unlink()
|
|
|
|
|
curIndex--;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ( iterators )
|
|
|
|
|
if ( iterators ) {
|
|
|
|
|
iterators->notifyRemove( n, curNode );
|
|
|
|
|
}
|
|
|
|
|
numNodes--;
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return n;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -513,6 +606,9 @@ QLNode *QGList::unlink()
|
|
|
|
|
|
|
|
|
|
bool QGList::removeNode( QLNode *n )
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
#if defined(QT_CHECK_NULL)
|
|
|
|
|
if ( n == 0 || (n->prev && n->prev->next != n) ||
|
|
|
|
|
(n->next && n->next->prev != n) ) {
|
|
|
|
@ -526,6 +622,9 @@ bool QGList::removeNode( QLNode *n )
|
|
|
|
|
delete n;
|
|
|
|
|
curNode = firstNode;
|
|
|
|
|
curIndex = curNode ? 0 : -1;
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -537,13 +636,27 @@ bool QGList::removeNode( QLNode *n )
|
|
|
|
|
|
|
|
|
|
bool QGList::remove( QPtrCollection::Item d )
|
|
|
|
|
{
|
|
|
|
|
if ( d && find(d) == -1 )
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
if ( d && find(d) == -1 ) {
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
QLNode *n = unlink();
|
|
|
|
|
if ( !n )
|
|
|
|
|
if ( !n ) {
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
deleteItem( n->data );
|
|
|
|
|
delete n;
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -553,13 +666,27 @@ bool QGList::remove( QPtrCollection::Item d )
|
|
|
|
|
|
|
|
|
|
bool QGList::removeRef( QPtrCollection::Item d )
|
|
|
|
|
{
|
|
|
|
|
if ( findRef(d) == -1 )
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
if ( findRef(d) == -1 ) {
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
QLNode *n = unlink();
|
|
|
|
|
if ( !n )
|
|
|
|
|
if ( !n ) {
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
deleteItem( n->data );
|
|
|
|
|
delete n;
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -581,13 +708,27 @@ bool QGList::removeRef( QPtrCollection::Item d )
|
|
|
|
|
|
|
|
|
|
bool QGList::removeAt( uint index )
|
|
|
|
|
{
|
|
|
|
|
if ( !locate(index) )
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
if ( !locate(index) ) {
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
QLNode *n = unlink();
|
|
|
|
|
if ( !n )
|
|
|
|
|
if ( !n ) {
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
deleteItem( n->data );
|
|
|
|
|
delete n;
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -597,13 +738,23 @@ bool QGList::removeAt( uint index )
|
|
|
|
|
*/
|
|
|
|
|
bool QGList::replaceAt( uint index, QPtrCollection::Item d )
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
QLNode *n = locate( index );
|
|
|
|
|
if ( !n )
|
|
|
|
|
if ( !n ) {
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
if ( n->data != d ) {
|
|
|
|
|
deleteItem( n->data );
|
|
|
|
|
n->data = newItem( d );
|
|
|
|
|
}
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -615,10 +766,16 @@ bool QGList::replaceAt( uint index, QPtrCollection::Item d )
|
|
|
|
|
|
|
|
|
|
QPtrCollection::Item QGList::takeNode( QLNode *n )
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
#if defined(QT_CHECK_NULL)
|
|
|
|
|
if ( n == 0 || (n->prev && n->prev->next != n) ||
|
|
|
|
|
(n->next && n->next->prev != n) ) {
|
|
|
|
|
qWarning( "QGList::takeNode: Corrupted node" );
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
@ -628,6 +785,9 @@ QPtrCollection::Item QGList::takeNode( QLNode *n )
|
|
|
|
|
delete n; // delete the node, not data
|
|
|
|
|
curNode = firstNode;
|
|
|
|
|
curIndex = curNode ? 0 : -1;
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return d;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -637,9 +797,15 @@ QPtrCollection::Item QGList::takeNode( QLNode *n )
|
|
|
|
|
|
|
|
|
|
QPtrCollection::Item QGList::take()
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
QLNode *n = unlink(); // unlink node
|
|
|
|
|
Item d = n ? n->data : 0;
|
|
|
|
|
delete n; // delete node, keep contents
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return d;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -649,11 +815,21 @@ QPtrCollection::Item QGList::take()
|
|
|
|
|
|
|
|
|
|
QPtrCollection::Item QGList::takeAt( uint index )
|
|
|
|
|
{
|
|
|
|
|
if ( !locate(index) )
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
if ( !locate(index) ) {
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
QLNode *n = unlink(); // unlink node
|
|
|
|
|
Item d = n ? n->data : 0;
|
|
|
|
|
delete n; // delete node, keep contents
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return d;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -663,10 +839,16 @@ QPtrCollection::Item QGList::takeAt( uint index )
|
|
|
|
|
|
|
|
|
|
QPtrCollection::Item QGList::takeFirst()
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
first();
|
|
|
|
|
QLNode *n = unlink(); // unlink node
|
|
|
|
|
Item d = n ? n->data : 0;
|
|
|
|
|
delete n;
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return d;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -676,10 +858,16 @@ QPtrCollection::Item QGList::takeFirst()
|
|
|
|
|
|
|
|
|
|
QPtrCollection::Item QGList::takeLast()
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
last();
|
|
|
|
|
QLNode *n = unlink(); // unlink node
|
|
|
|
|
Item d = n ? n->data : 0;
|
|
|
|
|
delete n;
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return d;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -690,14 +878,18 @@ QPtrCollection::Item QGList::takeLast()
|
|
|
|
|
|
|
|
|
|
void QGList::clear()
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
register QLNode *n = firstNode;
|
|
|
|
|
|
|
|
|
|
firstNode = lastNode = curNode = 0; // initialize list
|
|
|
|
|
numNodes = 0;
|
|
|
|
|
curIndex = -1;
|
|
|
|
|
|
|
|
|
|
if ( iterators )
|
|
|
|
|
if ( iterators ) {
|
|
|
|
|
iterators->notifyClear( FALSE );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QLNode *prevNode;
|
|
|
|
|
while ( n ) { // for all nodes ...
|
|
|
|
@ -706,6 +898,9 @@ void QGList::clear()
|
|
|
|
|
n = n->next;
|
|
|
|
|
delete prevNode; // deallocate node
|
|
|
|
|
}
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -716,6 +911,9 @@ void QGList::clear()
|
|
|
|
|
|
|
|
|
|
int QGList::findRef( QPtrCollection::Item d, bool fromStart )
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
register QLNode *n;
|
|
|
|
|
int index;
|
|
|
|
|
if ( fromStart ) { // start from first node
|
|
|
|
@ -731,6 +929,9 @@ int QGList::findRef( QPtrCollection::Item d, bool fromStart )
|
|
|
|
|
}
|
|
|
|
|
curNode = n;
|
|
|
|
|
curIndex = n ? index : -1;
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return curIndex; // return position of item
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -742,6 +943,9 @@ int QGList::findRef( QPtrCollection::Item d, bool fromStart )
|
|
|
|
|
|
|
|
|
|
int QGList::find( QPtrCollection::Item d, bool fromStart )
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
register QLNode *n;
|
|
|
|
|
int index;
|
|
|
|
|
if ( fromStart ) { // start from first node
|
|
|
|
@ -757,6 +961,9 @@ int QGList::find( QPtrCollection::Item d, bool fromStart )
|
|
|
|
|
}
|
|
|
|
|
curNode = n;
|
|
|
|
|
curIndex = n ? index : -1;
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return curIndex; // return position of item
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -767,6 +974,9 @@ int QGList::find( QPtrCollection::Item d, bool fromStart )
|
|
|
|
|
|
|
|
|
|
uint QGList::containsRef( QPtrCollection::Item d ) const
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
register QLNode *n = firstNode;
|
|
|
|
|
uint count = 0;
|
|
|
|
|
while ( n ) { // for all nodes...
|
|
|
|
@ -774,6 +984,9 @@ uint QGList::containsRef( QPtrCollection::Item d ) const
|
|
|
|
|
count++;
|
|
|
|
|
n = n->next;
|
|
|
|
|
}
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return count;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -784,6 +997,9 @@ uint QGList::containsRef( QPtrCollection::Item d ) const
|
|
|
|
|
|
|
|
|
|
uint QGList::contains( QPtrCollection::Item d ) const
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
register QLNode *n = firstNode;
|
|
|
|
|
uint count = 0;
|
|
|
|
|
QGList *that = (QGList*)this; // mutable for compareItems()
|
|
|
|
@ -792,6 +1008,9 @@ uint QGList::contains( QPtrCollection::Item d ) const
|
|
|
|
|
count++;
|
|
|
|
|
n = n->next;
|
|
|
|
|
}
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return count;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -839,10 +1058,19 @@ uint QGList::contains( QPtrCollection::Item d ) const
|
|
|
|
|
|
|
|
|
|
QPtrCollection::Item QGList::first()
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
if ( firstNode ) {
|
|
|
|
|
curIndex = 0;
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return (curNode=firstNode)->data;
|
|
|
|
|
}
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -852,10 +1080,19 @@ QPtrCollection::Item QGList::first()
|
|
|
|
|
|
|
|
|
|
QPtrCollection::Item QGList::last()
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
if ( lastNode ) {
|
|
|
|
|
curIndex = numNodes-1;
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return (curNode=lastNode)->data;
|
|
|
|
|
}
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -865,15 +1102,24 @@ QPtrCollection::Item QGList::last()
|
|
|
|
|
|
|
|
|
|
QPtrCollection::Item QGList::next()
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
if ( curNode ) {
|
|
|
|
|
if ( curNode->next ) {
|
|
|
|
|
curIndex++;
|
|
|
|
|
curNode = curNode->next;
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return curNode->data;
|
|
|
|
|
}
|
|
|
|
|
curIndex = -1;
|
|
|
|
|
curNode = 0;
|
|
|
|
|
}
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -883,15 +1129,24 @@ QPtrCollection::Item QGList::next()
|
|
|
|
|
|
|
|
|
|
QPtrCollection::Item QGList::prev()
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
if ( curNode ) {
|
|
|
|
|
if ( curNode->prev ) {
|
|
|
|
|
curIndex--;
|
|
|
|
|
curNode = curNode->prev;
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return curNode->data;
|
|
|
|
|
}
|
|
|
|
|
curIndex = -1;
|
|
|
|
|
curNode = 0;
|
|
|
|
|
}
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -902,9 +1157,16 @@ QPtrCollection::Item QGList::prev()
|
|
|
|
|
|
|
|
|
|
void QGList::toVector( QGVector *vector ) const
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
vector->clear();
|
|
|
|
|
if ( !vector->resize( count() ) )
|
|
|
|
|
if ( !vector->resize( count() ) ) {
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
register QLNode *n = firstNode;
|
|
|
|
|
uint i = 0;
|
|
|
|
|
while ( n ) {
|
|
|
|
@ -912,10 +1174,16 @@ void QGList::toVector( QGVector *vector ) const
|
|
|
|
|
n = n->next;
|
|
|
|
|
i++;
|
|
|
|
|
}
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QGList::heapSortPushDown( QPtrCollection::Item* heap, int first, int last )
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
int r = first;
|
|
|
|
|
while( r <= last/2 ) {
|
|
|
|
|
// Node r has only one child ?
|
|
|
|
@ -950,6 +1218,9 @@ void QGList::heapSortPushDown( QPtrCollection::Item* heap, int first, int last )
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -962,9 +1233,16 @@ void QGList::heapSortPushDown( QPtrCollection::Item* heap, int first, int last )
|
|
|
|
|
|
|
|
|
|
void QGList::sort()
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
uint n = count();
|
|
|
|
|
if ( n < 2 )
|
|
|
|
|
if ( n < 2 ) {
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Create the heap
|
|
|
|
|
QPtrCollection::Item* realheap = new QPtrCollection::Item[ n ];
|
|
|
|
@ -995,6 +1273,9 @@ void QGList::sort()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
delete [] realheap;
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -1019,6 +1300,9 @@ QDataStream &operator<<( QDataStream &s, const QGList &list )
|
|
|
|
|
|
|
|
|
|
QDataStream &QGList::read( QDataStream &s )
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
uint num;
|
|
|
|
|
s >> num; // read number of items
|
|
|
|
|
clear(); // clear list
|
|
|
|
@ -1042,6 +1326,9 @@ QDataStream &QGList::read( QDataStream &s )
|
|
|
|
|
}
|
|
|
|
|
curNode = firstNode;
|
|
|
|
|
curIndex = curNode ? 0 : -1;
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return s;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1051,12 +1338,18 @@ QDataStream &QGList::read( QDataStream &s )
|
|
|
|
|
|
|
|
|
|
QDataStream &QGList::write( QDataStream &s ) const
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
s << count(); // write number of items
|
|
|
|
|
QLNode *n = firstNode;
|
|
|
|
|
while ( n ) { // write all items
|
|
|
|
|
write( s, n->data );
|
|
|
|
|
n = n->next;
|
|
|
|
|
}
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return s;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1068,9 +1361,15 @@ QDataStream &QGList::write( QDataStream &s ) const
|
|
|
|
|
*/
|
|
|
|
|
QLNode* QGList::erase( QLNode* it )
|
|
|
|
|
{
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->lock();
|
|
|
|
|
#endif
|
|
|
|
|
QLNode* n = it;
|
|
|
|
|
it = it->next;
|
|
|
|
|
removeNode( n );
|
|
|
|
|
#if defined(QT_THREAD_SUPPORT)
|
|
|
|
|
//mutex->unlock();
|
|
|
|
|
#endif
|
|
|
|
|
return it;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|