mirror of
https://github.com/HowardHinnant/date.git
synced 2025-08-04 13:14:26 +02:00
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:
18
tz.cpp
18
tz.cpp
@@ -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
469
tz.h
@@ -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);
|
||||||
|
Reference in New Issue
Block a user