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