Allow heterogeneous zoned_time constructors

taking {string_view, zoned_time}
This commit is contained in:
Howard Hinnant
2018-04-21 17:45:52 -04:00
parent 9d0bcdb63f
commit c665992a6e
2 changed files with 111 additions and 76 deletions

View File

@@ -393,7 +393,7 @@ throw_invalid(const string_t& s, unsigned i, const string_t& message)
{ {
throw std::runtime_error(std::string("Invalid time_zone initializer.\n") + throw std::runtime_error(std::string("Invalid time_zone initializer.\n") +
std::string(message) + ":\n" + std::string(message) + ":\n" +
s + '\n' + std::string(s) + '\n' +
"\x1b[1;32m" + "\x1b[1;32m" +
std::string(i, '~') + '^' + std::string(i, '~') + '^' +
std::string(s.size()-i-1, '~') + std::string(s.size()-i-1, '~') +

View File

@@ -474,30 +474,34 @@ public:
>::type> >::type>
zoned_time(std::string_view name, const local_time<Duration>& tp, choose c); zoned_time(std::string_view name, const local_time<Duration>& tp, choose c);
template <class T = TimeZonePtr, template <class Duration2, class TimeZonePtr2, class T = TimeZonePtr,
class = typename std::enable_if class = typename std::enable_if
< <
std::is_constructible std::is_convertible<sys_time<Duration2>,
< sys_time<Duration>>::value &&
zoned_time, std::is_constructible
decltype(zoned_traits<T>::locate_zone(std::string_view())), <
zoned_time zoned_time,
>::value decltype(zoned_traits<T>::locate_zone(std::string_view())),
>::type> zoned_time
zoned_time(std::string_view name, const zoned_time& zt); >::value
>::type>
zoned_time(std::string_view name, const zoned_time<Duration2, TimeZonePtr2>& zt);
template <class T = TimeZonePtr, template <class Duration2, class TimeZonePtr2, class T = TimeZonePtr,
class = typename std::enable_if class = typename std::enable_if
< <
std::is_constructible std::is_convertible<sys_time<Duration2>,
< sys_time<Duration>>::value &&
zoned_time, std::is_constructible
decltype(zoned_traits<T>::locate_zone(std::string_view())), <
zoned_time, zoned_time,
choose decltype(zoned_traits<T>::locate_zone(std::string_view())),
>::value zoned_time,
>::type> choose
zoned_time(std::string_view name, const zoned_time& zt, choose); >::value
>::type>
zoned_time(std::string_view name, const zoned_time<Duration2, TimeZonePtr2>& zt, choose);
#else // !HAS_STRING_VIEW #else // !HAS_STRING_VIEW
@@ -588,62 +592,80 @@ public:
zoned_time(const char* name, const local_time<Duration>& tp, choose c); zoned_time(const char* name, const local_time<Duration>& tp, choose c);
#if !defined(_MSC_VER) || (_MSC_VER > 1900) #if !defined(_MSC_VER) || (_MSC_VER > 1900)
template <class T = TimeZonePtr, template <class Duration2, class TimeZonePtr2, class T = TimeZonePtr,
class = typename std::enable_if class = typename std::enable_if
< <
std::is_constructible std::is_convertible<sys_time<Duration2>,
< sys_time<Duration>>::value &&
zoned_time, std::is_constructible
decltype(zoned_traits<T>::locate_zone(std::string())), <
zoned_time zoned_time,
>::value decltype(zoned_traits<T>::locate_zone(std::string())),
>::type> zoned_time
>::value
>::type>
#else
template <class Duration2, class TimeZonePtr2>
#endif #endif
zoned_time(const std::string& name, const zoned_time& zt); zoned_time(const std::string& name, const zoned_time<Duration2, TimeZonePtr2>& zt);
#if !defined(_MSC_VER) || (_MSC_VER > 1900) #if !defined(_MSC_VER) || (_MSC_VER > 1900)
template <class T = TimeZonePtr, template <class Duration2, class TimeZonePtr2, class T = TimeZonePtr,
class = typename std::enable_if class = typename std::enable_if
< <
std::is_constructible std::is_convertible<sys_time<Duration2>,
< sys_time<Duration>>::value &&
zoned_time, std::is_constructible
decltype(zoned_traits<T>::locate_zone(std::string())), <
zoned_time zoned_time,
>::value decltype(zoned_traits<T>::locate_zone(std::string())),
>::type> zoned_time
>::value
>::type>
#else
template <class Duration2, class TimeZonePtr2>
#endif #endif
zoned_time(const char* name, const zoned_time& zt); zoned_time(const char* name, const zoned_time<Duration2, TimeZonePtr2>& zt);
#if !defined(_MSC_VER) || (_MSC_VER > 1900) #if !defined(_MSC_VER) || (_MSC_VER > 1900)
template <class T = TimeZonePtr, template <class Duration2, class TimeZonePtr2, class T = TimeZonePtr,
class = typename std::enable_if class = typename std::enable_if
< <
std::is_constructible std::is_convertible<sys_time<Duration2>,
< sys_time<Duration>>::value &&
zoned_time, std::is_constructible
decltype(zoned_traits<T>::locate_zone(std::string())), <
zoned_time, zoned_time,
choose decltype(zoned_traits<T>::locate_zone(std::string())),
>::value zoned_time,
>::type> choose
>::value
>::type>
#else
template <class Duration2, class TimeZonePtr2>
#endif #endif
zoned_time(const std::string& name, const zoned_time& zt, choose); zoned_time(const std::string& name, const zoned_time<Duration2, TimeZonePtr2>& zt,
choose);
#if !defined(_MSC_VER) || (_MSC_VER > 1900) #if !defined(_MSC_VER) || (_MSC_VER > 1900)
template <class T = TimeZonePtr, template <class Duration2, class TimeZonePtr2, class T = TimeZonePtr,
class = typename std::enable_if class = typename std::enable_if
< <
std::is_constructible std::is_convertible<sys_time<Duration2>,
< sys_time<Duration>>::value &&
zoned_time, std::is_constructible
decltype(zoned_traits<T>::locate_zone(std::string())), <
zoned_time, zoned_time,
choose decltype(zoned_traits<T>::locate_zone(std::string())),
>::value zoned_time,
>::type> choose
>::value
>::type>
#else
template <class Duration2, class TimeZonePtr2>
#endif #endif
zoned_time(const char* name, const zoned_time& zt, choose); zoned_time(const char* name, const zoned_time<Duration2, TimeZonePtr2>& zt,
choose);
#endif // !HAS_STRING_VIEW #endif // !HAS_STRING_VIEW
@@ -1465,17 +1487,19 @@ zoned_time<Duration, TimeZonePtr>::zoned_time(std::string_view name,
{} {}
template <class Duration, class TimeZonePtr> template <class Duration, class TimeZonePtr>
template <class, class> template <class Duration2, class TimeZonePtr2, class, class>
inline inline
zoned_time<Duration, TimeZonePtr>::zoned_time(std::string_view name, const zoned_time& zt) zoned_time<Duration, TimeZonePtr>::zoned_time(std::string_view name,
const zoned_time<Duration2, TimeZonePtr2>& zt)
: zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), zt) : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), zt)
{} {}
template <class Duration, class TimeZonePtr> template <class Duration, class TimeZonePtr>
template <class, class> template <class Duration2, class TimeZonePtr2, class, class>
inline inline
zoned_time<Duration, TimeZonePtr>::zoned_time(std::string_view name, zoned_time<Duration, TimeZonePtr>::zoned_time(std::string_view name,
const zoned_time& zt, choose c) const zoned_time<Duration2, TimeZonePtr2>& zt,
choose c)
: zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), zt, c) : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), zt, c)
{} {}
@@ -1543,40 +1567,51 @@ zoned_time<Duration, TimeZonePtr>::zoned_time(const char* name,
template <class Duration, class TimeZonePtr> template <class Duration, class TimeZonePtr>
#if !defined(_MSC_VER) || (_MSC_VER > 1900) #if !defined(_MSC_VER) || (_MSC_VER > 1900)
template <class T, class> template <class Duration2, class TimeZonePtr2, class, class>
#else
template <class Duration2, class TimeZonePtr2>
#endif #endif
inline inline
zoned_time<Duration, TimeZonePtr>::zoned_time(const std::string& name, zoned_time<Duration, TimeZonePtr>::zoned_time(const std::string& name,
const zoned_time& zt) const zoned_time<Duration2, TimeZonePtr2>& zt)
: zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), zt) : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), zt)
{} {}
template <class Duration, class TimeZonePtr> template <class Duration, class TimeZonePtr>
#if !defined(_MSC_VER) || (_MSC_VER > 1900) #if !defined(_MSC_VER) || (_MSC_VER > 1900)
template <class T, class> template <class Duration2, class TimeZonePtr2, class, class>
#else
template <class Duration2, class TimeZonePtr2>
#endif #endif
inline inline
zoned_time<Duration, TimeZonePtr>::zoned_time(const char* name, const zoned_time& zt) zoned_time<Duration, TimeZonePtr>::zoned_time(const char* name,
const zoned_time<Duration2, TimeZonePtr2>& zt)
: zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), zt) : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), zt)
{} {}
template <class Duration, class TimeZonePtr> template <class Duration, class TimeZonePtr>
#if !defined(_MSC_VER) || (_MSC_VER > 1900) #if !defined(_MSC_VER) || (_MSC_VER > 1900)
template <class T, class> template <class Duration2, class TimeZonePtr2, class, class>
#else
template <class Duration2, class TimeZonePtr2>
#endif #endif
inline inline
zoned_time<Duration, TimeZonePtr>::zoned_time(const std::string& name, zoned_time<Duration, TimeZonePtr>::zoned_time(const std::string& name,
const zoned_time& zt, choose c) const zoned_time<Duration2, TimeZonePtr2>& zt,
choose c)
: zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), zt, c) : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), zt, c)
{} {}
template <class Duration, class TimeZonePtr> template <class Duration, class TimeZonePtr>
#if !defined(_MSC_VER) || (_MSC_VER > 1900) #if !defined(_MSC_VER) || (_MSC_VER > 1900)
template <class T, class> template <class Duration2, class TimeZonePtr2, class, class>
#else
template <class Duration2, class TimeZonePtr2>
#endif #endif
inline inline
zoned_time<Duration, TimeZonePtr>::zoned_time(const char* name, zoned_time<Duration, TimeZonePtr>::zoned_time(const char* name,
const zoned_time& zt, choose c) const zoned_time<Duration2, TimeZonePtr2>& zt,
choose c)
: zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), zt, c) : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), zt, c)
{} {}