123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- //=======================================================================
- // 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 BOOST_GRAPH_ADJ_LIST_SERIALIZE_HPP
- #define BOOST_GRAPH_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 // BOOST_GRAPH_ADJ_LIST_SERIALIZE_HPP
|