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
00029
00030
00031
00032
00033 #include <map>
00034 #include "massert.h"
00035
00036 #ifdef DEBUG_ITER
00037 #include "Log.h"
00038 #endif
00039
00046 #ifndef _MACE_ITERATOR_H
00047 #define _MACE_ITERATOR_H
00048
00049 namespace mace {
00050
00052
00075 template <typename M>
00076 class MapIterator
00077 {
00078 private:
00079
00080
00081 typedef typename M::iterator iterator;
00082 typedef typename M::const_iterator const_iterator;
00083 typedef typename M::mapped_type V;
00084 typedef typename M::key_type K;
00085 iterator iter;
00086 iterator last;
00087
00088 M& set;
00089 const iterator begin;
00090 const iterator end;
00091
00092 public:
00093 typedef typename M::mapped_type mapped_type;
00094 typedef typename M::key_type key_type;
00095
00097 MapIterator(M& s): iter(s.begin()), set(s), begin(s.begin()), end(s.end()) {
00098 last = end;
00099 #ifdef DEBUG_ITER
00100 Log::logf("MAP_ITER_DEBUG", "size: %d", set.size());
00101 #endif
00102 }
00103
00105 MapIterator(M& s, iterator b): set(s), begin(b), end(s.end()), iter(b) {
00106 last = end;
00107 #ifdef DEBUG_ITER
00108 Log::logf("MAP_ITER_DEBUG", "size: %d", set.size());
00109 #endif
00110 }
00111
00113 MapIterator(M& s, iterator b, iterator e): iter(b), set(s), begin(b), end(e) {
00114 last = end;
00115 #ifdef DEBUG_ITER
00116 Log::logf("MAP_ITER_DEBUG", "size: %d", set.size());
00117 #endif
00118 }
00119
00121 bool hasNext() {
00122 return iter != end && iter != set.end();
00123 }
00124
00126 V& next() {
00127 ASSERT(hasNext());
00128 #ifdef DEBUG_ITER
00129 Log::logf("MAP_ITER_DEBUG", "next(): iter %x", iter->first);
00130 #endif
00131 last = iter;
00132 iter++;
00133 return last->second;
00134 }
00135
00137 V& next(K &key) {
00138 ASSERT(hasNext());
00139 #ifdef DEBUG_ITER
00140 Log::logf("MAP_ITER_DEBUG", "next(): iter %x", iter->first);
00141 #endif
00142 last = iter;
00143 iter++;
00144 key = last->first;
00145 return last->second;
00146 }
00147
00149 void remove() {
00150 #ifdef DEBUG_ITER
00151 Log::logf("MAP_ITER_DEBUG", "remove(): last %x", last->first);
00152 #endif
00153 if(last != end) {
00154 set.erase(last);
00155 last = end;
00156 } else {
00157 ASSERT(false);
00158 }
00159 }
00160
00161 };
00162
00164
00181 template <typename M>
00182 class ConstMapIterator
00183 {
00184 private:
00185
00186
00187 typedef typename M::iterator iterator;
00188 typedef typename M::const_iterator const_iterator;
00189 typedef typename M::mapped_type V;
00190 typedef typename M::key_type K;
00191 const_iterator iter;
00192 const_iterator last;
00193
00194 const M& set;
00195 const const_iterator begin;
00196 const const_iterator end;
00197
00198 public:
00199 typedef typename M::mapped_type mapped_type;
00200 typedef typename M::key_type key_type;
00202 ConstMapIterator(const M& s): set(s), begin(s.begin()), end(s.end()) {
00203 iter = begin;
00204 last = end;
00205 #ifdef DEBUG_ITER
00206 Log::logf("MAP_ITER_DEBUG::const", "size: %d", set.size());
00207 #endif
00208 }
00209
00211 ConstMapIterator(const M& s, const_iterator b): set(s), begin(b), end(s.end()) {
00212 iter = begin;
00213 last = end;
00214 #ifdef DEBUG_ITER
00215 Log::logf("MAP_ITER_DEBUG::const", "size: %d", set.size());
00216 #endif
00217 }
00218
00220 ConstMapIterator(const M& s, const_iterator b, const_iterator e): set(s), begin(b), end(e) {
00221 iter = begin;
00222 last = end;
00223 #ifdef DEBUG_ITER
00224 Log::logf("MAP_ITER_DEBUG::const", "size: %d", set.size());
00225 #endif
00226 }
00227
00229 bool hasNext() {
00230 return iter != end && iter != set.end();
00231 }
00232
00234 const V& next() {
00235 ASSERT(hasNext());
00236 #ifdef DEBUG_ITER
00237 Log::logf("MAP_ITER_DEBUG::const", "next(): iter %x", iter->first);
00238 #endif
00239 last = iter;
00240 iter++;
00241 return last->second;
00242 }
00243
00245 const V& next(K &key) {
00246 ASSERT(hasNext());
00247 #ifdef DEBUG_ITER
00248 Log::logf("MAP_ITER_DEBUG::const", "next(): iter %x", iter->first);
00249 #endif
00250 last = iter;
00251 iter++;
00252 key = last->first;
00253 return last->second;
00254 }
00255
00256 };
00257
00258 }
00259
00260 #endif //_MACE_ITERATOR_H