src/ell/StatePairCollector.hh
Go to the documentation of this file.00001 #ifndef STATEPAIRCOLLECTOR_HH_ 00002 #define STATEPAIRCOLLECTOR_HH_ 00003 00004 00005 //############################################################################## 00006 //############################################################################## 00007 00008 #include "ell/State.hh" 00009 00010 #include <utility> // contains std::pair definition 00011 00012 namespace ell 00013 { 00022 class StatePairCollector 00023 { 00024 public: 00025 00027 typedef std::pair<const State*,const State*> StatePair; 00028 00029 virtual 00030 ~StatePairCollector() {} 00031 00032 00035 virtual void add(const StatePair& s) = 0; 00036 00040 virtual void add( const State* const s1 00041 , const State* const s2) = 0; 00042 00045 virtual size_t size() const = 0; 00046 00052 virtual const StatePair getLastAdded() const = 0; 00053 00054 }; 00055 00056 } // namespace ell 00057 00058 //############################################################################## 00059 //############################################################################## 00060 00061 00062 namespace ell 00063 { 00071 class SPC_Counting : public StatePairCollector 00072 { 00073 00074 protected: 00075 00077 State* lastAdded_s1; 00079 State* lastAdded_s2; 00081 size_t statePairCount; 00082 00083 public: 00084 00085 SPC_Counting(); 00086 00087 virtual 00088 ~SPC_Counting(); 00089 00093 virtual void add( const StatePair& s ); 00094 00099 virtual void add( const State* const s1 00100 , const State* const s2 ); 00101 00104 virtual size_t size() const; 00105 00111 virtual const StatePair getLastAdded() const; 00112 00113 protected: 00114 00116 void clearLastAdded(); 00117 00118 }; 00119 00120 // inline defintion 00121 inline void SPC_Counting::clearLastAdded() { 00122 if (lastAdded_s1 != NULL) 00123 delete lastAdded_s1; 00124 if (lastAdded_s2 != NULL) 00125 delete lastAdded_s2; 00126 } 00127 00128 00129 } // namespace ell 00130 00131 00132 //############################################################################## 00133 //############################################################################## 00134 00135 #include <list> 00136 00137 namespace ell 00138 { 00146 class SPC_Listing : public StatePairCollector 00147 { 00148 public: 00149 typedef std::list<StatePair> List; 00150 00151 protected: 00152 00154 List statePairList; 00155 00156 public: 00157 00158 SPC_Listing(); 00159 00160 virtual 00161 ~SPC_Listing(); 00162 00165 virtual void add(const StatePair& s); 00166 00170 virtual void add( const State* const s1 00171 , const State* const s2 ); 00172 00175 virtual size_t size() const; 00176 00179 virtual const StatePair getLastAdded() const; 00180 00182 00185 virtual const List& getList() const; 00186 00187 }; 00188 00189 } // namespace ell 00190 00191 00192 //############################################################################## 00193 //############################################################################## 00194 00195 #include <ostream> 00196 #include <string> 00197 00198 namespace ell { 00199 00209 class SPC_Outstream : public SPC_Counting 00210 { 00211 protected: 00213 std::ostream& out; 00214 00216 const std::string strSep; 00217 00219 const std::string strAppend; 00220 00221 public: 00222 00230 SPC_Outstream( std::ostream& out 00231 , const std::string& separator 00232 , const std::string& toAppend ); 00233 00234 00235 virtual 00236 ~SPC_Outstream(); 00237 00241 virtual void add( const StatePair& s ); 00242 00247 virtual void add( const State* const s1 00248 , const State* const s2 ); 00249 00250 protected: 00251 00253 void printToStream(); 00254 00255 }; 00256 00257 inline void SPC_Outstream::printToStream() { 00258 out <<lastAdded_s1->toString() 00259 <<strSep 00260 <<lastAdded_s2->toString() 00261 <<strAppend; 00262 } 00263 00264 } // namespace ell 00265 00266 //############################################################################## 00267 //############################################################################## 00268 00269 00270 namespace ell 00271 { 00281 class SPC_MinPair : public SPC_Counting 00282 { 00283 00284 protected: 00285 00289 const bool pairsAddedInAscOrder; 00290 00292 State* minPair_s1; 00294 State* minPair_s2; 00297 const State* minPair_max; 00298 00299 using SPC_Counting::lastAdded_s1; 00300 using SPC_Counting::lastAdded_s2; 00301 00302 public: 00303 00308 SPC_MinPair( const bool pairsAddedInAscOrder = false ); 00309 00310 virtual 00311 ~SPC_MinPair(); 00312 00316 virtual void add( const StatePair& s ); 00317 00322 virtual void add( const State* const s1 00323 , const State* const s2 ); 00324 00330 virtual const StatePair getMinPair() const; 00331 00332 protected: 00333 00335 void clearMinPair(); 00336 00338 // minimal pair 00339 void checkMinPair(); 00340 00341 }; 00342 00343 // inline defintion 00344 inline void SPC_MinPair::clearMinPair() { 00345 if (minPair_s1 != NULL) 00346 delete minPair_s1; 00347 if (minPair_s2 != NULL) 00348 delete minPair_s2; 00349 } 00350 00351 00352 } // namespace ell 00353 00354 00355 //############################################################################## 00356 //############################################################################## 00357 00358 00359 #endif /*STATEPAIRCOLLECTOR_HH_*/