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_indexArc.H
1 # ifndef TPL_INDEXARC_H
2 # define TPL_INDEXARC_H
3 
4 # include <tpl_dynSetTree.H>
5 # include <tpl_graph.H>
6 
7 using namespace Aleph;
8 
9 namespace Aleph
10 {
11 
12 
36  template <
37  class GT,
38  template <class /* Key */, class /* Compare */> class Tree = Rand_Tree,
39  class SA = Dft_Show_Arc<GT>
40  >
41 class IndexArc
42 {
43 private:
44 
45  typedef typename GT::Arc GT_Arc;
46  typedef typename GT::Node GT_Node;
47  typedef typename GT::Arc_Type GT_Arc_Type;
48  typedef typename GT::Node_Type GT_Node_Type;
49 
50  typedef std::pair<void*, void*> Node_Pair;
51 
52  struct Cmp_Arc
53  {
54  bool operator () (GT_Arc * a1, GT_Arc * a2) const
55  {
56  if (a1->src_node < a2->src_node)
57  return true;
58 
59  return not (a2->src_node < a1->src_node) and a1->tgt_node < a2->tgt_node;
60  }
61  };
62 
63  GT & g;
65  SA & sa;
66 
67 public:
68 
70  GT_Arc * insert(GT_Arc * e)
71  {
72  return *index.put(e);
73  }
74 
81  GT_Arc * search(void * src, void * tgt)
82  {
83  GT_Arc arc;
84  arc.src_node = src;
85  arc.tgt_node = tgt;
86 
87  GT_Arc ** ret_val = index.search(&arc);
88 
89  if (ret_val != NULL)
90  return *ret_val;
91 
92  if (g.is_digraph())
93  return NULL;
94 
95  std::swap(arc.src_node, arc.tgt_node);
96  ret_val = index.search(&arc);
97 
98  if (ret_val == NULL)
99  return NULL;
100 
101  I(((src == (*ret_val)->src_node) and (tgt == (*ret_val)->tgt_node)) or
102  ((tgt == (*ret_val)->src_node) and (src == (*ret_val)->tgt_node)));
103 
104  return *ret_val;
105  }
106 
112  GT_Arc * search(GT_Arc * a)
113  {
114  return search(a->src_node, a->tgt_node);
115  }
116 
128  GT_Arc * insert_in_graph(GT_Node * src, GT_Node * tgt,
129  const GT_Arc_Type & info)
130  throw (std::exception, std::domain_error)
131  {
132  GT_Arc * a = search(src, tgt);
133 
134  if (a != NULL)
135  throw std::domain_error("There is already in arc between these nodes");
136 
137  a = g.insert_arc(src, tgt, info);
138  insert(a);
139 
140  return a;
141  }
142 
144  GT_Arc * insert_in_graph(GT_Node * src, GT_Node * tgt,
145  GT_Arc_Type && info = GT_Arc_Type())
146  throw (std::exception, std::domain_error)
147  {
148  GT_Arc * a = search(src, tgt);
149 
150  if (a != NULL)
151  throw std::domain_error("There is already in arc between these nodes");
152 
153  a = g.insert_arc(src, tgt, std::move(info));
154  insert(a);
155 
156  return a;
157  }
158 
160  void remove(GT_Arc * e)
161  {
162  index.remove(e);
163  }
164 
166  void remove_from_graph(GT_Arc * a)
167  {
168  remove(a);
169  g.remove_arc(a);
170  }
171 
173  void clear_index()
174  {
175  index.empty();
176  }
177 
179  void build_index()
180  {
181  for (Arc_Iterator<GT, SA> it(g, sa); it.has_curr(); it.next())
182  {
183  GT_Arc * a = it.get_curr();
184 
185  if (search(a) != a)
186  insert(a);
187  }
188  }
189 
190 private:
191 
192  void init()
193  {
194  for (Arc_Iterator<GT, SA> it(g, sa); it.has_curr(); it.next())
195  insert(it.get_curr());
196  }
197 
198 public:
199 
208  IndexArc(GT & __g, bool with_init = true, SA && __sa = SA())
209  : g(__g), sa(__sa)
210  {
211  if (with_init)
212  init();
213  }
214 
223  IndexArc(GT & __g, bool with_init, SA & __sa) : g(__g), sa(__sa)
224  {
225  if (with_init)
226  init();
227  }
228 
230  size_t size() const { return index.size(); }
231 };
232 
233 }
234 
235 # endif
236 
IndexArc(GT &__g, bool with_init, SA &__sa)
Definition: tpl_indexArc.H:223
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
Definition: tpl_graph.H:751
GT_Arc * search(GT_Arc *a)
Definition: tpl_indexArc.H:112
void clear_index()
Elimina todos los arcos del índice.
Definition: tpl_indexArc.H:173
GT_Arc * insert(GT_Arc *e)
Inserta en el índice el arco a.
Definition: tpl_indexArc.H:70
GT_Arc * insert_in_graph(GT_Node *src, GT_Node *tgt, const GT_Arc_Type &info)
Definition: tpl_indexArc.H:128
Key * search(const Key &key) const
Definition: tpl_dynSetTree.H:364
size_t size() const
Retorna la cantidad de arcos que contiene el índice.
Definition: tpl_indexArc.H:230
IndexArc(GT &__g, bool with_init=true, SA &&__sa=SA())
Definition: tpl_indexArc.H:208
GT_Arc * insert_in_graph(GT_Node *src, GT_Node *tgt, GT_Arc_Type &&info=GT_Arc_Type())
Definition: tpl_indexArc.H:144
Definition: tpl_graph.H:634
void next()
Adelanta el iterador una posición.
Definition: filter_iterator.H:143
void remove_from_graph(GT_Arc *a)
Elimina del índice y del grafo el arco a.
Definition: tpl_indexArc.H:166
Definition: tpl_rand_tree.H:547
Definition: tpl_indexArc.H:41
GT_Arc * search(void *src, void *tgt)
Definition: tpl_indexArc.H:81
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
void build_index()
Inserta todos los arcos del grafo en el índice.
Definition: tpl_indexArc.H:179

Leandro Rabindranath León