ROSE 0.11.145.147
GraphUtility.h
1#ifndef ROSE_GraphUtility_H
2#define ROSE_GraphUtility_H
3#include <RoseFirst.h>
4#include <boost/cstdint.hpp>
5#include <Sawyer/Graph.h>
6
7namespace Rose {
8
10namespace GraphUtility {
11
15template<class Graph>
16void
17serialize(std::ostream &output, Graph &graph)
18{
19 boost::uint32_t n = 0;
20 output.write((const char*)&n, 4);
21
22 n = graph.nVertices();
23 output.write((const char*)&n, 4);
24
25 n = graph.nEdges();
26 output.write((const char*)&n, 4);
27
28 for (size_t i=0; i<graph.nVertices(); ++i) {
29 typename Graph::ConstVertexIterator vertex = graph.findVertex(i);
30 vertex->value().serialize(output);
31 }
32
33 for (size_t i=0; i<graph.nEdges(); ++i) {
34 typename Graph::ConstEdgeIterator edge = graph.findEdge(i);
35 n = edge->source()->id();
36 output.write((const char*)&n, 4);
37 n = edge->target()->id();
38 output.write((const char*)&n, 4);
39 edge->value().serialize(output);
40 }
41}
42
43template<class Graph>
44void
45deserialize(std::istream &input, Graph &graph)
46{
47 graph.clear();
48 boost::uint32_t n;
49
50 input.read((char*)&n, 4);
51 ASSERT_require2(n==0, "incorrect version number");
52
53 input.read((char*)&n, 4);
54 size_t nverts = n;
55
56 input.read((char*)&n, 4);
57 size_t nedges = n;
58
59 for (size_t i=0; i<nverts; ++i) {
60 typename Graph::VertexIterator vertex = graph.insertVertex();
61 ASSERT_require2(vertex->id()==i, "unexpected vertex numbering");
62 vertex->value().deserialize(input);
63 }
64
65 for (size_t i=0; i<nedges; ++i) {
66 input.read((char*)&n, 4);
67 typename Graph::VertexIterator source = graph.findVertex(n);
68 input.read((char*)&n, 4);
69 typename Graph::VertexIterator target = graph.findVertex(n);
70 typename Graph::EdgeIterator edge = graph.insertEdge(source, target);
71 ASSERT_require2(edge->id()==i, "unexpected edge numbering");
72 edge->value().deserialize(input);
73 }
74}
75
76} // namespace
77} // namespace
78#endif
void serialize(std::ostream &output, Graph &graph)
Serialize a graph into a stream of bytes.
The ROSE library.