00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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
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