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 #ifndef _eoCheckPoint_h
00028 #define _eoCheckPoint_h
00029
00030 #include <eoContinue.h>
00031 #include <utils/eoUpdater.h>
00032 #include <utils/eoMonitor.h>
00033 #include <utils/eoStat.h>
00034
00035
00046 template <class EOT>
00047 class eoCheckPoint : public eoContinue<EOT>
00048 {
00049 public :
00050
00051 eoCheckPoint(eoContinue<EOT>& _cont)
00052 {
00053 continuators.push_back(&_cont);
00054 }
00055
00056 bool operator()(const eoPop<EOT>& _pop);
00057
00058 void add(eoContinue<EOT>& _cont) { continuators.push_back(&_cont); }
00059 void add(eoSortedStatBase<EOT>& _stat) { sorted.push_back(&_stat); }
00060 void add(eoStatBase<EOT>& _stat) { stats.push_back(&_stat); }
00061 void add(eoMonitor& _mon) { monitors.push_back(&_mon); }
00062 void add(eoUpdater& _upd) { updaters.push_back(&_upd); }
00063
00064 virtual std::string className(void) const { return "eoCheckPoint"; }
00065 std::string allClassNames() const ;
00066
00067 private :
00068
00069 std::vector<eoContinue<EOT>*> continuators;
00070 std::vector<eoSortedStatBase<EOT>*> sorted;
00071 std::vector<eoStatBase<EOT>*> stats;
00072 std::vector<eoMonitor*> monitors;
00073 std::vector<eoUpdater*> updaters;
00074 };
00075
00076 template <class EOT>
00077 bool eoCheckPoint<EOT>::operator()(const eoPop<EOT>& _pop)
00078 {
00079 unsigned i;
00080
00081 std::vector<const EOT*> sorted_pop;
00082 if (!sorted.empty())
00083 {
00084 _pop.sort(sorted_pop);
00085
00086 for (i = 0; i < sorted.size(); ++i)
00087 {
00088 (*sorted[i])(sorted_pop);
00089 }
00090 }
00091
00092 for (i = 0; i < stats.size(); ++i)
00093 (*stats[i])(_pop);
00094
00095 for (i = 0; i < updaters.size(); ++i)
00096 (*updaters[i])();
00097
00098 for (i = 0; i < monitors.size(); ++i)
00099 (*monitors[i])();
00100
00101 bool bContinue = true;
00102 for (i = 0; i < continuators.size(); ++i)
00103 if ( !(*continuators[i])(_pop) )
00104 bContinue = false;
00105
00106 if (! bContinue)
00107 {
00108 if (!sorted.empty())
00109 {
00110 for (i = 0; i < sorted.size(); ++i)
00111 {
00112 sorted[i]->lastCall(sorted_pop);
00113 }
00114 }
00115 for (i = 0; i < stats.size(); ++i)
00116 stats[i]->lastCall(_pop);
00117
00118 for (i = 0; i < updaters.size(); ++i)
00119 updaters[i]->lastCall();
00120
00121 for (i = 0; i < monitors.size(); ++i)
00122 monitors[i]->lastCall();
00123 }
00124 return bContinue;
00125 }
00126
00130 template <class EOT>
00131 std::string eoCheckPoint<EOT>::allClassNames() const
00132 {
00133 unsigned i;
00134 std::string s = "\n" + className() + "\n";
00135
00136 s += "Sorted Stats\n";
00137 for (i = 0; i < sorted.size(); ++i)
00138 s += sorted[i]->className() + "\n";
00139 s += "\n";
00140
00141 s += "Stats\n";
00142 for (i = 0; i < stats.size(); ++i)
00143 s += stats[i]->className() + "\n";
00144 s += "\n";
00145
00146 s += "Updaters\n";
00147 for (i = 0; i < updaters.size(); ++i)
00148 s += updaters[i]->className() + "\n";
00149 s += "\n";
00150
00151 s += "Monitors\n";
00152 for (i = 0; i < monitors.size(); ++i)
00153 s += monitors[i]->className() + "\n";
00154 s += "\n";
00155
00156 s += "Continuators\n";
00157 for (i = 0; i < continuators.size(); ++i)
00158 s += continuators[i]->className() + "\n";
00159 s += "\n";
00160
00161 return s;
00162 }
00163
00164 #endif