Chris@16: #ifndef POSIX_TIME_SERIALIZE_HPP___ Chris@16: #define POSIX_TIME_SERIALIZE_HPP___ Chris@16: Chris@16: /* Copyright (c) 2004-2005 CrystalClear Software, Inc. Chris@16: * Use, modification and distribution is subject to the Chris@16: * Boost Software License, Version 1.0. (See accompanying Chris@16: * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) Chris@16: * Author: Jeff Garland, Bart Garst Chris@101: * $Date$ Chris@16: */ Chris@16: Chris@16: #include "boost/date_time/posix_time/posix_time.hpp" Chris@16: #include "boost/date_time/gregorian/greg_serialize.hpp" Chris@16: #include "boost/serialization/split_free.hpp" Chris@16: #include "boost/serialization/nvp.hpp" Chris@16: Chris@16: Chris@16: // macros to split serialize functions into save & load functions Chris@16: // NOTE: these macros define template functions in the boost::serialization namespace. Chris@16: // They must be expanded *outside* of any namespace Chris@16: BOOST_SERIALIZATION_SPLIT_FREE(boost::posix_time::ptime) Chris@16: BOOST_SERIALIZATION_SPLIT_FREE(boost::posix_time::time_duration) Chris@16: BOOST_SERIALIZATION_SPLIT_FREE(boost::posix_time::time_period) Chris@16: Chris@16: namespace boost { Chris@16: namespace serialization { Chris@16: Chris@16: Chris@16: /*** time_duration ***/ Chris@16: Chris@16: //! Function to save posix_time::time_duration objects using serialization lib Chris@16: /*! time_duration objects are broken down into 4 parts for serialization: Chris@16: * types are hour_type, min_type, sec_type, and fractional_seconds_type Chris@16: * as defined in the time_duration class Chris@16: */ Chris@16: template Chris@16: void save(Archive & ar, Chris@16: const posix_time::time_duration& td, Chris@16: unsigned int /*version*/) Chris@16: { Chris@16: // serialize a bool so we know how to read this back in later Chris@16: bool is_special = td.is_special(); Chris@16: ar & make_nvp("is_special", is_special); Chris@16: if(is_special) { Chris@16: std::string s = to_simple_string(td); Chris@16: ar & make_nvp("sv_time_duration", s); Chris@16: } Chris@16: else { Chris@16: posix_time::time_duration::hour_type h = td.hours(); Chris@16: posix_time::time_duration::min_type m = td.minutes(); Chris@16: posix_time::time_duration::sec_type s = td.seconds(); Chris@16: posix_time::time_duration::fractional_seconds_type fs = td.fractional_seconds(); Chris@16: ar & make_nvp("time_duration_hours", h); Chris@16: ar & make_nvp("time_duration_minutes", m); Chris@16: ar & make_nvp("time_duration_seconds", s); Chris@16: ar & make_nvp("time_duration_fractional_seconds", fs); Chris@16: } Chris@16: } Chris@16: Chris@16: //! Function to load posix_time::time_duration objects using serialization lib Chris@16: /*! time_duration objects are broken down into 4 parts for serialization: Chris@16: * types are hour_type, min_type, sec_type, and fractional_seconds_type Chris@16: * as defined in the time_duration class Chris@16: */ Chris@16: template Chris@16: void load(Archive & ar, Chris@16: posix_time::time_duration & td, Chris@16: unsigned int /*version*/) Chris@16: { Chris@16: bool is_special = false; Chris@16: ar & make_nvp("is_special", is_special); Chris@16: if(is_special) { Chris@16: std::string s; Chris@16: ar & make_nvp("sv_time_duration", s); Chris@16: posix_time::special_values sv = gregorian::special_value_from_string(s); Chris@16: td = posix_time::time_duration(sv); Chris@16: } Chris@16: else { Chris@16: posix_time::time_duration::hour_type h(0); Chris@16: posix_time::time_duration::min_type m(0); Chris@16: posix_time::time_duration::sec_type s(0); Chris@16: posix_time::time_duration::fractional_seconds_type fs(0); Chris@16: ar & make_nvp("time_duration_hours", h); Chris@16: ar & make_nvp("time_duration_minutes", m); Chris@16: ar & make_nvp("time_duration_seconds", s); Chris@16: ar & make_nvp("time_duration_fractional_seconds", fs); Chris@16: td = posix_time::time_duration(h,m,s,fs); Chris@16: } Chris@16: } Chris@16: Chris@16: // no load_construct_data function provided as time_duration provides a Chris@16: // default constructor Chris@16: Chris@16: /*** ptime ***/ Chris@16: Chris@16: //! Function to save posix_time::ptime objects using serialization lib Chris@16: /*! ptime objects are broken down into 2 parts for serialization: Chris@16: * a date object and a time_duration onject Chris@16: */ Chris@16: template Chris@16: void save(Archive & ar, Chris@16: const posix_time::ptime& pt, Chris@16: unsigned int /*version*/) Chris@16: { Chris@16: // from_iso_string does not include fractional seconds Chris@16: // therefore date and time_duration are used Chris@16: posix_time::ptime::date_type d = pt.date(); Chris@16: ar & make_nvp("ptime_date", d); Chris@16: if(!pt.is_special()) { Chris@16: posix_time::ptime::time_duration_type td = pt.time_of_day(); Chris@16: ar & make_nvp("ptime_time_duration", td); Chris@16: } Chris@16: } Chris@16: Chris@16: //! Function to load posix_time::ptime objects using serialization lib Chris@16: /*! ptime objects are broken down into 2 parts for serialization: Chris@16: * a date object and a time_duration onject Chris@16: */ Chris@16: template Chris@16: void load(Archive & ar, Chris@16: posix_time::ptime & pt, Chris@16: unsigned int /*version*/) Chris@16: { Chris@16: // from_iso_string does not include fractional seconds Chris@16: // therefore date and time_duration are used Chris@16: posix_time::ptime::date_type d(posix_time::not_a_date_time); Chris@16: posix_time::ptime::time_duration_type td; Chris@16: ar & make_nvp("ptime_date", d); Chris@16: if(!d.is_special()) { Chris@16: ar & make_nvp("ptime_time_duration", td); Chris@16: pt = boost::posix_time::ptime(d,td); Chris@16: } Chris@16: else { Chris@16: pt = boost::posix_time::ptime(d.as_special()); Chris@16: } Chris@16: Chris@16: } Chris@16: Chris@16: //!override needed b/c no default constructor Chris@16: template Chris@16: inline void load_construct_data(Archive & /*ar*/, Chris@16: posix_time::ptime* pt, Chris@16: const unsigned int /*file_version*/) Chris@16: { Chris@16: // retrieve data from archive required to construct new Chris@16: // invoke inplace constructor to initialize instance of date Chris@16: new(pt) boost::posix_time::ptime(boost::posix_time::not_a_date_time); Chris@16: } Chris@16: Chris@16: /*** time_period ***/ Chris@16: Chris@16: //! Function to save posix_time::time_period objects using serialization lib Chris@16: /*! time_period objects are broken down into 2 parts for serialization: Chris@16: * a begining ptime object and an ending ptime object Chris@16: */ Chris@16: template Chris@16: void save(Archive & ar, Chris@16: const posix_time::time_period& tp, Chris@16: unsigned int /*version*/) Chris@16: { Chris@16: posix_time::ptime beg(tp.begin().date(), tp.begin().time_of_day()); Chris@16: posix_time::ptime end(tp.end().date(), tp.end().time_of_day()); Chris@16: ar & make_nvp("time_period_begin", beg); Chris@16: ar & make_nvp("time_period_end", end); Chris@16: } Chris@16: Chris@16: //! Function to load posix_time::time_period objects using serialization lib Chris@16: /*! time_period objects are broken down into 2 parts for serialization: Chris@16: * a begining ptime object and an ending ptime object Chris@16: */ Chris@16: template Chris@16: void load(Archive & ar, Chris@16: boost::posix_time::time_period & tp, Chris@16: unsigned int /*version*/) Chris@16: { Chris@16: posix_time::time_duration td(1,0,0); Chris@16: gregorian::date d(gregorian::not_a_date_time); Chris@16: posix_time::ptime beg(d,td); Chris@16: posix_time::ptime end(d,td); Chris@16: ar & make_nvp("time_period_begin", beg); Chris@16: ar & make_nvp("time_period_end", end); Chris@16: tp = boost::posix_time::time_period(beg, end); Chris@16: } Chris@16: Chris@16: //!override needed b/c no default constructor Chris@16: template Chris@16: inline void load_construct_data(Archive & /*ar*/, Chris@16: boost::posix_time::time_period* tp, Chris@16: const unsigned int /*file_version*/) Chris@16: { Chris@16: posix_time::time_duration td(1,0,0); Chris@16: gregorian::date d(gregorian::not_a_date_time); Chris@16: posix_time::ptime beg(d,td); Chris@16: posix_time::ptime end(d,td); Chris@16: new(tp) boost::posix_time::time_period(beg,end); Chris@16: } Chris@16: Chris@16: } // namespace serialization Chris@16: } // namespace boost Chris@16: Chris@16: #endif