/usr/local/lib64/python3.6/site-packages/pyarrow/include/arrow/vendored/datetime
Edit: /usr/local/lib64/python3.6/site-packages/pyarrow/include/arrow/vendored/datetime/tz.h (84869B)
#ifndef TZ_H
#define TZ_H
// The MIT License (MIT)
//
// Copyright (c) 2015, 2016, 2017 Howard Hinnant
// Copyright (c) 2017 Jiangang Zhuang
// Copyright (c) 2017 Aaron Bishop
// Copyright (c) 2017 Tomasz KamiĆski
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// Our apologies. When the previous paragraph was written, lowercase had not yet
// been invented (that would involve another several millennia of evolution).
// We did not mean to shout.
// Get more recent database at http://www.iana.org/time-zones
// The notion of "current timezone" is something the operating system is expected to "just
// know". How it knows this is system specific. It's often a value set by the user at OS
// installation time and recorded by the OS somewhere. On Linux and Mac systems the current
// timezone name is obtained by looking at the name or contents of a particular file on
// disk. On Windows the current timezone name comes from the registry. In either method,
// there is no guarantee that the "native" current timezone name obtained will match any
// of the "Standard" names in this library's "database". On Linux, the names usually do
// seem to match so mapping functions to map from native to "Standard" are typically not
// required. On Windows, the names are never "Standard" so mapping is always required.
// Technically any OS may use the mapping process but currently only Windows does use it.
// NOTE(ARROW): If this is not set, then the library will attempt to
// use libcurl to obtain a timezone database, and we probably do not want this.
#ifndef _WIN32
#define USE_OS_TZDB 1
#endif
#ifndef USE_OS_TZDB
# define USE_OS_TZDB 0
#endif
#ifndef HAS_REMOTE_API
# if USE_OS_TZDB == 0
# ifdef _WIN32
# define HAS_REMOTE_API 0
# else
# define HAS_REMOTE_API 1
# endif
# else // HAS_REMOTE_API makes no since when using the OS timezone database
# define HAS_REMOTE_API 0
# endif
#endif
#ifdef __clang__
# pragma clang diagnostic push
# pragma clang diagnostic ignored "-Wconstant-logical-operand"
#endif
static_assert(!(USE_OS_TZDB && HAS_REMOTE_API),
"USE_OS_TZDB and HAS_REMOTE_API can not be used together");
#ifdef __clang__
# pragma clang diagnostic pop
#endif
#ifndef AUTO_DOWNLOAD
# define AUTO_DOWNLOAD HAS_REMOTE_API
#endif
static_assert(HAS_REMOTE_API == 0 ? AUTO_DOWNLOAD == 0 : true,
"AUTO_DOWNLOAD can not be turned on without HAS_REMOTE_API");
#ifndef USE_SHELL_API
# define USE_SHELL_API 1
#endif
#if USE_OS_TZDB
# ifdef _WIN32
# error "USE_OS_TZDB can not be used on Windows"
# endif
#endif
#ifndef HAS_DEDUCTION_GUIDES
# if __cplusplus >= 201703
# define HAS_DEDUCTION_GUIDES 1
# else
# define HAS_DEDUCTION_GUIDES 0
# endif
#endif // HAS_DEDUCTION_GUIDES
#include "date.h"
#if defined(_MSC_VER) && (_MSC_VER < 1900)
#include "tz_private.h"
#endif
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#ifdef _WIN32
# ifdef DATE_BUILD_DLL
# define DATE_API __declspec(dllexport)
# elif defined(DATE_USE_DLL)
# define DATE_API __declspec(dllimport)
# else
# define DATE_API
# endif
#else
# ifdef DATE_BUILD_DLL
# define DATE_API __attribute__ ((visibility ("default")))
# else
# define DATE_API
# endif
#endif
namespace arrow_vendored
{
namespace date
{
enum class choose {earliest, latest};
namespace detail
{
struct undocumented;
template
struct nodeduct
{
using type = T;
};
template
using nodeduct_t = typename nodeduct::type;
}
struct sys_info
{
sys_seconds begin;
sys_seconds end;
std::chrono::seconds offset;
std::chrono::minutes save;
std::string abbrev;
};
template
std::basic_ostream&
operator<<(std::basic_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;
}
struct local_info
{
enum {unique, nonexistent, ambiguous} result;
sys_info first;
sys_info second;
};
template
std::basic_ostream&
operator<<(std::basic_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;
}
class nonexistent_local_time
: public std::runtime_error
{
public:
template
nonexistent_local_time(local_time tp, const local_info& i);
private:
template
static
std::string
make_msg(local_time tp, const local_info& i);
};
template
inline
nonexistent_local_time::nonexistent_local_time(local_time tp,
const local_info& i)
: std::runtime_error(make_msg(tp, i))
{
}
template
std::string
nonexistent_local_time::make_msg(local_time tp, const local_info& i)
{
assert(i.result == local_info::nonexistent);
std::ostringstream os;
os << tp << " is in a gap between\n"
<< local_seconds{i.first.end.time_since_epoch()} + i.first.offset << ' '
<< i.first.abbrev << " and\n"
<< local_seconds{i.second.begin.time_since_epoch()} + i.second.offset << ' '
<< i.second.abbrev
<< " which are both equivalent to\n"
<< i.first.end << " UTC";
return os.str();
}
class ambiguous_local_time
: public std::runtime_error
{
public:
template
ambiguous_local_time(local_time tp, const local_info& i);
private:
template
static
std::string
make_msg(local_time tp, const local_info& i);
};
template
inline
ambiguous_local_time::ambiguous_local_time(local_time tp, const local_info& i)
: std::runtime_error(make_msg(tp, i))
{
}
template
std::string
ambiguous_local_time::make_msg(local_time tp, const local_info& i)
{
assert(i.result == local_info::ambiguous);
std::ostringstream os;
os << tp << " is ambiguous. It could be\n"
<< tp << ' ' << i.first.abbrev << " == "
<< tp - i.first.offset << " UTC or\n"
<< tp << ' ' << i.second.abbrev << " == "
<< tp - i.second.offset << " UTC";
return os.str();
}
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);
#endif
DATE_API const time_zone* current_zone();
template
struct zoned_traits
{
};
template <>
struct zoned_traits
{
static
const time_zone*
default_zone()
{
return date::locate_zone("Etc/UTC");
}
#if HAS_STRING_VIEW
static
const time_zone*
locate_zone(std::string_view name)
{
return date::locate_zone(name);
}
#else // !HAS_STRING_VIEW
static
const time_zone*
locate_zone(const std::string& name)
{
return date::locate_zone(name);
}
static
const time_zone*
locate_zone(const char* name)
{
return date::locate_zone(name);
}
#endif // !HAS_STRING_VIEW
};
template
class zoned_time;
template
bool
operator==(const zoned_time& x,
const zoned_time& y);
template
class zoned_time
{
public:
using duration = typename std::common_type::type;
private:
TimeZonePtr zone_;
sys_time tp_;
public:
#if !defined(_MSC_VER) || (_MSC_VER > 1916)
template ::default_zone())>
#endif
zoned_time();
#if !defined(_MSC_VER) || (_MSC_VER > 1916)
template ::default_zone())>
#endif
zoned_time(const sys_time& st);
explicit zoned_time(TimeZonePtr z);
#if HAS_STRING_VIEW
template ::locate_zone(std::string_view()))
>::value
>::type>
explicit zoned_time(std::string_view name);
#else
# if !defined(_MSC_VER) || (_MSC_VER > 1916)
template ::locate_zone(std::string()))
>::value
>::type>
# endif
explicit zoned_time(const std::string& name);
#endif
template ,
sys_time>::value
>::type>
zoned_time(const zoned_time& zt) NOEXCEPT;
zoned_time(TimeZonePtr z, const sys_time& st);
#if !defined(_MSC_VER) || (_MSC_VER > 1916)
template ()->to_sys(local_time{})),
sys_time
>::value
>::type>
#endif
zoned_time(TimeZonePtr z, const local_time& tp);
#if !defined(_MSC_VER) || (_MSC_VER > 1916)
template ()->to_sys(local_time{},
choose::earliest)),
sys_time
>::value
>::type>
#endif
zoned_time(TimeZonePtr z, const local_time& tp, choose c);
template ,
sys_time>::value
>::type>
zoned_time(TimeZonePtr z, const zoned_time& zt);
template ,
sys_time>::value
>::type>
zoned_time(TimeZonePtr z, const zoned_time& zt, choose);
#if HAS_STRING_VIEW
template ::locate_zone(std::string_view())),
sys_time
>::value
>::type>
zoned_time(std::string_view name, detail::nodeduct_t&> st);
template ::locate_zone(std::string_view())),
local_time
>::value
>::type>
zoned_time(std::string_view name, detail::nodeduct_t&> tp);
template ::locate_zone(std::string_view())),
local_time,
choose
>::value
>::type>
zoned_time(std::string_view name, detail::nodeduct_t&> tp, choose c);
template ,
sys_time>::value &&
std::is_constructible
<
zoned_time,
decltype(zoned_traits::locate_zone(std::string_view())),
zoned_time
>::value
>::type>
zoned_time(std::string_view name, const zoned_time& zt);
template ,
sys_time>::value &&
std::is_constructible
<
zoned_time,
decltype(zoned_traits::locate_zone(std::string_view())),
zoned_time,
choose
>::value
>::type>
zoned_time(std::string_view name, const zoned_time& zt, choose);
#else // !HAS_STRING_VIEW
#if !defined(_MSC_VER) || (_MSC_VER > 1916)
template ::locate_zone(std::string())),
sys_time
>::value
>::type>
#endif
zoned_time(const std::string& name, const sys_time& st);
#if !defined(_MSC_VER) || (_MSC_VER > 1916)
template ::locate_zone(std::string())),
sys_time
>::value
>::type>
#endif
zoned_time(const char* name, const sys_time& st);
#if !defined(_MSC_VER) || (_MSC_VER > 1916)
template ::locate_zone(std::string())),
local_time
>::value
>::type>
#endif
zoned_time(const std::string& name, const local_time& tp);
#if !defined(_MSC_VER) || (_MSC_VER > 1916)
template ::locate_zone(std::string())),
local_time
>::value
>::type>
#endif
zoned_time(const char* name, const local_time& tp);
#if !defined(_MSC_VER) || (_MSC_VER > 1916)
template ::locate_zone(std::string())),
local_time,
choose
>::value
>::type>
#endif
zoned_time(const std::string& name, const local_time& tp, choose c);
#if !defined(_MSC_VER) || (_MSC_VER > 1916)
template ::locate_zone(std::string())),
local_time,
choose
>::value
>::type>
#endif
zoned_time(const char* name, const local_time& tp, choose c);
#if !defined(_MSC_VER) || (_MSC_VER > 1916)
template ,
sys_time>::value &&
std::is_constructible
<
zoned_time,
decltype(zoned_traits::locate_zone(std::string())),
zoned_time
>::value
>::type>
#else
template
#endif
zoned_time(const std::string& name, const zoned_time& zt);
#if !defined(_MSC_VER) || (_MSC_VER > 1916)
template ,
sys_time>::value &&
std::is_constructible
<
zoned_time,
decltype(zoned_traits::locate_zone(std::string())),
zoned_time
>::value
>::type>
#else
template
#endif
zoned_time(const char* name, const zoned_time& zt);
#if !defined(_MSC_VER) || (_MSC_VER > 1916)
template ,
sys_time>::value &&
std::is_constructible
<
zoned_time,
decltype(zoned_traits::locate_zone(std::string())),
zoned_time,
choose
>::value
>::type>
#else
template
#endif
zoned_time(const std::string& name, const zoned_time& zt,
choose);
#if !defined(_MSC_VER) || (_MSC_VER > 1916)
template ,
sys_time>::value &&
std::is_constructible
<
zoned_time,
decltype(zoned_traits::locate_zone(std::string())),
zoned_time,
choose
>::value
>::type>
#else
template
#endif
zoned_time(const char* name, const zoned_time& zt,
choose);
#endif // !HAS_STRING_VIEW
zoned_time& operator=(const sys_time& st);
zoned_time& operator=(const local_time& ut);
explicit operator sys_time() const;
explicit operator local_time() const;
TimeZonePtr get_time_zone() const;
local_time get_local_time() const;
sys_time get_sys_time() const;
sys_info get_info() const;
template
friend
bool
operator==(const zoned_time& x,
const zoned_time& y);
template
friend
std::basic_ostream&
operator<<(std::basic_ostream& os,
const zoned_time& t);
private:
template friend class zoned_time;
template
static
TimeZonePtr2&&
check(TimeZonePtr2&& p);
};
using zoned_seconds = zoned_time;
#if HAS_DEDUCTION_GUIDES
namespace detail
{
template
using time_zone_representation =
std::conditional_t
<
std::is_convertible::value,
time_zone const*,
std::remove_cv_t>
>;
}
zoned_time()
-> zoned_time;
template
zoned_time(sys_time)
-> zoned_time>;
template
zoned_time(TimeZonePtrOrName&&)
-> zoned_time>;
template
zoned_time(TimeZonePtrOrName&&, sys_time)
-> zoned_time, detail::time_zone_representation>;
template
zoned_time(TimeZonePtrOrName&&, local_time, choose = choose::earliest)
-> zoned_time, detail::time_zone_representation>;
template
zoned_time(TimeZonePtrOrName&&, zoned_time, choose = choose::earliest)
-> zoned_time, detail::time_zone_representation>;
#endif // HAS_DEDUCTION_GUIDES
template
inline
bool
operator==(const zoned_time& x,
const zoned_time& y)
{
return x.zone_ == y.zone_ && x.tp_ == y.tp_;
}
template
inline
bool
operator!=(const zoned_time& x,
const zoned_time& y)
{
return !(x == y);
}
#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
namespace detail
{
# if USE_OS_TZDB
struct transition;
struct expanded_ttinfo;
# else // !USE_OS_TZDB
struct zonelet;
class Rule;
# endif // !USE_OS_TZDB
}
#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900)
class time_zone
{
private:
std::string name_;
#if USE_OS_TZDB
std::vector transitions_;
std::vector ttinfos_;
#else // !USE_OS_TZDB
std::vector zonelets_;
#endif // !USE_OS_TZDB
std::unique_ptr adjusted_;
public:
#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
time_zone(time_zone&&) = default;
time_zone& operator=(time_zone&&) = default;
#else // defined(_MSC_VER) && (_MSC_VER < 1900)
time_zone(time_zone&& src);
time_zone& operator=(time_zone&& src);
#endif // defined(_MSC_VER) && (_MSC_VER < 1900)
DATE_API explicit time_zone(const std::string& s, detail::undocumented);
const std::string& name() const NOEXCEPT;
template sys_info get_info(sys_time st) const;
template local_info get_info(local_time tp) const;
template
sys_time::type>
to_sys(local_time tp) const;
template
sys_time::type>
to_sys(local_time tp, choose z) const;
template
local_time::type>
to_local(sys_time tp) const;
friend bool operator==(const time_zone& x, const time_zone& y) NOEXCEPT;
friend bool operator< (const time_zone& x, const time_zone& y) NOEXCEPT;
friend DATE_API std::ostream& operator<<(std::ostream& os, const time_zone& z);
#if !USE_OS_TZDB
DATE_API void add(const std::string& s);
#endif // !USE_OS_TZDB
private:
DATE_API sys_info get_info_impl(sys_seconds tp) const;
DATE_API local_info get_info_impl(local_seconds tp) const;
template
sys_time::type>
to_sys_impl(local_time tp, choose z, std::false_type) const;
template
sys_time::type>
to_sys_impl(local_time tp, choose, std::true_type) const;
#if USE_OS_TZDB
DATE_API void init() const;
DATE_API void init_impl();
DATE_API sys_info
load_sys_info(std::vector::const_iterator i) const;
template
DATE_API void
load_data(std::istream& inf, std::int32_t tzh_leapcnt, std::int32_t tzh_timecnt,
std::int32_t tzh_typecnt, std::int32_t tzh_charcnt);
#else // !USE_OS_TZDB
DATE_API sys_info get_info_impl(sys_seconds tp, int timezone) const;
DATE_API void adjust_infos(const std::vector& rules);
DATE_API void parse_info(std::istream& in);
#endif // !USE_OS_TZDB
};
#if defined(_MSC_VER) && (_MSC_VER < 1900)
inline
time_zone::time_zone(time_zone&& src)
: name_(std::move(src.name_))
, zonelets_(std::move(src.zonelets_))
, adjusted_(std::move(src.adjusted_))
{}
inline
time_zone&
time_zone::operator=(time_zone&& src)
{
name_ = std::move(src.name_);
zonelets_ = std::move(src.zonelets_);
adjusted_ = std::move(src.adjusted_);
return *this;
}
#endif // defined(_MSC_VER) && (_MSC_VER < 1900)
inline
const std::string&
time_zone::name() const NOEXCEPT
{
return name_;
}
template
inline
sys_info
time_zone::get_info(sys_time st) const
{
return get_info_impl(date::floor(st));
}
template
inline
local_info
time_zone::get_info(local_time tp) const
{
return get_info_impl(date::floor(tp));
}
template
inline
sys_time::type>
time_zone::to_sys(local_time tp) const
{
return to_sys_impl(tp, choose{}, std::true_type{});
}
template
inline
sys_time::type>
time_zone::to_sys(local_time tp, choose z) const
{
return to_sys_impl(tp, z, std::false_type{});
}
template
inline
local_time::type>
time_zone::to_local(sys_time tp) const
{
using LT = local_time::type>;
auto i = get_info(tp);
return LT{(tp + i.offset).time_since_epoch()};
}
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) NOEXCEPT {return x.name_ < y.name_;}
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) NOEXCEPT {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) NOEXCEPT {return !(x < y);}
template
sys_time::type>
time_zone::to_sys_impl(local_time tp, choose z, std::false_type) const
{
auto i = get_info(tp);
if (i.result == local_info::nonexistent)
{
return i.first.end;
}
else if (i.result == local_info::ambiguous)
{
if (z == choose::latest)
return sys_time{tp.time_since_epoch()} - i.second.offset;
}
return sys_time{tp.time_since_epoch()} - i.first.offset;
}
template
sys_time::type>
time_zone::to_sys_impl(local_time tp, choose, std::true_type) const
{
auto i = get_info(tp);
if (i.result == local_info::nonexistent)
throw nonexistent_local_time(tp, i);
else if (i.result == local_info::ambiguous)
throw ambiguous_local_time(tp, i);
return sys_time{tp.time_since_epoch()} - i.first.offset;
}
#if !USE_OS_TZDB
class time_zone_link
{
private:
std::string name_;
std::string target_;
public:
DATE_API explicit time_zone_link(const std::string& s);
const std::string& name() const {return name_;}
const std::string& target() const {return target_;}
friend bool operator==(const time_zone_link& x, const time_zone_link& y) {return x.name_ == y.name_;}
friend bool operator< (const time_zone_link& x, const time_zone_link& y) {return x.name_ < y.name_;}
friend DATE_API std::ostream& operator<<(std::ostream& os, const time_zone_link& x);
};
using link = time_zone_link;
inline bool operator!=(const time_zone_link& x, const time_zone_link& y) {return !(x == y);}
inline bool operator> (const time_zone_link& x, const time_zone_link& y) {return y < x;}
inline bool operator<=(const time_zone_link& x, const time_zone_link& y) {return !(y < x);}
inline bool operator>=(const time_zone_link& x, const time_zone_link& y) {return !(x < y);}
#endif // !USE_OS_TZDB
class leap_second
{
private:
sys_seconds date_;
public:
#if USE_OS_TZDB
DATE_API explicit leap_second(const sys_seconds& s, detail::undocumented);
#else
DATE_API explicit leap_second(const std::string& s, detail::undocumented);
#endif
sys_seconds date() const {return date_;}
friend bool operator==(const leap_second& x, const leap_second& y) {return x.date_ == y.date_;}
friend bool operator< (const leap_second& x, const leap_second& y) {return x.date_ < y.date_;}
template
friend
bool
operator==(const leap_second& x, const sys_time& y)
{
return x.date_ == y;
}
template
friend
bool
operator< (const leap_second& x, const sys_time& y)
{
return x.date_ < y;
}
template
friend
bool
operator< (const sys_time& x, const leap_second& y)
{
return x < y.date_;
}
friend DATE_API std::ostream& operator<<(std::ostream& os, const leap_second& x);
};
inline bool operator!=(const leap_second& x, const leap_second& y) {return !(x == y);}
inline bool operator> (const leap_second& x, const leap_second& y) {return y < x;}
inline bool operator<=(const leap_second& x, const leap_second& y) {return !(y < x);}
inline bool operator>=(const leap_second& x, const leap_second& y) {return !(x < y);}
template
inline
bool
operator==(const sys_time& x, const leap_second& y)
{
return y == x;
}
template
inline
bool
operator!=(const leap_second& x, const sys_time& y)
{
return !(x == y);
}
template
inline
bool
operator!=(const sys_time& x, const leap_second& y)
{
return !(x == y);
}
template
inline
bool
operator> (const leap_second& x, const sys_time& y)
{
return y < x;
}
template
inline
bool
operator> (const sys_time& x, const leap_second& y)
{
return y < x;
}
template
inline
bool
operator<=(const leap_second& x, const sys_time& y)
{
return !(y < x);
}
template
inline
bool
operator<=(const sys_time& x, const leap_second& y)
{
return !(y < x);
}
template
inline
bool
operator>=(const leap_second& x, const sys_time& y)
{
return !(x < y);
}
template
inline
bool
operator>=(const sys_time& x, const leap_second& y)
{
return !(x < y);
}
using leap = leap_second;
#ifdef _WIN32
namespace detail
{
// The time zone mapping is modelled after this data file:
// http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml
// and the field names match the element names from the mapZone element
// of windowsZones.xml.
// The website displays this file here:
// http://www.unicode.org/cldr/charts/latest/supplemental/zone_tzid.html
// The html view is sorted before being displayed but is otherwise the same
// There is a mapping between the os centric view (in this case windows)
// the html displays uses and the generic view the xml file.
// That mapping is this:
// display column "windows" -> xml field "other".
// display column "region" -> xml field "territory".
// display column "tzid" -> xml field "type".
// This structure uses the generic terminology because it could be
// used to to support other os/native name conversions, not just windows,
// and using the same generic names helps retain the connection to the
// origin of the data that we are using.
struct timezone_mapping
{
timezone_mapping(const char* other, const char* territory, const char* type)
: other(other), territory(territory), type(type)
{
}
timezone_mapping() = default;
std::string other;
std::string territory;
std::string type;
};
} // detail
#endif // _WIN32
struct tzdb
{
std::string version = "unknown";
std::vector zones;
#if !USE_OS_TZDB
std::vector links;
#endif
std::vector leap_seconds;
#if !USE_OS_TZDB
std::vector rules;
#endif
#ifdef _WIN32
std::vector mappings;
#endif
tzdb* next = nullptr;
tzdb() = default;
#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
tzdb(tzdb&&) = default;
tzdb& operator=(tzdb&&) = default;
#else // defined(_MSC_VER) && (_MSC_VER < 1900)
tzdb(tzdb&& src)
: version(std::move(src.version))
, zones(std::move(src.zones))
, links(std::move(src.links))
, leap_seconds(std::move(src.leap_seconds))
, rules(std::move(src.rules))
, mappings(std::move(src.mappings))
{}
tzdb& operator=(tzdb&& src)
{
version = std::move(src.version);
zones = std::move(src.zones);
links = std::move(src.links);
leap_seconds = std::move(src.leap_seconds);
rules = std::move(src.rules);
mappings = std::move(src.mappings);
return *this;
}
#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;
#endif
const time_zone* current_zone() const;
};
using TZ_DB = tzdb;
DATE_API std::ostream&
operator<<(std::ostream& os, const tzdb& db);
DATE_API const tzdb& get_tzdb();
class tzdb_list
{
std::atomic head_{nullptr};
public:
~tzdb_list();
tzdb_list() = default;
tzdb_list(tzdb_list&& x) NOEXCEPT;
const tzdb& front() const NOEXCEPT {return *head_;}
tzdb& front() NOEXCEPT {return *head_;}
class const_iterator;
const_iterator begin() const NOEXCEPT;
const_iterator end() const NOEXCEPT;
const_iterator cbegin() const NOEXCEPT;
const_iterator cend() const NOEXCEPT;
const_iterator erase_after(const_iterator p) NOEXCEPT;
struct undocumented_helper;
private:
void push_front(tzdb* tzdb) NOEXCEPT;
};
class tzdb_list::const_iterator
{
tzdb* p_ = nullptr;
explicit const_iterator(tzdb* p) NOEXCEPT : p_{p} {}
public:
const_iterator() = default;
using iterator_category = std::forward_iterator_tag;
using value_type = tzdb;
using reference = const value_type&;
using pointer = const value_type*;
using difference_type = std::ptrdiff_t;
reference operator*() const NOEXCEPT {return *p_;}
pointer operator->() const NOEXCEPT {return p_;}
const_iterator& operator++() NOEXCEPT {p_ = p_->next; return *this;}
const_iterator operator++(int) NOEXCEPT {auto t = *this; ++(*this); return t;}
friend
bool
operator==(const const_iterator& x, const const_iterator& y) NOEXCEPT
{return x.p_ == y.p_;}
friend
bool
operator!=(const const_iterator& x, const const_iterator& y) NOEXCEPT
{return !(x == y);}
friend class tzdb_list;
};
inline
tzdb_list::const_iterator
tzdb_list::begin() const NOEXCEPT
{
return const_iterator{head_};
}
inline
tzdb_list::const_iterator
tzdb_list::end() const NOEXCEPT
{
return const_iterator{nullptr};
}
inline
tzdb_list::const_iterator
tzdb_list::cbegin() const NOEXCEPT
{
return begin();
}
inline
tzdb_list::const_iterator
tzdb_list::cend() const NOEXCEPT
{
return end();
}
DATE_API tzdb_list& get_tzdb_list();
#if !USE_OS_TZDB
DATE_API const tzdb& reload_tzdb();
DATE_API void set_install(const std::string& install);
#endif // !USE_OS_TZDB
#if HAS_REMOTE_API
DATE_API std::string remote_version();
// if provided error_buffer size should be at least CURL_ERROR_SIZE
DATE_API bool remote_download(const std::string& version, char* error_buffer = nullptr);
DATE_API bool remote_install(const std::string& version);
#endif
// zoned_time
namespace detail
{
template
inline
T*
to_raw_pointer(T* p) NOEXCEPT
{
return p;
}
template
inline
auto
to_raw_pointer(Pointer p) NOEXCEPT
-> decltype(detail::to_raw_pointer(p.operator->()))
{
return detail::to_raw_pointer(p.operator->());
}
} // namespace detail
template