Blame src/cppunit/ProtectorChain.cpp

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