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