Improvements to QValueList. This may relate to bug 1820

(cherry picked from commit 71a6d7870f)
v3.5.13-sru
Michele Calgaro 10 years ago committed by Slávek Banko
parent 7e2db04621
commit 3bffdfb381

@ -233,12 +233,6 @@ public:
QValueListPrivate();
QValueListPrivate( const QValueListPrivate<T>& _p );
void derefAndDelete() // ### hack to get around hp-cc brain damage
{
if ( deref() )
delete this;
}
#if defined(Q_TEMPLATEDLL)
// Workaround MS bug in memory de/allocation in DLL vs. EXE
virtual
@ -261,14 +255,14 @@ public:
template <class T>
Q_INLINE_TEMPLATES QValueListPrivate<T>::QValueListPrivate()
{
node = new Node; node->next = node->prev = node; nodes = 0;
node = new Node(); node->next = node->prev = node; nodes = 0;
}
template <class T>
Q_INLINE_TEMPLATES QValueListPrivate<T>::QValueListPrivate( const QValueListPrivate<T>& _p )
: QShared()
{
node = new Node; node->next = node->prev = node; nodes = 0;
node = new Node(); node->next = node->prev = node; nodes = 0;
Iterator b( _p.node->next );
Iterator e( _p.node );
Iterator i( node );
@ -442,15 +436,23 @@ public:
qCopy( l.begin(), l.end(), std::back_inserter( *this ) );
}
#endif
~QValueList() { sh->derefAndDelete(); }
~QValueList()
{
if (sh->deref())
delete sh;
}
QValueList<T>& operator= ( const QValueList<T>& l )
{
if (this == &l || sh == l.sh)
return *this; // Do nothing is self-assigning
l.sh->ref();
sh->derefAndDelete();
if (sh->deref())
delete sh;
sh = l.sh;
return *this;
}
#ifndef QT_NO_STL
QValueList<T>& operator= ( const std::list<T>& l )
{
@ -458,6 +460,7 @@ public:
qCopy( l.begin(), l.end(), std::back_inserter( *this ) );
return *this;
}
bool operator== ( const std::list<T>& l ) const
{
if ( size() != l.size() )
@ -563,7 +566,14 @@ protected:
/**
* Helpers
*/
void detach() { if ( sh->count > 1 ) detachInternal(); }
void detach()
{
if (sh->count > 1)
{
sh->deref();
sh = new QValueListPrivate<T>(*sh);
}
}
/**
* Variables
@ -571,8 +581,6 @@ protected:
QValueListPrivate<T>* sh;
private:
void detachInternal();
friend class QDeepCopy< QValueList<T> >;
};
@ -592,7 +600,7 @@ Q_INLINE_TEMPLATES bool QValueList<T>::operator== ( const QValueList<T>& l ) con
template <class T>
Q_INLINE_TEMPLATES void QValueList<T>::clear()
{
if ( sh->count == 1 ) sh->clear(); else { sh->deref(); sh = new QValueListPrivate<T>; }
if ( sh->count == 1 ) sh->clear(); else { sh->deref(); sh = new QValueListPrivate<T>(); }
}
template <class T>
@ -629,12 +637,6 @@ Q_INLINE_TEMPLATES QValueList<T>& QValueList<T>::operator+= ( const QValueList<T
return *this;
}
template <class T>
Q_INLINE_TEMPLATES void QValueList<T>::detachInternal()
{
sh->deref(); sh = new QValueListPrivate<T>( *sh );
}
#ifndef QT_NO_DATASTREAM
template <class T>
Q_INLINE_TEMPLATES QDataStream& operator>>( QDataStream& s, QValueList<T>& l )

Loading…
Cancel
Save