From 3df43424ac998caab48bb98c89540f5d88e631ba Mon Sep 17 00:00:00 2001 From: Howard Hinnant Date: Thu, 2 Mar 2017 13:16:22 -1000 Subject: [PATCH] Add from_stream --- date.h | 662 ++++++++++----------------------------------------------- tz.h | 275 +++--------------------- 2 files changed, 142 insertions(+), 795 deletions(-) diff --git a/date.h b/date.h index 6fa5ca3..951bdc2 100644 --- a/date.h +++ b/date.h @@ -3397,10 +3397,9 @@ to_stream(std::basic_ostream& os, const CharT* fmt, template void -parse(std::basic_istream& is, - const CharT* fmt, fields& fds, - std::basic_string* abbrev = nullptr, - std::chrono::minutes* offset = nullptr); +from_stream(std::basic_istream& is, const CharT* fmt, + fields& fds, std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr); // time_of_day @@ -3918,7 +3917,7 @@ public: template friend void - date::parse(std::basic_istream& is, const CharT* fmt, + date::from_stream(std::basic_istream& is, const CharT* fmt, fields& fds, std::basic_string* abbrev, std::chrono::minutes* offset); }; @@ -4022,7 +4021,7 @@ public: template friend void - date::parse(std::basic_istream& is, const CharT* fmt, + date::from_stream(std::basic_istream& is, const CharT* fmt, fields& fds, std::basic_string* abbrev, std::chrono::minutes* offset); }; @@ -5016,8 +5015,6 @@ to_stream(std::basic_ostream& os, const CharT* fmt, // format -#ifndef NO_EXPRESSION_SFINAE - template auto format(const std::locale& loc, const CharT* fmt, const Streamable& tp) @@ -5065,172 +5062,6 @@ format(const std::basic_string& fmt, const Streamable& tp) return os.str(); } -#else // NO_EXPRESSION_SFINAE - -// const CharT* formats - -template -std::basic_string -format(const std::locale& loc, const CharT* fmt, const year_month_day& ymd) -{ - std::basic_ostringstream os; - os.imbue(loc); - to_stream(os, fmt, ymd); - return os.str(); -} - -template -std::basic_string -format(const CharT* fmt, const year_month_day& ymd) -{ - std::basic_ostringstream os; - to_stream(os, fmt, ymd); - return os.str(); -} - -template -std::basic_string -format(const std::locale& loc, const CharT* fmt, const local_time& tp) -{ - std::basic_ostringstream os; - os.imbue(loc); - to_stream(os, fmt, tp); - return os.str(); -} - -template -std::basic_string -format(const CharT* fmt, const local_time& tp) -{ - std::basic_ostringstream os; - to_stream(os, fmt, tp); - return os.str(); -} - -template -std::basic_string -format(const std::locale& loc, const CharT* fmt, const sys_time& tp) -{ - std::basic_ostringstream os; - os.imbue(loc); - to_stream(os, fmt, tp); - return os.str(); -} - -template -std::basic_string -format(const CharT* fmt, const sys_time& tp) -{ - std::basic_ostringstream os; - to_stream(os, fmt, tp); - return os.str(); -} - -template -std::basic_string -format(const std::locale& loc, const CharT* fmt, - const std::chrono::duration& d) -{ - std::basic_ostringstream os; - os.imbue(loc); - to_stream(os, fmt, d); - return os.str(); -} - -template -std::basic_string -format(const CharT* fmt, const std::chrono::duration& d) -{ - std::basic_ostringstream os; - to_stream(os, fmt, d); - return os.str(); -} - -// basic_string formats - -template -std::basic_string -format(const std::locale& loc, const std::basic_string& fmt, - const year_month_day& ymd) -{ - std::basic_ostringstream os; - os.imbue(loc); - to_stream(os, fmt.c_str(), ymd); - return os.str(); -} - -template -std::basic_string -format(const std::basic_string& fmt, const year_month_day& ymd) -{ - std::basic_ostringstream os; - to_stream(os, fmt.c_str(), ymd); - return os.str(); -} - -template -std::basic_string -format(const std::locale& loc, const std::basic_string& fmt, - const local_time& tp) -{ - std::basic_ostringstream os; - os.imbue(loc); - to_stream(os, fmt.c_str(), tp); - return os.str(); -} - -template -std::basic_string -format(const std::basic_string& fmt, const local_time& tp) -{ - std::basic_ostringstream os; - to_stream(os, fmt.c_str(), tp); - return os.str(); -} - -template -std::basic_string -format(const std::locale& loc, const std::basic_string& fmt, - const sys_time& tp) -{ - std::basic_ostringstream os; - os.imbue(loc); - to_stream(os, fmt.c_str(), tp); - return os.str(); -} - -template -std::basic_string -format(const std::basic_string& fmt, const sys_time& tp) -{ - std::basic_ostringstream os; - to_stream(os, fmt.c_str(), tp); - return os.str(); -} - -template -std::basic_string -format(const std::locale& loc, const std::basic_string& fmt, - const std::chrono::duration& d) -{ - std::basic_ostringstream os; - os.imbue(loc); - to_stream(os, fmt.c_str(), d); - return os.str(); -} - -template -std::basic_string -format(const std::basic_string& fmt, - const std::chrono::duration& d) -{ - std::basic_ostringstream os; - to_stream(os, fmt.c_str(), d); - return os.str(); -} - -#endif // NO_EXPRESSION_SFINAE - // parse namespace detail @@ -5468,8 +5299,9 @@ read(std::basic_istream& is, rld a0, Args&& ...args) template void -parse(std::basic_istream& is, const CharT* fmt, fields& fds, - std::basic_string* abbrev, std::chrono::minutes* offset) +from_stream(std::basic_istream& is, const CharT* fmt, + fields& fds, std::basic_string* abbrev, + std::chrono::minutes* offset) { using namespace std; using namespace std::chrono; @@ -6367,167 +6199,87 @@ broken: is.setstate(ios_base::failbit); } -template > -struct parse_manip; - -template -inline -typename parse_manip::type -parse(const std::basic_string& format, Parsable& tp) -{ - return {format, tp}; -} - -template -inline -typename parse_manip::type -parse(const std::basic_string& format, Parsable& tp, - std::basic_string& abbrev) -{ - return {format, tp, &abbrev}; -} - -template -inline -typename parse_manip::type -parse(const std::basic_string& format, Parsable& tp, - std::chrono::minutes& offset) -{ - return {format, tp, nullptr, &offset}; -} - -template -inline -typename parse_manip::type -parse(const std::basic_string& format, Parsable& tp, - std::basic_string& abbrev, std::chrono::minutes& offset) -{ - return {format, tp, &abbrev, &offset}; -} - -// const CharT* formats - -template -inline -typename parse_manip::type -parse(const CharT* format, Parsable& tp) -{ - return {format, tp}; -} - -template -inline -typename parse_manip::type -parse(const CharT* format, Parsable& tp, std::basic_string& abbrev) -{ - return {format, tp, &abbrev}; -} - -template -inline -typename parse_manip::type -parse(const CharT* format, Parsable& tp, std::chrono::minutes& offset) -{ - return {format, tp, nullptr, &offset}; -} - -template -inline -typename parse_manip::type -parse(const CharT* format, Parsable& tp, - std::basic_string& abbrev, std::chrono::minutes& offset) -{ - return {format, tp, &abbrev, &offset}; -} - template -struct parse_manip -{ - using type = parse_manip; - const std::basic_string format_; - year_month_day& ymd_; - std::basic_string* abbrev_; - std::chrono::minutes* offset_; - - parse_manip(std::basic_string format, - year_month_day& ymd, std::basic_string* abbrev = nullptr, - std::chrono::minutes* offset = nullptr) - : format_(std::move(format)) - , ymd_(ymd) - , abbrev_(abbrev) - , offset_(offset) - {} -}; - -template -inline -std::basic_istream& -operator>>(std::basic_istream& is, - const parse_manip& x) +void +from_stream(std::basic_istream& is, const CharT* fmt, + year_month_day& ymd, std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) { using namespace std; using namespace std::chrono; using CT = seconds; fields fds{}; - parse(is, x.format_.c_str(), fds, x.abbrev_, x.offset_); + from_stream(is, fmt, fds, abbrev, offset); if (!fds.ymd.ok()) is.setstate(ios::failbit); if (!is.fail()) - x.ymd_ = fds.ymd; - return is; + ymd = fds.ymd; } template -struct parse_manip, CharT, Traits> +void +from_stream(std::basic_istream& is, const CharT* fmt, + sys_time& tp, std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) { - using type = parse_manip; - const std::basic_string format_; - local_time& tp_; - std::basic_string* abbrev_; - std::chrono::minutes* offset_; - -public: - parse_manip(std::basic_string format, - local_time& tp, std::basic_string* abbrev = nullptr, - std::chrono::minutes* offset = nullptr) - : format_(std::move(format)) - , tp_(tp) - , abbrev_(abbrev) - , offset_(offset) - {} - -}; + using namespace std; + using namespace std::chrono; + using CT = typename common_type::type; + minutes offset_local{}; + auto offptr = offset ? offset : &offset_local; + fields fds{}; + from_stream(is, fmt, fds, abbrev, offptr); + if (!fds.ymd.ok()) + is.setstate(ios::failbit); + if (!is.fail()) + tp = sys_days(fds.ymd) + duration_cast(fds.tod.to_duration() - *offptr); +} template -inline -std::basic_istream& -operator>>(std::basic_istream& is, - const parse_manip, CharT, Traits>& x) +void +from_stream(std::basic_istream& is, const CharT* fmt, + local_time& tp, std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) { using namespace std; using namespace std::chrono; using CT = typename common_type::type; fields fds{}; - parse(is, x.format_.c_str(), fds, x.abbrev_, x.offset_); + from_stream(is, fmt, fds, abbrev, offset); if (!fds.ymd.ok()) is.setstate(ios::failbit); if (!is.fail()) - x.tp_ = local_days(fds.ymd) + duration_cast(fds.tod.to_duration()); - return is; + tp = local_days(fds.ymd) + duration_cast(fds.tod.to_duration()); } -template -struct parse_manip, CharT, Traits> +template +void +from_stream(std::basic_istream& is, const CharT* fmt, + std::chrono::duration& d, + std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) +{ + using namespace std; + using namespace std::chrono; + using Duration = std::chrono::duration; + using CT = typename common_type::type; + fields fds{}; + from_stream(is, fmt, fds, abbrev, offset); + if (!is.fail()) + d = duration_cast(fds.tod.to_duration()); +} + +template > +struct parse_manip { - using type = parse_manip; const std::basic_string format_; - sys_time& tp_; + Parsable& tp_; std::basic_string* abbrev_; std::chrono::minutes* offset_; public: parse_manip(std::basic_string format, - sys_time& tp, std::basic_string* abbrev = nullptr, + Parsable& tp, std::basic_string* abbrev = nullptr, std::chrono::minutes* offset = nullptr) : format_(std::move(format)) , tp_(tp) @@ -6537,288 +6289,108 @@ public: }; -template +template std::basic_istream& operator>>(std::basic_istream& is, - const parse_manip, CharT, Traits>& x) + const parse_manip& x) { - using namespace std; - using namespace std::chrono; - using CT = typename common_type::type; - minutes offset{}; - auto offptr = x.offset_ ? x.offset_ : &offset; - fields fds{}; - parse(is, x.format_.c_str(), fds, x.abbrev_, offptr); - if (!fds.ymd.ok()) - is.setstate(ios::failbit); - if (!is.fail()) - x.tp_ = sys_days(fds.ymd) + - duration_cast(fds.tod.to_duration() - *offptr); + from_stream(is, x.format_.c_str(), x.tp_, x.abbrev_, x.offset_); return is; } -template -struct parse_manip, CharT, Traits> -{ - using type = parse_manip; - using Duration = std::chrono::duration; - const std::basic_string format_; - Duration& d_; - -public: - parse_manip(std::basic_string format, Duration& d) - : format_(std::move(format)) - , d_(d) - {} - -}; - -template +template inline -std::basic_istream& -operator>>(std::basic_istream& is, - const parse_manip, CharT, Traits>& x) +auto +parse(const std::basic_string& format, Parsable& tp) + -> decltype(from_stream(std::declval&>(), + format.c_str(), tp), + parse_manip{format, tp}) { - using namespace std; - using namespace std::chrono; - using Duration = std::chrono::duration; - using CT = typename common_type::type; - fields fds{}; - parse(is, x.format_.c_str(), fds); - if (fds.ymd.ok()) - is.setstate(ios::failbit); - if (!is.fail()) - x.d_ = duration_cast(fds.tod.to_duration()); - return is; + return {format, tp}; } -#if 0 // use in >> parse(format, x); instead - -template +template inline -void -parse(std::basic_istream& is, - const std::basic_string& format, sys_time& tp) -{ - std::chrono::minutes offset{}; - local_time lt; - detail::parse(is, format.c_str(), lt, &offset); - if (!is.fail()) - tp = sys_time{floor(lt - offset).time_since_epoch()}; -} - -template -inline -void -parse(std::basic_istream& is, - const std::basic_string& format, sys_time& tp, +auto +parse(const std::basic_string& format, Parsable& tp, std::basic_string& abbrev) + -> decltype(from_stream(std::declval&>(), + format.c_str(), tp, &abbrev), + parse_manip{format, tp, &abbrev}) { - std::chrono::minutes offset{}; - local_time lt; - detail::parse(is, format.c_str(), lt, &abbrev, &offset); - if (!is.fail()) - tp = sys_time{floor(lt - offset).time_since_epoch()}; + return {format, tp, &abbrev}; } -template +template inline -void -parse(std::basic_istream& is, - const std::basic_string& format, sys_time& tp, +auto +parse(const std::basic_string& format, Parsable& tp, std::chrono::minutes& offset) + -> decltype(from_stream(std::declval&>(), + format.c_str(), tp, nullptr, &offset), + parse_manip{format, tp, nullptr, &offset}) { - local_time lt; - detail::parse(is, format.c_str(), lt, &offset); - if (!is.fail()) - tp = sys_time{floor(lt - offset).time_since_epoch()}; + return {format, tp, nullptr, &offset}; } -template +template inline -void -parse(std::basic_istream& is, - const std::basic_string& format, sys_time& tp, +auto +parse(const std::basic_string& format, Parsable& tp, std::basic_string& abbrev, std::chrono::minutes& offset) + -> decltype(from_stream(std::declval&>(), + format.c_str(), tp, &abbrev, &offset), + parse_manip{format, tp, &abbrev, &offset}) { - local_time lt; - detail::parse(is, format.c_str(), lt, &abbrev, &offset); - if (!is.fail()) - tp = sys_time{floor(lt - offset).time_since_epoch()}; + return {format, tp, &abbrev, &offset}; } -template +// const CharT* formats + +template inline -void -parse(std::basic_istream& is, - const std::basic_string& format, sys_time& tp, - std::chrono::minutes& offset, std::basic_string& abbrev) +auto +parse(const CharT* format, Parsable& tp) + -> decltype(from_stream(std::declval&>(), format, tp), + parse_manip{format, tp}) { - local_time lt; - detail::parse(is, format.c_str(), lt, &abbrev, &offset); - if (!is.fail()) - tp = sys_time{floor(lt - offset).time_since_epoch()}; + return {format, tp}; } -template +template inline -void -parse(std::basic_istream& is, - const std::basic_string& format, local_time& tp) +auto +parse(const CharT* format, Parsable& tp, std::basic_string& abbrev) + -> decltype(from_stream(std::declval&>(), format, + tp, &abbrev), + parse_manip{format, tp, &abbrev}) { - detail::parse(is, format.c_str(), tp); + return {format, tp, &abbrev}; } -template +template inline -void -parse(std::basic_istream& is, - const std::basic_string& format, local_time& tp, - std::basic_string& abbrev) +auto +parse(const CharT* format, Parsable& tp, std::chrono::minutes& offset) + -> decltype(from_stream(std::declval&>(), format, + tp, nullptr, &offset), + parse_manip{format, tp, nullptr, &offset}) { - detail::parse(is, format.c_str(), tp, &abbrev); + return {format, tp, nullptr, &offset}; } -template +template inline -void -parse(std::basic_istream& is, - const std::basic_string& format, local_time& tp, - std::chrono::minutes& offset) -{ - detail::parse(is, format.c_str(), tp, &offset); -} - -template -inline -void -parse(std::basic_istream& is, - const std::basic_string& format, local_time& tp, +auto +parse(const CharT* format, Parsable& tp, std::basic_string& abbrev, std::chrono::minutes& offset) + -> decltype(from_stream(std::declval&>(), format, + tp, &abbrev, &offset), + parse_manip{format, tp, &abbrev, &offset}) { - detail::parse(is, format.c_str(), tp, &abbrev, &offset); + return {format, tp, &abbrev, &offset}; } -template -inline -void -parse(std::basic_istream& is, - const std::basic_string& format, local_time& tp, - std::chrono::minutes& offset, std::basic_string& abbrev) -{ - detail::parse(is, format.c_str(), tp, &abbrev, &offset); -} - -template -inline -void -parse(std::basic_istream& is, const CharT* format, sys_time& tp) -{ - std::chrono::minutes offset{}; - local_time lt; - detail::parse(is, format, lt, &offset); - if (!is.fail()) - tp = sys_time{floor(lt - offset).time_since_epoch()}; -} - -template -inline -void -parse(std::basic_istream& is, const CharT* format, sys_time& tp, - std::basic_string& abbrev) -{ - std::chrono::minutes offset{}; - local_time lt; - detail::parse(is, format, lt, &abbrev, &offset); - if (!is.fail()) - tp = sys_time{floor(lt - offset).time_since_epoch()}; -} - -template -inline -void -parse(std::basic_istream& is, const CharT* format, sys_time& tp, - std::chrono::minutes& offset) -{ - local_time lt; - detail::parse(is, format, lt, &offset); - if (!is.fail()) - tp = sys_time{floor(lt - offset).time_since_epoch()}; -} - -template -inline -void -parse(std::basic_istream& is, const CharT* format, sys_time& tp, - std::basic_string& abbrev, std::chrono::minutes& offset) -{ - local_time lt; - detail::parse(is, format, lt, &abbrev, &offset); - if (!is.fail()) - tp = sys_time{floor(lt - offset).time_since_epoch()}; -} - -template -inline -void -parse(std::basic_istream& is, const CharT* format, sys_time& tp, - std::chrono::minutes& offset, std::basic_string& abbrev) -{ - local_time lt; - detail::parse(is, format, lt, &abbrev, &offset); - if (!is.fail()) - tp = sys_time{floor(lt - offset).time_since_epoch()}; -} - -template -inline -void -parse(std::basic_istream& is, const CharT* format, - local_time& tp) -{ - detail::parse(is, format, tp); -} - -template -inline -void -parse(std::basic_istream& is, const CharT* format, - local_time& tp, std::basic_string& abbrev) -{ - detail::parse(is, format, tp, &abbrev); -} - -template -inline -void -parse(std::basic_istream& is, const CharT* format, - local_time& tp, std::chrono::minutes& offset) -{ - detail::parse(is, format, tp, &offset); -} - -template -inline -void -parse(std::basic_istream& is, const CharT* format, - local_time& tp, std::basic_string& abbrev, - std::chrono::minutes& offset) -{ - detail::parse(is, format, tp, &abbrev, &offset); -} - -template -inline -void -parse(std::basic_istream& is, const CharT* format, - local_time& tp, std::chrono::minutes& offset, - std::basic_string& abbrev) -{ - detail::parse(is, format, tp, &abbrev, &offset); -} - -#endif // use in >> parse(format, x); instead - } // namespace date #endif // DATE_H diff --git a/tz.h b/tz.h index cbb9b54..4cd1d1e 100644 --- a/tz.h +++ b/tz.h @@ -1159,38 +1159,18 @@ operator<<(std::basic_ostream& os, const utc_time& t) } template -struct parse_manip, CharT, Traits> -{ - using type = parse_manip; - const std::basic_string format_; - utc_time& tp_; - std::basic_string* abbrev_; - std::chrono::minutes* offset_; - -public: - parse_manip(std::basic_string format, - utc_time& tp, std::basic_string* abbrev = nullptr, - std::chrono::minutes* offset = nullptr) - : format_(std::move(format)) - , tp_(tp) - , abbrev_(abbrev) - , offset_(offset) - {} - -}; - -template -std::basic_istream& -operator>>(std::basic_istream& is, - const parse_manip, CharT, Traits>& x) +void +from_stream(std::basic_istream& is, const CharT* fmt, + utc_time& tp, std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) { using namespace std; using namespace std::chrono; using CT = typename common_type::type; - minutes offset{}; - auto offptr = x.offset_ ? x.offset_ : &offset; + minutes offset_local{}; + auto offptr = offset ? offset : &offset_local; fields fds{}; - parse(is, x.format_.c_str(), fds, x.abbrev_, offptr); + from_stream(is, fmt, fds, abbrev, offptr); if (!fds.ymd.ok()) is.setstate(ios::failbit); if (!is.fail()) @@ -1198,12 +1178,11 @@ operator>>(std::basic_istream& is, bool is_leap_second = fds.tod.seconds() == seconds{60}; if (is_leap_second) fds.tod.seconds() -= seconds{1}; - x.tp_ = to_utc_time(sys_days(fds.ymd) + + tp = to_utc_time(sys_days(fds.ymd) + duration_cast(fds.tod.to_duration() - *offptr)); if (is_leap_second) - x.tp_ += seconds{1}; + tp += seconds{1}; } - return is; } // tai_clock @@ -1291,45 +1270,24 @@ operator<<(std::basic_ostream& os, const tai_time& t) } template -struct parse_manip, CharT, Traits> -{ - using type = parse_manip; - const std::basic_string format_; - tai_time& tp_; - std::basic_string* abbrev_; - std::chrono::minutes* offset_; - -public: - parse_manip(std::basic_string format, - tai_time& tp, std::basic_string* abbrev = nullptr, - std::chrono::minutes* offset = nullptr) - : format_(std::move(format)) - , tp_(tp) - , abbrev_(abbrev) - , offset_(offset) - {} - -}; - -template -std::basic_istream& -operator>>(std::basic_istream& is, - const parse_manip, CharT, Traits>& x) +void +from_stream(std::basic_istream& is, const CharT* fmt, + tai_time& tp, std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) { using namespace std; using namespace std::chrono; using CT = typename common_type::type; - minutes offset{}; - auto offptr = x.offset_ ? x.offset_ : &offset; + minutes offset_local{}; + auto offptr = offset ? offset : &offset_local; fields fds{}; - parse(is, x.format_.c_str(), fds, x.abbrev_, offptr); + from_stream(is, fmt, fds, abbrev, offptr); if (!fds.ymd.ok()) is.setstate(ios::failbit); if (!is.fail()) - x.tp_ = tai_time{duration_cast( + tp = tai_time{duration_cast( (sys_days(fds.ymd) + fds.tod.to_duration() + (sys_days(year{1970}/jan/1) - sys_days(year{1958}/jan/1)) - *offptr).time_since_epoch())}; - return is; } // gps_clock @@ -1417,46 +1375,25 @@ operator<<(std::basic_ostream& os, const gps_time& t) } template -struct parse_manip, CharT, Traits> -{ - using type = parse_manip; - const std::basic_string format_; - gps_time& tp_; - std::basic_string* abbrev_; - std::chrono::minutes* offset_; - -public: - parse_manip(std::basic_string format, - gps_time& tp, std::basic_string* abbrev = nullptr, - std::chrono::minutes* offset = nullptr) - : format_(std::move(format)) - , tp_(tp) - , abbrev_(abbrev) - , offset_(offset) - {} - -}; - -template -std::basic_istream& -operator>>(std::basic_istream& is, - const parse_manip, CharT, Traits>& x) +void +from_stream(std::basic_istream& is, const CharT* fmt, + gps_time& tp, std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) { using namespace std; using namespace std::chrono; using CT = typename common_type::type; - minutes offset{}; - auto offptr = x.offset_ ? x.offset_ : &offset; + minutes offset_local{}; + auto offptr = offset ? offset : &offset_local; fields fds{}; - parse(is, x.format_.c_str(), fds, x.abbrev_, offptr); + from_stream(is, fmt, fds, abbrev, offptr); if (!fds.ymd.ok()) is.setstate(ios::failbit); if (!is.fail()) - x.tp_ = gps_time{duration_cast( + tp = gps_time{duration_cast( (sys_days(fds.ymd) + fds.tod.to_duration() - (sys_days(year{1980}/jan/sun[1]) - sys_days(year{1970}/jan/1)) - *offptr).time_since_epoch())}; - return is; } template @@ -1497,168 +1434,6 @@ to_gps_time(const tai_time& t) NOEXCEPT (sys_days(year{1980}/jan/sun[1]) - sys_days(year{1958}/jan/1) + seconds{19}); } -#ifdef NO_EXPRESSION_SFINAE -// format -// basic_string formats - -template -std::basic_string -format(const std::locale& loc, const std::basic_string& fmt, - const zoned_time& tp) -{ - std::basic_ostringstream os; - os.imbue(loc); - to_stream(os, fmt.c_str(), tp); - return os.str(); -} - -template -std::basic_string -format(const std::basic_string& fmt, const zoned_time& tp) -{ - std::basic_ostringstream os; - to_stream(os, fmt.c_str(), tp); - return os.str(); -} - -template -std::basic_string -format(const std::locale& loc, const CharT* fmt, const zoned_time& tp) -{ - std::basic_ostringstream os; - os.imbue(loc); - to_stream(os, fmt, tp); - return os.str(); -} - -template -std::basic_string -format(const CharT* fmt, const zoned_time& tp) -{ - std::basic_ostringstream os; - to_stream(os, fmt, tp); - return os.str(); -} - -template -std::basic_string -format(const std::locale& loc, const CharT* fmt, const utc_time& tp) -{ - std::basic_ostringstream os; - os.imbue(loc); - to_stream(os, fmt, tp); - return os.str(); -} - -template -std::basic_string -format(const CharT* fmt, const utc_time& tp) -{ - std::basic_ostringstream os; - to_stream(os, fmt, tp); - return os.str(); -} - -template -std::basic_string -format(const std::locale& loc, const std::basic_string& fmt, - const utc_time& tp) -{ - std::basic_ostringstream os; - os.imbue(loc); - to_stream(os, fmt.c_str(), tp); - return os.str(); -} - -template -std::basic_string -format(const std::basic_string& fmt, const utc_time& tp) -{ - std::basic_ostringstream os; - to_stream(os, fmt.c_str(), tp); - return os.str(); -} - -template -std::basic_string -format(const std::locale& loc, const CharT* fmt, const tai_time& tp) -{ - std::basic_ostringstream os; - os.imbue(loc); - to_stream(os, fmt, tp); - return os.str(); -} - -template -std::basic_string -format(const CharT* fmt, const tai_time& tp) -{ - std::basic_ostringstream os; - to_stream(os, fmt, tp); - return os.str(); -} - -template -std::basic_string -format(const std::locale& loc, const std::basic_string& fmt, - const tai_time& tp) -{ - std::basic_ostringstream os; - os.imbue(loc); - to_stream(os, fmt.c_str(), tp); - return os.str(); -} - -template -std::basic_string -format(const std::basic_string& fmt, const tai_time& tp) -{ - std::basic_ostringstream os; - to_stream(os, fmt.c_str(), tp); - return os.str(); -} - -template -std::basic_string -format(const std::locale& loc, const CharT* fmt, const gps_time& tp) -{ - std::basic_ostringstream os; - os.imbue(loc); - to_stream(os, fmt, tp); - return os.str(); -} - -template -std::basic_string -format(const CharT* fmt, const gps_time& tp) -{ - std::basic_ostringstream os; - to_stream(os, fmt, tp); - return os.str(); -} - -template -std::basic_string -format(const std::locale& loc, const std::basic_string& fmt, - const gps_time& tp) -{ - std::basic_ostringstream os; - os.imbue(loc); - to_stream(os, fmt.c_str(), tp); - return os.str(); -} - -template -std::basic_string -format(const std::basic_string& fmt, const gps_time& tp) -{ - std::basic_ostringstream os; - to_stream(os, fmt.c_str(), tp); - return os.str(); -} - -#endif // NO_EXPRESSION_SFINAE - } // namespace date #endif // TZ_H