00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef _edoRepairerDispatcher_h
00029 #define _edoRepairerDispatcher_h
00030
00031 #include <vector>
00032 #include <utility>
00033
00034 #include "edoRepairer.h"
00035
00095 template < typename EOT, typename ICT = std::vector<unsigned int> >
00096 class edoRepairerDispatcher
00097 : public edoRepairer<EOT>,
00098 std::vector<
00099 std::pair< ICT, edoRepairer< EOT >* >
00100 >
00101 {
00102 public:
00103
00105 edoRepairerDispatcher() :
00106 std::vector<
00107 std::pair< std::vector< unsigned int >, edoRepairer< EOT >* >
00108 >()
00109 {}
00110
00112 edoRepairerDispatcher( ICT idx, edoRepairer<EOT>* op ) :
00113 std::vector<
00114 std::pair< std::vector< unsigned int >, edoRepairer< EOT >* >
00115 >()
00116 {
00117 this->add( idx, op );
00118 }
00119
00121 void add( ICT idx, edoRepairer<EOT>* op )
00122 {
00123
00124 #ifndef NDEBUG
00125 eo::log << eo::warnings << "A repairer is added to the dispatcher while having an empty index list, nothing will be repaired" << std::endl;
00126 #endif
00127 assert( op != NULL );
00128
00129 this->push_back( std::make_pair(idx, op) );
00130 }
00131
00133 virtual void operator()( EOT& sol )
00134 {
00135
00136
00137
00138
00139 for( typename edoRepairerDispatcher<EOT>::iterator ipair = this->begin(); ipair != this->end(); ++ipair ) {
00140
00141 assert( ipair->first.size() <= sol.size() );
00142
00143
00144 EOT partsol;
00145
00146
00147
00148
00149
00150 for( std::vector< unsigned int >::iterator j = ipair->first.begin(); j != ipair->first.end(); ++j ) {
00151
00152
00153
00154
00155 partsol.push_back( sol.at(*j) );
00156 }
00157
00158
00159
00160 if( partsol.size() == 0 ) {
00161 continue;
00162 }
00163 assert( partsol.size() > 0 );
00164
00165
00166
00167 (*(ipair->second))( partsol );
00168
00169 {
00170
00171 unsigned int k=0;
00172 for( std::vector< unsigned int >::iterator j = ipair->first.begin(); j != ipair->first.end(); ++j ) {
00173 sol[ *j ] = partsol[ k ];
00174 k++;
00175 }
00176 }
00177 }
00178
00179 sol.invalidate();
00180 }
00181 };
00182
00183 #endif // !_edoRepairerDispatcher_h