// Copyright (C) 2006 Trustees of Indiana University
//
// 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)

#include <boost/config.hpp>
#include <iostream>
#include <fstream>
#include <string>
#include <boost/tuple/tuple.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/visitors.hpp>
#include <boost/graph/breadth_first_search.hpp>
#include <map>
#include <boost/graph/adj_list_serialize.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>

struct vertex_properties
{
    std::string name;

    template < class Archive >
    void serialize(Archive& ar, const unsigned int /*version*/)
    {
        ar& BOOST_SERIALIZATION_NVP(name);
    }
};

struct edge_properties
{
    std::string name;

    template < class Archive >
    void serialize(Archive& ar, const unsigned int /*version*/)
    {
        ar& BOOST_SERIALIZATION_NVP(name);
    }
};

using namespace boost;

typedef adjacency_list< vecS, vecS, undirectedS, vertex_properties,
    edge_properties >
    Graph;

typedef graph_traits< Graph >::vertex_descriptor vd_type;

typedef adjacency_list< vecS, vecS, undirectedS, vertex_properties >
    Graph_no_edge_property;

int main()
{
    {
        std::ofstream ofs("./kevin-bacon2.dat");
        archive::xml_oarchive oa(ofs);
        Graph g;
        vertex_properties vp;
        vp.name = "A";
        vd_type A = add_vertex(vp, g);
        vp.name = "B";
        vd_type B = add_vertex(vp, g);

        edge_properties ep;
        ep.name = "a";
        add_edge(A, B, ep, g);

        oa << BOOST_SERIALIZATION_NVP(g);

        Graph_no_edge_property g_n;
        oa << BOOST_SERIALIZATION_NVP(g_n);
    }

    {
        std::ifstream ifs("./kevin-bacon2.dat");
        archive::xml_iarchive ia(ifs);
        Graph g;
        ia >> BOOST_SERIALIZATION_NVP(g);

        if (!(g[*(vertices(g).first)].name == "A"))
            return -1;

        Graph_no_edge_property g_n;
        ia >> BOOST_SERIALIZATION_NVP(g_n);
    }
    return 0;
}
