1 | #ifndef DATE_TIME_GREGORIAN_IO_HPP__ |
2 | #define DATE_TIME_GREGORIAN_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/date_facet.hpp> |
17 | #include <boost/date_time/period_parser.hpp> |
18 | #include <boost/date_time/period_formatter.hpp> |
19 | #include <boost/date_time/special_values_parser.hpp> |
20 | #include <boost/date_time/special_values_formatter.hpp> |
21 | #include <boost/date_time/gregorian/gregorian_types.hpp> |
22 | #include <boost/date_time/gregorian/conversion.hpp> // to_tm will be needed in the facets |
23 | |
24 | namespace boost { |
25 | namespace gregorian { |
26 | |
27 | |
28 | typedef boost::date_time::period_formatter<wchar_t> wperiod_formatter; |
29 | typedef boost::date_time::period_formatter<char> period_formatter; |
30 | |
31 | typedef boost::date_time::date_facet<date,wchar_t> wdate_facet; |
32 | typedef boost::date_time::date_facet<date,char> date_facet; |
33 | |
34 | typedef boost::date_time::period_parser<date,char> period_parser; |
35 | typedef boost::date_time::period_parser<date,wchar_t> wperiod_parser; |
36 | |
37 | typedef boost::date_time::special_values_formatter<char> special_values_formatter; |
38 | typedef boost::date_time::special_values_formatter<wchar_t> wspecial_values_formatter; |
39 | |
40 | typedef boost::date_time::special_values_parser<date,char> special_values_parser; |
41 | typedef boost::date_time::special_values_parser<date,wchar_t> wspecial_values_parser; |
42 | |
43 | typedef boost::date_time::date_input_facet<date,char> date_input_facet; |
44 | typedef boost::date_time::date_input_facet<date,wchar_t> wdate_input_facet; |
45 | |
46 | template <class CharT, class TraitsT> |
47 | inline std::basic_ostream<CharT, TraitsT>& |
48 | operator<<(std::basic_ostream<CharT, TraitsT>& os, const boost::gregorian::date& d) { |
49 | boost::io::ios_flags_saver iflags(os); |
50 | typedef boost::date_time::date_facet<date, CharT> custom_date_facet; |
51 | std::ostreambuf_iterator<CharT> output_itr(os); |
52 | if (std::has_facet<custom_date_facet>(os.getloc())) |
53 | std::use_facet<custom_date_facet>(os.getloc()).put(output_itr, os, os.fill(), d); |
54 | else { |
55 | //instantiate a custom facet for dealing with dates since the user |
56 | //has not put one in the stream so far. This is for efficiency |
57 | //since we would always need to reconstruct for every date |
58 | //if the locale did not already exist. Of course this will be overridden |
59 | //if the user imbues at some later point. With the default settings |
60 | //for the facet the resulting format will be the same as the |
61 | //std::time_facet settings. |
62 | custom_date_facet* f = new custom_date_facet(); |
63 | std::locale l = std::locale(os.getloc(), f); |
64 | os.imbue(l); |
65 | f->put(output_itr, os, os.fill(), d); |
66 | } |
67 | return os; |
68 | } |
69 | |
70 | //! input operator for date |
71 | template <class CharT, class Traits> |
72 | inline |
73 | std::basic_istream<CharT, Traits>& |
74 | operator>>(std::basic_istream<CharT, Traits>& is, date& d) |
75 | { |
76 | boost::io::ios_flags_saver iflags(is); |
77 | typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false); |
78 | if (strm_sentry) { |
79 | try { |
80 | typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local; |
81 | |
82 | std::istreambuf_iterator<CharT,Traits> sit(is), str_end; |
83 | if(std::has_facet<date_input_facet_local>(is.getloc())) { |
84 | std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, d); |
85 | } |
86 | else { |
87 | date_input_facet_local* f = new date_input_facet_local(); |
88 | std::locale l = std::locale(is.getloc(), f); |
89 | is.imbue(l); |
90 | f->get(sit, str_end, is, d); |
91 | } |
92 | } |
93 | catch(...) { |
94 | // mask tells us what exceptions are turned on |
95 | std::ios_base::iostate exception_mask = is.exceptions(); |
96 | // if the user wants exceptions on failbit, we'll rethrow our |
97 | // date_time exception & set the failbit |
98 | if(std::ios_base::failbit & exception_mask) { |
99 | try { is.setstate(std::ios_base::failbit); } |
100 | catch(std::ios_base::failure&) {} // ignore this one |
101 | throw; // rethrow original exception |
102 | } |
103 | else { |
104 | // if the user want's to fail quietly, we simply set the failbit |
105 | is.setstate(std::ios_base::failbit); |
106 | } |
107 | |
108 | } |
109 | } |
110 | return is; |
111 | } |
112 | |
113 | template <class CharT, class TraitsT> |
114 | inline std::basic_ostream<CharT, TraitsT>& |
115 | operator<<(std::basic_ostream<CharT, TraitsT>& os, const boost::gregorian::date_duration& dd) { |
116 | boost::io::ios_flags_saver iflags(os); |
117 | typedef boost::date_time::date_facet<date, CharT> custom_date_facet; |
118 | std::ostreambuf_iterator<CharT> output_itr(os); |
119 | if (std::has_facet<custom_date_facet>(os.getloc())) |
120 | std::use_facet<custom_date_facet>(os.getloc()).put(output_itr, os, os.fill(), dd); |
121 | else { |
122 | custom_date_facet* f = new custom_date_facet(); |
123 | std::locale l = std::locale(os.getloc(), f); |
124 | os.imbue(l); |
125 | f->put(output_itr, os, os.fill(), dd); |
126 | |
127 | } |
128 | return os; |
129 | } |
130 | |
131 | //! input operator for date_duration |
132 | template <class CharT, class Traits> |
133 | inline |
134 | std::basic_istream<CharT, Traits>& |
135 | operator>>(std::basic_istream<CharT, Traits>& is, date_duration& dd) |
136 | { |
137 | boost::io::ios_flags_saver iflags(is); |
138 | typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false); |
139 | if (strm_sentry) { |
140 | try { |
141 | typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local; |
142 | |
143 | std::istreambuf_iterator<CharT,Traits> sit(is), str_end; |
144 | if(std::has_facet<date_input_facet_local>(is.getloc())) { |
145 | std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, dd); |
146 | } |
147 | else { |
148 | date_input_facet_local* f = new date_input_facet_local(); |
149 | std::locale l = std::locale(is.getloc(), f); |
150 | is.imbue(l); |
151 | f->get(sit, str_end, is, dd); |
152 | } |
153 | } |
154 | catch(...) { |
155 | std::ios_base::iostate exception_mask = is.exceptions(); |
156 | if(std::ios_base::failbit & exception_mask) { |
157 | try { is.setstate(std::ios_base::failbit); } |
158 | catch(std::ios_base::failure&) {} |
159 | throw; // rethrow original exception |
160 | } |
161 | else { |
162 | is.setstate(std::ios_base::failbit); |
163 | } |
164 | |
165 | } |
166 | } |
167 | return is; |
168 | } |
169 | |
170 | template <class CharT, class TraitsT> |
171 | inline std::basic_ostream<CharT, TraitsT>& |
172 | operator<<(std::basic_ostream<CharT, TraitsT>& os, const boost::gregorian::date_period& dp) { |
173 | boost::io::ios_flags_saver iflags(os); |
174 | typedef boost::date_time::date_facet<date, CharT> custom_date_facet; |
175 | std::ostreambuf_iterator<CharT> output_itr(os); |
176 | if (std::has_facet<custom_date_facet>(os.getloc())) |
177 | std::use_facet<custom_date_facet>(os.getloc()).put(output_itr, os, os.fill(), dp); |
178 | else { |
179 | //instantiate a custom facet for dealing with date periods since the user |
180 | //has not put one in the stream so far. This is for efficiency |
181 | //since we would always need to reconstruct for every time period |
182 | //if the local did not already exist. Of course this will be overridden |
183 | //if the user imbues at some later point. With the default settings |
184 | //for the facet the resulting format will be the same as the |
185 | //std::time_facet settings. |
186 | custom_date_facet* f = new custom_date_facet(); |
187 | std::locale l = std::locale(os.getloc(), f); |
188 | os.imbue(l); |
189 | f->put(output_itr, os, os.fill(), dp); |
190 | |
191 | } |
192 | return os; |
193 | } |
194 | |
195 | //! input operator for date_period |
196 | template <class CharT, class Traits> |
197 | inline |
198 | std::basic_istream<CharT, Traits>& |
199 | operator>>(std::basic_istream<CharT, Traits>& is, date_period& dp) |
200 | { |
201 | boost::io::ios_flags_saver iflags(is); |
202 | typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false); |
203 | if (strm_sentry) { |
204 | try { |
205 | typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local; |
206 | |
207 | std::istreambuf_iterator<CharT,Traits> sit(is), str_end; |
208 | if(std::has_facet<date_input_facet_local>(is.getloc())) { |
209 | std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, dp); |
210 | } |
211 | else { |
212 | date_input_facet_local* f = new date_input_facet_local(); |
213 | std::locale l = std::locale(is.getloc(), f); |
214 | is.imbue(l); |
215 | f->get(sit, str_end, is, dp); |
216 | } |
217 | } |
218 | catch(...) { |
219 | std::ios_base::iostate exception_mask = is.exceptions(); |
220 | if(std::ios_base::failbit & exception_mask) { |
221 | try { is.setstate(std::ios_base::failbit); } |
222 | catch(std::ios_base::failure&) {} |
223 | throw; // rethrow original exception |
224 | } |
225 | else { |
226 | is.setstate(std::ios_base::failbit); |
227 | } |
228 | |
229 | } |
230 | } |
231 | return is; |
232 | } |
233 | |
234 | /********** small gregorian types **********/ |
235 | |
236 | template <class CharT, class TraitsT> |
237 | inline std::basic_ostream<CharT, TraitsT>& |
238 | operator<<(std::basic_ostream<CharT, TraitsT>& os, const boost::gregorian::greg_month& gm) { |
239 | boost::io::ios_flags_saver iflags(os); |
240 | typedef boost::date_time::date_facet<date, CharT> custom_date_facet; |
241 | std::ostreambuf_iterator<CharT> output_itr(os); |
242 | if (std::has_facet<custom_date_facet>(os.getloc())) |
243 | std::use_facet<custom_date_facet>(os.getloc()).put(output_itr, os, os.fill(), gm); |
244 | else { |
245 | custom_date_facet* f = new custom_date_facet();//-> 10/1074199752/32 because year & day not initialized in put(...) |
246 | //custom_date_facet* f = new custom_date_facet("%B"); |
247 | std::locale l = std::locale(os.getloc(), f); |
248 | os.imbue(l); |
249 | f->put(output_itr, os, os.fill(), gm); |
250 | } |
251 | return os; |
252 | } |
253 | |
254 | //! input operator for greg_month |
255 | template <class CharT, class Traits> |
256 | inline |
257 | std::basic_istream<CharT, Traits>& |
258 | operator>>(std::basic_istream<CharT, Traits>& is, greg_month& m) |
259 | { |
260 | boost::io::ios_flags_saver iflags(is); |
261 | typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false); |
262 | if (strm_sentry) { |
263 | try { |
264 | typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local; |
265 | |
266 | std::istreambuf_iterator<CharT,Traits> sit(is), str_end; |
267 | if(std::has_facet<date_input_facet_local>(is.getloc())) { |
268 | std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, m); |
269 | } |
270 | else { |
271 | date_input_facet_local* f = new date_input_facet_local(); |
272 | std::locale l = std::locale(is.getloc(), f); |
273 | is.imbue(l); |
274 | f->get(sit, str_end, is, m); |
275 | } |
276 | } |
277 | catch(...) { |
278 | std::ios_base::iostate exception_mask = is.exceptions(); |
279 | if(std::ios_base::failbit & exception_mask) { |
280 | try { is.setstate(std::ios_base::failbit); } |
281 | catch(std::ios_base::failure&) {} |
282 | throw; // rethrow original exception |
283 | } |
284 | else { |
285 | is.setstate(std::ios_base::failbit); |
286 | } |
287 | |
288 | } |
289 | } |
290 | return is; |
291 | } |
292 | |
293 | |
294 | template <class CharT, class TraitsT> |
295 | inline std::basic_ostream<CharT, TraitsT>& |
296 | operator<<(std::basic_ostream<CharT, TraitsT>& os, const boost::gregorian::greg_weekday& gw) { |
297 | boost::io::ios_flags_saver iflags(os); |
298 | typedef boost::date_time::date_facet<date, CharT> custom_date_facet; |
299 | std::ostreambuf_iterator<CharT> output_itr(os); |
300 | if (std::has_facet<custom_date_facet>(os.getloc())) |
301 | std::use_facet<custom_date_facet>(os.getloc()).put(output_itr, os, os.fill(), gw); |
302 | else { |
303 | custom_date_facet* f = new custom_date_facet(); |
304 | std::locale l = std::locale(os.getloc(), f); |
305 | os.imbue(l); |
306 | f->put(output_itr, os, os.fill(), gw); |
307 | } |
308 | return os; |
309 | } |
310 | |
311 | //! input operator for greg_weekday |
312 | template <class CharT, class Traits> |
313 | inline |
314 | std::basic_istream<CharT, Traits>& |
315 | operator>>(std::basic_istream<CharT, Traits>& is, greg_weekday& wd) |
316 | { |
317 | boost::io::ios_flags_saver iflags(is); |
318 | typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false); |
319 | if (strm_sentry) { |
320 | try { |
321 | typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local; |
322 | |
323 | std::istreambuf_iterator<CharT,Traits> sit(is), str_end; |
324 | if(std::has_facet<date_input_facet_local>(is.getloc())) { |
325 | std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, wd); |
326 | } |
327 | else { |
328 | date_input_facet_local* f = new date_input_facet_local(); |
329 | std::locale l = std::locale(is.getloc(), f); |
330 | is.imbue(l); |
331 | f->get(sit, str_end, is, wd); |
332 | } |
333 | } |
334 | catch(...) { |
335 | std::ios_base::iostate exception_mask = is.exceptions(); |
336 | if(std::ios_base::failbit & exception_mask) { |
337 | try { is.setstate(std::ios_base::failbit); } |
338 | catch(std::ios_base::failure&) {} |
339 | throw; // rethrow original exception |
340 | } |
341 | else { |
342 | is.setstate(std::ios_base::failbit); |
343 | } |
344 | |
345 | } |
346 | } |
347 | return is; |
348 | } |
349 | |
350 | //NOTE: output operator for greg_day was not necessary |
351 | |
352 | //! input operator for greg_day |
353 | template <class CharT, class Traits> |
354 | inline |
355 | std::basic_istream<CharT, Traits>& |
356 | operator>>(std::basic_istream<CharT, Traits>& is, greg_day& gd) |
357 | { |
358 | boost::io::ios_flags_saver iflags(is); |
359 | typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false); |
360 | if (strm_sentry) { |
361 | try { |
362 | typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local; |
363 | |
364 | std::istreambuf_iterator<CharT,Traits> sit(is), str_end; |
365 | if(std::has_facet<date_input_facet_local>(is.getloc())) { |
366 | std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, gd); |
367 | } |
368 | else { |
369 | date_input_facet_local* f = new date_input_facet_local(); |
370 | std::locale l = std::locale(is.getloc(), f); |
371 | is.imbue(l); |
372 | f->get(sit, str_end, is, gd); |
373 | } |
374 | } |
375 | catch(...) { |
376 | std::ios_base::iostate exception_mask = is.exceptions(); |
377 | if(std::ios_base::failbit & exception_mask) { |
378 | try { is.setstate(std::ios_base::failbit); } |
379 | catch(std::ios_base::failure&) {} |
380 | throw; // rethrow original exception |
381 | } |
382 | else { |
383 | is.setstate(std::ios_base::failbit); |
384 | } |
385 | |
386 | } |
387 | } |
388 | return is; |
389 | } |
390 | |
391 | //NOTE: output operator for greg_year was not necessary |
392 | |
393 | //! input operator for greg_year |
394 | template <class CharT, class Traits> |
395 | inline |
396 | std::basic_istream<CharT, Traits>& |
397 | operator>>(std::basic_istream<CharT, Traits>& is, greg_year& gy) |
398 | { |
399 | boost::io::ios_flags_saver iflags(is); |
400 | typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false); |
401 | if (strm_sentry) { |
402 | try { |
403 | typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local; |
404 | |
405 | std::istreambuf_iterator<CharT,Traits> sit(is), str_end; |
406 | if(std::has_facet<date_input_facet_local>(is.getloc())) { |
407 | std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, gy); |
408 | } |
409 | else { |
410 | date_input_facet_local* f = new date_input_facet_local(); |
411 | std::locale l = std::locale(is.getloc(), f); |
412 | is.imbue(l); |
413 | f->get(sit, str_end, is, gy); |
414 | } |
415 | } |
416 | catch(...) { |
417 | std::ios_base::iostate exception_mask = is.exceptions(); |
418 | if(std::ios_base::failbit & exception_mask) { |
419 | try { is.setstate(std::ios_base::failbit); } |
420 | catch(std::ios_base::failure&) {} |
421 | throw; // rethrow original exception |
422 | } |
423 | else { |
424 | is.setstate(std::ios_base::failbit); |
425 | } |
426 | |
427 | } |
428 | } |
429 | return is; |
430 | } |
431 | |
432 | /********** date generator types **********/ |
433 | |
434 | template <class CharT, class TraitsT> |
435 | inline std::basic_ostream<CharT, TraitsT>& |
436 | operator<<(std::basic_ostream<CharT, TraitsT>& os, const boost::gregorian::partial_date& pd) { |
437 | boost::io::ios_flags_saver iflags(os); |
438 | typedef boost::date_time::date_facet<date, CharT> custom_date_facet; |
439 | std::ostreambuf_iterator<CharT> output_itr(os); |
440 | if (std::has_facet<custom_date_facet>(os.getloc())) |
441 | std::use_facet<custom_date_facet>(os.getloc()).put(output_itr, os, os.fill(), pd); |
442 | else { |
443 | custom_date_facet* f = new custom_date_facet(); |
444 | std::locale l = std::locale(os.getloc(), f); |
445 | os.imbue(l); |
446 | f->put(output_itr, os, os.fill(), pd); |
447 | } |
448 | return os; |
449 | } |
450 | |
451 | //! input operator for partial_date |
452 | template <class CharT, class Traits> |
453 | inline |
454 | std::basic_istream<CharT, Traits>& |
455 | operator>>(std::basic_istream<CharT, Traits>& is, partial_date& pd) |
456 | { |
457 | boost::io::ios_flags_saver iflags(is); |
458 | typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false); |
459 | if (strm_sentry) { |
460 | try { |
461 | typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local; |
462 | |
463 | std::istreambuf_iterator<CharT,Traits> sit(is), str_end; |
464 | if(std::has_facet<date_input_facet_local>(is.getloc())) { |
465 | std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, pd); |
466 | } |
467 | else { |
468 | date_input_facet_local* f = new date_input_facet_local(); |
469 | std::locale l = std::locale(is.getloc(), f); |
470 | is.imbue(l); |
471 | f->get(sit, str_end, is, pd); |
472 | } |
473 | } |
474 | catch(...) { |
475 | std::ios_base::iostate exception_mask = is.exceptions(); |
476 | if(std::ios_base::failbit & exception_mask) { |
477 | try { is.setstate(std::ios_base::failbit); } |
478 | catch(std::ios_base::failure&) {} |
479 | throw; // rethrow original exception |
480 | } |
481 | else { |
482 | is.setstate(std::ios_base::failbit); |
483 | } |
484 | |
485 | } |
486 | } |
487 | return is; |
488 | } |
489 | |
490 | template <class CharT, class TraitsT> |
491 | inline std::basic_ostream<CharT, TraitsT>& |
492 | operator<<(std::basic_ostream<CharT, TraitsT>& os, const boost::gregorian::nth_day_of_the_week_in_month& nkd) { |
493 | boost::io::ios_flags_saver iflags(os); |
494 | typedef boost::date_time::date_facet<date, CharT> custom_date_facet; |
495 | std::ostreambuf_iterator<CharT> output_itr(os); |
496 | if (std::has_facet<custom_date_facet>(os.getloc())) |
497 | std::use_facet<custom_date_facet>(os.getloc()).put(output_itr, os, os.fill(), nkd); |
498 | else { |
499 | custom_date_facet* f = new custom_date_facet(); |
500 | std::locale l = std::locale(os.getloc(), f); |
501 | os.imbue(l); |
502 | f->put(output_itr, os, os.fill(), nkd); |
503 | } |
504 | return os; |
505 | } |
506 | |
507 | //! input operator for nth_day_of_the_week_in_month |
508 | template <class CharT, class Traits> |
509 | inline |
510 | std::basic_istream<CharT, Traits>& |
511 | operator>>(std::basic_istream<CharT, Traits>& is, |
512 | nth_day_of_the_week_in_month& nday) |
513 | { |
514 | boost::io::ios_flags_saver iflags(is); |
515 | typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false); |
516 | if (strm_sentry) { |
517 | try { |
518 | typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local; |
519 | |
520 | std::istreambuf_iterator<CharT,Traits> sit(is), str_end; |
521 | if(std::has_facet<date_input_facet_local>(is.getloc())) { |
522 | std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, nday); |
523 | } |
524 | else { |
525 | date_input_facet_local* f = new date_input_facet_local(); |
526 | std::locale l = std::locale(is.getloc(), f); |
527 | is.imbue(l); |
528 | f->get(sit, str_end, is, nday); |
529 | } |
530 | } |
531 | catch(...) { |
532 | std::ios_base::iostate exception_mask = is.exceptions(); |
533 | if(std::ios_base::failbit & exception_mask) { |
534 | try { is.setstate(std::ios_base::failbit); } |
535 | catch(std::ios_base::failure&) {} |
536 | throw; // rethrow original exception |
537 | } |
538 | else { |
539 | is.setstate(std::ios_base::failbit); |
540 | } |
541 | |
542 | } |
543 | } |
544 | return is; |
545 | } |
546 | |
547 | |
548 | template <class CharT, class TraitsT> |
549 | inline std::basic_ostream<CharT, TraitsT>& |
550 | operator<<(std::basic_ostream<CharT, TraitsT>& os, const boost::gregorian::first_day_of_the_week_in_month& fkd) { |
551 | boost::io::ios_flags_saver iflags(os); |
552 | typedef boost::date_time::date_facet<date, CharT> custom_date_facet; |
553 | std::ostreambuf_iterator<CharT> output_itr(os); |
554 | if (std::has_facet<custom_date_facet>(os.getloc())) |
555 | std::use_facet<custom_date_facet>(os.getloc()).put(output_itr, os, os.fill(), fkd); |
556 | else { |
557 | custom_date_facet* f = new custom_date_facet(); |
558 | std::locale l = std::locale(os.getloc(), f); |
559 | os.imbue(l); |
560 | f->put(output_itr, os, os.fill(), fkd); |
561 | } |
562 | return os; |
563 | } |
564 | |
565 | //! input operator for first_day_of_the_week_in_month |
566 | template <class CharT, class Traits> |
567 | inline |
568 | std::basic_istream<CharT, Traits>& |
569 | operator>>(std::basic_istream<CharT, Traits>& is, |
570 | first_day_of_the_week_in_month& fkd) |
571 | { |
572 | boost::io::ios_flags_saver iflags(is); |
573 | typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false); |
574 | if (strm_sentry) { |
575 | try { |
576 | typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local; |
577 | |
578 | std::istreambuf_iterator<CharT,Traits> sit(is), str_end; |
579 | if(std::has_facet<date_input_facet_local>(is.getloc())) { |
580 | std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, fkd); |
581 | } |
582 | else { |
583 | date_input_facet_local* f = new date_input_facet_local(); |
584 | std::locale l = std::locale(is.getloc(), f); |
585 | is.imbue(l); |
586 | f->get(sit, str_end, is, fkd); |
587 | } |
588 | } |
589 | catch(...) { |
590 | std::ios_base::iostate exception_mask = is.exceptions(); |
591 | if(std::ios_base::failbit & exception_mask) { |
592 | try { is.setstate(std::ios_base::failbit); } |
593 | catch(std::ios_base::failure&) {} |
594 | throw; // rethrow original exception |
595 | } |
596 | else { |
597 | is.setstate(std::ios_base::failbit); |
598 | } |
599 | |
600 | } |
601 | } |
602 | return is; |
603 | } |
604 | |
605 | |
606 | template <class CharT, class TraitsT> |
607 | inline std::basic_ostream<CharT, TraitsT>& |
608 | operator<<(std::basic_ostream<CharT, TraitsT>& os, const boost::gregorian::last_day_of_the_week_in_month& lkd) { |
609 | boost::io::ios_flags_saver iflags(os); |
610 | typedef boost::date_time::date_facet<date, CharT> custom_date_facet; |
611 | std::ostreambuf_iterator<CharT> output_itr(os); |
612 | if (std::has_facet<custom_date_facet>(os.getloc())) |
613 | std::use_facet<custom_date_facet>(os.getloc()).put(output_itr, os, os.fill(), lkd); |
614 | else { |
615 | custom_date_facet* f = new custom_date_facet(); |
616 | std::locale l = std::locale(os.getloc(), f); |
617 | os.imbue(l); |
618 | f->put(output_itr, os, os.fill(), lkd); |
619 | } |
620 | return os; |
621 | } |
622 | |
623 | //! input operator for last_day_of_the_week_in_month |
624 | template <class CharT, class Traits> |
625 | inline |
626 | std::basic_istream<CharT, Traits>& |
627 | operator>>(std::basic_istream<CharT, Traits>& is, |
628 | last_day_of_the_week_in_month& lkd) |
629 | { |
630 | boost::io::ios_flags_saver iflags(is); |
631 | typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false); |
632 | if (strm_sentry) { |
633 | try { |
634 | typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local; |
635 | |
636 | std::istreambuf_iterator<CharT,Traits> sit(is), str_end; |
637 | if(std::has_facet<date_input_facet_local>(is.getloc())) { |
638 | std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, lkd); |
639 | } |
640 | else { |
641 | date_input_facet_local* f = new date_input_facet_local(); |
642 | std::locale l = std::locale(is.getloc(), f); |
643 | is.imbue(l); |
644 | f->get(sit, str_end, is, lkd); |
645 | } |
646 | } |
647 | catch(...) { |
648 | std::ios_base::iostate exception_mask = is.exceptions(); |
649 | if(std::ios_base::failbit & exception_mask) { |
650 | try { is.setstate(std::ios_base::failbit); } |
651 | catch(std::ios_base::failure&) {} |
652 | throw; // rethrow original exception |
653 | } |
654 | else { |
655 | is.setstate(std::ios_base::failbit); |
656 | } |
657 | |
658 | } |
659 | } |
660 | return is; |
661 | } |
662 | |
663 | |
664 | template <class CharT, class TraitsT> |
665 | inline std::basic_ostream<CharT, TraitsT>& |
666 | operator<<(std::basic_ostream<CharT, TraitsT>& os, const boost::gregorian::first_day_of_the_week_after& fda) { |
667 | boost::io::ios_flags_saver iflags(os); |
668 | typedef boost::date_time::date_facet<date, CharT> custom_date_facet; |
669 | std::ostreambuf_iterator<CharT> output_itr(os); |
670 | if (std::has_facet<custom_date_facet>(os.getloc())) { |
671 | std::use_facet<custom_date_facet>(os.getloc()).put(output_itr, os, os.fill(), fda); |
672 | } |
673 | else { |
674 | custom_date_facet* f = new custom_date_facet(); |
675 | std::locale l = std::locale(os.getloc(), f); |
676 | os.imbue(l); |
677 | f->put(output_itr, os, os.fill(), fda); |
678 | } |
679 | return os; |
680 | } |
681 | |
682 | //! input operator for first_day_of_the_week_after |
683 | template <class CharT, class Traits> |
684 | inline |
685 | std::basic_istream<CharT, Traits>& |
686 | operator>>(std::basic_istream<CharT, Traits>& is, |
687 | first_day_of_the_week_after& fka) |
688 | { |
689 | boost::io::ios_flags_saver iflags(is); |
690 | typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false); |
691 | if (strm_sentry) { |
692 | try { |
693 | typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local; |
694 | |
695 | std::istreambuf_iterator<CharT,Traits> sit(is), str_end; |
696 | if(std::has_facet<date_input_facet_local>(is.getloc())) { |
697 | std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, fka); |
698 | } |
699 | else { |
700 | date_input_facet_local* f = new date_input_facet_local(); |
701 | std::locale l = std::locale(is.getloc(), f); |
702 | is.imbue(l); |
703 | f->get(sit, str_end, is, fka); |
704 | } |
705 | } |
706 | catch(...) { |
707 | std::ios_base::iostate exception_mask = is.exceptions(); |
708 | if(std::ios_base::failbit & exception_mask) { |
709 | try { is.setstate(std::ios_base::failbit); } |
710 | catch(std::ios_base::failure&) {} |
711 | throw; // rethrow original exception |
712 | } |
713 | else { |
714 | is.setstate(std::ios_base::failbit); |
715 | } |
716 | |
717 | } |
718 | } |
719 | return is; |
720 | } |
721 | |
722 | |
723 | template <class CharT, class TraitsT> |
724 | inline std::basic_ostream<CharT, TraitsT>& |
725 | operator<<(std::basic_ostream<CharT, TraitsT>& os, const boost::gregorian::first_day_of_the_week_before& fdb) { |
726 | boost::io::ios_flags_saver iflags(os); |
727 | typedef boost::date_time::date_facet<date, CharT> custom_date_facet; |
728 | std::ostreambuf_iterator<CharT> output_itr(os); |
729 | if (std::has_facet<custom_date_facet>(os.getloc())) { |
730 | std::use_facet<custom_date_facet>(os.getloc()).put(output_itr, os, os.fill(), fdb); |
731 | } |
732 | else { |
733 | custom_date_facet* f = new custom_date_facet(); |
734 | std::locale l = std::locale(os.getloc(), f); |
735 | os.imbue(l); |
736 | f->put(output_itr, os, os.fill(), fdb); |
737 | } |
738 | return os; |
739 | } |
740 | |
741 | //! input operator for first_day_of_the_week_before |
742 | template <class CharT, class Traits> |
743 | inline |
744 | std::basic_istream<CharT, Traits>& |
745 | operator>>(std::basic_istream<CharT, Traits>& is, |
746 | first_day_of_the_week_before& fkb) |
747 | { |
748 | boost::io::ios_flags_saver iflags(is); |
749 | typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false); |
750 | if (strm_sentry) { |
751 | try { |
752 | typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local; |
753 | |
754 | std::istreambuf_iterator<CharT,Traits> sit(is), str_end; |
755 | if(std::has_facet<date_input_facet_local>(is.getloc())) { |
756 | std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, fkb); |
757 | } |
758 | else { |
759 | date_input_facet_local* f = new date_input_facet_local(); |
760 | std::locale l = std::locale(is.getloc(), f); |
761 | is.imbue(l); |
762 | f->get(sit, str_end, is, fkb); |
763 | } |
764 | } |
765 | catch(...) { |
766 | std::ios_base::iostate exception_mask = is.exceptions(); |
767 | if(std::ios_base::failbit & exception_mask) { |
768 | try { is.setstate(std::ios_base::failbit); } |
769 | catch(std::ios_base::failure&) {} |
770 | throw; // rethrow original exception |
771 | } |
772 | else { |
773 | is.setstate(std::ios_base::failbit); |
774 | } |
775 | |
776 | } |
777 | } |
778 | return is; |
779 | } |
780 | |
781 | |
782 | } } // namespaces |
783 | |
784 | #endif // DATE_TIME_GREGORIAN_IO_HPP__ |
785 | |