// @(#)root/reflex:$Id: Callback.cxx 22729 2008-03-19 10:20:10Z pcanal $
// Author: Stefan Roiser 2004

// Copyright CERN, CH-1211 Geneva 23, 2004-2006, All rights reserved.
//
// Permission to use, copy, modify, and distribute this software for any
// purpose is hereby granted without fee, provided that this copyright and
// permissions notice appear in all copies and derivatives.
//
// This software is provided "as is" without express or implied warranty.

#ifndef REFLEX_BUILD
#define REFLEX_BUILD
#endif

#include "Reflex/Kernel.h"
#include "Reflex/Callback.h"
#include <list>

// typedef std::list<Reflex::ICallback*> CbList;
// On RH7.3 the callback list is destructed before clients Get
// the chance to uninstall their callbacks. So, let's build some
// protection. 
class  CbList : public std::list<Reflex::ICallback*> 
{
public:
   CbList() : fAlive(true) {}
   ~CbList() { fAlive = false; }
   bool IsAlive() { return fAlive; }
private:
   typedef bool Bool_t;
   Bool_t fAlive;
};

//------------------------------------------------------------------------------
static CbList & sClassCallbacks() {
//------------------------------------------------------------------------------
// Wraper for static callback list.
   static CbList m;
   return m;
}

//-------------------------------------------------------------------------------
void Reflex::InstallClassCallback( Reflex::ICallback * cb ) {
//-------------------------------------------------------------------------------
// Install a class callback.
   sClassCallbacks().push_back( cb );
}

//-------------------------------------------------------------------------------
void Reflex::UninstallClassCallback( Reflex::ICallback * cb ) {
//-------------------------------------------------------------------------------
// Uninstall a class callback.
   if( sClassCallbacks().IsAlive() ) {
      sClassCallbacks().remove( cb );
   }
}

//-------------------------------------------------------------------------------
void Reflex::FireClassCallback( const Reflex::Type & ty ) {
//-------------------------------------------------------------------------------
// Activate a class callback.
   for ( CbList::const_iterator i = sClassCallbacks().begin(); 
         i != sClassCallbacks().end(); i++ ) {
      (**i)(ty);
   }
}

//-------------------------------------------------------------------------------
void Reflex::FireFunctionCallback( const Reflex::Member & mem ) {
//-------------------------------------------------------------------------------
// Activate a function callback.
   for ( CbList::const_iterator i = sClassCallbacks().begin(); 
         i != sClassCallbacks().end(); i++ ) {
      (**i)(mem);
   }
}


Last change: Wed Jun 25 08:31:14 2008
Last generated: 2008-06-25 08:31

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.