git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@70 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
87 lines
1.6 KiB
C++
87 lines
1.6 KiB
C++
#include "ProtectorChain.h"
|
|
|
|
CPPUNIT_NS_BEGIN
|
|
|
|
|
|
class ProtectorChain::ProtectFunctor : public Functor
|
|
{
|
|
public:
|
|
ProtectFunctor( Protector *protector,
|
|
const Functor &functor,
|
|
const ProtectorContext &context )
|
|
: m_protector( protector )
|
|
, m_functor( functor )
|
|
, m_context( context )
|
|
{
|
|
}
|
|
|
|
bool operator()() const
|
|
{
|
|
return m_protector->protect( m_functor, m_context );
|
|
}
|
|
|
|
private:
|
|
Protector *m_protector;
|
|
const Functor &m_functor;
|
|
const ProtectorContext &m_context;
|
|
};
|
|
|
|
|
|
ProtectorChain::~ProtectorChain()
|
|
{
|
|
while ( count() > 0 )
|
|
pop();
|
|
}
|
|
|
|
|
|
void
|
|
ProtectorChain::push( Protector *protector )
|
|
{
|
|
m_protectors.push_back( protector );
|
|
}
|
|
|
|
|
|
void
|
|
ProtectorChain::pop()
|
|
{
|
|
delete m_protectors.back();
|
|
m_protectors.pop_back();
|
|
}
|
|
|
|
int
|
|
ProtectorChain::count() const
|
|
{
|
|
return m_protectors.size();
|
|
}
|
|
|
|
|
|
bool
|
|
ProtectorChain::protect( const Functor &functor,
|
|
const ProtectorContext &context )
|
|
{
|
|
if ( m_protectors.empty() )
|
|
return functor();
|
|
|
|
Functors functors;
|
|
for ( int index = m_protectors.size()-1; index >= 0; --index )
|
|
{
|
|
const Functor &protectedFunctor =
|
|
functors.empty() ? functor : *functors.back();
|
|
|
|
functors.push_back( new ProtectFunctor( m_protectors[index],
|
|
protectedFunctor,
|
|
context ) );
|
|
}
|
|
|
|
const Functor &outermostFunctor = *functors.back();
|
|
bool succeed = outermostFunctor();
|
|
|
|
for ( unsigned int deletingIndex = 0; deletingIndex < m_protectors.size(); ++deletingIndex )
|
|
delete functors[deletingIndex];
|
|
|
|
return succeed;
|
|
}
|
|
|
|
|
|
CPPUNIT_NS_END
|