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