From 28fa15c0aee4293a2180223359ad0b6bba61dcda Mon Sep 17 00:00:00 2001
From: Howard Hinnant
Changes since R3
+
zoned_time
on TimeZonePtr
.weekday_indexed
a defaulted default constructor.from_stream
and to_stream
customization points.tzdb
with
@@ -794,6 +795,7 @@ which is equal to nullptr
.
[time.timezone.exception]
[time.timezone.info]
[time.timezone.time_zone]
+ [time.timezone.zoned_traits]
[time.timezone.zoned_time]
[time.timezone.leap]
[time.timezone.link]
@@ -1450,25 +1452,29 @@ bool operator<=(const time_zone& x, const time_zone& y) noexcept;
bool operator>=(const time_zone& x, const time_zone& y) noexcept;
// zoned_time
-template <class Duration> class zoned_time;
+template <class Duration, class TimeZonePtr = const time_zone*> class zoned_time;
using zoned_seconds = zoned_time<seconds>;
-template <class Duration1, class Duration2>
+template <class Duration1, class Duration2, class TimeZonePtr>
bool
- operator==(const zoned_time<Duration1>& x, const zoned_time<Duration2>& y);
+ operator==(const zoned_time<Duration1, TimeZonePtr>& x,
+ const zoned_time<Duration2, TimeZonePtr>& y);
-template <class Duration1, class Duration2>
+template <class Duration1, class Duration, class TimeZonePtr2>
bool
- operator!=(const zoned_time<Duration1>& x, const zoned_time<Duration2>& y);
+ operator!=(const zoned_time<Duration1, TimeZonePtr>& x,
+ const zoned_time<Duration2, TimeZonePtr>& y);
-template <class charT, class traits, class Duration>
+template <class charT, class traits, class Duration, class TimeZonePtr>
basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& os, const zoned_time<Duration>& t);
+ operator<<(basic_ostream<charT, traits>& os,
+ const zoned_time<Duration, TimeZonePtr>& t);
-template <class charT, class traits, class Duration>
+template <class charT, class traits, class Duration, class TimeZonePtr>
basic_ostream<charT, traits>&
- to_stream(basic_ostream<charT, traits>& os, const charT* fmt, const zoned_time<Duration>& tp);
+ to_stream(basic_ostream<charT, traits>& os, const charT* fmt,
+ const zoned_time<Duration, TimeZonePtr>& tp);
// format
@@ -9784,7 +9790,46 @@ bool operator>=(const time_zone& x, const time_zone& y) noexcept;
zoned_time
[time.timezone.zoned_time]zoned_traits
[time.timezone.zoned_traits]
+zoned_traits
provides a means for customizing the behavior of
+zoned_time<Duration, TimeZonePtr
for the
+zoned_time
default constructor, and constructors taking
+string_view
. A specialization for const time_zone*
+is provided by the implementation.
+
+template <class T> struct zoned_traits {}; + +template <> +struct zoned_traits<const time_zone*> +{ + static const time_zone* default_zone(); + static const time_zone* locate_zone(string_view name); +}; ++ +
+static const time_zone* zoned_traits<const time_zone*>::default_zone(); ++
++ ++Returns:
+date::locate_zone("UTC")
. +
+static const time_zone* zoned_traits<const time_zone*>::locate_zone(string_view name); ++
++ ++Returns:
+date::locate_zone(name)
. +
zoned_time
[time.timezone.zoned_time]
zoned_time
represents a logical paring of time_zone
and a
@@ -9792,14 +9837,14 @@ bool operator>=(const time_zone& x, const time_zone& y) noexcept;
-template <class Duration> +template <class Duration, class TimeZonePtr = const time_zone*> class zoned_time { public: using duration = common_type_t<Duration, seconds>; private: - const time_zone* zone_; // exposition only + TimeZonePtr zone_; // exposition only sys_time<duration> tp_; // exposition only public: @@ -9808,24 +9853,24 @@ public: zoned_time& operator=(const zoned_time&) = default; zoned_time(const sys_time<Duration>& st); - explicit zoned_time(const time_zone* z); + explicit zoned_time(TimeZonePtr z); explicit zoned_time(string_view name); template <class Duration2> zoned_time(const zoned_time<Duration2>& zt) noexcept; - zoned_time(const time_zone* z, const local_time<Duration>& tp); - zoned_time(string_view name, const local_time<Duration>& tp); - zoned_time(const time_zone* z, const local_time<Duration>& tp, choose c); - zoned_time(string_view name, const local_time<Duration>& tp, choose c); + zoned_time(TimeZonePtr z, const sys_time<Duration>& st); + zoned_time(string_view name, const sys_time<Duration>& st); - zoned_time(const time_zone* z, const zoned_time<Duration>& zt); - zoned_time(string_view name, const zoned_time<Duration>& zt); - zoned_time(const time_zone* z, const zoned_time<Duration>& zt, choose); - zoned_time(string_view name, const zoned_time<Duration>& zt, choose); + zoned_time(TimeZonePtr z, const local_time<Duration>& tp); + zoned_time(string_view name, const local_time<Duration>& tp); + zoned_time(TimeZonePtr z, const local_time<Duration>& tp, choose c); + zoned_time(string_view name, const local_time<Duration>& tp, choose c); - zoned_time(const time_zone* z, const sys_time<Duration>& st); - zoned_time(string_view name, const sys_time<Duration>& st); + zoned_time(TimeZonePtr z, const zoned_time<Duration>& zt); + zoned_time(string_view name, const zoned_time<Duration>& zt); + zoned_time(TimeZonePtr z, const zoned_time<Duration>& zt, choose); + zoned_time(string_view name, const zoned_time<Duration>& zt, choose); zoned_time& operator=(const sys_time<Duration>& st); zoned_time& operator=(const local_time<Duration>& ut); @@ -9833,43 +9878,61 @@ public: operator sys_time<duration>() const; explicit operator local_time<duration>() const; - const time_zone* get_time_zone() const; + TimeZonePtr get_time_zone() const; local_time<duration> get_local_time() const; sys_time<duration> get_sys_time() const; sys_info get_info() const; }; -template <class Duration1, class Duration2> +template <class Duration1, class Duration2, class TimeZonePtr> bool -operator==(const zoned_time<Duration1>& x, const zoned_time<Duration2>& y); +operator==(const zoned_time<Duration1, TimeZonePtr>& x, + const zoned_time<Duration2, TimeZonePtr>& y); -template <class Duration1, class Duration2> +template <class Duration1, class Duration2, class TimeZonePtr> bool -operator!=(const zoned_time<Duration1>& x, const zoned_time<Duration2>& y); +operator!=(const zoned_time<Duration1, TimeZonePtr>& x, + const zoned_time<Duration2, TimeZonePtr>& y); -template <class charT, class traits, class Duration> +template <class charT, class traits, class Duration, class TimeZonePtr> basic_ostream<charT, traits>& - operator<<(basic_ostream<charT, traits>& os, const zoned_time<Duration>& t); + operator<<(basic_ostream<charT, traits>& os, + const zoned_time<Duration, TimeZonePtr>& t); -template <class charT, class traits, class Duration> +template <class charT, class traits, class Duration, class TimeZonePtr> basic_ostream<charT, traits>& - to_stream(basic_ostream<charT, traits>& os, const charT* fmt, const zoned_time<Duration>& tp); + to_stream(basic_ostream<charT, traits>& os, const charT* fmt, + const zoned_time<Duration, TimeZonePtr>& tp); + +zoned_time() + -> zoned_time<seconds>; template <class Duration> zoned_time(sys_time<Duration>) -> zoned_time<common_type_t<Duration, seconds>>; -template <class Zone, class Duration> - zoned_time(Zone, sys_time<Duration>) - -> zoned_time<common_type_t<Duration, seconds>>; +template <class TimeZonePtr, class Duration> + zoned_time(TimeZonePtr, sys_time<Duration>) + -> zoned_time<common_type_t<Duration, seconds>, TimeZonePtr>; -template <class Zone, class Duration> - zoned_time(Zone, local_time<Duration>, choose = choose::earliest) - -> zoned_time<common_type_t<Duration, seconds>>; +template <class TimeZonePtr, class Duration> + zoned_time(TimeZonePtr, local_time<Duration>, choose = choose::earliest) + -> zoned_time<common_type_t<Duration, seconds>, TimeZonePtr>; -template <class Zone, class Duration> - zoned_time(Zone, zoned_time<Duration>, choose = choose::earliest) - -> zoned_time<common_type_t<Duration, seconds>>; +template <class TimeZonePtr, class Duration> + zoned_time(TimeZonePtr, zoned_time<Duration>, choose = choose::earliest) + -> zoned_time<common_type_t<Duration, seconds>, TimeZonePtr>; + +zoned_time(string_view) + -> zoned_time<seconds>; + +template <class Duration> +zoned_time(string_view, sys_time<Duration>) + -> zoned_time<common_type_t<Duration, seconds>>; + +template <class Duration> +zoned_time(string_view, local_time<Duration>, choose = choose::earliest) + -> zoned_time<common_type_t<Duration, seconds>>;
@@ -9879,19 +9942,23 @@ and is not ambiguous.
-zoned_time<Duration>::zoned_time(); +zoned_time<Duration, TimeZonePtr>::zoned_time();
-Effects: Constructs a
+zoned_time
zt
such that -zt.get_time_zone()->name() == "UTC"
, and -zt.get_sys_time() == sys_seconds{}
. +Remarks: This constructor does not participate in overload resolution unless +the expressionzoned_traits<TimeZonePtr>::default_zone()
is well formed. ++Effects: Constructs a
zoned_time
by initializing +zone_
withzoned_traits<TimeZonePtr>::default_zone()
and +default constructingtp_
.
-zoned_time<Duration>::zoned_time(const zoned_time&) = default; -zoned_time<Duration>& zoned_time<Duration>::operator=(const zoned_time&) = default; +zoned_time<Duration, TimeZonePtr>::zoned_time(const zoned_time&) = default; +zoned_time<Duration, TimeZonePtr>& zoned_time<Duration>::operator=(const zoned_time&) = default;
@@ -9904,45 +9971,53 @@ members.
-zoned_time<Duration>::zoned_time(const sys_time<Duration>& st); +zoned_time<Duration, TimeZonePtr>::zoned_time(const sys_time<Duration>& st);
-Effects: Constructs a
+zoned_time
zt
such that -zt.get_time_zone()->name() == "UTC"
, and -zt.get_sys_time() == st
. +Remarks: This constructor does not participate in overload resolution unless +the expressionzoned_traits<TimeZonePtr>::default_zone()
is well formed. ++Effects: Constructs a
zoned_time
by initializing +zone_
withzoned_traits<TimeZonePtr>::default_zone()
and +tp_
withst
.
-explicit zoned_time<Duration>::zoned_time(const time_zone* z); +explicit zoned_time<Duration, TimeZonePtr>::zoned_time(TimeZonePtr z);
Requires:
z
refers to a validtime_zone
.-Effects: Constructs a
zoned_time
zt
such that -zt.get_time_zone() == z
, and -zt.get_sys_time() == sys_seconds{}
. +Effects: Constructs azoned_time
initializingzone_
+withstd::move(z)
.
-explicit zoned_time<Duration>::zoned_time(string_view name); +explicit zoned_time<Duration, TimeZonePtr>::zoned_time(string_view name);
-Effects: Equivalent to construction with
locate_zone(name)
. +Remarks: This constructor does not participate in overload resolution unless +the expressionzoned_traits<TimeZonePtr>::locate_zone(string_view{})
+is well formed andzoned_time
is constructible from the return type of +zoned_traits<TimeZonePtr>::locate_zone(string_view{})
.-Throws: Any exception propagating out of
locate_zone(name)
. +Effects: Constructs azoned_time
by initializing +zone_
withzoned_traits<TimeZonePtr>::locate_zone(name)
+and default constructingtp_
.
-template <class Duration2> - zoned_time<Duration>::zoned_time(const zoned_time<Duration2>& y) noexcept; +template <class Duration2, TimeZonePtr> + zoned_time<Duration>::zoned_time(const zoned_time<Duration2, TimeZonePtr>& y) noexcept;
@@ -9957,87 +10032,153 @@ template <class Duration2>
-zoned_time<Duration>::zoned_time(const time_zone* z, const local_time<Duration>& tp); +zoned_time<Duration, TimeZonePtr>::zoned_time(TimeZonePtr z, const sys_time<Duration>& st);
Requires:
z
refers to a validtime_zone
.-Effects: Constructs a
-zoned_time
zt
such that -zt.get_time_zone()-> == z
, andzt.get_local_time() == tp
. --Throws: Any exception that
z->to_sys(tp)
would throw. +Effects: Constructs azoned_time
by initializingzone_
+withstd::move(z)
andtp_
withst
.
-zoned_time<Duration>::zoned_time(string_view name, const local_time<Duration>& tp); +zoned_time<Duration, TimeZonePtr>::zoned_time(string_view name, const sys_time<Duration>& st);
-Effects: Equivalent to construction with
+{locate_zone(name), tp}
. +Remarks: This constructor does not participate in overload resolution unless +zoned_time
is constructible from the return type of +zoned_traits<TimeZonePtr>::locate_zone(name)
andst
. ++Effects: Equivalent to construction with
{zoned_traits<TimeZonePtr>::locate_zone(name), st}
.
-zoned_time<Duration>::zoned_time(const time_zone* z, const local_time<Duration>& tp, choose c); +zoned_time<Duration, TimeZonePtr>::zoned_time(TimeZonePtr z, const local_time<Duration>& tp);
Requires:
z
refers to a validtime_zone
.-Effects: Constructs a
+zoned_time
zt
such that -zt.get_time_zone()-> == z
, and -zt.get_sys_time() == z->to_sys(tp, c)
. +Remarks: This constructor does not participate in overload resolution unless +declval<TimeZonePtr&>()->to_sys(local_time<Duration>{})
+is convertible tosys_time<duration>
. ++Effects: Constructs a
zoned_time
by initializingzone_
+withstd::move(z)
andtp_
withzone_->to_sys(t)
.
-zoned_time<Duration>::zoned_time(string_view name, const local_time<Duration>& tp, choose c); +zoned_time<Duration, TimeZonePtr>::zoned_time(string_view name, const local_time<Duration>& tp);
-Effects: Equivalent to construction with
+{locate_zone(name), tp, c}
. +Remarks: This constructor does not participate in overload resolution unless +zoned_time
is constructible from the return type of +zoned_traits<TimeZonePtr>::locate_zone(name)
andtp
. ++Effects: Equivalent to construction with
{zoned_traits<TimeZonePtr>::locate_zone(name), tp}
.
-zoned_time<Duration>::zoned_time(const time_zone* z, const zoned_time<Duration>& y); +zoned_time<Duration, TimeZonePtr>::zoned_time(TimeZonePtr z, const local_time<Duration>& tp, choose c);
Requires:
z
refers to a validtime_zone
.-Effects: Constructs a
+zoned_time
zt
such that -zt.get_time_zone()-> == z
, and -zt.get_sys_time() == y.get_sys_time()
. +Remarks: This constructor does not participate in overload resolution unless +decltype(declval<TimeZonePtr&>()->to_sys(local_time<Duration>{}, choose::earliest))
+is convertible tosys_time<duration>
. ++Effects: Constructs a
zoned_time
by initializingzone_
+withstd::move(z)
andtp_
withzone_->to_sys(t, c)
.
-zoned_time<Duration>::zoned_time(string_view name, const zoned_time<Duration>& y); +zoned_time<Duration, TimeZonePtr>::zoned_time(string_view name, const local_time<Duration>& tp, choose c);
-Effects: Equivalent to construction with
+{locate_zone(name), y}
. +Remarks: This constructor does not participate in overload resolution unless +zoned_time
is constructible from the return type of +zoned_traits<TimeZonePtr>::locate_zone(name)
, +local_time<Duration>
andchoose
. ++Effects: Equivalent to construction with +
{zoned_traits<TimeZonePtr>::locate_zone(name), tp, c}
.
-zoned_time<Duration>::zoned_time(const time_zone* z, const zoned_time<Duration>& y, choose); +zoned_time<Duration, TimeZonePtr>::zoned_time(TimeZonePtr z, const zoned_time<Duration>& y);
+ +Requires:
z
refers to a validtime_zone
.-Effects: Constructs a
+zoned_time
zt
such that -zt.get_time_zone()-> == z
, and -zt.get_sys_time() == y.get_sys_time()
. +Effects: Constructs azoned_time
by initializingzone_
+withstd::move(z)
andtp_
withz.tp_
. +
+zoned_time<Duration, TimeZonePtr>::zoned_time(string_view name, const zoned_time<Duration>& y); ++
++ ++Remarks: This constructor does not participate in overload resolution unless +
+zoned_time
is constructible from the return type of +zoned_traits<TimeZonePtr>::locate_zone(name)
+andzoned_time
. ++Effects: Equivalent to construction with +
+{zoned_traits<TimeZonePtr>::locate_zone(name), y}
. +
+zoned_time<Duration, TimeZonePtr>::zoned_time(TimeZonePtr z, const zoned_time<Duration>& y, choose); ++
++ ++Requires:
+z
refers to a validtime_zone
. ++Effects: Equivalent to construction with
+Note: The{z, y}
. +choose
parameter is allowed here, but has no impact. + +
+zoned_time<Duration, TimeZonePtr>::zoned_time(string_view name, const zoned_time<Duration>& y, choose c); ++
++Remarks: This constructor does not participate in overload resolution unless +
+zoned_time
is constructible from the return type of +zoned_traits<TimeZonePtr>::locate_zone(name)
,zoned_time
, +andchoose
. ++Effects: Equivalent to construction with
{locate_zone(name), y, c}
.Note: The
choose
parameter is allowed here, but has no impact. @@ -10045,41 +10186,7 @@ zoned_time<Duration>::zoned_time(const time_zone* z, const zoned_time<D
-zoned_time<Duration>::zoned_time(string_view name, const zoned_time<Duration>& y, choose); --
-- --Effects: Equivalent to construction with
-{locate_zone(name), y}
. --Note: The
-choose
parameter is allowed here, but has no impact. -
-zoned_time<Duration>::zoned_time(const time_zone* z, const sys_time<Duration>& st); --
-- --Requires:
-z
refers to a validtime_zone
. --Effects: Constructs a
-zoned_time
zt
such that -zt.get_time_zone()-> == z
, andzt.get_sys_time() == st
. -
-zoned_time<Duration>::zoned_time(string_view name, const sys_time<Duration>& st); --
-- --Effects: Equivalent to construction with
-{locate_zone(name), st}
. -
-zoned_time<Duration>& zoned_time<Duration>::operator=(const sys_time<Duration>& st); +zoned_time<Duration, TimeZonePtr>& zoned_time<Duration, TimeZonePtr>::operator=(const sys_time<Duration>& st);
@@ -10092,7 +10199,7 @@ no effect on the return value of
get_time_zone()
.
-zoned_time<Duration>& zoned_time<Duration>::operator=(const local_time<Duration>& lt); +zoned_time<Duration, TimeZonePtr>& zoned_time<Duration, TimeZonePtr>::operator=(const local_time<Duration>& lt);
@@ -10105,7 +10212,7 @@ no effect on the return value of
get_time_zone()
.
-zoned_time<Duration>::operator sys_time<duration>() const; +zoned_time<Duration, TimeZonePtr>::operator sys_time<duration>() const;
@@ -10114,7 +10221,7 @@ zoned_time<Duration>::operator sys_time<duration>() const;
-explicit zoned_time<Duration>::operator local_time<duration>() const; +explicit zoned_time<Duration, TimeZonePtr>::operator local_time<duration>() const;
@@ -10123,7 +10230,7 @@ explicit zoned_time<Duration>::operator local_time<duration>() const
-const time_zone* zoned_time<Duration>::get_time_zone() const; +TimeZonePtr zoned_time<Duration, TimeZonePtr>::get_time_zone() const;
@@ -10132,7 +10239,7 @@ const time_zone* zoned_time<Duration>::get_time_zone() const;
-local_time<typename zoned_time<Duration>::duration> zoned_time<Duration>::get_local_time() const; +local_time<typename zoned_time<Duration, TimeZonePtr>::duration> zoned_time<Duration, TimeZonePtr>::get_local_time() const;
@@ -10141,7 +10248,7 @@ local_time<typename zoned_time<Duration>::duration> zoned_time<Du
-sys_time<typename zoned_time<Duration>::duration> zoned_time<Duration>::get_sys_time() const; +sys_time<typename zoned_time<Duration, TimeZonePtr>::duration> zoned_time<Duration, TimeZonePtr>::get_sys_time() const;
@@ -10150,7 +10257,7 @@ sys_time<typename zoned_time<Duration>::duration> zoned_time<Dura
-sys_info zoned_time<Duration>::get_info() const; +sys_info zoned_time<Duration, TimeZonePtr>::get_info() const;
@@ -10159,9 +10266,10 @@ sys_info zoned_time<Duration>::get_info() const;
-template <class Duration1, class Duration2> +template <class Duration1, class Duration2, class TimeZonePtr> bool -operator==(const zoned_time<Duration1>& x, const zoned_time<Duration2>& y); +operator==(const zoned_time<Duration1, TimeZonePtr>& x, + const zoned_time<Duration2, TimeZonePtr>& y);
@@ -10170,9 +10278,10 @@ operator==(const zoned_time<Duration1>& x, const zoned_time<Duratio
-template <class Duration1, class Duration2> +template <class Duration1, class Duration2, class TimeZonePtr> bool -operator!=(const zoned_time<Duration1>& x, const zoned_time<Duration2>& y); +operator!=(const zoned_time<Duration1, TimeZonePtr>& x, + const zoned_time<Duration2, TimeZonePtr>& y);
@@ -10181,9 +10290,10 @@ operator!=(const zoned_time<Duration1>& x, const zoned_time<Duratio
-template <class charT, class traits, class Duration> +template <class charT, class traits, class Duration, class TimeZonePtr> basic_ostream<charT, traits>& -operator<<(basic_ostream<charT, traits>& os, const zoned_time<Duration>& t) +operator<<(basic_ostream<charT, traits>& os, + const zoned_time<Duration, TimeZonePtr>& t)
@@ -10196,9 +10306,10 @@ and the value returned from
t.get_local_time()
.
-template <class charT, class traits, class Duration> +template <class charT, class traits, class Duration, class TimeZonePtr> basic_ostream<charT, traits>& -to_stream(basic_ostream<charT, traits>& os, const charT* fmt, const zoned_time<Duration>& tp); +to_stream(basic_ostream<charT, traits>& os, const charT* fmt, + const zoned_time<Duration, TimeZonePtr>& tp);
@@ -10218,12 +10329,12 @@ which for exposition purposes will be referred to as info
. Then ca
-Add a new section 23.17.12.10 leap [time.timezone.leap]: +Add a new section 23.17.12.7 leap [time.timezone.leap]:
-23.17.12.10 class
+leap
[time.timezone.leap]23.17.12.7 class
leap
[time.timezone.leap]@@ -10494,12 +10605,12 @@ template <class Duration> bool operator>=(const sys_time<Duration>
-Add a new section 23.17.12.11 link [time.timezone.link]: +Add a new section 23.17.12.8 link [time.timezone.link]:
-23.17.12.11 class
+link
[time.timezone.link]23.17.12.8 class
link
[time.timezone.link]class link