Blame src/cppunit/ProtectorChain.cpp

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