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
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050 #ifndef _cvc3__expr_h_
00051 #include "expr.h"
00052 #endif
00053
00054 #ifndef _cvc3__expr_map_h_
00055 #define _cvc3__expr_map_h_
00056
00057 #include "expr_hash.h"
00058
00059 namespace CVC3 {
00060
00061 template<class Data>
00062 class ExprMap {
00063 private:
00064
00065 typedef std::map<Expr, Data> ExprMapType;
00066
00067 ExprMapType d_map;
00068
00069 public:
00070
00071
00072
00073
00074
00075
00076
00077
00078 class const_iterator: public std::iterator<std::input_iterator_tag, std::pair<Expr,Data>,std::ptrdiff_t> {
00079 friend class ExprMap;
00080 private:
00081 typename ExprMapType::const_iterator d_it;
00082
00083 const_iterator(const typename ExprMapType::const_iterator& it)
00084 : d_it(it) { }
00085 public:
00086
00087 const_iterator() { }
00088
00089 bool operator==(const const_iterator& i) const { return d_it == i.d_it; }
00090 bool operator!=(const const_iterator& i) const { return d_it != i.d_it; }
00091
00092 const std::pair<const Expr,Data>& operator*() const { return *d_it; }
00093 const std::pair<const Expr,Data>* operator->() const {
00094 return d_it.operator->();
00095 }
00096
00097 const_iterator& operator++() { ++d_it; return *this; }
00098
00099
00100 class Proxy {
00101 const std::pair<const Expr,Data>& d_pair;
00102 public:
00103 Proxy(const std::pair<Expr,Data>& pair) : d_pair(pair) { }
00104 std::pair<const Expr,Data> operator*() { return d_pair; }
00105 };
00106
00107
00108
00109
00110 Proxy operator++(int) {
00111 Proxy tmp(*(*this));
00112 ++(*this);
00113 return tmp;
00114 }
00115
00116 const_iterator& operator--() { --d_it; return *this; }
00117 };
00118
00119 class iterator: public std::iterator<std::input_iterator_tag, std::pair<Expr,Data>,std::ptrdiff_t> {
00120 friend class ExprMap;
00121 private:
00122 typename ExprMapType::iterator d_it;
00123
00124 iterator(const typename ExprMapType::iterator& it)
00125 : d_it(it) { }
00126 public:
00127
00128 iterator() { }
00129
00130 bool operator==(const iterator& i) const { return d_it == i.d_it; }
00131 bool operator!=(const iterator& i) const { return d_it != i.d_it; }
00132
00133 std::pair<const Expr,Data>& operator*() const { return *d_it; }
00134 std::pair<const Expr,Data>* operator->() const {
00135 return d_it.operator->();
00136 }
00137
00138 iterator& operator++() { ++d_it; return *this; }
00139
00140
00141 class Proxy {
00142 std::pair<const Expr,Data>& d_pair;
00143 public:
00144 Proxy(std::pair<const Expr,Data>& pair) : d_pair(pair) { }
00145 std::pair<const Expr,Data> operator*() { return d_pair; }
00146 };
00147
00148
00149
00150
00151 Proxy operator++(int) {
00152 Proxy tmp(*(*this));
00153 ++(*this);
00154 return tmp;
00155 }
00156
00157 iterator& operator--() { --d_it; return *this; }
00158 };
00159
00160
00161
00162
00163
00164
00165 ExprMap() { }
00166
00167 ExprMap(const ExprMap& map): d_map(map.d_map) { }
00168
00169
00170 bool empty() const { return d_map.empty(); }
00171 size_t size() const { return d_map.size(); }
00172
00173 size_t count(const Expr& e) const { return d_map.count(e); }
00174 Data& operator[](const Expr& e) { return d_map[e]; }
00175 void clear() { d_map.clear(); }
00176
00177 void insert(const Expr& e, const Data& d) { d_map[e] = d; }
00178 void erase(const Expr& e) { d_map.erase(e); }
00179
00180 template<class InputIterator>
00181 void insert(InputIterator l, InputIterator r) { d_map.insert(l,r); }
00182
00183 template<class InputIterator>
00184 void erase(InputIterator l, InputIterator r) {
00185 for(; l!=r; ++l) {
00186 d_map.erase((*l).first);
00187 }
00188 }
00189
00190 iterator begin() { return iterator(d_map.begin()); }
00191 iterator end() { return iterator(d_map.end()); }
00192 const_iterator begin() const { return const_iterator(d_map.begin()); }
00193 const_iterator end() const { return const_iterator(d_map.end()); }
00194 iterator find(const Expr& e) { return iterator(d_map.find(e)); }
00195 const_iterator find(const Expr& e) const { return const_iterator(d_map.find(e)); }
00196
00197 friend bool operator==(const ExprMap& m1, const ExprMap& m2) {
00198 return m1.d_map == m2.d_map;
00199 }
00200 friend bool operator!=(const ExprMap& m1, const ExprMap& m2) {
00201 return !(m1 == m2);
00202 }
00203 };
00204
00205 template<class Data>
00206 class ExprHashMap {
00207 private:
00208
00209 typedef std::hash_map<Expr, Data> ExprHashMapType;
00210
00211 ExprHashMapType d_map;
00212
00213 public:
00214
00215 class const_iterator: public std::iterator<std::input_iterator_tag, std::pair<Expr,Data>,std::ptrdiff_t> {
00216 friend class ExprHashMap;
00217 private:
00218 typename ExprHashMapType::const_iterator d_it;
00219
00220 const_iterator(const typename ExprHashMapType::const_iterator& it)
00221 : d_it(it) { }
00222 public:
00223
00224 const_iterator() { }
00225
00226 bool operator==(const const_iterator& i) const { return d_it == i.d_it; }
00227 bool operator!=(const const_iterator& i) const { return d_it != i.d_it; }
00228
00229 const std::pair<const Expr,Data>& operator*() const { return *d_it; }
00230 const std::pair<const Expr,Data>* operator->() const {
00231 return d_it.operator->();
00232 }
00233
00234 const_iterator& operator++() { ++d_it; return *this; }
00235
00236
00237 class Proxy {
00238 const std::pair<const Expr,Data>& d_pair;
00239 public:
00240 Proxy(const std::pair<Expr,Data>& pair) : d_pair(pair) { }
00241 std::pair<const Expr,Data> operator*() { return d_pair; }
00242 };
00243
00244
00245
00246
00247 Proxy operator++(int) {
00248 Proxy tmp(*(*this));
00249 ++(*this);
00250 return tmp;
00251 }
00252 };
00253
00254 class iterator: public std::iterator<std::input_iterator_tag, std::pair<Expr,Data>,std::ptrdiff_t> {
00255 friend class ExprHashMap;
00256 private:
00257 typename ExprHashMapType::iterator d_it;
00258
00259 iterator(const typename ExprHashMapType::iterator& it)
00260 : d_it(it) { }
00261 public:
00262
00263 iterator() { }
00264
00265 bool operator==(const iterator& i) const { return d_it == i.d_it; }
00266 bool operator!=(const iterator& i) const { return d_it != i.d_it; }
00267
00268 std::pair<const Expr,Data>& operator*() const { return *d_it; }
00269 std::pair<const Expr,Data>* operator->() const {
00270 return d_it.operator->();
00271 }
00272
00273 iterator& operator++() { ++d_it; return *this; }
00274
00275
00276 class Proxy {
00277 std::pair<const Expr,Data>& d_pair;
00278 public:
00279 Proxy(std::pair<const Expr,Data>& pair) : d_pair(pair) { }
00280 std::pair<const Expr,Data> operator*() { return d_pair; }
00281 };
00282
00283
00284
00285
00286 Proxy operator++(int) {
00287 Proxy tmp(*(*this));
00288 ++(*this);
00289 return tmp;
00290 }
00291 };
00292
00293
00294
00295
00296
00297
00298 ExprHashMap() { }
00299
00300 ExprHashMap(size_t n): d_map(n) { }
00301
00302 ExprHashMap(const ExprHashMap& map): d_map(map.d_map) { }
00303
00304
00305 bool empty() const { return d_map.empty(); }
00306 size_t size() const { return d_map.size(); }
00307
00308 size_t count(const Expr& e) const { return d_map.count(e); }
00309 Data& operator[](const Expr& e) { return d_map[e]; }
00310 void clear() { d_map.clear(); }
00311
00312 void insert(const Expr& e, const Data& d) { d_map[e] = d; }
00313 void erase(const Expr& e) { d_map.erase(e); }
00314
00315 template<class InputIterator>
00316 void insert(InputIterator l, InputIterator r) { d_map.insert(l,r); }
00317
00318 template<class InputIterator>
00319 void erase(InputIterator l, InputIterator r) {
00320 for(; l!=r; ++l) {
00321 d_map.erase((*l).first);
00322 }
00323 }
00324
00325 iterator begin() { return iterator(d_map.begin()); }
00326 iterator end() { return iterator(d_map.end()); }
00327 const_iterator begin() const { return const_iterator(d_map.begin()); }
00328 const_iterator end() const { return const_iterator(d_map.end()); }
00329 iterator find(const Expr& e) { return iterator(d_map.find(e)); }
00330 const_iterator find(const Expr& e) const { return const_iterator(d_map.find(e)); }
00331
00332
00333
00334
00335
00336
00337
00338
00339 };
00340
00341 }
00342
00343 #endif