Lots of minor changes motivated by reviews of the draft proposal

This commit is contained in:
Howard Hinnant
2016-10-15 17:31:08 -04:00
parent 501609bacf
commit 806c29fddc
3 changed files with 80 additions and 79 deletions

16
date.h
View File

@@ -3873,7 +3873,7 @@ template <class Rep, class Period,
CONSTCD11 CONSTCD11
inline inline
time_of_day<std::chrono::duration<Rep, Period>> time_of_day<std::chrono::duration<Rep, Period>>
make_time(std::chrono::duration<Rep, Period> d) NOEXCEPT make_time(const std::chrono::duration<Rep, Period>& d)
{ {
return time_of_day<std::chrono::duration<Rep, Period>>(d); return time_of_day<std::chrono::duration<Rep, Period>>(d);
} }
@@ -3881,7 +3881,7 @@ make_time(std::chrono::duration<Rep, Period> d) NOEXCEPT
CONSTCD11 CONSTCD11
inline inline
time_of_day<std::chrono::hours> time_of_day<std::chrono::hours>
make_time(std::chrono::hours h, unsigned md) NOEXCEPT make_time(const std::chrono::hours& h, unsigned md)
{ {
return time_of_day<std::chrono::hours>(h, md); return time_of_day<std::chrono::hours>(h, md);
} }
@@ -3889,7 +3889,8 @@ make_time(std::chrono::hours h, unsigned md) NOEXCEPT
CONSTCD11 CONSTCD11
inline inline
time_of_day<std::chrono::minutes> time_of_day<std::chrono::minutes>
make_time(std::chrono::hours h, std::chrono::minutes m, unsigned md) NOEXCEPT make_time(const std::chrono::hours& h, const std::chrono::minutes& m,
unsigned md)
{ {
return time_of_day<std::chrono::minutes>(h, m, md); return time_of_day<std::chrono::minutes>(h, m, md);
} }
@@ -3897,8 +3898,8 @@ make_time(std::chrono::hours h, std::chrono::minutes m, unsigned md) NOEXCEPT
CONSTCD11 CONSTCD11
inline inline
time_of_day<std::chrono::seconds> time_of_day<std::chrono::seconds>
make_time(std::chrono::hours h, std::chrono::minutes m, std::chrono::seconds s, make_time(const std::chrono::hours& h, const std::chrono::minutes& m,
unsigned md) NOEXCEPT const std::chrono::seconds& s, unsigned md)
{ {
return time_of_day<std::chrono::seconds>(h, m, s, md); return time_of_day<std::chrono::seconds>(h, m, s, md);
} }
@@ -3909,8 +3910,9 @@ template <class Rep, class Period,
CONSTCD11 CONSTCD11
inline inline
time_of_day<std::chrono::duration<Rep, Period>> time_of_day<std::chrono::duration<Rep, Period>>
make_time(std::chrono::hours h, std::chrono::minutes m, std::chrono::seconds s, make_time(const std::chrono::hours& h, const std::chrono::minutes& m,
std::chrono::duration<Rep, Period> sub_s, unsigned md) NOEXCEPT const std::chrono::seconds& s, const std::chrono::duration<Rep, Period>& sub_s,
unsigned md)
{ {
return time_of_day<std::chrono::duration<Rep, Period>>(h, m, s, sub_s, md); return time_of_day<std::chrono::duration<Rep, Period>>(h, m, s, sub_s, md);
} }

27
tz.cpp
View File

@@ -2977,33 +2977,6 @@ operator<<(std::ostream& os, const TZ_DB& db)
// ----------------------- // -----------------------
std::ostream&
operator<<(std::ostream& os, const sys_info& r)
{
os << r.begin << '\n';
os << r.end << '\n';
os << make_time(r.offset) << "\n";
os << make_time(r.save) << "\n";
os << r.abbrev << '\n';
return os;
}
std::ostream&
operator<<(std::ostream& os, const local_info& r)
{
if (r.result == local_info::nonexistent)
os << "nonexistent between\n";
else if (r.result == local_info::ambiguous)
os << "ambiguous between\n";
os << r.first;
if (r.result != local_info::unique)
{
os << "and\n";
os << r.second;
}
return os;
}
#ifdef _WIN32 #ifdef _WIN32
const time_zone* const time_zone*

116
tz.h
View File

