Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

nci/suif/suif2b/extratypes/bit_vector/cross_map.h

Go to the documentation of this file.
00001 #ifndef CROSS_MAP_H
00002 #define CROSS_MAP_H
00003 
00004 #include "common/machine_dependent.h"
00005 #include "common/common_forwarders.h"
00006 #include "common/suif_hash_map.h"
00007 #include "common/suif_vector.h"
00008 
00009 
00010 // map the node class to an integer that
00011 // is allocated when we find a new one
00012 // We can get the integer from the node
00013 // and the node from the integer.
00014 
00015 template <class node_t> 
00016 class CrossMap {
00017   typedef suif_hash_map<node_t, size_t> map_t;
00018   typedef suif_vector<node_t> vect_t;
00019 
00020   map_t *_map;
00021   vect_t *_vect;
00022  public:
00023   CrossMap() { 
00024     _map = new suif_hash_map<node_t, size_t>();
00025     _vect = new vect_t();
00026   }
00027   ~CrossMap() { delete _map; delete _vect; }
00028   CrossMap &operator=(const CrossMap &other) {
00029     delete _map;
00030     delete _vect;
00031     _map = new map_t(other._map);
00032     _vect = new vect_t(other._vect);
00033     return(*this);
00034   }
00035 
00036   CrossMap(const CrossMap &other) :
00037     _map(new map_t(other._map)),
00038     _vect(new vect_t(other._vect))
00039     {}
00040 
00041   CrossMap *clone() const {
00042     return(new CrossMap(*this));
00043   }
00044   
00045   bool is_member(node_t node) const { 
00046     typename map_t::iterator iter = _map->find(node);
00047     return(!(iter == _map->end()));
00048   }
00049 
00050   size_t lookup_id(node_t node) const { 
00051     typename map_t::iterator iter = _map->find(node);
00052     assert(!(iter == _map->end()));
00053     return((*iter).second);
00054   }
00055  
00056  size_t retrieve_id(node_t node) { 
00057     typename map_t::iterator iter = _map->find(node);
00058     if (iter == _map->end()) {
00059       size_t id = _vect->size();
00060       _vect->push_back(node);
00061       _map->enter_value(node, id);
00062       return(id);
00063     }
00064     return((*iter).second);
00065   }
00066 
00067   node_t get_node(size_t id) const {
00068     return((*_vect)[id]);
00069   }
00070 
00071   size_t size() const { return(_vect->size()); }
00072 
00073   // for (CrossMap<a>::iterator iter(the_cross_map);
00074   //      iter.is_valid(); iter.next()) {
00075   //   a idx = iter.current();
00076   // 
00077   // }
00078 
00079   class iterator {
00080     suif_vector<node_t>*          _vect;
00081     suif_vector<node_t>::iterator _iter;
00082   public:
00083     iterator(const CrossMap *map) :
00084       _vect(map->_vect),
00085       _iter(map->_vect->begin())
00086       {}
00087     iterator(const iterator &other) :
00088       _vect(other._vect),
00089       _iter(other._iter)
00090       {}
00091     iterator &operator=(const iterator &other) {
00092       _vect = other._vect;
00093       _iter = other._iter;
00094     }
00095     node_t current() const {
00096       return (*_iter);
00097     }
00098     bool is_valid() const {
00099       return (_iter != _vect->end());
00100     }
00101     void next() { _iter++; }
00102     void reset() { _iter = _vect->begin(); }
00103   };
00104 
00105   friend class iterator;
00106 };
00107   
00108   
00109 #endif /* CROSS_MAP_H */

Generated at Mon Jul 31 13:41:44 2000 for NCI SUIF by doxygen 1.1.2 written by Dimitri van Heesch, © 1997-2000