/*

Copyright (C) 2010 Timothy Pearson <kb9vqf@pearsoncomputing.net>

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Library General Public License for more details.

You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB.  If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.

*/

#ifndef TQCLEANUPHANDLER_H
#define TQCLEANUPHANDLER_H

#include <tqt.h>

#ifdef USE_QT3

// Reimplement the QCleanupHandler class
// For Qt3, no changes are needed

#include <qcleanuphandler.h>

#endif // USE_QT3

#ifdef USE_QT4

// Reimplement the QCleanupHandler class
// For Qt4, some changes are needed

//#include <Qt/qcleanuphandler.h>

#include "tqptrlist.h"

template<class Type>
class TQCleanupHandler
{
public:
    TQCleanupHandler() : cleanupObjects( 0 ) {}
    ~TQCleanupHandler() { clear(); }

    Type* add( Type **object ) {
	if ( !cleanupObjects )
	    cleanupObjects = new Q3PtrList<Type*>;
	cleanupObjects->insert( 0, object );
	return *object;
    }

    void remove( Type **object ) {
	if ( !cleanupObjects )
	    return;
	if ( cleanupObjects->findRef( object ) >= 0 )
	    (void) cleanupObjects->take();
    }

    bool isEmpty() const {
	return cleanupObjects ? cleanupObjects->isEmpty() : TRUE;
    }

    void clear() {
	if ( !cleanupObjects )
	    return;
	Q3PtrListIterator<Type*> it( *cleanupObjects );
	Type **object;
	while ( ( object = it.current() ) ) {
	    delete *object;
	    *object = 0;
	    cleanupObjects->remove( object );
	}
	delete cleanupObjects;
	cleanupObjects = 0;
    }

private:
    Q3PtrList<Type*> *cleanupObjects;
};

template<class Type>
class TQSingleCleanupHandler
{
public:
    TQSingleCleanupHandler() : object( 0 ) {}
    ~TQSingleCleanupHandler() {
	if ( object ) {
	    delete *object;
	    *object = 0;
	}
    }
    Type* set( Type **o ) {
	object = o;
	return *object;
    }
    void reset() { object = 0; }
private:
    Type **object;
};

template<class Type>
class TQSharedCleanupHandler
{
public:
    TQSharedCleanupHandler() : object( 0 ) {}
    ~TQSharedCleanupHandler() {
	if ( object ) {
	    if ( (*object)->deref() )
		delete *object;
	    *object = 0;
	}
    }
    Type* set( Type **o ) {
	object = o;
	return *object;
    }
    void reset() { object = 0; }
private:
    Type **object;
};

#endif // USE_QT4

#endif /* TQCLEANUPHANDLER_H */