|
Packit |
8c9aa0 |
#include "ProtectorChain.h"
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
CPPUNIT_NS_BEGIN
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
class ProtectorChain::ProtectFunctor : public Functor
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
public:
|
|
Packit |
8c9aa0 |
ProtectFunctor( Protector *protector,
|
|
Packit |
8c9aa0 |
const Functor &functor,
|
|
Packit |
8c9aa0 |
const ProtectorContext &context )
|
|
Packit |
8c9aa0 |
: m_protector( protector )
|
|
Packit |
8c9aa0 |
, m_functor( functor )
|
|
Packit |
8c9aa0 |
, m_context( context )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
bool operator()() const
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
return m_protector->protect( m_functor, m_context );
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
private:
|
|
Packit |
8c9aa0 |
// disable copying
|
|
Packit |
8c9aa0 |
ProtectFunctor( const ProtectFunctor& );
|
|
Packit |
8c9aa0 |
// disable copying
|
|
Packit |
8c9aa0 |
ProtectFunctor& operator=( const ProtectFunctor& );
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
Protector *m_protector;
|
|
Packit |
8c9aa0 |
const Functor &m_functor;
|
|
Packit |
8c9aa0 |
const ProtectorContext &m_context;
|
|
Packit |
8c9aa0 |
};
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
ProtectorChain::ProtectorChain()
|
|
Packit |
8c9aa0 |
: m_protectors(0)
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
ProtectorChain::~ProtectorChain()
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
while ( count() > 0 )
|
|
Packit |
8c9aa0 |
pop();
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
void
|
|
Packit |
8c9aa0 |
ProtectorChain::push( Protector *protector )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
m_protectors.push_back( protector );
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
void
|
|
Packit |
8c9aa0 |
ProtectorChain::pop()
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
delete m_protectors.back();
|
|
Packit |
8c9aa0 |
m_protectors.pop_back();
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
int
|
|
Packit |
8c9aa0 |
ProtectorChain::count() const
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
return m_protectors.size();
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
bool
|
|
Packit |
8c9aa0 |
ProtectorChain::protect( const Functor &functor,
|
|
Packit |
8c9aa0 |
const ProtectorContext &context )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
if ( m_protectors.empty() )
|
|
Packit |
8c9aa0 |
return functor();
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
Functors functors;
|
|
Packit |
8c9aa0 |
for ( int index = m_protectors.size()-1; index >= 0; --index )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
const Functor &protectedFunctor =
|
|
Packit |
8c9aa0 |
functors.empty() ? functor : *functors.back();
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
functors.push_back( new ProtectFunctor( m_protectors[index],
|
|
Packit |
8c9aa0 |
protectedFunctor,
|
|
Packit |
8c9aa0 |
context ) );
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
const Functor &outermostFunctor = *functors.back();
|
|
Packit |
8c9aa0 |
bool succeed = outermostFunctor();
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
for ( unsigned int deletingIndex = 0; deletingIndex < m_protectors.size(); ++deletingIndex )
|
|
Packit |
8c9aa0 |
delete functors[deletingIndex];
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
return succeed;
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
CPPUNIT_NS_END
|