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_sgraph.H
1 # ifndef TPL_SGRAPH_H
2 # define TPL_SGRAPH_H
3 
4 # include <memory>
5 # include <htlist.H>
6 # include <tpl_graph.H>
7 # include <tpl_dynSetTree.H>
8 
9 using namespace Aleph;
10 
11 namespace Aleph {
12 
13 
50  template <typename Node_Info = Empty_Class>
52 {
53 public:
54 
55  GRAPH_NODE_COMMON(Graph_Snode);
56 
57  DynList<void*> arc_list; // lista de adyacencia
58 
68  Graph_Snode() : num_arcs(0) { /* empty */ }
69 
70  Graph_Snode(const Graph_Snode &) : num_arcs(0) { /* empty */ }
71 
85  Graph_Snode(const Node_Info & info) : node_info(info), num_arcs(0)
86  {
87  /* empty */
88  }
89 
105  Graph_Snode(Graph_Snode * node) : node_info(node->get_info()), num_arcs(0)
106  {
107  /* empty */
108  }
109 };
110 
147  template <typename Arc_Info = Empty_Class>
149 {
150 public:
151 
152  GRAPH_ARC_COMMON(Graph_Sarc);
153 
154  Graph_Sarc() : src_node(NULL), tgt_node(NULL)
155  {
156  /* empty */
157  }
158 
159  Graph_Sarc(const Arc_Info & info)
160  : arc_info(info), src_node(NULL), tgt_node(NULL)
161  {
162  /* empty */
163  }
164 
165  Graph_Sarc(void * src, void * tgt, const Arc_Info & data)
166  : arc_info(data), src_node(src), tgt_node(tgt)
167  {
168  // empty
169  }
170 
171  Graph_Sarc(void * src, void * tgt) : src_node(src), tgt_node(tgt)
172  {
173  // empty
174  }
175 };
176 
177 
206 template <typename __Graph_Node = Graph_Snode<int>,
207  typename __Graph_Arc = Graph_Sarc<int>>
209 {
210  GRAPH_ATTR_COMMON(List_SGraph);
211 
212 private:
213 
216 
217  DynSetNode node_list; // lista de nodos
218  DynSetArc arc_list; // lista de arcos
219 
220 public:
221 
228  class Node_Iterator : public DynSetNode::Iterator
229  {
230  public:
231 
233  typedef Node * Item_Type;
234 
237 
238  Node_Iterator() { /* empty */ }
239 
240  Node_Iterator(List_SGraph & g) : DynSetNode::Iterator(g.node_list)
241  {
242  // empty
243  }
244 
246  Node * get_current_node() const
247  {
248  return this->get_curr();
249  }
250  };
251 
259  class Node_Arc_Iterator : public DynList<void*>::Iterator
260  {
261  Node * src_node;
262 
263  public:
264 
266  typedef Arc * Item_Type;
267 
269  typedef Node * Set_Type;
270 
272  Node_Arc_Iterator() { /* empty */ }
273 
275  Node_Arc_Iterator(Node * src)
276  : DynList<void*>::Iterator(src->arc_list), src_node(src)
277  {
278  // empty
279  }
280 
282  Arc * get_current_arc() const
283  {
284  return (Arc*) this->DynList<void*>::Iterator::get_curr();
285  }
286 
288  Arc * get_current() const { return get_current_arc(); }
289 
291  Arc * get_curr() const { return get_current_arc(); }
292 
294  Node * get_tgt_node() const
295  {
296  Arc * a = get_curr();
297  return (Node*) a->get_connected_node(src_node);
298  }
299  };
300 
308  class Arc_Iterator : public DynSetArc::Iterator
309  {
310  public:
311 
313  typedef Arc * Item_Type;
314 
317 
318  Arc_Iterator() { /* empty */ }
319 
320  Arc_Iterator(List_SGraph & _g) : DynSetArc::Iterator(_g.arc_list)
321  {
322  // empty
323  }
324 
326  Arc * get_current_arc() const
327  {
328  return this->get_curr();
329  }
330 
332  Node * get_src_node() const { return (Node*) get_current_arc()->src_node; }
333 
335  Node * get_tgt_node() const { return (Node*) get_current_arc()->tgt_node; }
336  };
337 
338  GRAPH_ITERATIVE_METHODS;
339 
340  GRAPH_SEARCH_METHODS;
341 
342 
359  virtual Node * insert_node(Node * p)
360  {
361  I(p->arc_list.is_empty());
362 
363  ++num_nodes;
364  node_list.append(p);
365 
366  return p;
367  }
368 
369 private:
370 
371  Arc * insert_arc(Node * src, Node * tgt, void * a)
372  {
373  Arc * arc = (Arc*) a;
374 
375  arc->src_node = src;
376  arc->tgt_node = tgt;
377 
378  src->arc_list.append(a);
379  src->num_arcs++;
380  if (not digraph and src != tgt)
381  {
382  tgt->arc_list.append(a);
383  tgt->num_arcs++;
384  }
385 
386  arc_list.append(arc);
387  ++num_arcs;
388 
389  return arc;
390  }
391 
392 public:
393 
417 
418 private:
419 
420  void disconnect_arc(Arc * arc)
421  {
422  Node * src = (Node*) arc->src_node;
423  Node * tgt = (Node*) arc->tgt_node;
424 
425  src->arc_list.remove(arc);
426  src->num_arcs--;
427 
428  if (not digraph and src != tgt)
429  {
430  tgt->arc_list.remove(arc);
431  tgt->num_arcs--;
432  }
433  }
434 
435 public:
436 
447  virtual void remove_arc(Arc * arc)
448  {
449  disconnect_arc(arc);
450  arc_list.remove(arc);
451  --num_arcs;
452  delete arc;
453  }
454 
455  virtual void remove_node(Node * p)
456  {
457  for (typename DynSetArc::Iterator it(arc_list); it.has_curr(); )
458  {
459  Arc * arc = (Arc*) it.get_curr();
460 
461  if (get_src_node(arc) == p or get_tgt_node(arc) == p)
462  {
463  disconnect_arc(arc);
464  --num_arcs;
465  delete it.del();
466  }
467  else
468  it.next();
469  }
470 
471  node_list.remove(p);
472  --num_nodes;
473 
474  delete p;
475  }
476 
477  Node * get_first_node() const
478  {
479  return (Node*) node_list.get_first();
480  }
481 
482  Arc * get_first_arc() const
483  {
484  return (Arc*) arc_list.get_first();
485  }
486 
487  Arc * get_first_arc(Node * p) const
488  {
489  return (Arc*) p->arc_list.get_first();
490  }
491 
492  List_SGraph()
493  {
494  init();
495  }
496 
497 private:
498 
499  void clear()
500  {
501  arc_list.for_each( [/* Lambda */] (const Arc * p) { delete p; } );
502  node_list.for_each( [/* Lambda */] (const Node * p) { delete p; } );
503  }
504 
505 public:
506 
507  ~List_SGraph()
508  {
509  clear();
510  }
511 
512  template <class GT>
513  List_SGraph(GT & g)
514  {
515  init();
516  inter_copy_graph<GT, List_SGraph>(*this, g, false);
517  }
518 
519  void swap(List_SGraph & g)
520  {
521  common_swap(g);
522  node_list.swap(g.node_list);
523  arc_list.swap(g.arc_list);
524  }
525 
526  List_SGraph(List_SGraph && g)
527  {
528  init();
529  swap(g);
530  }
531 
532  List_SGraph & operator = (const List_SGraph & g)
533  {
534  if (&g == this)
535  return *this;
536 
537  clear();
538 
539  copy_graph(*this, const_cast<List_SGraph&>(g));
540 
541  return *this;
542  }
543 
544  List_SGraph & operator = (List_SGraph && g)
545  {
546  swap(g);
547 
548  return *this;
549  }
550 
551 private:
552 
553  template <class Cmp>
554  struct Cmp_Arc
555  {
556  Cmp & cmp;
557 
558  Cmp_Arc(Cmp && __cmp = Cmp()) : cmp(__cmp) { /* empty */ }
559 
560  Cmp_Arc(Cmp & __cmp) : cmp(__cmp) { /* empty */ }
561 
562  bool operator () (Slinknc * s1, Slinknc * s2) const
563  {
564  Arc * arc1 = (Arc*) s1;
565  Arc * arc2 = (Arc*) s2;
566  return cmp(arc1, arc2);
567  }
568  };
569 
570 public:
571 
572  template <class Compare>
573  void sort_arcs(Compare & cmp)
574  {
575  Cmp_Arc<Compare> comp(cmp);
576  mergesort<HTList, Cmp_Arc<Compare>>(arc_list, comp);
577  }
578 
579  template <class Compare>
580  void sort_arcs(Compare && cmp = Compare())
581  {
582  mergesort<Cmp_Arc<Compare>>(arc_list, Cmp_Arc<Compare>(cmp));
583  }
584 
585  GRAPH_FUNCTIONAL_METHODS(List_SGraph);
586 };
587 
605  template <typename __Graph_Node = Graph_Snode<int>,
606  typename __Graph_Arc = Graph_Sarc<int>>
607 class List_SDigraph : public List_SGraph<__Graph_Node, __Graph_Arc>
608 {
610 
611 public:
612 
613  typedef __Graph_Node Node;
614 
615  typedef __Graph_Arc Arc;
616 
617  List_SDigraph()
618  {
619  this->digraph = true;
620  }
621 
622  List_SDigraph(const List_SDigraph & dg) : GT()
623  {
624  this->digraph = true;
625  copy_graph(*this, const_cast<List_SDigraph<Node, Arc>&>(dg));
626  }
627 
628  List_SDigraph & operator = (const List_SDigraph<Node, Arc> & g)
629  {
630  if (this == &g)
631  return *this;
632 
633  this->digraph = true;
634  copy_graph(*this, const_cast<List_SDigraph<Node, Arc>&>(g));
635 
636  return *this;
637  }
638 
639  List_SDigraph(List_SDigraph && dg) : GT()
640  {
641  this->digraph = true;
642  this->swap(dg);
643  }
644 
645  List_SDigraph & operator = (List_SDigraph<Node, Arc> && g)
646  {
647  this->digraph = true;
648  this->swap(g);
649 
650  return *this;
651  }
652 };
653 
654 
655 GRAPH_METHODS_IMPLS(List_SGraph);
656 
657 
658 } // end namespace Aleph
659 
660 # endif /* TPL_SGRAPH_H */
Node * Set_Type
El tipo de conjunto sobre el cual se itera.
Definition: tpl_sgraph.H:269
Node_Arc_Iterator(Node *src)
Instancia un iterador sobre el nodo _src_node.
Definition: tpl_sgraph.H:275
virtual void remove_arc(Arc *arc)
Definition: tpl_sgraph.H:447
Definition: tpl_sgraph.H:607
Graph_Snode(const Node_Info &info)
Definition: tpl_sgraph.H:85
size_t remove(const Key &key)
Definition: tpl_dynSetTree.H:274
Node * get_tgt_node() const
Retorna el nodo destino del arco actual.
Definition: tpl_sgraph.H:294
Arc * Item_Type
Tipo de elemento que retorna get_current()
Definition: tpl_sgraph.H:313
GRAPH_INSERTION_METHODS
Definition: tpl_sgraph.H:416
Arc * get_current_arc() const
Retorna un puntero al arco actual.
Definition: tpl_sgraph.H:326
Node * get_current_node() const
retorna el nodo actual.
Definition: tpl_sgraph.H:246
Node * get_tgt_node() const
Retorna el nodo destino del arco actual (sólo cuenta si es digrafo)
Definition: tpl_sgraph.H:335
void swap(DynSetTree &dset)
Definition: tpl_dynSetTree.H:65
Node * get_src_node() const
Retorna el nodo origen del arco actual (sólo cuenta si es digrafo)
Definition: tpl_sgraph.H:332
Definition: htlist.H:17
const Key & get_first()
Definition: tpl_dynSetTree.H:386
Graph_Snode(Graph_Snode *node)
Definition: tpl_sgraph.H:105
virtual Node * insert_node(Node *p)
Definition: tpl_sgraph.H:359
Arc * get_current() const
Definition: tpl_sgraph.H:288
Arc * get_current_arc() const
Retorna el arco actual.
Definition: tpl_sgraph.H:282
Definition: tpl_sgraph.H:228
void copy_graph(GT &gtgt, GT &gsrc, const bool cookie_map=false)
Definition: tpl_graph.H:2505
Arc * Item_Type
El tipo de dato que retorna get_current().
Definition: tpl_sgraph.H:266
Node * Item_Type
Tipo de elemento que retorna get_current()
Definition: tpl_sgraph.H:233
Arc * get_curr() const
Definition: tpl_sgraph.H:291
List_SGraph Set_Type
El tipo de conjunto sobre el cual se itera.
Definition: tpl_sgraph.H:236
Graph_Snode()
Definition: tpl_sgraph.H:68
Definition: tpl_sgraph.H:51
Definition: tpl_sgraph.H:208
Definition: tpl_sgraph.H:308
Definition: tpl_sgraph.H:259
List_SGraph Set_Type
El tipo de conjunto sobre el cual se itera.
Definition: tpl_sgraph.H:316
Definition: tpl_sgraph.H:148
Node_Arc_Iterator()
Instancia un iterador vacío (inválido).
Definition: tpl_sgraph.H:272

Leandro Rabindranath León