1/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
2//
3// demo_xml.cpp
4//
5// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .
6// Use, modification and distribution is subject to the Boost Software
7// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
8// http://www.boost.org/LICENSE_1_0.txt)
9
10#include <iomanip>
11#include <iostream>
12#include <fstream>
13#include <string>
14
15#include <cstdio> // remove
16#include <boost/config.hpp>
17#if defined(BOOST_NO_STDC_NAMESPACE)
18namespace std{
19 using ::remove;
20}
21#endif
22
23#include <boost/archive/tmpdir.hpp>
24#include <boost/archive/xml_iarchive.hpp>
25#include <boost/archive/xml_oarchive.hpp>
26
27#include "demo_gps.hpp"
28
29void save_schedule(const bus_schedule &s, const char * filename){
30 // make an archive
31 std::ofstream ofs(filename);
32 assert(ofs.good());
33 boost::archive::xml_oarchive oa(ofs);
34 oa << BOOST_SERIALIZATION_NVP(s);
35}
36
37void
38restore_schedule(bus_schedule &s, const char * filename)
39{
40 // open the archive
41 std::ifstream ifs(filename);
42 assert(ifs.good());
43 boost::archive::xml_iarchive ia(ifs);
44
45 // restore the schedule from the archive
46 ia >> BOOST_SERIALIZATION_NVP(s);
47}
48
49int main(int argc, char *argv[])
50{
51 // make the schedule
52 bus_schedule original_schedule;
53
54 // fill in the data
55 // make a few stops
56 bus_stop *bs0 = new bus_stop_corner(
57 gps_position(34, 135, 52.560f),
58 gps_position(134, 22, 78.30f),
59 "24th Street", "10th Avenue"
60 );
61 bus_stop *bs1 = new bus_stop_corner(
62 gps_position(35, 137, 23.456f),
63 gps_position(133, 35, 54.12f),
64 "State street", "Cathedral Vista Lane"
65 );
66 bus_stop *bs2 = new bus_stop_destination(
67 gps_position(35, 136, 15.456f),
68 gps_position(133, 32, 15.300f),
69 "White House"
70 );
71 bus_stop *bs3 = new bus_stop_destination(
72 gps_position(35, 134, 48.789f),
73 gps_position(133, 32, 16.230f),
74 "Lincoln Memorial"
75 );
76
77 // make a route
78 bus_route route0;
79 route0.append(bs: bs0);
80 route0.append(bs: bs1);
81 route0.append(bs: bs2);
82
83 // add trips to schedule
84 original_schedule.append(d: "bob", h: 6, m: 24, br: &route0);
85 original_schedule.append(d: "bob", h: 9, m: 57, br: &route0);
86 original_schedule.append(d: "alice", h: 11, m: 02, br: &route0);
87
88 // make another route
89 bus_route route1;
90 route1.append(bs: bs3);
91 route1.append(bs: bs2);
92 route1.append(bs: bs1);
93
94 // add trips to schedule
95 original_schedule.append(d: "ted", h: 7, m: 17, br: &route1);
96 original_schedule.append(d: "ted", h: 9, m: 38, br: &route1);
97 original_schedule.append(d: "alice", h: 11, m: 47, br: &route1);
98
99 // display the complete schedule
100 std::cout << "original schedule";
101 std::cout << original_schedule;
102
103 std::string filename(boost::archive::tmpdir());
104 filename += "/demo.xml";
105
106 // save the schedule
107 save_schedule(s: original_schedule, filename: filename.c_str());
108
109 // ... some time later
110 // make a new schedule
111 bus_schedule new_schedule;
112
113 restore_schedule(s&: new_schedule, filename: filename.c_str());
114
115 // and display
116 std::cout << "\nrestored schedule";
117 std::cout << new_schedule;
118 // should be the same as the old one. (except for the pointer values)
119
120 std::remove(filename: filename.c_str());
121
122 delete bs0;
123 delete bs1;
124 delete bs2;
125 delete bs3;
126 return 0;
127}
128

source code of boost/libs/serialization/example/demo_xml.cpp