demo_xml.cpp
#include
#include
#include
#include
#include
#include
#if defined(BOOST_NO_STDC_NAMESPACE)
namespace std{
using ::remove;
}
#endif
#include
#include
#include
#include "demo_gps.hpp"
void save_schedule(const bus_schedule &s, const char * filename){
std::ofstream ofs(filename);
assert(ofs.good());
boost::archive::xml_oarchive oa(ofs);
oa << BOOST_SERIALIZATION_NVP(s);
}
void
restore_schedule(bus_schedule &s, const char * filename)
{
std::ifstream ifs(filename);
assert(ifs.good());
boost::archive::xml_iarchive ia(ifs);
ia >> BOOST_SERIALIZATION_NVP(s);
}
int main(int argc, char *argv[])
{
bus_schedule original_schedule;
bus_stop *bs0 = new bus_stop_corner(
gps_position(34, 135, 52.560f),
gps_position(134, 22, 78.30f),
"24th Street", "10th Avenue"
);
bus_stop *bs1 = new bus_stop_corner(
gps_position(35, 137, 23.456f),
gps_position(133, 35, 54.12f),
"State street", "Cathedral Vista Lane"
);
bus_stop *bs2 = new bus_stop_destination(
gps_position(35, 136, 15.456f),
gps_position(133, 32, 15.300f),
"White House"
);
bus_stop *bs3 = new bus_stop_destination(
gps_position(35, 134, 48.789f),
gps_position(133, 32, 16.230f),
"Lincoln Memorial"
);
bus_route route0;
route0.append(bs0);
route0.append(bs1);
route0.append(bs2);
original_schedule.append("bob", 6, 24, &route0);
original_schedule.append("bob", 9, 57, &route0);
original_schedule.append("alice", 11, 02, &route0);
bus_route route1;
route1.append(bs3);
route1.append(bs2);
route1.append(bs1);
original_schedule.append("ted", 7, 17, &route1);
original_schedule.append("ted", 9, 38, &route1);
original_schedule.append("alice", 11, 47, &route1);
std::cout << "original schedule";
std::cout << original_schedule;
std::string filename(boost::archive::tmpdir());
filename += "/demo.xml";
save_schedule(original_schedule, filename.c_str());
bus_schedule new_schedule;
restore_schedule(new_schedule, filename.c_str());
std::cout << "\nrestored schedule";
std::cout << new_schedule;
std::remove(filename.c_str());
delete bs0;
delete bs1;
delete bs2;
delete bs3;
return 0;
}
demo_gps.hpp
#ifndef BOOST_SERIALIZATION_EXAMPLE_DEMO_GPS_HPP
#define BOOST_SERIALIZATION_EXAMPLE_DEMO_GPS_HPP
#include
#include
#include
#include
#include
#include
#include
#include
#include
class gps_position
{
friend class boost::serialization::access;
friend std::ostream & operator<<(std::ostream &os, const gps_position &gp);
int degrees;
int minutes;
float seconds;
template<class Archive>
void serialize(Archive & ar, const unsigned int ){
ar & BOOST_SERIALIZATION_NVP(degrees)
& BOOST_SERIALIZATION_NVP(minutes)
& BOOST_SERIALIZATION_NVP(seconds);
}
public:
gps_position(){};
gps_position(int _d, int _m, float _s) :
degrees(_d), minutes(_m), seconds(_s)
{}
};
std::ostream & operator<<(std::ostream &os, const gps_position &gp)
{
return os << ' ' << gp.degrees << (unsigned char)186 << gp.minutes << '\'' << gp.seconds << '"';
}
class bus_stop
{
friend class boost::serialization::access;
virtual std::string description() const = 0;
gps_position latitude;
gps_position longitude;
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & BOOST_SERIALIZATION_NVP(latitude);
ar & BOOST_SERIALIZATION_NVP(longitude);
}
protected:
bus_stop(const gps_position & _lat, const gps_position & _long) :
latitude(_lat), longitude(_long)
{}
public:
bus_stop(){}
friend std::ostream & operator<<(std::ostream &os, const bus_stop &gp);
virtual ~bus_stop(){}
};
BOOST_SERIALIZATION_ASSUME_ABSTRACT(bus_stop)
std::ostream & operator<<(std::ostream &os, const bus_stop &bs)
{
return os << bs.latitude << bs.longitude << ' ' << bs.description();
}
class bus_stop_corner : public bus_stop
{
friend class boost::serialization::access;
std::string street1;
std::string street2;
virtual std::string description() const
{
return street1 + " and " + street2;
}
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(bus_stop);
ar & BOOST_SERIALIZATION_NVP(street1);
ar & BOOST_SERIALIZATION_NVP(street2);
}
public:
bus_stop_corner(){}
bus_stop_corner(const gps_position & _lat, const gps_position & _long,
const std::string & _s1, const std::string & _s2
) :
bus_stop(_lat, _long), street1(_s1), street2(_s2)
{
}
};
class bus_stop_destination : public bus_stop
{
friend class boost::serialization::access;
std::string name;
virtual std::string description() const
{
return name;
}
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(bus_stop)
& BOOST_SERIALIZATION_NVP(name);
}
public:
bus_stop_destination(){}
bus_stop_destination(
const gps_position & _lat, const gps_position & _long, const std::string & _name
) :
bus_stop(_lat, _long), name(_name)
{
}
};
class bus_route
{
friend class boost::serialization::access;
friend std::ostream & operator<<(std::ostream &os, const bus_route &br);
typedef bus_stop * bus_stop_pointer;
std::list<bus_stop_pointer> stops;
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar.register_type(static_cast<bus_stop_corner *>(NULL));
ar.register_type(static_cast<bus_stop_destination *>(NULL));
ar & BOOST_SERIALIZATION_NVP(stops);
}
public:
bus_route(){}
void append(bus_stop *_bs)
{
stops.insert(stops.end(), _bs);
}
};
std::ostream & operator<<(std::ostream &os, const bus_route &br)
{
std::list<bus_stop *>::const_iterator it;
for(it = br.stops.begin(); it != br.stops.end(); it++){
os << '\n' << std::hex << "0x" << *it << std::dec << ' ' << **it;
}
return os;
}
class bus_schedule
{
friend class boost::serialization::access;
friend std::ostream & operator<<(std::ostream &os, const bus_schedule &bs);
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & BOOST_SERIALIZATION_NVP(schedule);
}
public:
struct trip_info
{
template<class Archive>
void serialize(Archive &ar, const unsigned int file_version)
{
if(file_version >= 2)
ar & BOOST_SERIALIZATION_NVP(driver);
ar & BOOST_SERIALIZATION_NVP(hour)
& BOOST_SERIALIZATION_NVP(minute);
}
int hour;
int minute;
std::string driver;
trip_info(){}
trip_info(int _h, int _m, const std::string &_d) :
hour(_h), minute(_m), driver(_d)
{}
~trip_info(){
}
};
private:
std::list<std::pair<trip_info, bus_route *> > schedule;
public:
void append(const std::string &_d, int _h, int _m, bus_route *_br)
{
schedule.insert(schedule.end(), std::make_pair(trip_info(_h, _m, _d), _br));
}
bus_schedule(){}
};
BOOST_CLASS_VERSION(bus_schedule::trip_info, 3)
BOOST_CLASS_VERSION(bus_schedule, 2)
std::ostream & operator<<(std::ostream &os, const bus_schedule::trip_info &ti)
{
return os << '\n' << ti.hour << ':' << ti.minute << ' ' << ti.driver << ' ';
}
std::ostream & operator<<(std::ostream &os, const bus_schedule &bs)
{
std::list<std::pair<bus_schedule::trip_info, bus_route *> >::const_iterator it;
for(it = bs.schedule.begin(); it != bs.schedule.end(); it++){
os << it->first << *(it->second);
}
return os;
}
#endif