Template zoned_time on TimeZonePtr

* TimeZonePtr defaults to const time_zone*.
* Adjust template deduction guides and make_zoned.
* Add HAS_STRING_VIEW
This commit is contained in:
Howard Hinnant
2017-07-15 20:08:59 -04:00
parent 07ada69385
commit d4d6eda861
2 changed files with 346 additions and 141 deletions

18
tz.cpp
View File

@@ -3346,10 +3346,18 @@ get_tzdb()
} }
const time_zone* const time_zone*
#if HAS_STRING_VIEW
TZ_DB::locate_zone(std::string_view tz_name) const
#else
TZ_DB::locate_zone(const std::string& tz_name) const TZ_DB::locate_zone(const std::string& tz_name) const
#endif
{ {
auto zi = std::lower_bound(zones.begin(), zones.end(), tz_name, auto zi = std::lower_bound(zones.begin(), zones.end(), tz_name,
#if HAS_STRING_VIEW
[](const time_zone& z, const std::string_view& nm)
#else
[](const time_zone& z, const std::string& nm) [](const time_zone& z, const std::string& nm)
#endif
{ {
return z.name() < nm; return z.name() < nm;
}); });
@@ -3357,7 +3365,11 @@ TZ_DB::locate_zone(const std::string& tz_name) const
{ {
#if !USE_OS_TZDB #if !USE_OS_TZDB
auto li = std::lower_bound(links.begin(), links.end(), tz_name, auto li = std::lower_bound(links.begin(), links.end(), tz_name,
#if HAS_STRING_VIEW
[](const link& z, const std::string_view& nm)
#else
[](const link& z, const std::string& nm) [](const link& z, const std::string& nm)
#endif
{ {
return z.name() < nm; return z.name() < nm;
}); });
@@ -3372,13 +3384,17 @@ TZ_DB::locate_zone(const std::string& tz_name) const
return &*zi; return &*zi;
} }
#endif // !USE_OS_TZDB #endif // !USE_OS_TZDB
throw std::runtime_error(tz_name + " not found in timezone database"); throw std::runtime_error(std::string(tz_name) + " not found in timezone database");
} }
return &*zi; return &*zi;
} }
const time_zone* const time_zone*
#if HAS_STRING_VIEW
locate_zone(std::string_view tz_name)
#else
locate_zone(const std::string& tz_name) locate_zone(const std::string& tz_name)
#endif
{ {
return get_tzdb().locate_zone(tz_name); return get_tzdb().locate_zone(tz_name);
} }

469
tz.h
View File

