EVOLUTION-MANAGER
Edit File: adj_list_serialize.hpp
//======================================================================= // 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) ); } ar << serialization::make_nvp("graph_property", get_property(graph, graph_all_t()) ); } 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) ); } ar >> serialization::make_nvp("graph_property", get_property(graph, graph_all_t()) ); } 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