From f4292e6aca78a1f18b582debe15926ed37ce5da0 Mon Sep 17 00:00:00 2001 From: gaspardpetit Date: Wed, 8 Mar 2017 13:03:22 -0500 Subject: [PATCH] Added Alloc argument to template parameters to support custom allocators in from_stream --- date.h | 107 +++++++++++++++++++++++++++++---------------------------- tz.h | 14 ++++---- 2 files changed, 62 insertions(+), 59 deletions(-) diff --git a/date.h b/date.h index 1fedf7f..a9586e8 100644 --- a/date.h +++ b/date.h @@ -3395,10 +3395,10 @@ to_stream(std::basic_ostream& os, const CharT* fmt, const fields& fds, const std::string* abbrev = nullptr, const std::chrono::seconds* offset_sec = nullptr); -template +template void from_stream(std::basic_istream& is, const CharT* fmt, - fields& fds, std::basic_string* abbrev = nullptr, + fields& fds, std::basic_string* abbrev = nullptr, std::chrono::minutes* offset = nullptr); // time_of_day @@ -3914,12 +3914,12 @@ public: const fields& fds, const std::string* abbrev, const std::chrono::seconds* offset_sec); - template + template friend void date::from_stream(std::basic_istream& is, const CharT* fmt, fields& fds, - std::basic_string* abbrev, std::chrono::minutes* offset); + std::basic_string* abbrev, std::chrono::minutes* offset); }; template @@ -4018,12 +4018,12 @@ public: const fields& fds, const std::string* abbrev, const std::chrono::seconds* offset_sec); - template + template friend void date::from_stream(std::basic_istream& is, const CharT* fmt, fields& fds, - std::basic_string* abbrev, std::chrono::minutes* offset); + std::basic_string* abbrev, std::chrono::minutes* offset); }; } // namespace detail @@ -5038,12 +5038,12 @@ format(const CharT* fmt, const Streamable& tp) return os.str(); } -template +template auto -format(const std::locale& loc, const std::basic_string& fmt, +format(const std::locale& loc, const std::basic_string& fmt, const Streamable& tp) -> decltype(to_stream(std::declval&>(), fmt, tp), - std::basic_string{}) + std::basic_string{}) { std::basic_ostringstream os; os.imbue(loc); @@ -5051,11 +5051,11 @@ format(const std::locale& loc, const std::basic_string& fmt, return os.str(); } -template +template auto -format(const std::basic_string& fmt, const Streamable& tp) +format(const std::basic_string& fmt, const Streamable& tp) -> decltype(to_stream(std::declval&>(), fmt, tp), - std::basic_string{}) + std::basic_string{}) { std::basic_ostringstream os; to_stream(os, fmt.c_str(), tp); @@ -5297,10 +5297,10 @@ read(std::basic_istream& is, rld a0, Args&& ...args) } // namespace detail; -template +template > void from_stream(std::basic_istream& is, const CharT* fmt, - fields& fds, std::basic_string* abbrev, + fields& fds, std::basic_string* abbrev, std::chrono::minutes* offset) { using namespace std; @@ -5310,7 +5310,7 @@ from_stream(std::basic_istream& is, const CharT* fmt, { auto& f = use_facet>(is.getloc()); std::tm tm{}; - std::basic_string temp_abbrev; + std::basic_string temp_abbrev; minutes temp_offset{}; const CharT* command = nullptr; auto modified = CharT{}; @@ -6199,10 +6199,10 @@ broken: is.setstate(ios_base::failbit); } -template +template > void from_stream(std::basic_istream& is, const CharT* fmt, - year_month_day& ymd, std::basic_string* abbrev = nullptr, + year_month_day& ymd, std::basic_string* abbrev = nullptr, std::chrono::minutes* offset = nullptr) { using namespace std; @@ -6216,10 +6216,10 @@ from_stream(std::basic_istream& is, const CharT* fmt, ymd = fds.ymd; } -template +template > void from_stream(std::basic_istream& is, const CharT* fmt, - sys_time& tp, std::basic_string* abbrev = nullptr, + sys_time& tp, std::basic_string* abbrev = nullptr, std::chrono::minutes* offset = nullptr) { using namespace std; @@ -6235,10 +6235,10 @@ from_stream(std::basic_istream& is, const CharT* fmt, tp = sys_days(fds.ymd) + duration_cast(fds.tod.to_duration() - *offptr); } -template +template > void from_stream(std::basic_istream& is, const CharT* fmt, - local_time& tp, std::basic_string* abbrev = nullptr, + local_time& tp, std::basic_string* abbrev = nullptr, std::chrono::minutes* offset = nullptr) { using namespace std; @@ -6252,11 +6252,11 @@ from_stream(std::basic_istream& is, const CharT* fmt, tp = local_days(fds.ymd) + duration_cast(fds.tod.to_duration()); } -template +template > void from_stream(std::basic_istream& is, const CharT* fmt, std::chrono::duration& d, - std::basic_string* abbrev = nullptr, + std::basic_string* abbrev = nullptr, std::chrono::minutes* offset = nullptr) { using namespace std; @@ -6269,18 +6269,19 @@ from_stream(std::basic_istream& is, const CharT* fmt, d = duration_cast(fds.tod.to_duration()); } -template > +template , + class Alloc = std::allocator> struct parse_manip { - const std::basic_string format_; - Parsable& tp_; - std::basic_string* abbrev_; - std::chrono::minutes* offset_; + const std::basic_string format_; + Parsable& tp_; + std::basic_string* abbrev_; + std::chrono::minutes* offset_; public: - parse_manip(std::basic_string format, - Parsable& tp, std::basic_string* abbrev = nullptr, - std::chrono::minutes* offset = nullptr) + parse_manip(std::basic_string format, Parsable& tp, + std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) : format_(std::move(format)) , tp_(tp) , abbrev_(abbrev) @@ -6289,58 +6290,58 @@ public: }; -template +template std::basic_istream& operator>>(std::basic_istream& is, - const parse_manip& x) + const parse_manip& x) { from_stream(is, x.format_.c_str(), x.tp_, x.abbrev_, x.offset_); return is; } -template +template inline auto -parse(const std::basic_string& format, Parsable& tp) +parse(const std::basic_string& format, Parsable& tp) -> decltype(from_stream(std::declval&>(), format.c_str(), tp), - parse_manip{format, tp}) + parse_manip{format, tp}) { return {format, tp}; } -template +template inline auto -parse(const std::basic_string& format, Parsable& tp, - std::basic_string& abbrev) +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}) + parse_manip{format, tp, &abbrev}) { return {format, tp, &abbrev}; } -template +template inline auto -parse(const std::basic_string& format, Parsable& tp, +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}) + parse_manip{format, tp, nullptr, &offset}) { return {format, tp, nullptr, &offset}; } -template +template inline auto -parse(const std::basic_string& format, Parsable& tp, - std::basic_string& abbrev, std::chrono::minutes& offset) +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}) + parse_manip{format, tp, &abbrev, &offset}) { return {format, tp, &abbrev, &offset}; } @@ -6357,13 +6358,13 @@ parse(const CharT* format, Parsable& tp) return {format, tp}; } -template +template inline auto -parse(const CharT* format, Parsable& tp, std::basic_string& abbrev) +parse(const CharT* format, Parsable& tp, std::basic_string& abbrev) -> decltype(from_stream(std::declval&>(), format, tp, &abbrev), - parse_manip{format, tp, &abbrev}) + parse_manip{format, tp, &abbrev}) { return {format, tp, &abbrev}; } @@ -6379,14 +6380,14 @@ parse(const CharT* format, Parsable& tp, std::chrono::minutes& offset) return {format, tp, nullptr, &offset}; } -template +template inline auto parse(const CharT* format, Parsable& tp, - std::basic_string& abbrev, std::chrono::minutes& offset) + std::basic_string& abbrev, std::chrono::minutes& offset) -> decltype(from_stream(std::declval&>(), format, tp, &abbrev, &offset), - parse_manip{format, tp, &abbrev, &offset}) + parse_manip{format, tp, &abbrev, &offset}) { return {format, tp, &abbrev, &offset}; } diff --git a/tz.h b/tz.h index ce73f7e..c13b280 100644 --- a/tz.h +++ b/tz.h @@ -1158,10 +1158,10 @@ operator<<(std::basic_ostream& os, const utc_time& t) return os; } -template +template > void from_stream(std::basic_istream& is, const CharT* fmt, - utc_time& tp, std::basic_string* abbrev = nullptr, + utc_time& tp, std::basic_string* abbrev = nullptr, std::chrono::minutes* offset = nullptr) { using namespace std; @@ -1269,10 +1269,11 @@ operator<<(std::basic_ostream& os, const tai_time& t) return os; } -template +template > void from_stream(std::basic_istream& is, const CharT* fmt, - tai_time& tp, std::basic_string* abbrev = nullptr, + tai_time& tp, + std::basic_string* abbrev = nullptr, std::chrono::minutes* offset = nullptr) { using namespace std; @@ -1374,10 +1375,11 @@ operator<<(std::basic_ostream& os, const gps_time& t) return os; } -template +template > void from_stream(std::basic_istream& is, const CharT* fmt, - gps_time& tp, std::basic_string* abbrev = nullptr, + gps_time& tp, + std::basic_string* abbrev = nullptr, std::chrono::minutes* offset = nullptr) { using namespace std;