| //======================================================================= |
| // Copyright 2005 Jeremy G. Siek |
| // Authors: Jeremy G. Siek |
| // |
| // Distributed under the Boost Software License, Version 1.0. (See |
| // accompanying file LICENSE_1_0.txt or copy at |
| // http://www.boost.org/LICENSE_1_0.txt) |
| //======================================================================= |
| #ifndef ADJ_LIST_SERIALIZE_HPP |
| #define ADJ_LIST_SERIALIZE_HPP |
| |
| #include <boost/graph/adjacency_list.hpp> |
| #include <boost/graph/iteration_macros.hpp> |
| #include <boost/pending/property_serialize.hpp> |
| #include <boost/config.hpp> |
| #include <boost/detail/workaround.hpp> |
| |
| #include <boost/serialization/collections_save_imp.hpp> |
| #include <boost/serialization/collections_load_imp.hpp> |
| #include <boost/serialization/split_free.hpp> |
| |
| namespace boost { |
| |
| namespace serialization { |
| |
| // Turn off tracking for adjacency_list. It's not polymorphic, and we |
| // need to do this to enable saving of non-const adjacency lists. |
| template<class OEL, class VL, class D, class VP, class EP, class GP, class EL> |
| struct tracking_level<boost::adjacency_list<OEL,VL,D,VP,EP,GP,EL> > { |
| typedef mpl::integral_c_tag tag; |
| typedef mpl::int_<track_never> type; |
| BOOST_STATIC_CONSTANT(int, value = tracking_level::type::value); |
| }; |
| |
| template<class Archive, class OEL, class VL, class D, |
| class VP, class EP, class GP, class EL> |
| inline void save( |
| Archive & ar, |
| const boost::adjacency_list<OEL,VL,D,VP,EP,GP,EL> &graph, |
| const unsigned int /* file_version */ |
| ){ |
| typedef adjacency_list<OEL,VL,D,VP,EP,GP,EL> Graph; |
| typedef typename graph_traits<Graph>::vertex_descriptor Vertex; |
| |
| int V = num_vertices(graph); |
| int E = num_edges(graph); |
| ar << BOOST_SERIALIZATION_NVP(V); |
| ar << BOOST_SERIALIZATION_NVP(E); |
| |
| // assign indices to vertices |
| std::map<Vertex,int> indices; |
| int num = 0; |
| BGL_FORALL_VERTICES_T(v, graph, Graph) { |
| indices[v] = num++; |
| ar << serialization::make_nvp("vertex_property", get(vertex_all_t(), graph, v) ); |
| } |
| |
| // write edges |
| BGL_FORALL_EDGES_T(e, graph, Graph) { |
| ar << serialization::make_nvp("u" , indices[source(e,graph)]); |
| ar << serialization::make_nvp("v" , indices[target(e,graph)]); |
| ar << serialization::make_nvp("edge_property", get(edge_all_t(), graph, e) ); |
| } |
| } |
| |
| |
| template<class Archive, class OEL, class VL, class D, |
| class VP, class EP, class GP, class EL> |
| inline void load( |
| Archive & ar, |
| boost::adjacency_list<OEL,VL,D,VP,EP,GP,EL> &graph, |
| const unsigned int /* file_version */ |
| ){ |
| typedef adjacency_list<OEL,VL,D,VP,EP,GP,EL> Graph; |
| typedef typename graph_traits<Graph>::vertex_descriptor Vertex; |
| typedef typename graph_traits<Graph>::edge_descriptor Edge; |
| |
| unsigned int V; |
| ar >> BOOST_SERIALIZATION_NVP(V); |
| unsigned int E; |
| ar >> BOOST_SERIALIZATION_NVP(E); |
| |
| std::vector<Vertex> verts(V); |
| int i = 0; |
| while(V-- > 0){ |
| Vertex v = add_vertex(graph); |
| verts[i++] = v; |
| ar >> serialization::make_nvp("vertex_property", get(vertex_all_t(), graph, v) ); |
| } |
| while(E-- > 0){ |
| int u; int v; |
| ar >> BOOST_SERIALIZATION_NVP(u); |
| ar >> BOOST_SERIALIZATION_NVP(v); |
| Edge e; bool inserted; |
| boost::tie(e,inserted) = add_edge(verts[u], verts[v], graph); |
| ar >> serialization::make_nvp("edge_property", get(edge_all_t(), graph, e) ); |
| } |
| } |
| |
| template<class Archive, class OEL, class VL, class D, class VP, class EP, class GP, class EL> |
| inline void serialize( |
| Archive & ar, |
| boost::adjacency_list<OEL,VL,D,VP,EP,GP,EL> &graph, |
| const unsigned int file_version |
| ){ |
| boost::serialization::split_free(ar, graph, file_version); |
| } |
| |
| }//serialization |
| }//boost |
| |
| |
| #endif // ADJ_LIST_SERIALIZE_HPP |