Improvements to TQValueList. This may relate to bug 1820

pull/1/head
Michele Calgaro 10 years ago
parent 0c50fad6c7
commit 6fb1d18ed1

@ -229,12 +229,6 @@ public:
TQValueListPrivate(); TQValueListPrivate();
TQValueListPrivate( const TQValueListPrivate<T>& _p ); TQValueListPrivate( const TQValueListPrivate<T>& _p );
void derefAndDelete() // ### hack to get around hp-cc brain damage
{
if ( deref() )
delete this;
}
#if defined(Q_TEMPLATEDLL) #if defined(Q_TEMPLATEDLL)
// Workaround MS bug in memory de/allocation in DLL vs. EXE // Workaround MS bug in memory de/allocation in DLL vs. EXE
virtual virtual
@ -258,14 +252,14 @@ public:
template <class T> template <class T>
Q_INLINE_TEMPLATES TQValueListPrivate<T>::TQValueListPrivate() Q_INLINE_TEMPLATES TQValueListPrivate<T>::TQValueListPrivate()
{ {
node = new Node; node->next = node->prev = node; nodes = 0; node = new Node(); node->next = node->prev = node; nodes = 0;
} }
template <class T> template <class T>
Q_INLINE_TEMPLATES TQValueListPrivate<T>::TQValueListPrivate( const TQValueListPrivate<T>& _p ) Q_INLINE_TEMPLATES TQValueListPrivate<T>::TQValueListPrivate( const TQValueListPrivate<T>& _p )
: TQShared() : TQShared()
{ {
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 b( _p.node->next );
Iterator e( _p.node ); Iterator e( _p.node );
Iterator i( node ); Iterator i( node );
@ -452,15 +446,23 @@ public:
tqCopy( l.begin(), l.end(), std::back_inserter( *this ) ); tqCopy( l.begin(), l.end(), std::back_inserter( *this ) );
} }
#endif #endif
~TQValueList() { sh->derefAndDelete(); } ~TQValueList()
{
if (sh->deref())
delete sh;
}
TQValueList<T>& operator= ( const TQValueList<T>& l ) TQValueList<T>& operator= ( const TQValueList<T>& l )
{ {
if (this == &l || sh == l.sh)
return *this; // Do nothing is self-assigning
l.sh->ref(); l.sh->ref();
sh->derefAndDelete(); if (sh->deref())
delete sh;
sh = l.sh; sh = l.sh;
return *this; return *this;
} }
#ifndef QT_NO_STL #ifndef QT_NO_STL
TQValueList<T>& operator= ( const std::list<T>& l ) TQValueList<T>& operator= ( const std::list<T>& l )
{ {
@ -468,6 +470,7 @@ public:
tqCopy( l.begin(), l.end(), std::back_inserter( *this ) ); tqCopy( l.begin(), l.end(), std::back_inserter( *this ) );
return *this; return *this;
} }
bool operator== ( const std::list<T>& l ) const bool operator== ( const std::list<T>& l ) const
{ {
if ( size() != l.size() ) if ( size() != l.size() )
@ -574,7 +577,14 @@ protected:
/** /**
* Helpers * Helpers
*/ */
void detach() { if ( sh->count > 1 ) detachInternal(); } void detach()
{
if (sh->count > 1)
{
sh->deref();
sh = new TQValueListPrivate<T>(*sh);
}
}
/** /**
* Variables * Variables
@ -582,8 +592,6 @@ protected:
TQValueListPrivate<T>* sh; TQValueListPrivate<T>* sh;
private: private:
void detachInternal();
friend class TQDeepCopy< TQValueList<T> >; friend class TQDeepCopy< TQValueList<T> >;
}; };
@ -603,7 +611,7 @@ Q_INLINE_TEMPLATES bool TQValueList<T>::operator== ( const TQValueList<T>& l ) c
template <class T> template <class T>
Q_INLINE_TEMPLATES void TQValueList<T>::clear() Q_INLINE_TEMPLATES void TQValueList<T>::clear()
{ {
if ( sh->count == 1 ) sh->clear(); else { sh->deref(); sh = new TQValueListPrivate<T>; } if ( sh->count == 1 ) sh->clear(); else { sh->deref(); sh = new TQValueListPrivate<T>(); }
} }
template <class T> template <class T>
@ -640,12 +648,6 @@ Q_INLINE_TEMPLATES TQValueList<T>& TQValueList<T>::operator+= ( const TQValueLis
return *this; return *this;
} }
template <class T>
Q_INLINE_TEMPLATES void TQValueList<T>::detachInternal()
{
sh->deref(); sh = new TQValueListPrivate<T>( *sh );
}
#ifndef QT_NO_DATASTREAM #ifndef QT_NO_DATASTREAM
template <class T> template <class T>
Q_INLINE_TEMPLATES TQDataStream& operator>>( TQDataStream& s, TQValueList<T>& l ) Q_INLINE_TEMPLATES TQDataStream& operator>>( TQDataStream& s, TQValueList<T>& l )

Loading…
Cancel
Save