Line data Source code
1 : #ifndef DATE_TIME_POSIX_TIME_IO_HPP__
2 : #define DATE_TIME_POSIX_TIME_IO_HPP__
3 :
4 : /* Copyright (c) 2004-2005 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 : #include <locale>
13 : #include <iostream>
14 : #include <iterator> // i/ostreambuf_iterator
15 : #include <boost/io/ios_state.hpp>
16 : #include <boost/date_time/time_facet.hpp>
17 : #include <boost/date_time/period_formatter.hpp>
18 : #include <boost/date_time/posix_time/ptime.hpp>
19 : #include <boost/date_time/posix_time/time_period.hpp>
20 : #include <boost/date_time/posix_time/posix_time_duration.hpp>
21 : #include <boost/date_time/posix_time/conversion.hpp> // to_tm will be needed in the facets
22 :
23 : namespace boost {
24 : namespace posix_time {
25 :
26 :
27 : //! wptime_facet is depricated and will be phased out. use wtime_facet instead
28 : //typedef boost::date_time::time_facet<ptime, wchar_t> wptime_facet;
29 : //! ptime_facet is depricated and will be phased out. use time_facet instead
30 : //typedef boost::date_time::time_facet<ptime, char> ptime_facet;
31 :
32 : //! wptime_input_facet is depricated and will be phased out. use wtime_input_facet instead
33 : //typedef boost::date_time::time_input_facet<ptime,wchar_t> wptime_input_facet;
34 : //! ptime_input_facet is depricated and will be phased out. use time_input_facet instead
35 : //typedef boost::date_time::time_input_facet<ptime,char> ptime_input_facet;
36 :
37 : typedef boost::date_time::time_facet<ptime, wchar_t> wtime_facet;
38 : typedef boost::date_time::time_facet<ptime, char> time_facet;
39 :
40 : typedef boost::date_time::time_input_facet<ptime, wchar_t> wtime_input_facet;
41 : typedef boost::date_time::time_input_facet<ptime, char> time_input_facet;
42 :
43 : template <class CharT, class TraitsT>
44 : inline
45 : std::basic_ostream<CharT, TraitsT>&
46 0 : operator<<(std::basic_ostream<CharT, TraitsT>& os,
47 : const ptime& p) {
48 0 : boost::io::ios_flags_saver iflags(os);
49 : typedef boost::date_time::time_facet<ptime, CharT> custom_ptime_facet;
50 0 : std::ostreambuf_iterator<CharT> oitr(os);
51 0 : if (std::has_facet<custom_ptime_facet>(os.getloc()))
52 0 : std::use_facet<custom_ptime_facet>(os.getloc()).put(oitr, os, os.fill(), p);
53 : else {
54 : //instantiate a custom facet for dealing with times since the user
55 : //has not put one in the stream so far. This is for efficiency
56 : //since we would always need to reconstruct for every time period
57 : //if the locale did not already exist. Of course this will be overridden
58 : //if the user imbues as some later point.
59 0 : custom_ptime_facet* f = new custom_ptime_facet();
60 0 : std::locale l = std::locale(os.getloc(), f);
61 0 : os.imbue(l);
62 0 : f->put(oitr, os, os.fill(), p);
63 : }
64 0 : return os;
65 : }
66 :
67 : //! input operator for ptime
68 : template <class CharT, class Traits>
69 : inline
70 : std::basic_istream<CharT, Traits>&
71 : operator>>(std::basic_istream<CharT, Traits>& is, ptime& pt)
72 : {
73 : boost::io::ios_flags_saver iflags(is);
74 : typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
75 : if (strm_sentry) {
76 : try {
77 : typedef typename date_time::time_input_facet<ptime, CharT> time_input_facet_local;
78 : std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
79 : if(std::has_facet<time_input_facet_local>(is.getloc())) {
80 : std::use_facet<time_input_facet_local>(is.getloc()).get(sit, str_end, is, pt);
81 : }
82 : else {
83 : time_input_facet_local* f = new time_input_facet_local();
84 : std::locale l = std::locale(is.getloc(), f);
85 : is.imbue(l);
86 : f->get(sit, str_end, is, pt);
87 : }
88 : }
89 : catch(...) {
90 : // mask tells us what exceptions are turned on
91 : std::ios_base::iostate exception_mask = is.exceptions();
92 : // if the user wants exceptions on failbit, we'll rethrow our
93 : // date_time exception & set the failbit
94 : if(std::ios_base::failbit & exception_mask) {
95 : try { is.setstate(std::ios_base::failbit); }
96 : catch(std::ios_base::failure&) {} // ignore this one
97 : throw; // rethrow original exception
98 : }
99 : else {
100 : // if the user want's to fail quietly, we simply set the failbit
101 : is.setstate(std::ios_base::failbit);
102 : }
103 : }
104 : }
105 : return is;
106 : }
107 :
108 :
109 : template <class CharT, class TraitsT>
110 : inline
111 : std::basic_ostream<CharT, TraitsT>&
112 : operator<<(std::basic_ostream<CharT, TraitsT>& os,
113 : const boost::posix_time::time_period& p) {
114 : boost::io::ios_flags_saver iflags(os);
115 : typedef boost::date_time::time_facet<ptime, CharT> custom_ptime_facet;
116 : std::ostreambuf_iterator<CharT> oitr(os);
117 : if (std::has_facet<custom_ptime_facet>(os.getloc())) {
118 : std::use_facet<custom_ptime_facet>(os.getloc()).put(oitr, os, os.fill(), p);
119 : }
120 : else {
121 : //instantiate a custom facet for dealing with periods since the user
122 : //has not put one in the stream so far. This is for efficiency
123 : //since we would always need to reconstruct for every time period
124 : //if the local did not already exist. Of course this will be overridden
125 : //if the user imbues as some later point.
126 : custom_ptime_facet* f = new custom_ptime_facet();
127 : std::locale l = std::locale(os.getloc(), f);
128 : os.imbue(l);
129 : f->put(oitr, os, os.fill(), p);
130 : }
131 : return os;
132 : }
133 :
134 : //! input operator for time_period
135 : template <class CharT, class Traits>
136 : inline
137 : std::basic_istream<CharT, Traits>&
138 : operator>>(std::basic_istream<CharT, Traits>& is, time_period& tp)
139 : {
140 : boost::io::ios_flags_saver iflags(is);
141 : typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
142 : if (strm_sentry) {
143 : try {
144 : typedef typename date_time::time_input_facet<ptime, CharT> time_input_facet_local;
145 : std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
146 : if(std::has_facet<time_input_facet_local>(is.getloc())) {
147 : std::use_facet<time_input_facet_local>(is.getloc()).get(sit, str_end, is, tp);
148 : }
149 : else {
150 : time_input_facet_local* f = new time_input_facet_local();
151 : std::locale l = std::locale(is.getloc(), f);
152 : is.imbue(l);
153 : f->get(sit, str_end, is, tp);
154 : }
155 : }
156 : catch(...) {
157 : std::ios_base::iostate exception_mask = is.exceptions();
158 : if(std::ios_base::failbit & exception_mask) {
159 : try { is.setstate(std::ios_base::failbit); }
160 : catch(std::ios_base::failure&) {}
161 : throw; // rethrow original exception
162 : }
163 : else {
164 : is.setstate(std::ios_base::failbit);
165 : }
166 : }
167 : }
168 : return is;
169 : }
170 :
171 :
172 : //! ostream operator for posix_time::time_duration
173 : // todo fix to use facet -- place holder for now...
174 : template <class CharT, class Traits>
175 : inline
176 : std::basic_ostream<CharT, Traits>&
177 : operator<<(std::basic_ostream<CharT, Traits>& os, const time_duration& td)
178 : {
179 : boost::io::ios_flags_saver iflags(os);
180 : typedef boost::date_time::time_facet<ptime, CharT> custom_ptime_facet;
181 : std::ostreambuf_iterator<CharT> oitr(os);
182 : if (std::has_facet<custom_ptime_facet>(os.getloc()))
183 : std::use_facet<custom_ptime_facet>(os.getloc()).put(oitr, os, os.fill(), td);
184 : else {
185 : //instantiate a custom facet for dealing with times since the user
186 : //has not put one in the stream so far. This is for efficiency
187 : //since we would always need to reconstruct for every time period
188 : //if the locale did not already exist. Of course this will be overridden
189 : //if the user imbues as some later point.
190 : custom_ptime_facet* f = new custom_ptime_facet();
191 : std::locale l = std::locale(os.getloc(), f);
192 : os.imbue(l);
193 : f->put(oitr, os, os.fill(), td);
194 : }
195 : return os;
196 : }
197 :
198 : //! input operator for time_duration
199 : template <class CharT, class Traits>
200 : inline
201 : std::basic_istream<CharT, Traits>&
202 : operator>>(std::basic_istream<CharT, Traits>& is, time_duration& td)
203 : {
204 : boost::io::ios_flags_saver iflags(is);
205 : typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
206 : if (strm_sentry) {
207 : try {
208 : typedef typename date_time::time_input_facet<ptime, CharT> time_input_facet_local;
209 : std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
210 : if(std::has_facet<time_input_facet_local>(is.getloc())) {
211 : std::use_facet<time_input_facet_local>(is.getloc()).get(sit, str_end, is, td);
212 : }
213 : else {
214 : time_input_facet_local* f = new time_input_facet_local();
215 : std::locale l = std::locale(is.getloc(), f);
216 : is.imbue(l);
217 : f->get(sit, str_end, is, td);
218 : }
219 : }
220 : catch(...) {
221 : std::ios_base::iostate exception_mask = is.exceptions();
222 : if(std::ios_base::failbit & exception_mask) {
223 : try { is.setstate(std::ios_base::failbit); }
224 : catch(std::ios_base::failure&) {}
225 : throw; // rethrow original exception
226 : }
227 : else {
228 : is.setstate(std::ios_base::failbit);
229 : }
230 : }
231 : }
232 : return is;
233 : }
234 :
235 : } } // namespaces
236 : #endif // DATE_TIME_POSIX_TIME_IO_HPP__
|