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