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 */