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_indexGraph.H
1 # ifndef TPL_INDEXGRAPH
2 # define TPL_INDEXGRAPH
3 
4 # include <tpl_indexNode.H>
5 # include <tpl_indexArc.H>
6 
7 namespace Aleph
8 {
9 
47 template
48 <class GT,
49  class Compare = Dft_Node_Cmp<GT>,
50  template <class /* Key */, class /* Compare */> class Tree = Treap>
52 {
53 private:
54 
55  typedef typename GT::Arc GT_Arc;
56  typedef typename GT::Node GT_Node;
57  typedef typename GT::Arc_Type GT_Arc_Type;
58  typedef typename GT::Node_Type GT_Node_Type;
59 
61  IndexArc<GT, Tree> idx_arc;
62 
63 public:
64 
66  Index_Graph(GT & g) : idx_node(g), idx_arc(g)
67  {
68  // empty
69  }
70 
77  GT_Node * insert_node(const GT_Node_Type & info)
78  {
79  return idx_node.insert_in_graph(info);
80  }
81 
92  GT_Arc * insert_arc(GT_Node * src, GT_Node * tgt,
93  const GT_Arc_Type & info = GT_Arc_Type())
94  throw (std::exception, std::domain_error)
95  {
96  if (idx_node.search(src) == NULL)
97  throw std::domain_error("src node not in index");
98 
99  if (idx_node.search(tgt) == NULL)
100  throw std::domain_error("tgt node not in index");
101 
102  return idx_arc.insert_in_graph(src, tgt, info);
103  }
104 
111  GT_Node * search_node(GT_Node * p)
112  {
113  return idx_node.search(p);
114  }
115 
125  GT_Node * search_node(const GT_Node_Type & info)
126  {
127  return idx_node.search(info);
128  }
129 
137  GT_Arc * search_arc(GT_Node * src, GT_Node * tgt)
138  {
139  return idx_arc.search(src, tgt);
140  }
141 
146  void remove_node(GT_Node * p)
147  {
148  // eliminar del índice los arcos emanantes del nodo (ellos serán
149  // eliminados por la eliminación de nodo del grafo)
150  for (typename GT::Node_Arc_Iterator it(p); it.has_current(); it.next())
151  idx_arc.remove(it.get_current());
152 
153  return idx_node.remove_from_graph(p);
154  }
155 
157  void remove_arc(GT_Arc * a)
158  {
159  return idx_arc.remove_from_graph(a);
160  }
161 
163  size_t get_num_arcs() const { return idx_arc.size(); }
164 
166  size_t get_num_nodes() const { return idx_node.size(); }
167 };
168 
169 
170 }
171 
172 # endif // TPL_INDEXGRAPH
173 
174 
void remove(GT_Arc *e)
Elimina del índice el arco e.
Definition: tpl_indexArc.H:160
void remove_from_graph(GT_Node *p)
Definition: tpl_indexNode.H:177
Definition: tpl_indexGraph.H:51
GT_Node * search_node(GT_Node *p)
Definition: tpl_indexGraph.H:111
GT_Node * search_node(const GT_Node_Type &info)
Definition: tpl_indexGraph.H:125
Definition: tpl_treap.H:352
size_t get_num_nodes() const
Retorna el número de nodos que contiene el índice.
Definition: tpl_indexGraph.H:166
GT_Arc * insert_in_graph(GT_Node *src, GT_Node *tgt, const GT_Arc_Type &info)
Definition: tpl_indexArc.H:128
void remove_arc(GT_Arc *a)
Elimina del grafo y del índice el arco a.
Definition: tpl_indexGraph.H:157
size_t size() const
Retorna la cantidad de arcos que contiene el índice.
Definition: tpl_indexArc.H:230
GT_Arc * search_arc(GT_Node *src, GT_Node *tgt)
Definition: tpl_indexGraph.H:137
GT_Node * insert_node(const GT_Node_Type &info)
Definition: tpl_indexGraph.H:77
void remove_from_graph(GT_Arc *a)
Elimina del índice y del grafo el arco a.
Definition: tpl_indexArc.H:166
size_t size() const
Retorna la cantidad de arcos que contiene el índice.
Definition: tpl_indexNode.H:237
void remove_node(GT_Node *p)
Definition: tpl_indexGraph.H:146
GT_Node * search(GT_Node *p)
Definition: tpl_indexNode.H:136
Index_Graph(GT &g)
Crea un índice del grafo: los nodos y arcos son indizados.
Definition: tpl_indexGraph.H:66
GT_Arc * search(void *src, void *tgt)
Definition: tpl_indexArc.H:81
size_t get_num_arcs() const
Retorna el número de arcos que contiene el índice.
Definition: tpl_indexGraph.H:163
Definition: tpl_graph_indexes.H:13
GT_Node * insert_in_graph(const GT_Node_Type &info)
Definition: tpl_indexNode.H:92
GT_Arc * insert_arc(GT_Node *src, GT_Node *tgt, const GT_Arc_Type &info=GT_Arc_Type())
Definition: tpl_indexGraph.H:92

Leandro Rabindranath León