@@ -95,6 +95,14 @@ static_assert(HAS_REMOTE_API == 0 ? AUTO_DOWNLOAD == 0 : true,
# endif # endif
#endif // HAS_DEDUCTION_GUIDES #endif // HAS_DEDUCTION_GUIDES
#ifndef HAS_STRING_VIEW
# if __cplusplus >= 201703
# define HAS_STRING_VIEW 1
# else
# define HAS_STRING_VIEW 0
# endif
#endif // HAS_STRING_VIEW
#include "date.h" #include "date.h"
#if defined(_MSC_VER) && (_MSC_VER < 1900) #if defined(_MSC_VER) && (_MSC_VER < 1900)
@@ -280,24 +288,34 @@ operator<<(std::basic_ostream<CharT, Traits>& os, const local_info& r)
} }
class time_zone; class time_zone;
#if HAS_STRING_VIEW
DATE_API const time_zone* locate_zone(std::string_view tz_name);
#else
DATE_API const time_zone* locate_zone(const std::string& tz_name); DATE_API const time_zone* locate_zone(const std::string& tz_name);
#endif
DATE_API const time_zone* current_zone(); DATE_API const time_zone* current_zone();
template <class Duration> template <class Duration, class TimeZonePtr = const time_zone*>
class zoned_time class zoned_time
{ {
public: public:
using duration = typename std::common_type<Duration, std::chrono::seconds>::type; using duration = typename std::common_type<Duration, std::chrono::seconds>::type;
private: private:
const time_zone* zone_; TimeZonePtr zone_;
sys_time<duration> tp_; sys_time<duration> tp_;
public: public:
zoned_time(); zoned_time();
zoned_time(const sys_time<Duration>& st); zoned_time(const sys_time<Duration>& st);
explicit zoned_time(const time_zone* z); explicit zoned_time(TimeZonePtr z);
#if HAS_STRING_VIEW
explicit zoned_time(const std::string_view& name);
#else
explicit zoned_time(const std::string& name); explicit zoned_time(const std::string& name);
#endif
template <class Duration2, template <class Duration2,
class = typename std::enable_if class = typename std::enable_if
@@ -305,25 +323,32 @@ public:
std::is_convertible<sys_time<Duration2>, std::is_convertible<sys_time<Duration2>,
sys_time<Duration>>::value sys_time<Duration>>::value
>::type> >::type>
zoned_time(const zoned_time<Duration2>& zt) NOEXCEPT; zoned_time(const zoned_time<Duration2, TimeZonePtr>& zt) NOEXCEPT;
zoned_time(const time_zone* z, const local_time<Duration>& tp); zoned_time(TimeZonePtr z, const sys_time<Duration>& st);
zoned_time(const std::string& name, const local_time<Duration>& tp); zoned_time(TimeZonePtr z, const local_time<Duration>& tp);
zoned_time(const char* name, const local_time<Duration>& tp); zoned_time(TimeZonePtr z, const local_time<Duration>& tp, choose c);
zoned_time(const time_zone* z, const local_time<Duration>& tp, choose c); zoned_time(TimeZonePtr z, const zoned_time<Duration, TimeZonePtr>& zt);
zoned_time(const std::string& name, const local_time<Duration>& tp, choose c); zoned_time(TimeZonePtr z, const zoned_time<Duration, TimeZonePtr>& zt, choose);
zoned_time(const char* name, const local_time<Duration>& tp, choose c);
zoned_time(const time_zone* z, const zoned_time<Duration>& zt); #if HAS_STRING_VIEW
zoned_time(const std::string& name, const zoned_time<Duration>& zt); zoned_time(std::string_view name, const sys_time<Duration>& st);
zoned_time(const char* name, const zoned_time<Duration>& zt); zoned_time(std::string_view name, const local_time<Duration>& tp);
zoned_time(const time_zone* z, const zoned_time<Duration>& zt, choose); zoned_time(std::string_view name, const local_time<Duration>& tp, choose c);
zoned_time(const std::string& name, const zoned_time<Duration>& zt, choose); zoned_time(std::string_view name, const zoned_time<Duration, TimeZonePtr>& zt);
zoned_time(const char* name, const zoned_time<Duration>& zt, choose); zoned_time(std::string_view name, const zoned_time<Duration, TimeZonePtr>& zt, choose);
#else // !HAS_STRING_VIEW
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(const char* name, const sys_time<Duration>& st); zoned_time(const char* name, const sys_time<Duration>& st);
zoned_time(const std::string& name, const local_time<Duration>& tp);
zoned_time(const char* name, const local_time<Duration>& tp);
zoned_time(const std::string& name, const local_time<Duration>& tp, choose c);
zoned_time(const char* name, const local_time<Duration>& tp, choose c);
zoned_time(const std::string& name, const zoned_time<Duration, TimeZonePtr>& zt);
zoned_time(const char* name, const zoned_time<Duration, TimeZonePtr>& zt);
zoned_time(const std::string& name, const zoned_time<Duration, TimeZonePtr>& zt, choose);
zoned_time(const char* name, const zoned_time<Duration, TimeZonePtr>& zt, choose);
#endif // !HAS_STRING_VIEW
zoned_time& operator=(const sys_time<Duration>& st); zoned_time& operator=(const sys_time<Duration>& st);
zoned_time& operator=(const local_time<Duration>& ut); zoned_time& operator=(const local_time<Duration>& ut);
@@ -331,59 +356,102 @@ public:
explicit operator sys_time<duration>() const; explicit operator sys_time<duration>() const;
explicit operator local_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; local_time<duration> get_local_time() const;
sys_time<duration> get_sys_time() const; sys_time<duration> get_sys_time() const;
sys_info get_info() const; sys_info get_info() const;
template <class Duration1, class Duration2> template <class Duration1, class Duration2, class TimeZonePtr1>
friend friend
bool bool
operator==(const zoned_time<Duration1>& x, const zoned_time<Duration2>& y); operator==(const zoned_time<Duration1, TimeZonePtr1>& x,
const zoned_time<Duration2, TimeZonePtr1>& y);
template <class CharT, class Traits, class Duration1> template <class CharT, class Traits, class Duration1, class TimeZonePtr1>
friend friend
std::basic_ostream<CharT, Traits>& std::basic_ostream<CharT, Traits>&
operator<<(std::basic_ostream<CharT, Traits>& os, const zoned_time<Duration1>& t); operator<<(std::basic_ostream<CharT, Traits>& os,
const zoned_time<Duration1, TimeZonePtr1>& t);
private: private:
template <class D> friend class zoned_time; template <class D, class T> friend class zoned_time;
}; };
using zoned_seconds = zoned_time<std::chrono::seconds>; using zoned_seconds = zoned_time<std::chrono::seconds>;
#if HAS_DEDUCTION_GUIDES #if HAS_DEDUCTION_GUIDES
zoned_time()
-> zoned_time<std::chrono::seconds>;
template <class Duration> template <class Duration>
zoned_time(sys_time<Duration>) zoned_time(sys_time<Duration>)
-> zoned_time<std::common_type_t<Duration, std::chrono::seconds>>; -> zoned_time<std::common_type_t<Duration, std::chrono::seconds>>;
template <class Zone, class Duration> template <class TimeZonePtr>
zoned_time(Zone, sys_time<Duration>) zoned_time(TimeZonePtr)
-> zoned_time<std::chrono::seconds, TimeZonePtr>;
template <class TimeZonePtr, class Duration>
zoned_time(TimeZonePtr, sys_time<Duration>)
-> zoned_time<std::common_type_t<Duration, std::chrono::seconds>, TimeZonePtr>;
template <class TimeZonePtr, class Duration>
zoned_time(TimeZonePtr, local_time<Duration>, choose = choose::earliest)
-> zoned_time<std::common_type_t<Duration, std::chrono::seconds>, TimeZonePtr>;
#if HAS_STRING_VIEW
zoned_time(std::string_view)
-> zoned_time<std::chrono::seconds>;
template <class Duration>
zoned_time(std::string_view, sys_time<Duration>)
-> zoned_time<std::common_type_t<Duration, std::chrono::seconds>>; -> zoned_time<std::common_type_t<Duration, std::chrono::seconds>>;
template <class Zone, class Duration> template <class Duration>
zoned_time(Zone, local_time<Duration>, choose = choose::earliest) zoned_time(std::string_view, local_time<Duration>, choose = choose::earliest)
-> zoned_time<std::common_type_t<Duration, std::chrono::seconds>>; -> zoned_time<std::common_type_t<Duration, std::chrono::seconds>>;
template <class Zone, class Duration> #else // !HAS_STRING_VIEW
zoned_time(Zone, zoned_time<Duration>, choose = choose::earliest)
zoned_time(std::string)
-> zoned_time<std::chrono::seconds>;
template <class Duration>
zoned_time(std::string, sys_time<Duration>)
-> zoned_time<std::common_type_t<Duration, std::chrono::seconds>>;
template <class Duration>
zoned_time(std::string, local_time<Duration>, choose = choose::earliest)
-> zoned_time<std::common_type_t<Duration, std::chrono::seconds>>;
#endif // !HAS_STRING_VIEW
template <class Duration>
zoned_time(const char*, sys_time<Duration>)
-> zoned_time<std::common_type_t<Duration, std::chrono::seconds>>;
template <class Duration>
zoned_time(const char*, local_time<Duration>, choose = choose::earliest)
-> zoned_time<std::common_type_t<Duration, std::chrono::seconds>>; -> zoned_time<std::common_type_t<Duration, std::chrono::seconds>>;
#endif // HAS_DEDUCTION_GUIDES #endif // HAS_DEDUCTION_GUIDES
template <class Duration1, class Duration2> template <class Duration1, class Duration2, class TimeZonePtr>
inline inline
bool 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)
{ {
return x.zone_ == y.zone_ && x.tp_ == y.tp_; return x.zone_ == y.zone_ && x.tp_ == y.tp_;
} }
template <class Duration1, class Duration2> template <class Duration1, class Duration2, class TimeZonePtr>
inline inline
bool 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)
{ {
return !(x == y); return !(x == y);
} }
@@ -834,7 +902,11 @@ struct TZ_DB
} }
#endif // defined(_MSC_VER) && (_MSC_VER < 1900) #endif // defined(_MSC_VER) && (_MSC_VER < 1900)
#if HAS_STRING_VIEW
const time_zone* locate_zone(std::string_view tz_name) const;
#else
const time_zone* locate_zone(const std::string& tz_name) const; const time_zone* locate_zone(const std::string& tz_name) const;
#endif
const time_zone* current_zone() const; const time_zone* current_zone() const;
}; };
@@ -859,209 +931,291 @@ DATE_API bool remote_install(const std::string& version);
#endif #endif
DATE_API const time_zone* locate_zone(const std::string& tz_name);
DATE_API const time_zone* current_zone();
// zoned_time // zoned_time
template <class Duration> template <class Duration, class TimeZonePtr>
inline inline
zoned_time<Duration>::zoned_time() zoned_time<Duration, TimeZonePtr>::zoned_time()
: zone_(locate_zone("UTC")) : zone_(locate_zone("UTC"))
{} {}
template <class Duration> template <class Duration, class TimeZonePtr>
inline inline
zoned_time<Duration>::zoned_time(const sys_time<Duration>& st) zoned_time<Duration, TimeZonePtr>::zoned_time(const sys_time<Duration>& st)
: zone_(locate_zone("UTC")) : zone_(locate_zone("UTC"))
, tp_(st) , tp_(st)
{} {}
template <class Duration> template <class Duration, class TimeZonePtr>
inline inline
zoned_time<Duration>::zoned_time(const time_zone* z) zoned_time<Duration, TimeZonePtr>::zoned_time(TimeZonePtr z)
: zone_(z) : zone_(std::move(z))
{assert(zone_ != nullptr);} {assert(zone_ != nullptr);}
template <class Duration> #if HAS_DEDUCTION_GUIDES
template <class Duration, class TimeZonePtr>
inline inline
zoned_time<Duration>::zoned_time(const std::string& name) zoned_time<Duration, TimeZonePtr>::zoned_time(const std::string_view& name)
: zoned_time(locate_zone(name)) : zoned_time(locate_zone(name))
{} {}
template <class Duration> #else
template <class Duration, class TimeZonePtr>
inline
zoned_time<Duration, TimeZonePtr>::zoned_time(const std::string& name)
: zoned_time(locate_zone(name))
{}
#endif
template <class Duration, class TimeZonePtr>
template <class Duration2, class> template <class Duration2, class>
inline inline
zoned_time<Duration>::zoned_time(const zoned_time<Duration2>& zt) NOEXCEPT zoned_time<Duration, TimeZonePtr>::zoned_time(const zoned_time<Duration2, TimeZonePtr>& zt) NOEXCEPT
: zone_(zt.zone_) : zone_(zt.zone_)
, tp_(zt.tp_) , tp_(zt.tp_)
{} {}
template <class Duration> template <class Duration, class TimeZonePtr>
inline inline
zoned_time<Duration>::zoned_time(const time_zone* z, const local_time<Duration>& t) zoned_time<Duration, TimeZonePtr>::zoned_time(TimeZonePtr z, const local_time<Duration>& t)
: zone_(z) : zone_(std::move(z))
, tp_(z->to_sys(t)) , tp_(z->to_sys(t))
{} {}
template <class Duration> #if HAS_STRING_VIEW
template <class Duration, class TimeZonePtr>
inline inline
zoned_time<Duration>::zoned_time(const std::string& name, const local_time<Duration>& t) zoned_time<Duration, TimeZonePtr>::zoned_time(std::string_view name, const local_time<Duration>& t)
: zoned_time(locate_zone(name), t) : zoned_time(locate_zone(name), t)
{} {}
template <class Duration> #else // !HAS_STRING_VIEW
template <class Duration, class TimeZonePtr>
inline inline
zoned_time<Duration>::zoned_time(const char* name, const local_time<Duration>& t) zoned_time<Duration, TimeZonePtr>::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, class TimeZonePtr>
inline inline
zoned_time<Duration>::zoned_time(const time_zone* z, const local_time<Duration>& t, zoned_time<Duration, TimeZonePtr>::zoned_time(const char* name, const local_time<Duration>& t)
: zoned_time(locate_zone(name), t)
{}
#endif // HAS_STRING_VIEW
template <class Duration, class TimeZonePtr>
inline
zoned_time<Duration, TimeZonePtr>::zoned_time(TimeZonePtr z, const local_time<Duration>& t,
choose c) choose c)
: zone_(z) : zone_(std::move(z))
, tp_(z->to_sys(t, c)) , tp_(z->to_sys(t, c))
{} {}
template <class Duration> #if HAS_STRING_VIEW
template <class Duration, class TimeZonePtr>
inline inline
zoned_time<Duration>::zoned_time(const std::string& name, const local_time<Duration>& t, zoned_time<Duration, TimeZonePtr>::zoned_time(std::string_view name, const local_time<Duration>& t,
choose c) choose c)
: zoned_time(locate_zone(name), t, c) : zoned_time(locate_zone(name), t, c)
{} {}
template <class Duration> #else // !HAS_STRING_VIEW
template <class Duration, class TimeZonePtr>
inline inline
zoned_time<Duration>::zoned_time(const char* name, const local_time<Duration>& t, zoned_time<Duration, TimeZonePtr>::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)
{} {}
template <class Duration> template <class Duration, class TimeZonePtr>
inline inline
zoned_time<Duration>::zoned_time(const time_zone* z, const zoned_time<Duration>& zt) zoned_time<Duration, TimeZonePtr>::zoned_time(const char* name, const local_time<Duration>& t,
: zone_(z) choose c)
: zoned_time(locate_zone(name), t, c)
{}
#endif // !HAS_STRING_VIEW
template <class Duration, class TimeZonePtr>
inline
zoned_time<Duration, TimeZonePtr>::zoned_time(TimeZonePtr z, const zoned_time<Duration, TimeZonePtr>& zt)
: zone_(std::move(z))
, tp_(zt.tp_) , tp_(zt.tp_)
{} {}
template <class Duration> #if HAS_STRING_VIEW
template <class Duration, class TimeZonePtr>
inline inline
zoned_time<Duration>::zoned_time(const std::string& name, const zoned_time<Duration>& zt) zoned_time<Duration, TimeZonePtr>::zoned_time(std::string_view name,
const zoned_time<Duration, TimeZonePtr>& zt)
: zoned_time(locate_zone(name), zt) : zoned_time(locate_zone(name), zt)
{} {}
template <class Duration> #else // !HAS_STRING_VIEW
template <class Duration, class TimeZonePtr>
inline inline
zoned_time<Duration>::zoned_time(const char* name, const zoned_time<Duration>& zt) zoned_time<Duration, TimeZonePtr>::zoned_time(const std::string& name,
const zoned_time<Duration, TimeZonePtr>& zt)
: zoned_time(locate_zone(name), zt) : zoned_time(locate_zone(name), zt)
{} {}
template <class Duration> template <class Duration, class TimeZonePtr>
inline inline
zoned_time<Duration>::zoned_time(const time_zone* z, const zoned_time<Duration>& zt, choose) zoned_time<Duration, TimeZonePtr>::zoned_time(const char* name,
: zoned_time(z, zt) const zoned_time<Duration, TimeZonePtr>& zt)
: zoned_time(locate_zone(name), zt)
{} {}
template <class Duration> #endif // !HAS_STRING_VIEW
template <class Duration, class TimeZonePtr>
inline inline
zoned_time<Duration>::zoned_time(const std::string& name, zoned_time<Duration, TimeZonePtr>::zoned_time(TimeZonePtr z,
const zoned_time<Duration>& zt, choose c) const zoned_time<Duration, TimeZonePtr>& zt, choose)
: zoned_time(std::move(z), zt)
{}
#if HAS_STRING_VIEW
template <class Duration, class TimeZonePtr>
inline
zoned_time<Duration, TimeZonePtr>::zoned_time(std::string_view name,
const zoned_time<Duration, TimeZonePtr>& zt, choose c)
: zoned_time(locate_zone(name), zt, c) : zoned_time(locate_zone(name), zt, c)
{} {}
template <class Duration> #else // !HAS_STRING_VIEW
template <class Duration, class TimeZonePtr>
inline inline
zoned_time<Duration>::zoned_time(const char* name, zoned_time<Duration, TimeZonePtr>::zoned_time(const std::string& name,
const zoned_time<Duration>& zt, choose c) const zoned_time<Duration, TimeZonePtr>& zt, choose c)
: zoned_time(locate_zone(name), zt, c) : zoned_time(locate_zone(name), zt, c)
{} {}
template <class Duration> template <class Duration, class TimeZonePtr>
inline inline
zoned_time<Duration>::zoned_time(const time_zone* z, const sys_time<Duration>& st) zoned_time<Duration, TimeZonePtr>::zoned_time(const char* name,
: zone_(z) const zoned_time<Duration, TimeZonePtr>& zt, choose c)
: zoned_time(locate_zone(name), zt, c)
{}
#endif // !HAS_STRING_VIEW
template <class Duration, class TimeZonePtr>
inline
zoned_time<Duration, TimeZonePtr>::zoned_time(TimeZonePtr z, const sys_time<Duration>& st)
: zone_(std::move(z))
, tp_(st) , tp_(st)
{} {}
template <class Duration> #if HAS_STRING_VIEW
template <class Duration, class TimeZonePtr>
inline inline
zoned_time<Duration>::zoned_time(const std::string& name, const sys_time<Duration>& st) zoned_time<Duration, TimeZonePtr>::zoned_time(std::string_view name, const sys_time<Duration>& st)
: zoned_time(locate_zone(name), st) : zoned_time(locate_zone(name), st)
{} {}
template <class Duration> #else // !HAS_STRING_VIEW
template <class Duration, class TimeZonePtr>
inline inline
zoned_time<Duration>::zoned_time(const char* name, const sys_time<Duration>& st) zoned_time<Duration, TimeZonePtr>::zoned_time(const std::string& name, const sys_time<Duration>& st)
: zoned_time(locate_zone(name), st) : zoned_time(locate_zone(name), st)
{} {}
template <class Duration> template <class Duration, class TimeZonePtr>
inline inline
zoned_time<Duration>& zoned_time<Duration, TimeZonePtr>::zoned_time(const char* name, const sys_time<Duration>& st)
zoned_time<Duration>::operator=(const sys_time<Duration>& st) : zoned_time(locate_zone(name), st)
{}
#endif // !HAS_STRING_VIEW
template <class Duration, class TimeZonePtr>
inline
zoned_time<Duration, TimeZonePtr>&
zoned_time<Duration, TimeZonePtr>::operator=(const sys_time<Duration>& st)
{ {
tp_ = st; tp_ = st;
return *this; return *this;
} }
template <class Duration> template <class Duration, class TimeZonePtr>
inline inline
zoned_time<Duration>& zoned_time<Duration, TimeZonePtr>&
zoned_time<Duration>::operator=(const local_time<Duration>& ut) zoned_time<Duration, TimeZonePtr>::operator=(const local_time<Duration>& ut)
{ {
tp_ = zone_->to_sys(ut); tp_ = zone_->to_sys(ut);
return *this; return *this;
} }
template <class Duration> template <class Duration, class TimeZonePtr>
inline inline
zoned_time<Duration>::operator local_time<zoned_time::duration>() const zoned_time<Duration, TimeZonePtr>::operator local_time<zoned_time::duration>() const
{ {
return get_local_time(); return get_local_time();
} }
template <class Duration> template <class Duration, class TimeZonePtr>
inline inline
zoned_time<Duration>::operator sys_time<zoned_time::duration>() const zoned_time<Duration, TimeZonePtr>::operator sys_time<zoned_time::duration>() const
{ {
return get_sys_time(); return get_sys_time();
} }
template <class Duration> template <class Duration, class TimeZonePtr>
inline inline
const time_zone* TimeZonePtr
zoned_time<Duration>::get_time_zone() const zoned_time<Duration, TimeZonePtr>::get_time_zone() const
{ {
return zone_; return zone_;
} }
template <class Duration> template <class Duration, class TimeZonePtr>
inline inline
local_time<typename zoned_time<Duration>::duration> local_time<typename zoned_time<Duration, TimeZonePtr>::duration>
zoned_time<Duration>::get_local_time() const zoned_time<Duration, TimeZonePtr>::get_local_time() const
{ {
return zone_->to_local(tp_); return zone_->to_local(tp_);
} }
template <class Duration> template <class Duration, class TimeZonePtr>
inline inline
sys_time<typename zoned_time<Duration>::duration> sys_time<typename zoned_time<Duration, TimeZonePtr>::duration>
zoned_time<Duration>::get_sys_time() const zoned_time<Duration, TimeZonePtr>::get_sys_time() const
{ {
return tp_; return tp_;
} }
template <class Duration> template <class Duration, class TimeZonePtr>
inline inline
sys_info sys_info
zoned_time<Duration>::get_info() const zoned_time<Duration, TimeZonePtr>::get_info() const
{ {
return zone_->get_info(tp_); return zone_->get_info(tp_);
} }
// make_zoned_time // make_zoned_time
inline
zoned_time<std::chrono::seconds>
make_zoned()
{
return {};
}
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>
@@ -1070,12 +1224,50 @@ make_zoned(const sys_time<Duration>& tp)
return {tp}; return {tp};
} }
template <class Duration> template <class TimeZonePtr,
class = typename std::enable_if
<
std::is_class<typename std::decay<decltype(*std::declval<TimeZonePtr&>())>::type>{}
>::type
>
inline inline
zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type> zoned_time<std::chrono::seconds, TimeZonePtr>
make_zoned(const time_zone* zone, const local_time<Duration>& tp) make_zoned(TimeZonePtr z)
{ {
return {zone, tp}; return zoned_time<std::chrono::seconds, TimeZonePtr>{std::move(z)};
}
inline
zoned_seconds
make_zoned(const std::string& name)
{
return zoned_seconds{name};
}
template <class Duration, class TimeZonePtr,
class = typename std::enable_if
<
std::is_class<typename std::decay<decltype(*std::declval<TimeZonePtr&>())>::type>{}
>::type
>
inline
zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type, TimeZonePtr>
make_zoned(TimeZonePtr zone, const local_time<Duration>& tp)
{
return {std::move(zone), tp};
}
template <class Duration, class TimeZonePtr,
class = typename std::enable_if
<
std::is_class<typename std::decay<decltype(*std::declval<TimeZonePtr&>())>::type>{}
>::type
>
inline
zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type, TimeZonePtr>
make_zoned(TimeZonePtr zone, const local_time<Duration>& tp, choose c)
{
return {std::move(zone), tp, c};
} }
template <class Duration> template <class Duration>
@@ -1086,14 +1278,6 @@ make_zoned(const std::string& name, const local_time<Duration>& tp)
return {name, tp}; return {name, tp};
} }
template <class Duration>
inline
zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type>
make_zoned(const time_zone* zone, const local_time<Duration>& tp, choose c)
{
return {zone, tp, 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>
@@ -1102,44 +1286,49 @@ make_zoned(const std::string& name, const local_time<Duration>& tp, choose c)
return {name, tp, c}; return {name, tp, c};
} }
template <class Duration> template <class Duration, class TimeZonePtr>
inline inline
zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type> zoned_time<Duration, TimeZonePtr>
make_zoned(const time_zone* zone, const zoned_time<Duration>& zt) make_zoned(TimeZonePtr zone, const zoned_time<Duration, TimeZonePtr>& zt)
{ {
return {zone, zt}; return {std::move(zone), zt};
} }
template <class Duration> template <class Duration, class TimeZonePtr>
inline inline
zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type> zoned_time<Duration, TimeZonePtr>
make_zoned(const std::string& name, const zoned_time<Duration>& zt) make_zoned(const std::string& name, const zoned_time<Duration, TimeZonePtr>& zt)
{ {
return {name, zt}; return {name, zt};
} }
template <class Duration> template <class Duration, class TimeZonePtr>
inline inline
zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type> zoned_time<Duration, TimeZonePtr>
make_zoned(const time_zone* zone, const zoned_time<Duration>& zt, choose c) make_zoned(TimeZonePtr zone, const zoned_time<Duration, TimeZonePtr>& zt, choose c)
{ {
return {zone, zt, c}; return {std::move(zone), zt, c};
} }
template <class Duration> template <class Duration, class TimeZonePtr>
inline inline
zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type> zoned_time<Duration, TimeZonePtr>
make_zoned(const std::string& name, const zoned_time<Duration>& zt, choose c) make_zoned(const std::string& name, const zoned_time<Duration, TimeZonePtr>& zt, choose c)
{ {
return {name, zt, c}; return {name, zt, c};
} }
template <class Duration> template <class Duration, class TimeZonePtr,
class = typename std::enable_if
<
std::is_class<typename std::decay<decltype(*std::declval<TimeZonePtr&>())>::type>{}
>::type
>
inline inline
zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type> zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type, TimeZonePtr>
make_zoned(const time_zone* zone, const sys_time<Duration>& st) make_zoned(TimeZonePtr zone, const sys_time<Duration>& st)
{ {
return {zone, st}; return {std::move(zone), st};
} }
template <class Duration> template <class Duration>
@@ -1150,19 +1339,19 @@ make_zoned(const std::string& name, const sys_time<Duration>& st)
return {name, st}; return {name, st};
} }
template <class CharT, class Traits, class Duration> template <class CharT, class Traits, class Duration, class TimeZonePtr>
std::basic_ostream<CharT, Traits>& std::basic_ostream<CharT, Traits>&
to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt, to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt,
const zoned_time<Duration>& tp) const zoned_time<Duration, TimeZonePtr>& tp)
{ {
auto const info = tp.get_info(); auto const info = tp.get_info();
return to_stream(os, fmt, tp.get_local_time(), &info.abbrev, &info.offset); return to_stream(os, fmt, tp.get_local_time(), &info.abbrev, &info.offset);
} }
template <class CharT, class Traits, class Duration> template <class CharT, class Traits, class Duration, class TimeZonePtr>
inline inline
std::basic_ostream<CharT, Traits>& std::basic_ostream<CharT, Traits>&
operator<<(std::basic_ostream<CharT, Traits>& os, const zoned_time<Duration>& t) operator<<(std::basic_ostream<CharT, Traits>& os, const zoned_time<Duration, TimeZonePtr>& t)
{ {
const CharT fmt[] = {'%', 'F', ' ', '%', 'T', ' ', '%', 'Z', CharT{}}; const CharT fmt[] = {'%', 'F', ' ', '%', 'T', ' ', '%', 'Z', CharT{}};
return to_stream(os, fmt, t); return to_stream(os, fmt, t);