blob: e2b0ca41a88ffbfaf03bda71275f31274c94b720 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef _VCL_IMPDEL_HXX
#define _VCL_IMPDEL_HXX
#include <list>
namespace vcl
{
class DeletionListener;
class DeletionNotifier
{
std::list< DeletionListener* > m_aListeners;
protected:
DeletionNotifier() {}
~DeletionNotifier()
{ notifyDelete(); }
inline void notifyDelete();
public:
void addDel( DeletionListener* pListener )
{ m_aListeners.push_back( pListener ); }
void removeDel( DeletionListener* pListener )
{ m_aListeners.remove( pListener ); }
};
class DeletionListener
{
DeletionNotifier* m_pNotifier;
public:
DeletionListener( DeletionNotifier* pNotifier )
: m_pNotifier( pNotifier )
{
if( m_pNotifier )
m_pNotifier->addDel( this );
}
~DeletionListener()
{
if( m_pNotifier )
m_pNotifier->removeDel( this );
}
void deleted() { m_pNotifier = NULL; }
bool isDeleted() const { return (m_pNotifier == NULL); }
};
inline void DeletionNotifier::notifyDelete()
{
for( std::list< DeletionListener* >::const_iterator it =
m_aListeners.begin(); it != m_aListeners.end(); ++it )
(*it)->deleted();
m_aListeners.clear();
}
} // namespace vcl
#endif // _VCL_IMPDEL_HXX