diff --git a/date.h b/date.h index 6a6c636..d793a8d 100644 --- a/date.h +++ b/date.h @@ -4148,8 +4148,9 @@ namespace detail template void parse(std::basic_istream& is, - const std::basic_string& format, sys_time& tp, - std::basic_string& abbrev, std::chrono::minutes& offset) + const std::basic_string& format, local_time& tp, + std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) { using namespace std; using namespace std::chrono; @@ -4334,13 +4335,15 @@ parse(std::basic_istream& is, if ((err & ios_base::failbit) == 0) { using namespace std::chrono; - tp = floor(sys_days(year{tm.tm_year + 1900}/ - (tm.tm_mon+1)/ - (tm.tm_mday)) + + tp = floor(local_days(year{tm.tm_year + 1900}/ + (tm.tm_mon+1)/ + (tm.tm_mday)) + hours{tm.tm_hour} + minutes{tm.tm_min} + seconds{tm.tm_sec} + subseconds); - abbrev = std::move(temp_abbrev); - offset = temp_offset; + if (abbrev != nullptr) + *abbrev = std::move(temp_abbrev); + if (offset != nullptr) + *offset = temp_offset; } } is.setstate(err); @@ -4349,6 +4352,79 @@ parse(std::basic_istream& is, is.setstate(ios_base::failbit); } +template +inline +void +parse(std::basic_istream& is, + const std::basic_string& format, local_time& tp, + std::chrono::minutes* offset) +{ + parse(is, format, tp, static_cast*>(nullptr), offset); +} + +template > +struct parse_local_manip +{ + const std::basic_string& format_; + local_time& tp_; + std::basic_string* abbrev_; + std::chrono::minutes* offset_; + +public: + parse_local_manip(const std::basic_string& format, + local_time& tp, std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) + : format_(format) + , tp_(tp) + , abbrev_(abbrev) + , offset_(offset) + {} + +}; + +template +std::basic_istream& +operator>>(std::basic_istream& is, + const parse_local_manip& x) +{ + parse(is, x.format_, x.tp_, x.abbrev_, x.offset_); + return is; +} + +template > +struct parse_sys_manip +{ + const std::basic_string& format_; + sys_time& tp_; + std::basic_string* abbrev_; + std::chrono::minutes* offset_; + +public: + parse_sys_manip(const std::basic_string& format, + sys_time& tp, std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) + : format_(format) + , tp_(tp) + , abbrev_(abbrev) + , offset_(offset) + {} + +}; + +template +std::basic_istream& +operator>>(std::basic_istream& is, + const parse_sys_manip& x) +{ + std::chrono::minutes offset{}; + auto offptr = x.offset_ ? x.offset_ : &offset; + local_time lt; + parse(is, x.format_, lt, x.abbrev_, offptr); + if (!is.fail()) + x.tp_ = sys_time{floor(lt - *offptr).time_since_epoch()}; + return is; +} + } // namespace detail template @@ -4357,11 +4433,19 @@ void parse(std::basic_istream& is, const std::basic_string& format, sys_time& tp) { - std::basic_string abbrev; std::chrono::minutes offset{}; - detail::parse(is, format, tp, abbrev, offset); + local_time lt; + detail::parse(is, format, lt, &offset); if (!is.fail()) - tp = floor(tp - offset); + tp = sys_time{floor(lt - offset).time_since_epoch()}; +} + +template +inline +detail::parse_sys_manip +parse(const std::basic_string& format, sys_time& tp) +{ + return {format, tp}; } template @@ -4372,9 +4456,19 @@ parse(std::basic_istream& is, std::basic_string& abbrev) { std::chrono::minutes offset{}; - detail::parse(is, format, tp, abbrev, offset); + local_time lt; + detail::parse(is, format, lt, &abbrev, &offset); if (!is.fail()) - tp = floor(tp - offset); + tp = sys_time{floor(lt - offset).time_since_epoch()}; +} + +template +inline +detail::parse_sys_manip +parse(const std::basic_string& format, sys_time& tp, + std::basic_string& abbrev) +{ + return {format, tp, &abbrev}; } template @@ -4384,10 +4478,19 @@ parse(std::basic_istream& is, const std::basic_string& format, sys_time& tp, std::chrono::minutes& offset) { - std::basic_string abbrev; - detail::parse(is, format, tp, abbrev, offset); + local_time lt; + detail::parse(is, format, lt, &offset); if (!is.fail()) - tp = floor(tp - offset); + tp = sys_time{floor(lt - offset).time_since_epoch()}; +} + +template +inline +detail::parse_sys_manip +parse(const std::basic_string& format, sys_time& tp, + std::chrono::minutes& offset) +{ + return {format, tp, &offset}; } template @@ -4397,9 +4500,19 @@ parse(std::basic_istream& is, const std::basic_string& format, sys_time& tp, std::basic_string& abbrev, std::chrono::minutes& offset) { - detail::parse(is, format, tp, abbrev, offset); + local_time lt; + detail::parse(is, format, lt, &abbrev, &offset); if (!is.fail()) - tp = floor(tp - offset); + tp = sys_time{floor(lt - offset).time_since_epoch()}; +} + +template +inline +detail::parse_sys_manip +parse(const std::basic_string& format, sys_time& tp, + std::basic_string& abbrev, std::chrono::minutes& offset) +{ + return {format, tp, &abbrev, &offset}; } template @@ -4409,9 +4522,19 @@ parse(std::basic_istream& is, const std::basic_string& format, sys_time& tp, std::chrono::minutes& offset, std::basic_string& abbrev) { - detail::parse(is, format, tp, abbrev, offset); + local_time lt; + detail::parse(is, format, lt, &abbrev, &offset); if (!is.fail()) - tp = floor(tp - offset); + tp = sys_time{floor(lt - offset).time_since_epoch()}; +} + +template +inline +detail::parse_sys_manip +parse(const std::basic_string& format, sys_time& tp, + std::chrono::minutes& offset, std::basic_string& abbrev) +{ + return {format, tp, &abbrev, &offset}; } template @@ -4420,12 +4543,15 @@ void parse(std::basic_istream& is, const std::basic_string& format, local_time& tp) { - sys_time st; - std::basic_string abbrev; - std::chrono::minutes offset{}; - detail::parse(is, format, st, abbrev, offset); - if (!is.fail()) - tp = local_time{st.time_since_epoch()}; + detail::parse(is, format, tp); +} + +template +inline +detail::parse_local_manip +parse(const std::basic_string& format, local_time& tp) +{ + return {format, tp}; } template @@ -4435,11 +4561,16 @@ parse(std::basic_istream& is, const std::basic_string& format, local_time& tp, std::basic_string& abbrev) { - sys_time st; - std::chrono::minutes offset{}; - detail::parse(is, format, st, abbrev, offset); - if (!is.fail()) - tp = local_time{st.time_since_epoch()}; + detail::parse(is, format, tp, &abbrev); +} + +template +inline +detail::parse_local_manip +parse(const std::basic_string& format, local_time& tp, + std::basic_string& abbrev) +{ + return {format, tp, &abbrev}; } template @@ -4449,11 +4580,16 @@ parse(std::basic_istream& is, const std::basic_string& format, local_time& tp, std::chrono::minutes& offset) { - sys_time st; - std::basic_string abbrev; - detail::parse(is, format, st, abbrev, offset); - if (!is.fail()) - tp = local_time{st.time_since_epoch()}; + detail::parse(is, format, tp, &offset); +} + +template +inline +detail::parse_local_manip +parse(const std::basic_string& format, local_time& tp, + std::chrono::minutes& offset) +{ + return {format, tp, &offset}; } template @@ -4463,10 +4599,16 @@ parse(std::basic_istream& is, const std::basic_string& format, local_time& tp, std::basic_string& abbrev, std::chrono::minutes& offset) { - sys_time st; - detail::parse(is, format, st, abbrev, offset); - if (!is.fail()) - tp = local_time{st.time_since_epoch()}; + detail::parse(is, format, tp, &abbrev, &offset); +} + +template +inline +detail::parse_local_manip +parse(const std::basic_string& format, local_time& tp, + std::basic_string& abbrev, std::chrono::minutes& offset) +{ + return {format, tp, &abbrev, &offset}; } template @@ -4476,10 +4618,16 @@ parse(std::basic_istream& is, const std::basic_string& format, local_time& tp, std::chrono::minutes& offset, std::basic_string& abbrev) { - sys_time st; - detail::parse(is, format, st, abbrev, offset); - if (!is.fail()) - tp = local_time{st.time_since_epoch()}; + detail::parse(is, format, tp, &abbrev, &offset); +} + +template +inline +detail::parse_local_manip +parse(const std::basic_string& format, local_time& tp, + std::chrono::minutes& offset, std::basic_string& abbrev) +{ + return {format, tp, &abbrev, &offset}; } // const CharT* formats @@ -4492,6 +4640,14 @@ parse(std::basic_istream& is, const CharT* format, sys_time(format), tp); } +template +inline +detail::parse_sys_manip +parse(const CharT* format, sys_time& tp) +{ + return {format, tp}; +} + template inline void @@ -4501,6 +4657,15 @@ parse(std::basic_istream& is, const CharT* format, sys_time(format), tp, abbrev); } +template +inline +detail::parse_sys_manip +parse(const CharT* format, sys_time& tp, + std::basic_string& abbrev) +{ + return {format, tp, &abbrev}; +} + template inline void @@ -4510,6 +4675,14 @@ parse(std::basic_istream& is, const CharT* format, sys_time(format), tp, offset); } +template +inline +detail::parse_sys_manip +parse(const CharT* format, sys_time& tp, std::chrono::minutes& offset) +{ + return {format, tp, nullptr, &offset}; +} + template inline void @@ -4519,6 +4692,15 @@ parse(std::basic_istream& is, const CharT* format, sys_time(format), tp, abbrev, offset); } +template +inline +detail::parse_sys_manip +parse(const CharT* format, sys_time& tp, + std::basic_string& abbrev, std::chrono::minutes& offset) +{ + return {format, tp, &abbrev, &offset}; +} + template inline void @@ -4528,6 +4710,15 @@ parse(std::basic_istream& is, const CharT* format, sys_time(format), tp, abbrev, offset); } +template +inline +detail::parse_sys_manip +parse(const CharT* format, sys_time& tp, + std::chrono::minutes& offset, std::basic_string& abbrev) +{ + return {format, tp, &abbrev, &offset}; +} + template inline void @@ -4537,6 +4728,14 @@ parse(std::basic_istream& is, const CharT* format, parse(is, std::basic_string(format), tp); } +template +inline +detail::parse_local_manip +parse(const CharT* format, local_time& tp) +{ + return {format, tp}; +} + template inline void @@ -4546,6 +4745,15 @@ parse(std::basic_istream& is, const CharT* format, parse(is, std::basic_string(format), tp, abbrev); } +template +inline +detail::parse_local_manip +parse(const CharT* format, local_time& tp, + std::basic_string& abbrev) +{ + return {format, tp, &abbrev}; +} + template inline void @@ -4555,6 +4763,14 @@ parse(std::basic_istream& is, const CharT* format, parse(is, std::basic_string(format), tp, offset); } +template +inline +detail::parse_local_manip +parse(const CharT* format, local_time& tp, std::chrono::minutes& offset) +{ + return {format, tp, nullptr, &offset}; +} + template inline void @@ -4565,6 +4781,15 @@ parse(std::basic_istream& is, const CharT* format, parse(is, std::basic_string(format), tp, abbrev, offset); } +template +inline +detail::parse_local_manip +parse(const CharT* format, local_time& tp, + std::basic_string& abbrev, std::chrono::minutes& offset) +{ + return {format, tp, &abbrev, &offset}; +} + template inline void @@ -4575,6 +4800,15 @@ parse(std::basic_istream& is, const CharT* format, parse(is, std::basic_string(format), tp, abbrev, offset); } +template +inline +detail::parse_local_manip +parse(const CharT* format, local_time& tp, std::chrono::minutes& offset, + std::basic_string& abbrev) +{ + return {format, tp, &abbrev, &offset}; +} + } // namespace date #endif // DATE_H