@@ -212,7 +212,17 @@ struct sys_info
std::string abbrev; std::string abbrev;
}; };
std::ostream& operator<<(std::ostream& os, const sys_info& r); template<class CharT, class Traits>
std::basic_ostream<CharT, Traits>&
operator<<(std::basic_ostream<CharT, Traits>& os, const sys_info& r)
{
os << r.begin << '\n';
os << r.end << '\n';
os << make_time(r.offset) << "\n";
os << make_time(r.save) << "\n";
os << r.abbrev << '\n';
return os;
}
struct local_info struct local_info
{ {
@@ -221,7 +231,22 @@ struct local_info
sys_info second; sys_info second;
}; };
std::ostream& operator<<(std::ostream& os, const local_info& r); template<class CharT, class Traits>
std::basic_ostream<CharT, Traits>&
operator<<(std::basic_ostream<CharT, Traits>& os, const local_info& r)
{
if (r.result == local_info::nonexistent)
os << "nonexistent between\n";
else if (r.result == local_info::ambiguous)
os << "ambiguous between\n";
os << r.first;
if (r.result != local_info::unique)
{
os << "and\n";
os << r.second;
}
return os;
}
class time_zone; class time_zone;
@@ -232,7 +257,7 @@ class zoned_time
sys_time<Duration> tp_; sys_time<Duration> tp_;
public: public:
zoned_time(sys_time<Duration> st); zoned_time(const sys_time<Duration>& st);
explicit zoned_time(const time_zone* z); explicit zoned_time(const time_zone* z);
explicit zoned_time(const std::string& name); explicit zoned_time(const std::string& name);
@@ -244,10 +269,10 @@ public:
>::type> >::type>
zoned_time(const zoned_time<Duration2>& zt) NOEXCEPT; zoned_time(const zoned_time<Duration2>& zt) NOEXCEPT;
zoned_time(const time_zone* z, local_time<Duration> tp); zoned_time(const time_zone* z, const local_time<Duration>& tp);
zoned_time(const std::string& name, local_time<Duration> tp); zoned_time(const std::string& name, const local_time<Duration>& tp);
zoned_time(const time_zone* z, local_time<Duration> tp, choose c); zoned_time(const time_zone* z, const local_time<Duration>& tp, choose c);
zoned_time(const std::string& name, local_time<Duration> tp, choose c); zoned_time(const std::string& name, const local_time<Duration>& tp, choose c);
zoned_time(const time_zone* z, const zoned_time<Duration>& zt); zoned_time(const time_zone* z, const zoned_time<Duration>& zt);
zoned_time(const std::string& name, const zoned_time<Duration>& zt); zoned_time(const std::string& name, const zoned_time<Duration>& zt);
@@ -257,8 +282,8 @@ public:
zoned_time(const time_zone* z, const sys_time<Duration>& st); zoned_time(const time_zone* z, const sys_time<Duration>& st);
zoned_time(const std::string& name, const sys_time<Duration>& st); zoned_time(const std::string& name, const sys_time<Duration>& st);
zoned_time& operator=(sys_time<Duration> st); zoned_time& operator=(const sys_time<Duration>& st);
zoned_time& operator=(local_time<Duration> ut); zoned_time& operator=(const local_time<Duration>& ut);
operator sys_time<Duration>() const; operator sys_time<Duration>() const;
explicit operator local_time<Duration>() const; explicit operator local_time<Duration>() const;
@@ -328,7 +353,7 @@ public:
explicit time_zone(const std::string& s, detail::undocumented); explicit time_zone(const std::string& s, detail::undocumented);
const std::string& name() const; const std::string& name() const NOEXCEPT;
template <class Duration> sys_info get_info(sys_time<Duration> st) const; template <class Duration> sys_info get_info(sys_time<Duration> st) const;
template <class Duration> local_info get_info(local_time<Duration> tp) const; template <class Duration> local_info get_info(local_time<Duration> tp) const;
@@ -345,8 +370,8 @@ public:
local_time<typename std::common_type<Duration, std::chrono::seconds>::type> local_time<typename std::common_type<Duration, std::chrono::seconds>::type>
to_local(sys_time<Duration> tp) const; to_local(sys_time<Duration> tp) const;
friend bool operator==(const time_zone& x, const time_zone& y); friend bool operator==(const time_zone& x, const time_zone& y) NOEXCEPT;
friend bool operator< (const time_zone& x, const time_zone& y); friend bool operator< (const time_zone& x, const time_zone& y) NOEXCEPT;
friend std::ostream& operator<<(std::ostream& os, const time_zone& z); friend std::ostream& operator<<(std::ostream& os, const time_zone& z);
void add(const std::string& s); void add(const std::string& s);
@@ -394,7 +419,7 @@ time_zone::operator=(time_zone&& src)
inline inline
const std::string& const std::string&
time_zone::name() const time_zone::name() const NOEXCEPT
{ {
return name_; return name_;
} }
@@ -443,13 +468,13 @@ time_zone::to_local(sys_time<Duration> tp) const
return LT{(tp + i.offset).time_since_epoch()}; return LT{(tp + i.offset).time_since_epoch()};
} }
inline bool operator==(const time_zone& x, const time_zone& y) {return x.name_ == y.name_;} inline bool operator==(const time_zone& x, const time_zone& y) NOEXCEPT {return x.name_ == y.name_;}
inline bool operator< (const time_zone& x, const time_zone& y) {return x.name_ < y.name_;} inline bool operator< (const time_zone& x, const time_zone& y) NOEXCEPT {return x.name_ < y.name_;}
inline bool operator!=(const time_zone& x, const time_zone& y) {return !(x == y);} inline bool operator!=(const time_zone& x, const time_zone& y) NOEXCEPT {return !(x == y);}
inline bool operator> (const time_zone& x, const time_zone& y) {return y < x;} inline bool operator> (const time_zone& x, const time_zone& y) NOEXCEPT {return y < x;}
inline bool operator<=(const time_zone& x, const time_zone& y) {return !(y < x);} inline bool operator<=(const time_zone& x, const time_zone& y) NOEXCEPT {return !(y < x);}
inline bool operator>=(const time_zone& x, const time_zone& y) {return !(x < y);} inline bool operator>=(const time_zone& x, const time_zone& y) NOEXCEPT {return !(x < y);}
template <class Duration> template <class Duration>
sys_time<typename std::common_type<Duration, std::chrono::seconds>::type> sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
@@ -750,7 +775,7 @@ const time_zone* current_zone();
template <class Duration> template <class Duration>
inline inline
zoned_time<Duration>::zoned_time(sys_time<Duration> st) zoned_time<Duration>::zoned_time(const sys_time<Duration>& st)
: zone_(locate_zone("UTC")) : zone_(locate_zone("UTC"))
, tp_(st) , tp_(st)
{} {}
@@ -769,27 +794,28 @@ zoned_time<Duration>::zoned_time(const std::string& name)
template <class Duration> template <class Duration>
inline inline
zoned_time<Duration>::zoned_time(const time_zone* z, local_time<Duration> t) zoned_time<Duration>::zoned_time(const time_zone* z, const local_time<Duration>& t)
: zone_(z) : zone_(z)
, tp_(z->to_sys(t)) , tp_(z->to_sys(t))
{} {}
template <class Duration> template <class Duration>
inline inline
zoned_time<Duration>::zoned_time(const std::string& name, local_time<Duration> t) zoned_time<Duration>::zoned_time(const std::string& name, const local_time<Duration>& t)
: zoned_time(locate_zone(name), t) : zoned_time(locate_zone(name), t)
{} {}
template <class Duration> template <class Duration>
inline inline
zoned_time<Duration>::zoned_time(const time_zone* z, local_time<Duration> t, choose c) zoned_time<Duration>::zoned_time(const time_zone* z, const local_time<Duration>& t,
choose c)
: zone_(z) : zone_(z)
, tp_(z->to_sys(t, c)) , tp_(z->to_sys(t, c))
{} {}
template <class Duration> template <class Duration>
inline inline
zoned_time<Duration>::zoned_time(const std::string& name, local_time<Duration> t, zoned_time<Duration>::zoned_time(const std::string& name, const local_time<Duration>& t,
choose c) choose c)
: zoned_time(locate_zone(name), t, c) : zoned_time(locate_zone(name), t, c)
{} {}
@@ -845,7 +871,7 @@ zoned_time<Duration>::zoned_time(const std::string& name, const sys_time<Duratio
template <class Duration> template <class Duration>
inline inline
zoned_time<Duration>& zoned_time<Duration>&
zoned_time<Duration>::operator=(sys_time<Duration> st) zoned_time<Duration>::operator=(const sys_time<Duration>& st)
{ {
tp_ = st; tp_ = st;
return *this; return *this;
@@ -854,7 +880,7 @@ zoned_time<Duration>::operator=(sys_time<Duration> st)
template <class Duration> template <class Duration>
inline inline
zoned_time<Duration>& zoned_time<Duration>&
zoned_time<Duration>::operator=(local_time<Duration> ut) zoned_time<Duration>::operator=(const local_time<Duration>& ut)
{ {
tp_ = zone_->to_sys(ut); tp_ = zone_->to_sys(ut);
return *this; return *this;
@@ -911,7 +937,7 @@ zoned_time<Duration>::get_info() const
template <class Duration> template <class Duration>
inline inline
zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type> zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type>
make_zoned(sys_time<Duration> tp) make_zoned(const sys_time<Duration>& tp)
{ {
return {tp}; return {tp};
} }
@@ -919,7 +945,7 @@ make_zoned(sys_time<Duration> tp)
template <class Duration> template <class Duration>
inline inline
zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type> zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type>
make_zoned(const time_zone* zone, local_time<Duration> tp) make_zoned(const time_zone* zone, const local_time<Duration>& tp)
{ {
return {zone, tp}; return {zone, tp};
} }
@@ -927,7 +953,7 @@ make_zoned(const time_zone* zone, local_time<Duration> tp)
template <class Duration> template <class Duration>
inline inline
zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type> zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type>
make_zoned(const std::string& name, local_time<Duration> tp) make_zoned(const std::string& name, const local_time<Duration>& tp)
{ {
return {name, tp}; return {name, tp};
} }
@@ -935,7 +961,7 @@ make_zoned(const std::string& name, local_time<Duration> tp)
template <class Duration> template <class Duration>
inline inline
zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type> zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type>
make_zoned(const time_zone* zone, local_time<Duration> tp, choose c) make_zoned(const time_zone* zone, const local_time<Duration>& tp, choose c)
{ {
return {zone, tp, c}; return {zone, tp, c};
} }
@@ -943,7 +969,7 @@ make_zoned(const time_zone* zone, local_time<Duration> tp, choose c)
template <class Duration> template <class Duration>
inline inline
zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type> zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type>
make_zoned(const std::string& name, local_time<Duration> tp, choose c) make_zoned(const std::string& name, const local_time<Duration>& tp, choose c)
{ {
return {name, tp, c}; return {name, tp, c};
} }
@@ -1015,7 +1041,7 @@ public:
using time_point = std::chrono::time_point<utc_clock>; using time_point = std::chrono::time_point<utc_clock>;
static CONSTDATA bool is_steady = false; static CONSTDATA bool is_steady = false;
static time_point now() NOEXCEPT; static time_point now();
}; };
template <class Duration> template <class Duration>
@@ -1026,7 +1052,7 @@ using utc_seconds = utc_time<std::chrono::seconds>;
template <class Duration> template <class Duration>
inline inline
utc_time<typename std::common_type<Duration, std::chrono::seconds>::type> utc_time<typename std::common_type<Duration, std::chrono::seconds>::type>
to_utc_time(sys_time<Duration> st) to_utc_time(const sys_time<Duration>& st)
{ {
using namespace std::chrono; using namespace std::chrono;
using duration = typename std::common_type<Duration, seconds>::type; using duration = typename std::common_type<Duration, seconds>::type;
@@ -1038,7 +1064,7 @@ to_utc_time(sys_time<Duration> st)
template <class Duration> template <class Duration>
inline inline
sys_time<typename std::common_type<Duration, std::chrono::seconds>::type> sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
to_sys_time(utc_time<Duration> ut) to_sys_time(const utc_time<Duration>& ut)
{ {
using namespace std::chrono; using namespace std::chrono;
using duration = typename std::common_type<Duration, seconds>::type; using duration = typename std::common_type<Duration, seconds>::type;
@@ -1061,7 +1087,7 @@ to_sys_time(utc_time<Duration> ut)
inline inline
utc_clock::time_point utc_clock::time_point
utc_clock::now() NOEXCEPT utc_clock::now()
{ {
using namespace std::chrono; using namespace std::chrono;
return to_utc_time(system_clock::now()); return to_utc_time(system_clock::now());
@@ -1117,7 +1143,7 @@ using tai_seconds = tai_time<std::chrono::seconds>;
template <class Duration> template <class Duration>
inline inline
utc_time<typename std::common_type<Duration, std::chrono::seconds>::type> utc_time<typename std::common_type<Duration, std::chrono::seconds>::type>
to_utc_time(tai_time<Duration> t) NOEXCEPT to_utc_time(const tai_time<Duration>& t) NOEXCEPT
{ {
using namespace std::chrono; using namespace std::chrono;
using duration = typename std::common_type<Duration, seconds>::type; using duration = typename std::common_type<Duration, seconds>::type;
@@ -1128,7 +1154,7 @@ to_utc_time(tai_time<Duration> t) NOEXCEPT
template <class Duration> template <class Duration>
inline inline
tai_time<typename std::common_type<Duration, std::chrono::seconds>::type> tai_time<typename std::common_type<Duration, std::chrono::seconds>::type>
to_tai_time(utc_time<Duration> t) NOEXCEPT to_tai_time(const utc_time<Duration>& t) NOEXCEPT
{ {
using namespace std::chrono; using namespace std::chrono;
using duration = typename std::common_type<Duration, seconds>::type; using duration = typename std::common_type<Duration, seconds>::type;
@@ -1139,7 +1165,7 @@ to_tai_time(utc_time<Duration> t) NOEXCEPT
template <class Duration> template <class Duration>
inline inline
tai_time<typename std::common_type<Duration, std::chrono::seconds>::type> tai_time<typename std::common_type<Duration, std::chrono::seconds>::type>
to_tai_time(sys_time<Duration> t) to_tai_time(const sys_time<Duration>& t)
{ {
return to_tai_time(to_utc_time(t)); return to_tai_time(to_utc_time(t));
} }
@@ -1185,7 +1211,7 @@ using gps_seconds = gps_time<std::chrono::seconds>;
template <class Duration> template <class Duration>
inline inline
utc_time<typename std::common_type<Duration, std::chrono::seconds>::type> utc_time<typename std::common_type<Duration, std::chrono::seconds>::type>
to_utc_time(gps_time<Duration> t) NOEXCEPT to_utc_time(const gps_time<Duration>& t) NOEXCEPT
{ {
using namespace std::chrono; using namespace std::chrono;
using duration = typename std::common_type<Duration, seconds>::type; using duration = typename std::common_type<Duration, seconds>::type;
@@ -1196,7 +1222,7 @@ to_utc_time(gps_time<Duration> t) NOEXCEPT
template <class Duration> template <class Duration>
inline inline
gps_time<typename std::common_type<Duration, std::chrono::seconds>::type> gps_time<typename std::common_type<Duration, std::chrono::seconds>::type>
to_gps_time(utc_time<Duration> t) to_gps_time(const utc_time<Duration>& t)
{ {
using namespace std::chrono; using namespace std::chrono;
using duration = typename std::common_type<Duration, seconds>::type; using duration = typename std::common_type<Duration, seconds>::type;
@@ -1207,7 +1233,7 @@ to_gps_time(utc_time<Duration> t)
template <class Duration> template <class Duration>
inline inline
gps_time<typename std::common_type<Duration, std::chrono::seconds>::type> gps_time<typename std::common_type<Duration, std::chrono::seconds>::type>
to_gps_time(sys_time<Duration> t) to_gps_time(const sys_time<Duration>& t)
{ {
return to_gps_time(to_utc_time(t)); return to_gps_time(to_utc_time(t));
} }
@@ -1234,7 +1260,7 @@ operator<<(std::basic_ostream<CharT, Traits>& os, const gps_time<Duration>& t)
template <class Duration> template <class Duration>
inline inline
sys_time<typename std::common_type<Duration, std::chrono::seconds>::type> sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
to_sys_time(tai_time<Duration> t) to_sys_time(const tai_time<Duration>& t)
{ {
return to_sys_time(to_utc_time(t)); return to_sys_time(to_utc_time(t));
} }
@@ -1242,7 +1268,7 @@ to_sys_time(tai_time<Duration> t)
template <class Duration> template <class Duration>
inline inline
sys_time<typename std::common_type<Duration, std::chrono::seconds>::type> sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
to_sys_time(gps_time<Duration> t) to_sys_time(const gps_time<Duration>& t)
{ {
return to_sys_time(to_utc_time(t)); return to_sys_time(to_utc_time(t));
} }
@@ -1250,7 +1276,7 @@ to_sys_time(gps_time<Duration> t)
template <class Duration> template <class Duration>
inline inline
tai_time<typename std::common_type<Duration, std::chrono::seconds>::type> tai_time<typename std::common_type<Duration, std::chrono::seconds>::type>
to_tai_time(gps_time<Duration> t) NOEXCEPT to_tai_time(const gps_time<Duration>& t) NOEXCEPT
{ {
using namespace std::chrono; using namespace std::chrono;
using duration = typename std::common_type<Duration, seconds>::type; using duration = typename std::common_type<Duration, seconds>::type;
@@ -1261,7 +1287,7 @@ to_tai_time(gps_time<Duration> t) NOEXCEPT
template <class Duration> template <class Duration>
inline inline
gps_time<typename std::common_type<Duration, std::chrono::seconds>::type> gps_time<typename std::common_type<Duration, std::chrono::seconds>::type>
to_gps_time(tai_time<Duration> t) NOEXCEPT to_gps_time(const tai_time<Duration>& t) NOEXCEPT
{ {
using namespace std::chrono; using namespace std::chrono;
using duration = typename std::common_type<Duration, seconds>::type; using duration = typename std::common_type<Duration, seconds>::type;