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 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 iterator(const typename ExprMapType::const_iterator& it)
00084 : d_it(it) { }
00085 public:
00086
00087 iterator() { }
00088
00089 bool operator==(const iterator& i) const { return d_it == i.d_it; }
00090 bool operator!=(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 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
00117
00118
00119
00120
00121
00122 ExprMap() { }
00123
00124 ExprMap(const ExprMap& map): d_map(map.d_map) { }
00125
00126
00127 bool empty() const { return d_map.empty(); }
00128 size_t size() const { return d_map.size(); }
00129
00130 size_t count(const Expr& e) const { return d_map.count(e); }
00131 Data& operator[](const Expr& e) { return d_map[e]; }
00132 void clear() { d_map.clear(); }
00133
00134 void insert(const Expr& e, const Data& d) { d_map[e] = d; }
00135 void erase(const Expr& e) { d_map.erase(e); }
00136
00137 template<class InputIterator>
00138 void insert(InputIterator l, InputIterator r) { d_map.insert(l,r); }
00139
00140 template<class InputIterator>
00141 void erase(InputIterator l, InputIterator r) {
00142 for(; l!=r; ++l) {
00143 d_map.erase((*l).first);
00144 }
00145 }
00146
00147 iterator begin() const { return iterator(d_map.begin()); }
00148 iterator end() const { return iterator(d_map.end()); }
00149 iterator find(const Expr& e) const { return iterator(d_map.find(e)); }
00150
00151 friend bool operator==(const ExprMap& m1, const ExprMap& m2) {
00152 return m1.d_map == m2.d_map;
00153 }
00154 friend bool operator!=(const ExprMap& m1, const ExprMap& m2) {
00155 return !(m1 == m2);
00156 }
00157 };
00158
00159 template<class Data>
00160 class ExprHashMap {
00161 private:
00162
00163 typedef std::hash_map<Expr, Data> ExprHashMapType;
00164
00165 ExprHashMapType d_map;
00166
00167 public:
00168
00169
00170
00171
00172
00173
00174
00175
00176 class iterator: public std::iterator<std::input_iterator_tag, std::pair<Expr,Data>,std::ptrdiff_t> {
00177 friend class ExprHashMap;
00178 private:
00179 typename ExprHashMapType::const_iterator d_it;
00180
00181 iterator(const typename ExprHashMapType::const_iterator& it)
00182 : d_it(it) { }
00183 public:
00184
00185 iterator() { }
00186
00187 bool operator==(const iterator& i) const { return d_it == i.d_it; }
00188 bool operator!=(const iterator& i) const { return d_it != i.d_it; }
00189
00190 const std::pair<const Expr,Data>& operator*() const { return *d_it; }
00191 const std::pair<const Expr,Data>* operator->() const {
00192 return d_it.operator->();
00193 }
00194
00195 iterator& operator++() { ++d_it; return *this; }
00196
00197
00198 class Proxy {
00199 const std::pair<const Expr,Data>& d_pair;
00200 public:
00201 Proxy(const std::pair<Expr,Data>& pair) : d_pair(pair) { }
00202 std::pair<const Expr,Data> operator*() { return d_pair; }
00203 };
00204
00205
00206
00207
00208 Proxy operator++(int) {
00209 Proxy tmp(*(*this));
00210 ++(*this);
00211 return tmp;
00212 }
00213 };
00214
00215
00216
00217
00218
00219
00220 ExprHashMap() { }
00221
00222 ExprHashMap(size_t n): d_map(n) { }
00223
00224 ExprHashMap(const ExprHashMap& map): d_map(map.d_map) { }
00225
00226
00227 bool empty() const { return d_map.empty(); }
00228 size_t size() const { return d_map.size(); }
00229
00230 size_t count(const Expr& e) const { return d_map.count(e); }
00231 Data& operator[](const Expr& e) { return d_map[e]; }
00232 void clear() { d_map.clear(); }
00233
00234 void insert(const Expr& e, const Data& d) { d_map[e] = d; }
00235 void erase(const Expr& e) { d_map.erase(e); }
00236
00237 template<class InputIterator>
00238 void insert(InputIterator l, InputIterator r) { d_map.insert(l,r); }
00239
00240 template<class InputIterator>
00241 void erase(InputIterator l, InputIterator r) {
00242 for(; l!=r; ++l) {
00243 d_map.erase((*l).first);
00244 }
00245 }
00246
00247 iterator begin() const { return iterator(d_map.begin()); }
00248 iterator end() const { return iterator(d_map.end()); }
00249 iterator find(const Expr& e) const { return iterator(d_map.find(e)); }
00250
00251 friend bool operator==(const ExprHashMap& m1, const ExprHashMap& m2) {
00252 return m1.d_map == m2.d_map;
00253 }
00254 friend bool operator!=(const ExprHashMap& m1, const ExprHashMap& m2) {
00255 return !(m1 == m2);
00256 }
00257 };
00258
00259 }
00260
00261 #endif