1#ifndef POSIX_TIME_PRE133_OPERATORS_HPP___
2#define POSIX_TIME_PRE133_OPERATORS_HPP___
3
4/* Copyright (c) 2002-2004 CrystalClear Software, Inc.
5 * Use, modification and distribution is subject to the
6 * Boost Software License, Version 1.0. (See accompanying
7 * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
8 * Author: Jeff Garland, Bart Garst
9 * $Date$
10 */
11
12/*! @file posix_time_pre133_operators.hpp
13 * These input and output operators are for use with the
14 * pre 1.33 version of the date_time libraries io facet code.
15 * The operators used in version 1.33 and later can be found
16 * in posix_time_io.hpp */
17
18#include <iostream>
19#include <string>
20#include <sstream>
21#include "boost/date_time/compiler_config.hpp"
22#include "boost/date_time/gregorian/gregorian.hpp"
23#include "boost/date_time/posix_time/posix_time_duration.hpp"
24#include "boost/date_time/posix_time/ptime.hpp"
25#include "boost/date_time/posix_time/time_period.hpp"
26#include "boost/date_time/time_parsing.hpp"
27
28namespace boost {
29namespace posix_time {
30
31
32//The following code is removed for configurations with poor std::locale support (eg: MSVC6, gcc 2.9x)
33#ifndef BOOST_DATE_TIME_NO_LOCALE
34#if defined(USE_DATE_TIME_PRE_1_33_FACET_IO)
35 //! ostream operator for posix_time::time_duration
36 template <class charT, class traits>
37 inline
38 std::basic_ostream<charT, traits>&
39 operator<<(std::basic_ostream<charT, traits>& os, const time_duration& td)
40 {
41 typedef boost::date_time::ostream_time_duration_formatter<time_duration, charT> duration_formatter;
42 duration_formatter::duration_put(td, os);
43 return os;
44 }
45
46 //! ostream operator for posix_time::ptime
47 template <class charT, class traits>
48 inline
49 std::basic_ostream<charT, traits>&
50 operator<<(std::basic_ostream<charT, traits>& os, const ptime& t)
51 {
52 typedef boost::date_time::ostream_time_formatter<ptime, charT> time_formatter;
53 time_formatter::time_put(t, os);
54 return os;
55 }
56
57 //! ostream operator for posix_time::time_period
58 template <class charT, class traits>
59 inline
60 std::basic_ostream<charT, traits>&
61 operator<<(std::basic_ostream<charT, traits>& os, const time_period& tp)
62 {
63 typedef boost::date_time::ostream_time_period_formatter<time_period, charT> period_formatter;
64 period_formatter::period_put(tp, os);
65 return os;
66 }
67#endif // USE_DATE_TIME_PRE_1_33_FACET_IO
68/******** input streaming ********/
69 template<class charT>
70 inline
71 std::basic_istream<charT>& operator>>(std::basic_istream<charT>& is, time_duration& td)
72 {
73 // need to create a std::string and parse it
74 std::basic_string<charT> inp_s;
75 std::stringstream out_ss;
76 is >> inp_s;
77 typename std::basic_string<charT>::iterator b = inp_s.begin();
78 // need to use both iterators because there is no requirement
79 // for the data held by a std::basic_string<> be terminated with
80 // any marker (such as '\0').
81 typename std::basic_string<charT>::iterator e = inp_s.end();
82 while(b != e){
83 out_ss << is.narrow(*b, 0);
84 ++b;
85 }
86
87 td = date_time::parse_delimited_time_duration<time_duration>(s: out_ss.str());
88 return is;
89 }
90
91 template<class charT>
92 inline
93 std::basic_istream<charT>& operator>>(std::basic_istream<charT>& is, ptime& pt)
94 {
95 gregorian::date d(not_a_date_time);
96 time_duration td(0,0,0);
97 is >> d >> td;
98 pt = ptime(d, td);
99
100 return is;
101 }
102
103 /** operator>> for time_period. time_period must be in
104 * "[date time_duration/date time_duration]" format. */
105 template<class charT>
106 inline
107 std::basic_istream<charT>& operator>>(std::basic_istream<charT>& is, time_period& tp)
108 {
109 gregorian::date d(not_a_date_time);
110 time_duration td(0,0,0);
111 ptime beg(d, td);
112 ptime end(beg);
113 std::basic_string<charT> s;
114 // get first date string and remove leading '['
115 is >> s;
116 {
117 std::basic_stringstream<charT> ss;
118 ss << s.substr(s.find('[')+1);
119 ss >> d;
120 }
121 // get first time_duration & second date string, remove the '/'
122 // and split into 2 strings
123 is >> s;
124 {
125 std::basic_stringstream<charT> ss;
126 ss << s.substr(0, s.find('/'));
127 ss >> td;
128 }
129 beg = ptime(d, td);
130 {
131 std::basic_stringstream<charT> ss;
132 ss << s.substr(s.find('/')+1);
133 ss >> d;
134 }
135 // get last time_duration and remove the trailing ']'
136 is >> s;
137 {
138 std::basic_stringstream<charT> ss;
139 ss << s.substr(0, s.find(']'));
140 ss >> td;
141 }
142 end = ptime(d, td);
143
144 tp = time_period(beg,end);
145 return is;
146 }
147
148
149#endif //BOOST_DATE_TIME_NO_LOCALE
150
151} } // namespaces
152
153#endif // POSIX_TIME_PRE133_OPERATORS_HPP___
154

source code of boost/boost/date_time/posix_time/posix_time_legacy_io.hpp