/////////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 #include #include #include #include // remove #include #if defined(BOOST_NO_STDC_NAMESPACE) namespace std{ using ::remove; } #endif #include #include #include #include #include #include #include "bus.h" void save_schedule(const bus_schedule &s, const char * filename){ // make an archive std::ofstream ofs(filename); assert(ofs.good()); boost::archive::binary_oarchive oa(ofs); //boost::archive::xml_oarchive oa(ofs); oa << BOOST_SERIALIZATION_NVP(s); } void restore_schedule(bus_schedule &s, const char * filename) { // open the archive std::ifstream ifs(filename); assert(ifs.good()); boost::archive::binary_iarchive ia(ifs); // boost::archive::xml_iarchive ia(ifs); // restore the schedule from the archive ia >> BOOST_SERIALIZATION_NVP(s); } void save_mapSchedule(const std::map &s, const char * filename){ // make an archive std::ofstream ofs(filename); assert(ofs.good()); boost::archive::binary_oarchive oa(ofs); // boost::archive::xml_oarchive oa(ofs); oa << BOOST_SERIALIZATION_NVP(s); } void restore_mapSchedule(std::map &s, const char * filename) { // open the archive std::ifstream ifs(filename); assert(ifs.good()); boost::archive::binary_iarchive ia(ifs); // boost::archive::xml_iarchive ia(ifs); // restore the schedule from the archive ia >> BOOST_SERIALIZATION_NVP(s); } int main(int argc, char *argv[]) { // make the schedule bus_schedule original_schedule; // fill in the data // make a few stops 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" ); // 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 schedule save_schedule(original_schedule, filename.c_str()); // ... some time later // make a new schedule bus_schedule new_schedule; restore_schedule(new_schedule, filename.c_str()); // make a map of schedule std::map mapSchedule; for (int i=0; i<1000; i++){ bus_schedule mySchedule; restore_schedule(mySchedule, filename.c_str()); std::pair pair(i,mySchedule); mapSchedule.insert(mapSchedule.end(),pair); } // save the map save_mapSchedule(mapSchedule,"file.bin"); // create a new map std::map newmapSchedule; // restore restore_mapSchedule(newmapSchedule,"file.bin"); // 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; return 0; }