Aleph-w  1.5a.2
Biblioteca general de algoritmos y estructuras de datos
 Todo Clases Archivos Funciones Variables 'typedefs' Enumeraciones Amigas Grupos Páginas
tpl_indexNode.H
1 # ifndef TPL_INDEXNODE_H
2 # define TPL_INDEXNODE_H
3 
4 # include <tpl_dynSetTree.H>
5 # include <tpl_graph.H>
6 
7 using namespace Aleph;
8 
9 namespace Aleph
10 {
11 
12  template <class GT>
13 struct Dft_Node_Cmp
14 {
15  bool
16  operator () (typename GT::Node * p1, typename GT::Node * p2) const
17  {
18  return p1->get_info() < p2->get_info();
19  }
20 };
21 
55  template
56  <class GT,
57  class Compare = Dft_Node_Cmp<GT>,
58  template <class /* Key */, class /* Compare */> class Tree = Treap,
59  class SN = Dft_Show_Node<GT> >
60 class IndexNode
61 {
62 private:
63 
64  typedef typename GT::Node GT_Node;
65  typedef typename GT::Node_Type GT_Node_Type;
66 
68 
69  GT & g;
70  SN & sn;
71 
72 public:
73 
79  GT_Node * insert(GT_Node * p)
80  {
81  index.put(p);
82  return p;
83  }
84 
92  GT_Node * insert_in_graph(const GT_Node_Type & info)
93  {
94  GT_Node * ret_val = g.insert_node(info);
95 
96  try
97  {
98  insert(ret_val);
99 
100  return ret_val;
101  }
102  catch (...)
103  {
104  g.remove_node(ret_val);
105  throw;
106  }
107  }
108 
110  GT_Node * insert_in_graph(GT_Node_Type && info = GT_Node_Type())
111  {
112  GT_Node * ret_val = g.insert_node(std::move(info));
113 
114  try
115  {
116  insert(ret_val);
117 
118  return ret_val;
119  }
120  catch (...)
121  {
122  g.remove_node(ret_val);
123  throw;
124  }
125  }
126 
136  GT_Node * search(GT_Node * p)
137  {
138  GT_Node ** ret_val = index.search(p);
139 
140  if (ret_val == NULL)
141  return NULL;
142 
143  return *ret_val;
144  }
145 
157  GT_Node * search(const GT_Node_Type & info)
158  {
159  GT_Node dummy_node(info);
160  GT_Node * dummy_node_ptr = &dummy_node;
161 
162  return search(dummy_node_ptr);
163  }
164 
166  void remove(GT_Node * p)
167  {
168  index.remove(p);
169  }
170 
177  void remove_from_graph(GT_Node * p) throw(std::exception, std::domain_error)
178  {
179  index.find(p); // dispara excepción si p no está en el índice
180  index.remove(p);
181  g.remove_node(p);
182  }
183 
185  void clear_index()
186  {
187  index.empty();
188  }
189 
191  void build_index()
192  {
193  for (Node_Iterator<GT, SN> it(g, sn); it.has_curr(); it.next())
194  {
195  GT_Node * p = it.get_curr();
196 
197  if (search(p) != p)
198  insert(p);
199  }
200  }
201 
203  void clear_graph()
204  {
205  clear_index();
206  g.clear_graph();
207  }
208 
209 private:
210 
211  void init()
212  {
213  for (Node_Iterator<GT, SN> it(g, sn); it.has_curr(); it.next())
214  insert(it.get_curr());
215  }
216 
217 public:
218 
226  IndexNode(GT & __g, SN && __sn = SN()) : g(__g), sn(__sn)
227  {
228  init();
229  }
230 
231  IndexNode(GT & __g, SN & __sn) : g(__g), sn(__sn)
232  {
233  init();
234  }
235 
237  size_t size() const { return index.size(); }
238 };
239 
240 }
241 
242 # endif
243 
GT_Node * search(const GT_Node_Type &info)
Definition: tpl_indexNode.H:157
void remove_from_graph(GT_Node *p)
Definition: tpl_indexNode.H:177
size_t remove(const Key &key)
Definition: tpl_dynSetTree.H:274
const size_t & size() const
Retorna la cardinalidad del conjunto.
Definition: tpl_dynSetTree.H:408
void clear_index()
Borra el índice; todos los nodos son eliminados.
Definition: tpl_indexNode.H:185
Definition: tpl_treap.H:352
Key * search(const Key &key) const
Definition: tpl_dynSetTree.H:364
Definition: tpl_graph.H:794
void clear_graph()
Elimina todos los nodos del grafo y del índice.
Definition: tpl_indexNode.H:203
Key & find(const Key &key)
Definition: tpl_dynSetTree.H:316
void next()
Adelanta el iterador una posición.
Definition: filter_iterator.H:143
GT_Node * insert(GT_Node *p)
Definition: tpl_indexNode.H:79
size_t size() const
Retorna la cantidad de arcos que contiene el índice.
Definition: tpl_indexNode.H:237
Definition: tpl_indexNode.H:60
Definition: tpl_graph.H:814
void build_index()
Inserta todos los nodos del grafo en el índice.
Definition: tpl_indexNode.H:191
GT_Node * search(GT_Node *p)
Definition: tpl_indexNode.H:136
GT_Node * insert_in_graph(GT_Node_Type &&info=GT_Node_Type())
Definition: tpl_indexNode.H:110
IndexNode(GT &__g, SN &&__sn=SN())
Definition: tpl_indexNode.H:226
void empty()
Elimina todos los elementos del conjunto.
Definition: tpl_dynSetTree.H:112
Key * put(const Key &key)
Seudo sinonimo de insert; no retorna ningún valor.
Definition: tpl_dynSetTree.H:257
Definition: tpl_graph_indexes.H:13
GT_Node * insert_in_graph(const GT_Node_Type &info)
Definition: tpl_indexNode.H:92

Leandro Rabindranath León