williamr@2
|
1 |
//=======================================================================
|
williamr@2
|
2 |
// Copyright 2005 Jeremy G. Siek
|
williamr@2
|
3 |
// Authors: Jeremy G. Siek
|
williamr@2
|
4 |
//
|
williamr@2
|
5 |
// Distributed under the Boost Software License, Version 1.0. (See
|
williamr@2
|
6 |
// accompanying file LICENSE_1_0.txt or copy at
|
williamr@2
|
7 |
// http://www.boost.org/LICENSE_1_0.txt)
|
williamr@2
|
8 |
//=======================================================================
|
williamr@2
|
9 |
#ifndef ADJ_LIST_SERIALIZE_HPP
|
williamr@2
|
10 |
#define ADJ_LIST_SERIALIZE_HPP
|
williamr@2
|
11 |
|
williamr@2
|
12 |
#include <boost/graph/adjacency_list.hpp>
|
williamr@2
|
13 |
#include <boost/pending/property_serialize.hpp>
|
williamr@2
|
14 |
#include <boost/config.hpp>
|
williamr@2
|
15 |
#include <boost/detail/workaround.hpp>
|
williamr@2
|
16 |
|
williamr@2
|
17 |
#include <boost/serialization/collections_save_imp.hpp>
|
williamr@2
|
18 |
#include <boost/serialization/collections_load_imp.hpp>
|
williamr@2
|
19 |
#include <boost/serialization/split_free.hpp>
|
williamr@2
|
20 |
|
williamr@2
|
21 |
namespace boost {
|
williamr@2
|
22 |
|
williamr@2
|
23 |
namespace serialization {
|
williamr@2
|
24 |
|
williamr@2
|
25 |
// Turn off tracking for adjacency_list. It's not polymorphic, and we
|
williamr@2
|
26 |
// need to do this to enable saving of non-const adjacency lists.
|
williamr@2
|
27 |
template<class OEL, class VL, class D, class VP, class EP, class GP, class EL>
|
williamr@2
|
28 |
struct tracking_level<boost::adjacency_list<OEL,VL,D,VP,EP,GP,EL> > {
|
williamr@2
|
29 |
typedef mpl::integral_c_tag tag;
|
williamr@2
|
30 |
typedef mpl::int_<track_never> type;
|
williamr@2
|
31 |
BOOST_STATIC_CONSTANT(int, value = tracking_level::type::value);
|
williamr@2
|
32 |
};
|
williamr@2
|
33 |
|
williamr@2
|
34 |
template<class Archive, class OEL, class VL, class D,
|
williamr@2
|
35 |
class VP, class EP, class GP, class EL>
|
williamr@2
|
36 |
inline void save(
|
williamr@2
|
37 |
Archive & ar,
|
williamr@2
|
38 |
const boost::adjacency_list<OEL,VL,D,VP,EP,GP,EL> &graph,
|
williamr@2
|
39 |
const unsigned int /* file_version */
|
williamr@2
|
40 |
){
|
williamr@2
|
41 |
typedef adjacency_list<OEL,VL,D,VP,EP,GP,EL> Graph;
|
williamr@2
|
42 |
typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
|
williamr@2
|
43 |
|
williamr@2
|
44 |
int V = num_vertices(graph);
|
williamr@2
|
45 |
int E = num_edges(graph);
|
williamr@2
|
46 |
ar << BOOST_SERIALIZATION_NVP(V);
|
williamr@2
|
47 |
ar << BOOST_SERIALIZATION_NVP(E);
|
williamr@2
|
48 |
|
williamr@2
|
49 |
// assign indices to vertices
|
williamr@2
|
50 |
std::map<Vertex,int> indices;
|
williamr@2
|
51 |
int num = 0;
|
williamr@2
|
52 |
typename graph_traits<Graph>::vertex_iterator vi;
|
williamr@2
|
53 |
for (vi = vertices(graph).first; vi != vertices(graph).second; ++vi) {
|
williamr@2
|
54 |
indices[*vi] = num++;
|
williamr@2
|
55 |
ar << serialization::make_nvp("vertex_property", get(vertex_all_t(), graph, *vi) );
|
williamr@2
|
56 |
}
|
williamr@2
|
57 |
|
williamr@2
|
58 |
// write edges
|
williamr@2
|
59 |
typename graph_traits<Graph>::edge_iterator ei;
|
williamr@2
|
60 |
for (ei = edges(graph).first; ei != edges(graph).second; ++ei){
|
williamr@2
|
61 |
ar << serialization::make_nvp("u" , indices[source(*ei,graph)]);
|
williamr@2
|
62 |
ar << serialization::make_nvp("v" , indices[target(*ei,graph)]);
|
williamr@2
|
63 |
ar << serialization::make_nvp("edge_property", get(edge_all_t(), graph, *ei) );
|
williamr@2
|
64 |
}
|
williamr@2
|
65 |
}
|
williamr@2
|
66 |
|
williamr@2
|
67 |
|
williamr@2
|
68 |
template<class Archive, class OEL, class VL, class D,
|
williamr@2
|
69 |
class VP, class EP, class GP, class EL>
|
williamr@2
|
70 |
inline void load(
|
williamr@2
|
71 |
Archive & ar,
|
williamr@2
|
72 |
boost::adjacency_list<OEL,VL,D,VP,EP,GP,EL> &graph,
|
williamr@2
|
73 |
const unsigned int /* file_version */
|
williamr@2
|
74 |
){
|
williamr@2
|
75 |
typedef adjacency_list<OEL,VL,D,VP,EP,GP,EL> Graph;
|
williamr@2
|
76 |
typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
|
williamr@2
|
77 |
typedef typename graph_traits<Graph>::edge_descriptor Edge;
|
williamr@2
|
78 |
|
williamr@2
|
79 |
unsigned int V;
|
williamr@2
|
80 |
ar >> BOOST_SERIALIZATION_NVP(V);
|
williamr@2
|
81 |
unsigned int E;
|
williamr@2
|
82 |
ar >> BOOST_SERIALIZATION_NVP(E);
|
williamr@2
|
83 |
|
williamr@2
|
84 |
std::vector<Vertex> verts(V);
|
williamr@2
|
85 |
int i = 0;
|
williamr@2
|
86 |
while(V-- > 0){
|
williamr@2
|
87 |
Vertex v = add_vertex(graph);
|
williamr@2
|
88 |
verts[i++] = v;
|
williamr@2
|
89 |
ar >> serialization::make_nvp("vertex_property", get(vertex_all_t(), graph, v) );
|
williamr@2
|
90 |
}
|
williamr@2
|
91 |
while(E-- > 0){
|
williamr@2
|
92 |
int u; int v;
|
williamr@2
|
93 |
ar >> BOOST_SERIALIZATION_NVP(u);
|
williamr@2
|
94 |
ar >> BOOST_SERIALIZATION_NVP(v);
|
williamr@2
|
95 |
Edge e; bool inserted;
|
williamr@2
|
96 |
tie(e,inserted) = add_edge(verts[u], verts[v], graph);
|
williamr@2
|
97 |
ar >> serialization::make_nvp("edge_property", get(edge_all_t(), graph, e) );
|
williamr@2
|
98 |
}
|
williamr@2
|
99 |
}
|
williamr@2
|
100 |
|
williamr@2
|
101 |
template<class Archive, class OEL, class VL, class D, class VP, class EP, class GP, class EL>
|
williamr@2
|
102 |
inline void serialize(
|
williamr@2
|
103 |
Archive & ar,
|
williamr@2
|
104 |
boost::adjacency_list<OEL,VL,D,VP,EP,GP,EL> &graph,
|
williamr@2
|
105 |
const unsigned int file_version
|
williamr@2
|
106 |
){
|
williamr@2
|
107 |
boost::serialization::split_free(ar, graph, file_version);
|
williamr@2
|
108 |
}
|
williamr@2
|
109 |
|
williamr@2
|
110 |
}//serialization
|
williamr@2
|
111 |
}//boost
|
williamr@2
|
112 |
|
williamr@2
|
113 |
|
williamr@2
|
114 |
#endif // ADJ_LIST_SERIALIZE_HPP
|