Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

CombinatoricScenario.h

00001 /*
00002  * Copyright 2003 Michael A. Marsh, Cornell University. All rights reserved.
00003  * This software is released under the modified BSD license.
00004  * See the file LICENSE in the top-level directory for details.
00005  */
00006 //
00007 // $Id: CombinatoricScenario.h,v 1.3 2004/05/19 15:57:00 mmarsh Exp $
00008 //
00009 // $Log: CombinatoricScenario.h,v $
00010 // Revision 1.3  2004/05/19 15:57:00  mmarsh
00011 // *** empty log message ***
00012 //
00013 // Revision 1.2  2003/11/04 22:23:07  mmarsh
00014 // General code cleanup.
00015 //
00016 //
00017 
00018 #ifndef __CODEX_VSS_COMBINATORICSCENARIO_H__
00019 #define __CODEX_VSS_COMBINATORICSCENARIO_H__
00020 
00021 #include <vector>
00022 
00023 #include "CODEX_Exceptions/ExceptionBase.h"
00024 #include "CODEX_Exceptions/Check.h"
00025 
00026 namespace CODEX_VSS
00027 {
00031    class DynamicCombinatoricScenario
00032    {
00033       public :
00038          DynamicCombinatoricScenario( unsigned int numServ,
00039                                       unsigned int numFaults ) :
00040             m_numServ( numServ ),
00041             m_numFaults( numFaults )
00042          {
00043             for ( unsigned int i = 0 ; i < m_numServ ; ++i )
00044             {
00045                m_masks.push_back( 1 << i );
00046             }
00047             setScenarios(0,0,m_numFaults);
00048          }
00049 
00051          virtual ~DynamicCombinatoricScenario() {}
00052 
00062          bool inScenario( unsigned int host, unsigned int scenario ) const
00063          {
00064             if ( ( host >= m_numServ ) || ( scenario >= m_scenarios.size() ) )
00065             {
00066                throw CODEX_Exceptions::IllegalIndexException( __FILE__ ,
00067                                                               __LINE__ );
00068             }
00069             return ( m_masks[host] & m_scenarios[scenario] );
00070          }
00071 
00072       private :
00074          void setScenarios( unsigned int first,
00075                             unsigned int mask,
00076                             unsigned int t )
00077          {
00078             if ( 0 == t )
00079             {
00080                m_scenarios.push_back(mask);
00081                return;
00082             }
00083             unsigned int current = first;
00084             for( ; current != m_numServ ; ++current )
00085             {
00086                unsigned int newmask = mask | m_masks[current];
00087                setScenarios( current+1, newmask, t-1 );
00088             }
00089          }
00090 
00091          const unsigned int  m_numServ;
00092          const unsigned int  m_numFaults;
00093 
00094          vector< unsigned int >  m_masks;
00095          vector< unsigned int >  m_scenarios;
00096    };
00097 
00105    template< unsigned int NumT , unsigned int FaultT >
00106    class CombinatoricScenario : public DynamicCombinatoricScenario
00107    {
00108       public :
00110          static CombinatoricScenario* instance()
00111          {
00112             if ( 0 == m_instance )
00113             {
00114                m_instance = new CombinatoricScenario;
00115             }
00116             return m_instance;
00117          }
00118 
00120          static void destroy()
00121          {
00122             if ( 0 != m_instance )
00123             {
00124                delete m_instance;
00125                m_instance = 0;
00126             }
00127          }
00128 
00129       private :
00130          static CombinatoricScenario*  m_instance;
00131 
00132          CombinatoricScenario() :
00133             DynamicCombinatoricScenario( NumT , FaultT )
00134          {
00135             // Make sure the parameters are sensible.
00136             CODEX_Exceptions::Check< ( NumT > FaultT ) >();
00137          }
00138 
00139          virtual ~CombinatoricScenario() {}
00140 
00141    };
00142 
00143    template< unsigned int NumT, unsigned int FaultT >
00144    CombinatoricScenario< NumT, FaultT >*
00145    CombinatoricScenario< NumT, FaultT >::m_instance = 0;
00146 
00147 }
00148 
00149 #endif /* __CODEX_VSS_COMBINATORICSCENARIO_H__ */

Generated on Fri May 6 17:38:55 2005 for COrnell Data EXchange (CODEX) by  doxygen 1.4.1