Aleph-w  1.5a.2
Biblioteca general de algoritmos y estructuras de datos
 Todo Clases Archivos Funciones Variables 'typedefs' Enumeraciones Amigas Grupos Páginas
io_graph.H
1 # ifndef IO_GRAPH_H
2 # define IO_GRAPH_H
3 
4 # include <fstream>
5 # include <iostream>
6 # include <tpl_graph.H>
7 
8 extern bool verbose; // comunmente definida en main
9 
10 namespace Aleph {
11 
12 
13  template <class GT>
15 {
16  void operator () (ofstream & output, GT &, typename GT::Node * p)
17  {
18  output.write((char*) &p->get_info(), sizeof(typename GT::Node_Type));
19  }
20 
21  void operator () (ostream & output, GT &, typename GT::Node * p)
22  {
23  output << p->get_info() << endl;
24  }
25 };
26 
27  template <class GT>
29 {
30  void operator () (ofstream & output, GT &, typename GT::Arc * a)
31  {
32  output.write((char*) &a->get_info(), sizeof(typename GT::Arc_Type));
33  }
34 
35  void operator () (ostream & output, GT &, typename GT::Arc * a)
36  {
37  output << a->get_info() << endl;
38  }
39 };
40 
41  template <class GT>
43 {
44  void operator () (ifstream & input, GT &, typename GT::Node * p)
45  {
46  input.read((char*) &p->get_info(), sizeof(typename GT::Node_Type));
47  }
48 
49  void operator () (istream & input, GT &, typename GT::Node * p)
50  {
51  input >> p->get_info();
52  }
53 };
54 
55  template <class GT>
57 {
58  void operator () (ifstream & input, GT &, typename GT::Arc * a)
59  {
60  input.read((char*) &a->get_info(), sizeof(typename GT::Arc_Type));
61  }
62 
63  void operator () (istream & input, GT &, typename GT::Arc * a)
64  {
65  input >> a->get_info();
66  }
67 };
68 
118 template <class GT,
119  class Load_Node = Dft_Load_Node<GT>,
120  class Store_Node = Dft_Store_Node<GT>,
121  class Load_Arc = Dft_Load_Arc<GT>,
122  class Store_Arc = Dft_Store_Arc<GT>,
123  class NF = Aleph::Dft_Show_Node<GT>, // Filtro de nodos
124  class AF = Aleph::Dft_Show_Arc<GT> > // Filtro de arcos
125 class IO_Graph
126 {
127 
128  GT & g;
129 
130 public:
131 
133  IO_Graph(GT & __g) : g(__g) { /* empty */ }
134 
136  IO_Graph(GT * gptr) : g(*gptr) { /* empty */ }
137 
139  void save(ofstream & output)
140  {
141  // guarda cantidad de nodos
142  const size_t num_nodes = g.get_num_nodes();
143 
144  if (verbose)
145  cout << "Storing " << num_nodes << " nodes ... ";
146 
147  output.write((const char*) &num_nodes, sizeof(num_nodes));
148 
149  int i = 0; // contador de nodos. Lleva los índices en la tabla
150 
151  // tabla de pares <ptr nodo, orden de isnerción>
153 
154  for (Node_Iterator<GT,NF> it(g); it.has_current(); it.next(), ++i)
155  {
156  typename GT::Node * p = it.get_current();
157 
158  if (verbose)
159  cout << i << " ";
160 
161  Store_Node () (output, g, p);
162 
163  nodes_table.insert(p, i);
164  }
165 
166  const size_t num_arcs = g.get_num_arcs();
167 
168  if (verbose)
169  cout << " done " << endl
170  << "Storing " << num_arcs << " arcs ... " << endl;
171 
172  output.write((const char*) &num_arcs, sizeof(num_arcs));
173 
174  for (Arc_Iterator<GT,AF> it(g); it.has_current(); it.next())
175  {
176  typename GT::Arc * a = it.get_current();
177 
178  typename GT::Node * src = g.get_src_node(a);
179  typename GT::Node * tgt = g.get_tgt_node(a);
180 
181  const int & src_idx = nodes_table.find(src);
182  const int & tgt_idx = nodes_table.find(tgt);
183 
184  // guarda índices de nodos origen y destino respectivamente
185  output.write((const char*) &src_idx, sizeof(int));
186  output.write((const char*) &tgt_idx, sizeof(int));
187 
188  if (verbose)
189  cout << " " << src_idx << "--" << tgt_idx << " ";
190 
191  Store_Arc () (output, g, a);
192 
193  if (verbose)
194  cout << endl;
195  }
196 
197  if (verbose)
198  cout << " done " << endl << endl;
199  }
200 
202  void load(ifstream & input)
203  {
204  // lee cantidad de nodos
205  size_t num_nodes;
206  input.read((char *) &num_nodes, sizeof(num_nodes));
207 
208  if (verbose)
209  cout << "Loading " << num_nodes << " nodes ...";
210 
211  DynArray<typename GT::Node*> nodes_table(num_nodes);
212  nodes_table.reserve(0, num_nodes - 1);
213 
214  for (size_t i = 0; i < num_nodes; ++i)
215  {
216  typename GT::Node * p = new typename GT::Node;
217 
218  if (verbose)
219  cout << " " << i;
220 
221  Load_Node () (input, g, p);
222 
223  p = g.insert_node(p);
224  nodes_table.access(i) = p;
225  }
226 
227  size_t num_arcs;
228  input.read((char *) &num_arcs, sizeof(num_arcs));
229 
230  if (verbose)
231  cout << " done " << endl
232  << "Loading " << num_arcs << " arcs ... " << endl;
233 
234  for (int i = 0; i < num_arcs; ++i)
235  {
236  int src_idx;
237  input.read((char*) &src_idx, sizeof(int));
238  typename GT::Node * src = nodes_table.access(src_idx);
239 
240  int tgt_idx;
241  input.read((char*) &tgt_idx, sizeof(int));
242  typename GT::Node * tgt = nodes_table.access(tgt_idx);
243 
244  typename GT::Arc * a = g.insert_arc(src, tgt);
245 
246  if (verbose)
247  cout << " " << src_idx << "--" << tgt_idx << " ";
248 
249  Load_Arc () (input, g, a);
250 
251  if (verbose)
252  cout << endl;
253  }
254 
255  if (verbose)
256  cout << " done " << endl << endl;
257  }
258 
260  void save_in_text_mode(ostream & output)
261  {
262  // guarda cantidad de nodos
263  const size_t num_nodes = g.get_num_nodes();
264  const size_t num_arcs = g.get_num_arcs();
265  output << num_nodes << endl
266  << num_arcs << endl;
267 
268  if (verbose)
269  cout << "Storing " << num_nodes << " nodes ... ";
270 
271  int i = 0; // contador de nodos. Lleva los índices en la tabla
272 
273  // tabla de pares <ptr nodo, orden de inserción>
275 
276  for (Node_Iterator<GT,NF> it(g); it.has_current(); it.next(), ++i)
277  {
278  typename GT::Node * p = it.get_current();
279 
280  if (verbose)
281  cout << i << " ";
282 
283  Store_Node () (output, g, p);
284 
285  nodes_table.insert(p, i);
286  }
287 
288  if (verbose)
289  cout << " done " << endl
290  << "Storing " << num_arcs << " arcs ... " << endl;
291 
292  for (Arc_Iterator<GT,AF> it(g); it.has_current(); it.next())
293  {
294  typename GT::Arc * a = it.get_current();
295 
296  typename GT::Node * src = g.get_src_node(a);
297  typename GT::Node * tgt = g.get_tgt_node(a);
298 
299  const int & src_idx = nodes_table.find(src);
300  const int & tgt_idx = nodes_table.find(tgt);
301 
302  // guarda índices de nodos origen y destino respectivamente
303  output << src_idx << " " << tgt_idx << " ";
304 
305  if (verbose)
306  cout << " " << src_idx << "--" << tgt_idx << " ";
307 
308  Store_Arc () (output, g, a);
309 
310  if (verbose)
311  cout << endl;
312  }
313 
314  if (verbose)
315  cout << " done " << endl << endl;
316  }
317 
318 
320  void load_in_text_mode(istream & input)
321  {
322  // lee cantidad de nodos
323  size_t num_nodes;
324  size_t num_arcs;
325 
326  input >> num_nodes >> num_arcs;
327 
328  if (verbose)
329  cout << "Loading " << num_nodes << " nodes ...";
330 
331  DynArray<typename GT::Node*> nodes_table(num_nodes);
332  nodes_table.reserve(0, num_nodes - 1);
333 
334  for (size_t i = 0; i < num_nodes; ++i)
335  {
336  typename GT::Node * p = new typename GT::Node;
337 
338  if (verbose)
339  cout << " " << i;
340 
341  Load_Node () (input, g, p);
342 
343  p = g.insert_node(p);
344  nodes_table.access(i) = p;
345  }
346 
347  if (verbose)
348  cout << " done " << endl
349  << "Loading " << num_arcs << " arcs ... " << endl;
350 
351  for (int i = 0; i < num_arcs; ++i)
352  {
353  int src_idx;
354  int tgt_idx;
355 
356  input >> src_idx >> tgt_idx;
357 
358  typename GT::Node * src = nodes_table.access(src_idx);
359  typename GT::Node * tgt = nodes_table.access(tgt_idx);
360 
361  typename GT::Arc * a = g.insert_arc(src, tgt);
362 
363  if (verbose)
364  cout << " " << src_idx << "--" << tgt_idx << " ";
365 
366  Load_Arc () (input, g, a);
367 
368  if (verbose)
369  cout << " " << endl;
370  }
371 
372  if (verbose)
373  cout << " done " << endl << endl;
374  }
375 };
376 
377 } // end namespace Aleph
378 
379 # endif // IO_GRAPH_H
Definition: io_graph.H:125
void reserve(const size_t l, const size_t r)
Definition: tpl_dynArray.H:960
Definition: io_graph.H:42
Definition: io_graph.H:28
Definition: io_graph.H:56
Definition: tpl_graph.H:751
Definition: tpl_graph.H:794
IO_Graph(GT *gptr)
Constructor con puntero a grafo.
Definition: io_graph.H:136
Definition: io_graph.H:14
void save_in_text_mode(ostream &output)
Guarda el grafo en el stream output.
Definition: io_graph.H:260
Definition: tpl_graph.H:634
void next()
Adelanta el iterador una posición.
Definition: filter_iterator.H:143
void load(ifstream &input)
Carga el grafo desde el stream output.
Definition: io_graph.H:202
IO_Graph(GT &__g)
Constructor con referencia a grafo.
Definition: io_graph.H:133
void save(ofstream &output)
Guarda el grafo en el stream output.
Definition: io_graph.H:139
Definition: tpl_dynMapTree.H:289
Definition: tpl_graph.H:814
T & access(const size_t i)
Definition: tpl_dynArray.H:793
Key * insert(const Key &key, const Type &data)
Definition: tpl_dynMapTree.H:74
void load_in_text_mode(istream &input)
Carga el grafo desde el stream intput.
Definition: io_graph.H:320
Type & find(const Key &key)
Definition: tpl_dynMapTree.H:223

Leandro Rabindranath León