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