Aleph-w  1.5a.2
Biblioteca general de algoritmos y estructuras de datos
 Todo Clases Archivos Funciones Variables 'typedefs' Enumeraciones Amigas Grupos Páginas
grid.H
1 # ifndef GRID_H
2 # define GRID_H
3 
4 namespace Aleph
5 {
6 
7 template <class GT>
9 {
10  void operator () (GT &, typename GT::Node *, const size_t &, const size_t &) { /* Empty */ }
11 };
12 
13 template <class GT>
15 {
16  void operator () (GT &, typename GT::Arc *, const size_t &, const size_t &) { /* Empty */ }
17 };
18 
23 template <
24  class GT,
25  class Operation_On_Node = Default_Operation_On_Node<GT>,
26  class Operation_On_Arc = Default_Operation_On_Arc<GT>
27  >
29 {
30 public:
31  void operator () (GT & g, const size_t & width, const size_t & height)
32  {
33  if (g.get_num_nodes() != 0)
34  throw std::domain_error("There is nodes in graph");
35 
36  if (width < 2 or height < 2)
37  throw std::length_error("The minimun size must be 2 x 2");
38 
39  typename GT::Node *** map = new typename GT::Node **[height];
40  for (size_t i = 0; i < height; ++i)
41  {
42  try
43  {
44  map[i] = new typename GT::Node *[width];
45  for (size_t j = 0; j < width; ++j)
46  {
47  typename GT::Node * n = g.insert_node(typename GT::Node_Type());
48  Operation_On_Node()(g, n, i, j);
49  map[i][j] = n;
50  if (j > 0) //Conecta con el nodo a su izquierda
51  {
52  typename GT::Arc * a = g.insert_arc(n, map[i][j - 1]);
53  Operation_On_Arc()(g, a, i, j);
54  }
55  if (i > 0) //Conecta con el nodo que esta arriba
56  {
57  typename GT::Arc * a = g.insert_arc(n, map[i - 1][j]);
58  Operation_On_Arc()(g, a, i, j);
59  }
60  if (i > 0 and j > 0) //Conecta con el nodo que esta arriba y a la izquierda
61  {
62  typename GT::Arc * a = g.insert_arc(n, map[i - 1][j - 1]);
63  Operation_On_Arc()(g, a, i, j);
64  }
65  if (j + 1 < width and i > 0) //Conecta con el nodo que esta arriba y a la derecha
66  {
67  typename GT::Arc * a = g.insert_arc(n, map[i - 1][j + 1]);
68  Operation_On_Arc()(g, a, i, j);
69  }
70  }
71  }
72  catch (...)
73  {
74  for (size_t k = i - 1; k >= 0; --k)
75  delete [] map[k];
76  delete [] map;
77  clear_graph(g);
78  throw;
79  }
80  }
81 
82  for (size_t i = 0; i < height; ++i)
83  delete [] map[i];
84  delete [] map;
85  }
86 };
87 
88 }
89 
90 # endif
91 
Definition: grid.H:28
void clear_graph(GT &g)
Definition: tpl_graph.H:2486
Definition: Map.H:56
Definition: grid.H:14

Leandro Rabindranath León