1/2/3/4/5/6/7/8//// demo_xml.cpp//// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .// Use, modification and distribution is subject to 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<iomanip>#include<iostream>#include<fstream>#include<string>#include<cstdio>// remove#include<boost/config.hpp>#ifdefined(BOOST_NO_STDC_NAMESPACE)namespace std{using::remove;}#endif#include<boost/archive/tmpdir.hpp>#include<boost/archive/xml_iarchive.hpp>#include<boost/archive/xml_oarchive.hpp>#include"demo_gps.hpp"voidsave_schedule(const bus_schedule &s,constchar* filename){// make an archive
std::ofstream ofs(filename);assert(ofs.good());
boost::archive::xml_oarchive oa(ofs);
oa <<BOOST_SERIALIZATION_NVP(s);}voidrestore_schedule(bus_schedule &s,constchar* filename){// open the archive
std::ifstream ifs(filename);assert(ifs.good());
boost::archive::xml_iarchive ia(ifs);// restore the schedule from the archive
ia >>BOOST_SERIALIZATION_NVP(s);}intmain(int argc,char*argv[]){// make the schedule
bus_schedule original_schedule;// fill in the data// make a few stops
bus_stop *bs0 =newbus_stop_corner(gps_position(34,135,52.560f),gps_position(134,22,78.30f),"24th Street","10th Avenue");
bus_stop *bs1 =newbus_stop_corner(gps_position(35,137,23.456f),gps_position(133,35,54.12f),"State street","Cathedral Vista Lane");
bus_stop *bs2 =newbus_stop_destination(gps_position(35,136,15.456f),gps_position(133,32,15.300f),"White House");
bus_stop *bs3 =newbus_stop_destination(gps_position(35,134,48.789f),gps_position(133,32,16.230f),"Lincoln Memorial");// make a routes
bus_route route0;
route0.append(bs0);
route0.append(bs1);
route0.append(bs2);// add trips to schedule
original_schedule.append("bob",6,24,&route0);
original_schedule.append("bob",9,57,&route0);
original_schedule.append("alice",11,02,&route0);// make aother routes
bus_route route1;
route1.append(bs3);
route1.append(bs2);
route1.append(bs1);// add trips to schedule
original_schedule.append("ted",7,17,&route1);
original_schedule.append("ted",9,38,&route1);
original_schedule.append("alice",11,47,&route1);// display the complete schedule
std::cout <<"original schedule";
std::cout << original_schedule;
std::string filename(boost::archive::tmpdir());
filename +="/demo.xml";// save the schedulesave_schedule(original_schedule, filename.c_str());// ... some time later// make a new schedule
bus_schedule new_schedule;restore_schedule(new_schedule, filename.c_str());// and display
std::cout <<"\nrestored schedule";
std::cout << new_schedule;// should be the same as the old one. (except for the pointer values)
std::remove(filename.c_str());delete bs0;delete bs1;delete bs2;delete bs3;return0;}