#ifndef POSIX_TIME_PRE133_OPERATORS_HPP___ | |
#define POSIX_TIME_PRE133_OPERATORS_HPP___ | |
/* Copyright (c) 2002-2004 CrystalClear Software, Inc. | |
* Use, modification and distribution is subject to the | |
* Boost Software License, Version 1.0. (See accompanying | |
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) | |
* Author: Jeff Garland, Bart Garst | |
* $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $ | |
*/ | |
/*! @file posix_time_pre133_operators.hpp | |
* These input and output operators are for use with the | |
* pre 1.33 version of the date_time libraries io facet code. | |
* The operators used in version 1.33 and later can be found | |
* in posix_time_io.hpp */ | |
#include <iostream> | |
#include <string> | |
#include <sstream> | |
#include "boost/date_time/compiler_config.hpp" | |
#include "boost/date_time/gregorian/gregorian.hpp" | |
#include "boost/date_time/posix_time/posix_time_duration.hpp" | |
#include "boost/date_time/posix_time/ptime.hpp" | |
#include "boost/date_time/posix_time/time_period.hpp" | |
#include "boost/date_time/time_parsing.hpp" | |
namespace boost { | |
namespace posix_time { | |
//The following code is removed for configurations with poor std::locale support (eg: MSVC6, gcc 2.9x) | |
#ifndef BOOST_DATE_TIME_NO_LOCALE | |
#if defined(USE_DATE_TIME_PRE_1_33_FACET_IO) | |
//! ostream operator for posix_time::time_duration | |
template <class charT, class traits> | |
inline | |
std::basic_ostream<charT, traits>& | |
operator<<(std::basic_ostream<charT, traits>& os, const time_duration& td) | |
{ | |
typedef boost::date_time::ostream_time_duration_formatter<time_duration, charT> duration_formatter; | |
duration_formatter::duration_put(td, os); | |
return os; | |
} | |
//! ostream operator for posix_time::ptime | |
template <class charT, class traits> | |
inline | |
std::basic_ostream<charT, traits>& | |
operator<<(std::basic_ostream<charT, traits>& os, const ptime& t) | |
{ | |
typedef boost::date_time::ostream_time_formatter<ptime, charT> time_formatter; | |
time_formatter::time_put(t, os); | |
return os; | |
} | |
//! ostream operator for posix_time::time_period | |
template <class charT, class traits> | |
inline | |
std::basic_ostream<charT, traits>& | |
operator<<(std::basic_ostream<charT, traits>& os, const time_period& tp) | |
{ | |
typedef boost::date_time::ostream_time_period_formatter<time_period, charT> period_formatter; | |
period_formatter::period_put(tp, os); | |
return os; | |
} | |
#endif // USE_DATE_TIME_PRE_1_33_FACET_IO | |
/******** input streaming ********/ | |
template<class charT> | |
inline | |
std::basic_istream<charT>& operator>>(std::basic_istream<charT>& is, time_duration& td) | |
{ | |
// need to create a std::string and parse it | |
std::basic_string<charT> inp_s; | |
std::stringstream out_ss; | |
is >> inp_s; | |
typename std::basic_string<charT>::iterator b = inp_s.begin(); | |
// need to use both iterators because there is no requirement | |
// for the data held by a std::basic_string<> be terminated with | |
// any marker (such as '\0'). | |
typename std::basic_string<charT>::iterator e = inp_s.end(); | |
while(b != e){ | |
out_ss << out_ss.narrow(*b, 0); | |
++b; | |
} | |
td = date_time::parse_delimited_time_duration<time_duration>(out_ss.str()); | |
return is; | |
} | |
template<class charT> | |
inline | |
std::basic_istream<charT>& operator>>(std::basic_istream<charT>& is, ptime& pt) | |
{ | |
gregorian::date d(not_a_date_time); | |
time_duration td(0,0,0); | |
is >> d >> td; | |
pt = ptime(d, td); | |
return is; | |
} | |
/** operator>> for time_period. time_period must be in | |
* "[date time_duration/date time_duration]" format. */ | |
template<class charT> | |
inline | |
std::basic_istream<charT>& operator>>(std::basic_istream<charT>& is, time_period& tp) | |
{ | |
gregorian::date d(not_a_date_time); | |
time_duration td(0,0,0); | |
ptime beg(d, td); | |
ptime end(beg); | |
std::basic_string<charT> s; | |
// get first date string and remove leading '[' | |
is >> s; | |
{ | |
std::basic_stringstream<charT> ss; | |
ss << s.substr(s.find('[')+1); | |
ss >> d; | |
} | |
// get first time_duration & second date string, remove the '/' | |
// and split into 2 strings | |
is >> s; | |
{ | |
std::basic_stringstream<charT> ss; | |
ss << s.substr(0, s.find('/')); | |
ss >> td; | |
} | |
beg = ptime(d, td); | |
{ | |
std::basic_stringstream<charT> ss; | |
ss << s.substr(s.find('/')+1); | |
ss >> d; | |
} | |
// get last time_duration and remove the trailing ']' | |
is >> s; | |
{ | |
std::basic_stringstream<charT> ss; | |
ss << s.substr(0, s.find(']')); | |
ss >> td; | |
} | |
end = ptime(d, td); | |
tp = time_period(beg,end); | |
return is; | |
} | |
#endif //BOOST_DATE_TIME_NO_LOCALE | |
} } // namespaces | |
#endif // POSIX_TIME_PRE133_OPERATORS_HPP___ |