123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784 |
- #ifndef DATE_TIME_GREGORIAN_IO_HPP__
- #define DATE_TIME_GREGORIAN_IO_HPP__
- /* Copyright (c) 2004-2005 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$
- */
- #include <locale>
- #include <iostream>
- #include <iterator> // i/ostreambuf_iterator
- #include <boost/io/ios_state.hpp>
- #include <boost/date_time/date_facet.hpp>
- #include <boost/date_time/period_parser.hpp>
- #include <boost/date_time/period_formatter.hpp>
- #include <boost/date_time/special_values_parser.hpp>
- #include <boost/date_time/special_values_formatter.hpp>
- #include <boost/date_time/gregorian/gregorian_types.hpp>
- #include <boost/date_time/gregorian/conversion.hpp> // to_tm will be needed in the facets
- namespace boost {
- namespace gregorian {
- typedef boost::date_time::period_formatter<wchar_t> wperiod_formatter;
- typedef boost::date_time::period_formatter<char> period_formatter;
-
- typedef boost::date_time::date_facet<date,wchar_t> wdate_facet;
- typedef boost::date_time::date_facet<date,char> date_facet;
- typedef boost::date_time::period_parser<date,char> period_parser;
- typedef boost::date_time::period_parser<date,wchar_t> wperiod_parser;
-
- typedef boost::date_time::special_values_formatter<char> special_values_formatter;
- typedef boost::date_time::special_values_formatter<wchar_t> wspecial_values_formatter;
-
- typedef boost::date_time::special_values_parser<date,char> special_values_parser;
- typedef boost::date_time::special_values_parser<date,wchar_t> wspecial_values_parser;
-
- typedef boost::date_time::date_input_facet<date,char> date_input_facet;
- typedef boost::date_time::date_input_facet<date,wchar_t> wdate_input_facet;
- template <class CharT, class TraitsT>
- inline std::basic_ostream<CharT, TraitsT>&
- operator<<(std::basic_ostream<CharT, TraitsT>& os, const boost::gregorian::date& d) {
- boost::io::ios_flags_saver iflags(os);
- typedef boost::date_time::date_facet<date, CharT> custom_date_facet;
- std::ostreambuf_iterator<CharT> output_itr(os);
- if (std::has_facet<custom_date_facet>(os.getloc()))
- std::use_facet<custom_date_facet>(os.getloc()).put(output_itr, os, os.fill(), d);
- else {
- //instantiate a custom facet for dealing with dates since the user
- //has not put one in the stream so far. This is for efficiency
- //since we would always need to reconstruct for every date
- //if the locale did not already exist. Of course this will be overridden
- //if the user imbues at some later point. With the default settings
- //for the facet the resulting format will be the same as the
- //std::time_facet settings.
- custom_date_facet* f = new custom_date_facet();
- std::locale l = std::locale(os.getloc(), f);
- os.imbue(l);
- f->put(output_itr, os, os.fill(), d);
- }
- return os;
- }
- //! input operator for date
- template <class CharT, class Traits>
- inline
- std::basic_istream<CharT, Traits>&
- operator>>(std::basic_istream<CharT, Traits>& is, date& d)
- {
- boost::io::ios_flags_saver iflags(is);
- typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
- if (strm_sentry) {
- try {
- typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
-
- std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
- if(std::has_facet<date_input_facet_local>(is.getloc())) {
- std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, d);
- }
- else {
- date_input_facet_local* f = new date_input_facet_local();
- std::locale l = std::locale(is.getloc(), f);
- is.imbue(l);
- f->get(sit, str_end, is, d);
- }
- }
- catch(...) {
- // mask tells us what exceptions are turned on
- std::ios_base::iostate exception_mask = is.exceptions();
- // if the user wants exceptions on failbit, we'll rethrow our
- // date_time exception & set the failbit
- if(std::ios_base::failbit & exception_mask) {
- try { is.setstate(std::ios_base::failbit); }
- catch(std::ios_base::failure&) {} // ignore this one
- throw; // rethrow original exception
- }
- else {
- // if the user want's to fail quietly, we simply set the failbit
- is.setstate(std::ios_base::failbit);
- }
-
- }
- }
- return is;
- }
- template <class CharT, class TraitsT>
- inline std::basic_ostream<CharT, TraitsT>&
- operator<<(std::basic_ostream<CharT, TraitsT>& os, const boost::gregorian::date_duration& dd) {
- boost::io::ios_flags_saver iflags(os);
- typedef boost::date_time::date_facet<date, CharT> custom_date_facet;
- std::ostreambuf_iterator<CharT> output_itr(os);
- if (std::has_facet<custom_date_facet>(os.getloc()))
- std::use_facet<custom_date_facet>(os.getloc()).put(output_itr, os, os.fill(), dd);
- else {
- custom_date_facet* f = new custom_date_facet();
- std::locale l = std::locale(os.getloc(), f);
- os.imbue(l);
- f->put(output_itr, os, os.fill(), dd);
- }
- return os;
- }
- //! input operator for date_duration
- template <class CharT, class Traits>
- inline
- std::basic_istream<CharT, Traits>&
- operator>>(std::basic_istream<CharT, Traits>& is, date_duration& dd)
- {
- boost::io::ios_flags_saver iflags(is);
- typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
- if (strm_sentry) {
- try {
- typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
-
- std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
- if(std::has_facet<date_input_facet_local>(is.getloc())) {
- std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, dd);
- }
- else {
- date_input_facet_local* f = new date_input_facet_local();
- std::locale l = std::locale(is.getloc(), f);
- is.imbue(l);
- f->get(sit, str_end, is, dd);
- }
- }
- catch(...) {
- std::ios_base::iostate exception_mask = is.exceptions();
- if(std::ios_base::failbit & exception_mask) {
- try { is.setstate(std::ios_base::failbit); }
- catch(std::ios_base::failure&) {}
- throw; // rethrow original exception
- }
- else {
- is.setstate(std::ios_base::failbit);
- }
-
- }
- }
- return is;
- }
- template <class CharT, class TraitsT>
- inline std::basic_ostream<CharT, TraitsT>&
- operator<<(std::basic_ostream<CharT, TraitsT>& os, const boost::gregorian::date_period& dp) {
- boost::io::ios_flags_saver iflags(os);
- typedef boost::date_time::date_facet<date, CharT> custom_date_facet;
- std::ostreambuf_iterator<CharT> output_itr(os);
- if (std::has_facet<custom_date_facet>(os.getloc()))
- std::use_facet<custom_date_facet>(os.getloc()).put(output_itr, os, os.fill(), dp);
- else {
- //instantiate a custom facet for dealing with date periods since the user
- //has not put one in the stream so far. This is for efficiency
- //since we would always need to reconstruct for every time period
- //if the local did not already exist. Of course this will be overridden
- //if the user imbues at some later point. With the default settings
- //for the facet the resulting format will be the same as the
- //std::time_facet settings.
- custom_date_facet* f = new custom_date_facet();
- std::locale l = std::locale(os.getloc(), f);
- os.imbue(l);
- f->put(output_itr, os, os.fill(), dp);
- }
- return os;
- }
- //! input operator for date_period
- template <class CharT, class Traits>
- inline
- std::basic_istream<CharT, Traits>&
- operator>>(std::basic_istream<CharT, Traits>& is, date_period& dp)
- {
- boost::io::ios_flags_saver iflags(is);
- typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
- if (strm_sentry) {
- try {
- typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
- std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
- if(std::has_facet<date_input_facet_local>(is.getloc())) {
- std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, dp);
- }
- else {
- date_input_facet_local* f = new date_input_facet_local();
- std::locale l = std::locale(is.getloc(), f);
- is.imbue(l);
- f->get(sit, str_end, is, dp);
- }
- }
- catch(...) {
- std::ios_base::iostate exception_mask = is.exceptions();
- if(std::ios_base::failbit & exception_mask) {
- try { is.setstate(std::ios_base::failbit); }
- catch(std::ios_base::failure&) {}
- throw; // rethrow original exception
- }
- else {
- is.setstate(std::ios_base::failbit);
- }
-
- }
- }
- return is;
- }
- /********** small gregorian types **********/
-
- template <class CharT, class TraitsT>
- inline std::basic_ostream<CharT, TraitsT>&
- operator<<(std::basic_ostream<CharT, TraitsT>& os, const boost::gregorian::greg_month& gm) {
- boost::io::ios_flags_saver iflags(os);
- typedef boost::date_time::date_facet<date, CharT> custom_date_facet;
- std::ostreambuf_iterator<CharT> output_itr(os);
- if (std::has_facet<custom_date_facet>(os.getloc()))
- std::use_facet<custom_date_facet>(os.getloc()).put(output_itr, os, os.fill(), gm);
- else {
- custom_date_facet* f = new custom_date_facet();//-> 10/1074199752/32 because year & day not initialized in put(...)
- //custom_date_facet* f = new custom_date_facet("%B");
- std::locale l = std::locale(os.getloc(), f);
- os.imbue(l);
- f->put(output_itr, os, os.fill(), gm);
- }
- return os;
- }
- //! input operator for greg_month
- template <class CharT, class Traits>
- inline
- std::basic_istream<CharT, Traits>&
- operator>>(std::basic_istream<CharT, Traits>& is, greg_month& m)
- {
- boost::io::ios_flags_saver iflags(is);
- typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
- if (strm_sentry) {
- try {
- typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
- std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
- if(std::has_facet<date_input_facet_local>(is.getloc())) {
- std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, m);
- }
- else {
- date_input_facet_local* f = new date_input_facet_local();
- std::locale l = std::locale(is.getloc(), f);
- is.imbue(l);
- f->get(sit, str_end, is, m);
- }
- }
- catch(...) {
- std::ios_base::iostate exception_mask = is.exceptions();
- if(std::ios_base::failbit & exception_mask) {
- try { is.setstate(std::ios_base::failbit); }
- catch(std::ios_base::failure&) {}
- throw; // rethrow original exception
- }
- else {
- is.setstate(std::ios_base::failbit);
- }
-
- }
- }
- return is;
- }
- template <class CharT, class TraitsT>
- inline std::basic_ostream<CharT, TraitsT>&
- operator<<(std::basic_ostream<CharT, TraitsT>& os, const boost::gregorian::greg_weekday& gw) {
- boost::io::ios_flags_saver iflags(os);
- typedef boost::date_time::date_facet<date, CharT> custom_date_facet;
- std::ostreambuf_iterator<CharT> output_itr(os);
- if (std::has_facet<custom_date_facet>(os.getloc()))
- std::use_facet<custom_date_facet>(os.getloc()).put(output_itr, os, os.fill(), gw);
- else {
- custom_date_facet* f = new custom_date_facet();
- std::locale l = std::locale(os.getloc(), f);
- os.imbue(l);
- f->put(output_itr, os, os.fill(), gw);
- }
- return os;
- }
-
- //! input operator for greg_weekday
- template <class CharT, class Traits>
- inline
- std::basic_istream<CharT, Traits>&
- operator>>(std::basic_istream<CharT, Traits>& is, greg_weekday& wd)
- {
- boost::io::ios_flags_saver iflags(is);
- typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
- if (strm_sentry) {
- try {
- typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
- std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
- if(std::has_facet<date_input_facet_local>(is.getloc())) {
- std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, wd);
- }
- else {
- date_input_facet_local* f = new date_input_facet_local();
- std::locale l = std::locale(is.getloc(), f);
- is.imbue(l);
- f->get(sit, str_end, is, wd);
- }
- }
- catch(...) {
- std::ios_base::iostate exception_mask = is.exceptions();
- if(std::ios_base::failbit & exception_mask) {
- try { is.setstate(std::ios_base::failbit); }
- catch(std::ios_base::failure&) {}
- throw; // rethrow original exception
- }
- else {
- is.setstate(std::ios_base::failbit);
- }
-
- }
- }
- return is;
- }
- //NOTE: output operator for greg_day was not necessary
- //! input operator for greg_day
- template <class CharT, class Traits>
- inline
- std::basic_istream<CharT, Traits>&
- operator>>(std::basic_istream<CharT, Traits>& is, greg_day& gd)
- {
- boost::io::ios_flags_saver iflags(is);
- typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
- if (strm_sentry) {
- try {
- typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
- std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
- if(std::has_facet<date_input_facet_local>(is.getloc())) {
- std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, gd);
- }
- else {
- date_input_facet_local* f = new date_input_facet_local();
- std::locale l = std::locale(is.getloc(), f);
- is.imbue(l);
- f->get(sit, str_end, is, gd);
- }
- }
- catch(...) {
- std::ios_base::iostate exception_mask = is.exceptions();
- if(std::ios_base::failbit & exception_mask) {
- try { is.setstate(std::ios_base::failbit); }
- catch(std::ios_base::failure&) {}
- throw; // rethrow original exception
- }
- else {
- is.setstate(std::ios_base::failbit);
- }
-
- }
- }
- return is;
- }
- //NOTE: output operator for greg_year was not necessary
- //! input operator for greg_year
- template <class CharT, class Traits>
- inline
- std::basic_istream<CharT, Traits>&
- operator>>(std::basic_istream<CharT, Traits>& is, greg_year& gy)
- {
- boost::io::ios_flags_saver iflags(is);
- typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
- if (strm_sentry) {
- try {
- typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
- std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
- if(std::has_facet<date_input_facet_local>(is.getloc())) {
- std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, gy);
- }
- else {
- date_input_facet_local* f = new date_input_facet_local();
- std::locale l = std::locale(is.getloc(), f);
- is.imbue(l);
- f->get(sit, str_end, is, gy);
- }
- }
- catch(...) {
- std::ios_base::iostate exception_mask = is.exceptions();
- if(std::ios_base::failbit & exception_mask) {
- try { is.setstate(std::ios_base::failbit); }
- catch(std::ios_base::failure&) {}
- throw; // rethrow original exception
- }
- else {
- is.setstate(std::ios_base::failbit);
- }
-
- }
- }
- return is;
- }
- /********** date generator types **********/
-
- template <class CharT, class TraitsT>
- inline std::basic_ostream<CharT, TraitsT>&
- operator<<(std::basic_ostream<CharT, TraitsT>& os, const boost::gregorian::partial_date& pd) {
- boost::io::ios_flags_saver iflags(os);
- typedef boost::date_time::date_facet<date, CharT> custom_date_facet;
- std::ostreambuf_iterator<CharT> output_itr(os);
- if (std::has_facet<custom_date_facet>(os.getloc()))
- std::use_facet<custom_date_facet>(os.getloc()).put(output_itr, os, os.fill(), pd);
- else {
- custom_date_facet* f = new custom_date_facet();
- std::locale l = std::locale(os.getloc(), f);
- os.imbue(l);
- f->put(output_itr, os, os.fill(), pd);
- }
- return os;
- }
- //! input operator for partial_date
- template <class CharT, class Traits>
- inline
- std::basic_istream<CharT, Traits>&
- operator>>(std::basic_istream<CharT, Traits>& is, partial_date& pd)
- {
- boost::io::ios_flags_saver iflags(is);
- typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
- if (strm_sentry) {
- try {
- typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
- std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
- if(std::has_facet<date_input_facet_local>(is.getloc())) {
- std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, pd);
- }
- else {
- date_input_facet_local* f = new date_input_facet_local();
- std::locale l = std::locale(is.getloc(), f);
- is.imbue(l);
- f->get(sit, str_end, is, pd);
- }
- }
- catch(...) {
- std::ios_base::iostate exception_mask = is.exceptions();
- if(std::ios_base::failbit & exception_mask) {
- try { is.setstate(std::ios_base::failbit); }
- catch(std::ios_base::failure&) {}
- throw; // rethrow original exception
- }
- else {
- is.setstate(std::ios_base::failbit);
- }
-
- }
- }
- return is;
- }
- template <class CharT, class TraitsT>
- inline std::basic_ostream<CharT, TraitsT>&
- operator<<(std::basic_ostream<CharT, TraitsT>& os, const boost::gregorian::nth_day_of_the_week_in_month& nkd) {
- boost::io::ios_flags_saver iflags(os);
- typedef boost::date_time::date_facet<date, CharT> custom_date_facet;
- std::ostreambuf_iterator<CharT> output_itr(os);
- if (std::has_facet<custom_date_facet>(os.getloc()))
- std::use_facet<custom_date_facet>(os.getloc()).put(output_itr, os, os.fill(), nkd);
- else {
- custom_date_facet* f = new custom_date_facet();
- std::locale l = std::locale(os.getloc(), f);
- os.imbue(l);
- f->put(output_itr, os, os.fill(), nkd);
- }
- return os;
- }
- //! input operator for nth_day_of_the_week_in_month
- template <class CharT, class Traits>
- inline
- std::basic_istream<CharT, Traits>&
- operator>>(std::basic_istream<CharT, Traits>& is,
- nth_day_of_the_week_in_month& nday)
- {
- boost::io::ios_flags_saver iflags(is);
- typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
- if (strm_sentry) {
- try {
- typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
- std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
- if(std::has_facet<date_input_facet_local>(is.getloc())) {
- std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, nday);
- }
- else {
- date_input_facet_local* f = new date_input_facet_local();
- std::locale l = std::locale(is.getloc(), f);
- is.imbue(l);
- f->get(sit, str_end, is, nday);
- }
- }
- catch(...) {
- std::ios_base::iostate exception_mask = is.exceptions();
- if(std::ios_base::failbit & exception_mask) {
- try { is.setstate(std::ios_base::failbit); }
- catch(std::ios_base::failure&) {}
- throw; // rethrow original exception
- }
- else {
- is.setstate(std::ios_base::failbit);
- }
-
- }
- }
- return is;
- }
- template <class CharT, class TraitsT>
- inline std::basic_ostream<CharT, TraitsT>&
- operator<<(std::basic_ostream<CharT, TraitsT>& os, const boost::gregorian::first_day_of_the_week_in_month& fkd) {
- boost::io::ios_flags_saver iflags(os);
- typedef boost::date_time::date_facet<date, CharT> custom_date_facet;
- std::ostreambuf_iterator<CharT> output_itr(os);
- if (std::has_facet<custom_date_facet>(os.getloc()))
- std::use_facet<custom_date_facet>(os.getloc()).put(output_itr, os, os.fill(), fkd);
- else {
- custom_date_facet* f = new custom_date_facet();
- std::locale l = std::locale(os.getloc(), f);
- os.imbue(l);
- f->put(output_itr, os, os.fill(), fkd);
- }
- return os;
- }
- //! input operator for first_day_of_the_week_in_month
- template <class CharT, class Traits>
- inline
- std::basic_istream<CharT, Traits>&
- operator>>(std::basic_istream<CharT, Traits>& is,
- first_day_of_the_week_in_month& fkd)
- {
- boost::io::ios_flags_saver iflags(is);
- typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
- if (strm_sentry) {
- try {
- typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
- std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
- if(std::has_facet<date_input_facet_local>(is.getloc())) {
- std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, fkd);
- }
- else {
- date_input_facet_local* f = new date_input_facet_local();
- std::locale l = std::locale(is.getloc(), f);
- is.imbue(l);
- f->get(sit, str_end, is, fkd);
- }
- }
- catch(...) {
- std::ios_base::iostate exception_mask = is.exceptions();
- if(std::ios_base::failbit & exception_mask) {
- try { is.setstate(std::ios_base::failbit); }
- catch(std::ios_base::failure&) {}
- throw; // rethrow original exception
- }
- else {
- is.setstate(std::ios_base::failbit);
- }
-
- }
- }
- return is;
- }
- template <class CharT, class TraitsT>
- inline std::basic_ostream<CharT, TraitsT>&
- operator<<(std::basic_ostream<CharT, TraitsT>& os, const boost::gregorian::last_day_of_the_week_in_month& lkd) {
- boost::io::ios_flags_saver iflags(os);
- typedef boost::date_time::date_facet<date, CharT> custom_date_facet;
- std::ostreambuf_iterator<CharT> output_itr(os);
- if (std::has_facet<custom_date_facet>(os.getloc()))
- std::use_facet<custom_date_facet>(os.getloc()).put(output_itr, os, os.fill(), lkd);
- else {
- custom_date_facet* f = new custom_date_facet();
- std::locale l = std::locale(os.getloc(), f);
- os.imbue(l);
- f->put(output_itr, os, os.fill(), lkd);
- }
- return os;
- }
- //! input operator for last_day_of_the_week_in_month
- template <class CharT, class Traits>
- inline
- std::basic_istream<CharT, Traits>&
- operator>>(std::basic_istream<CharT, Traits>& is,
- last_day_of_the_week_in_month& lkd)
- {
- boost::io::ios_flags_saver iflags(is);
- typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
- if (strm_sentry) {
- try {
- typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
- std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
- if(std::has_facet<date_input_facet_local>(is.getloc())) {
- std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, lkd);
- }
- else {
- date_input_facet_local* f = new date_input_facet_local();
- std::locale l = std::locale(is.getloc(), f);
- is.imbue(l);
- f->get(sit, str_end, is, lkd);
- }
- }
- catch(...) {
- std::ios_base::iostate exception_mask = is.exceptions();
- if(std::ios_base::failbit & exception_mask) {
- try { is.setstate(std::ios_base::failbit); }
- catch(std::ios_base::failure&) {}
- throw; // rethrow original exception
- }
- else {
- is.setstate(std::ios_base::failbit);
- }
-
- }
- }
- return is;
- }
- template <class CharT, class TraitsT>
- inline std::basic_ostream<CharT, TraitsT>&
- operator<<(std::basic_ostream<CharT, TraitsT>& os, const boost::gregorian::first_day_of_the_week_after& fda) {
- boost::io::ios_flags_saver iflags(os);
- typedef boost::date_time::date_facet<date, CharT> custom_date_facet;
- std::ostreambuf_iterator<CharT> output_itr(os);
- if (std::has_facet<custom_date_facet>(os.getloc())) {
- std::use_facet<custom_date_facet>(os.getloc()).put(output_itr, os, os.fill(), fda);
- }
- else {
- custom_date_facet* f = new custom_date_facet();
- std::locale l = std::locale(os.getloc(), f);
- os.imbue(l);
- f->put(output_itr, os, os.fill(), fda);
- }
- return os;
- }
- //! input operator for first_day_of_the_week_after
- template <class CharT, class Traits>
- inline
- std::basic_istream<CharT, Traits>&
- operator>>(std::basic_istream<CharT, Traits>& is,
- first_day_of_the_week_after& fka)
- {
- boost::io::ios_flags_saver iflags(is);
- typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
- if (strm_sentry) {
- try {
- typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
- std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
- if(std::has_facet<date_input_facet_local>(is.getloc())) {
- std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, fka);
- }
- else {
- date_input_facet_local* f = new date_input_facet_local();
- std::locale l = std::locale(is.getloc(), f);
- is.imbue(l);
- f->get(sit, str_end, is, fka);
- }
- }
- catch(...) {
- std::ios_base::iostate exception_mask = is.exceptions();
- if(std::ios_base::failbit & exception_mask) {
- try { is.setstate(std::ios_base::failbit); }
- catch(std::ios_base::failure&) {}
- throw; // rethrow original exception
- }
- else {
- is.setstate(std::ios_base::failbit);
- }
-
- }
- }
- return is;
- }
- template <class CharT, class TraitsT>
- inline std::basic_ostream<CharT, TraitsT>&
- operator<<(std::basic_ostream<CharT, TraitsT>& os, const boost::gregorian::first_day_of_the_week_before& fdb) {
- boost::io::ios_flags_saver iflags(os);
- typedef boost::date_time::date_facet<date, CharT> custom_date_facet;
- std::ostreambuf_iterator<CharT> output_itr(os);
- if (std::has_facet<custom_date_facet>(os.getloc())) {
- std::use_facet<custom_date_facet>(os.getloc()).put(output_itr, os, os.fill(), fdb);
- }
- else {
- custom_date_facet* f = new custom_date_facet();
- std::locale l = std::locale(os.getloc(), f);
- os.imbue(l);
- f->put(output_itr, os, os.fill(), fdb);
- }
- return os;
- }
- //! input operator for first_day_of_the_week_before
- template <class CharT, class Traits>
- inline
- std::basic_istream<CharT, Traits>&
- operator>>(std::basic_istream<CharT, Traits>& is,
- first_day_of_the_week_before& fkb)
- {
- boost::io::ios_flags_saver iflags(is);
- typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
- if (strm_sentry) {
- try {
- typedef typename date_time::date_input_facet<date, CharT> date_input_facet_local;
- std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
- if(std::has_facet<date_input_facet_local>(is.getloc())) {
- std::use_facet<date_input_facet_local>(is.getloc()).get(sit, str_end, is, fkb);
- }
- else {
- date_input_facet_local* f = new date_input_facet_local();
- std::locale l = std::locale(is.getloc(), f);
- is.imbue(l);
- f->get(sit, str_end, is, fkb);
- }
- }
- catch(...) {
- std::ios_base::iostate exception_mask = is.exceptions();
- if(std::ios_base::failbit & exception_mask) {
- try { is.setstate(std::ios_base::failbit); }
- catch(std::ios_base::failure&) {}
- throw; // rethrow original exception
- }
- else {
- is.setstate(std::ios_base::failbit);
- }
-
- }
- }
- return is;
- }
-
- } } // namespaces
- #endif // DATE_TIME_GREGORIAN_IO_HPP__
|