summaryrefslogtreecommitdiff
path: root/src/libs/date
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/date')
m---------src/libs/date0
-rw-r--r--src/libs/date/includes/date/chrono_io.h34
-rw-r--r--src/libs/date/includes/date/date.h7947
-rw-r--r--src/libs/date/includes/date/ios.h50
-rw-r--r--src/libs/date/includes/date/islamic.h3031
-rw-r--r--src/libs/date/includes/date/iso_week.h1751
-rw-r--r--src/libs/date/includes/date/julian.h3046
-rw-r--r--src/libs/date/includes/date/ptz.h627
-rw-r--r--src/libs/date/includes/date/tz.h2775
-rw-r--r--src/libs/date/includes/date/tz_private.h316
-rw-r--r--src/libs/date/src/tz.cpp3825
11 files changed, 0 insertions, 23402 deletions
diff --git a/src/libs/date b/src/libs/date
new file mode 160000
+Subproject 9502bc27a3b32fa5759ea82a76c22551620ebcd
diff --git a/src/libs/date/includes/date/chrono_io.h b/src/libs/date/includes/date/chrono_io.h
deleted file mode 100644
index 21be4040..00000000
--- a/src/libs/date/includes/date/chrono_io.h
+++ /dev/null
@@ -1,34 +0,0 @@
-#ifndef CHRONO_IO_H
-#define CHRONO_IO_H
-
-// The MIT License (MIT)
-//
-// Copyright (c) 2016, 2017 Howard Hinnant
-//
-// 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.
-
-// This functionality has moved to "date.h"
-
-#include "date.h"
-
-#endif // CHRONO_IO_H
diff --git a/src/libs/date/includes/date/date.h b/src/libs/date/includes/date/date.h
deleted file mode 100644
index 027a5a46..00000000
--- a/src/libs/date/includes/date/date.h
+++ /dev/null
@@ -1,7947 +0,0 @@
-#ifndef DATE_H
-#define DATE_H
-
-// The MIT License (MIT)
-//
-// Copyright (c) 2015, 2016, 2017 Howard Hinnant
-// Copyright (c) 2016 Adrian Colomitchi
-// Copyright (c) 2017 Florian Dang
-// Copyright (c) 2017 Paul Thompson
-// Copyright (c) 2018, 2019 Tomasz KamiƄski
-// Copyright (c) 2019 Jiangang Zhuang
-//
-// 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.
-
-#ifndef HAS_STRING_VIEW
-# if __cplusplus >= 201703 || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
-# define HAS_STRING_VIEW 1
-# else
-# define HAS_STRING_VIEW 0
-# endif
-#endif // HAS_STRING_VIEW
-
-#include <cassert>
-#include <algorithm>
-#include <cctype>
-#include <chrono>
-#include <climits>
-#if !(__cplusplus >= 201402)
-# include <cmath>
-#endif
-#include <cstddef>
-#include <cstdint>
-#include <cstdlib>
-#include <ctime>
-#include <ios>
-#include <istream>
-#include <iterator>
-#include <limits>
-#include <locale>
-#include <memory>
-#include <ostream>
-#include <ratio>
-#include <sstream>
-#include <stdexcept>
-#include <string>
-#if HAS_STRING_VIEW
-# include <string_view>
-#endif
-#include <utility>
-#include <type_traits>
-
-#ifdef __GNUC__
-# pragma GCC diagnostic push
-# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR > 7)
-# pragma GCC diagnostic ignored "-Wpedantic"
-# endif
-# if __GNUC__ < 5
- // GCC 4.9 Bug 61489 Wrong warning with -Wmissing-field-initializers
-# pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-# endif
-#endif
-
-#ifdef _MSC_VER
-# pragma warning(push)
-// warning C4127: conditional expression is constant
-# pragma warning(disable : 4127)
-#endif
-
-namespace date
-{
-
-//---------------+
-// Configuration |
-//---------------+
-
-#ifndef ONLY_C_LOCALE
-# define ONLY_C_LOCALE 0
-#endif
-
-#if defined(_MSC_VER) && (!defined(__clang__) || (_MSC_VER < 1910))
-// MSVC
-# ifndef _SILENCE_CXX17_UNCAUGHT_EXCEPTION_DEPRECATION_WARNING
-# define _SILENCE_CXX17_UNCAUGHT_EXCEPTION_DEPRECATION_WARNING
-# endif
-# if _MSC_VER < 1910
-// before VS2017
-# define CONSTDATA const
-# define CONSTCD11
-# define CONSTCD14
-# define NOEXCEPT _NOEXCEPT
-# else
-// VS2017 and later
-# define CONSTDATA constexpr const
-# define CONSTCD11 constexpr
-# define CONSTCD14 constexpr
-# define NOEXCEPT noexcept
-# endif
-
-#elif defined(__SUNPRO_CC) && __SUNPRO_CC <= 0x5150
-// Oracle Developer Studio 12.6 and earlier
-# define CONSTDATA constexpr const
-# define CONSTCD11 constexpr
-# define CONSTCD14
-# define NOEXCEPT noexcept
-
-#elif __cplusplus >= 201402
-// C++14
-# define CONSTDATA constexpr const
-# define CONSTCD11 constexpr
-# define CONSTCD14 constexpr
-# define NOEXCEPT noexcept
-#else
-// C++11
-# define CONSTDATA constexpr const
-# define CONSTCD11 constexpr
-# define CONSTCD14
-# define NOEXCEPT noexcept
-#endif
-
-#ifndef HAS_UNCAUGHT_EXCEPTIONS
-# if __cplusplus > 201703 || (defined(_MSVC_LANG) && _MSVC_LANG > 201703L)
-# define HAS_UNCAUGHT_EXCEPTIONS 1
-# else
-# define HAS_UNCAUGHT_EXCEPTIONS 0
-# endif
-#endif // HAS_UNCAUGHT_EXCEPTIONS
-
-#ifndef HAS_VOID_T
-# if __cplusplus >= 201703 || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
-# define HAS_VOID_T 1
-# else
-# define HAS_VOID_T 0
-# endif
-#endif // HAS_VOID_T
-
-// Protect from Oracle sun macro
-#ifdef sun
-# undef sun
-#endif
-
-// Work around for a NVCC compiler bug which causes it to fail
-// to compile std::ratio_{multiply,divide} when used directly
-// in the std::chrono::duration template instantiations below
-namespace detail {
-template <typename R1, typename R2>
-using ratio_multiply = decltype(std::ratio_multiply<R1, R2>{});
-
-template <typename R1, typename R2>
-using ratio_divide = decltype(std::ratio_divide<R1, R2>{});
-} // namespace detail
-
-//-----------+
-// Interface |
-//-----------+
-
-// durations
-
-using days = std::chrono::duration
- <int, detail::ratio_multiply<std::ratio<24>, std::chrono::hours::period>>;
-
-using weeks = std::chrono::duration
- <int, detail::ratio_multiply<std::ratio<7>, days::period>>;
-
-using years = std::chrono::duration
- <int, detail::ratio_multiply<std::ratio<146097, 400>, days::period>>;
-
-using months = std::chrono::duration
- <int, detail::ratio_divide<years::period, std::ratio<12>>>;
-
-// time_point
-
-template <class Duration>
- using sys_time = std::chrono::time_point<std::chrono::system_clock, Duration>;
-
-using sys_days = sys_time<days>;
-using sys_seconds = sys_time<std::chrono::seconds>;
-
-struct local_t {};
-
-template <class Duration>
- using local_time = std::chrono::time_point<local_t, Duration>;
-
-using local_seconds = local_time<std::chrono::seconds>;
-using local_days = local_time<days>;
-
-// types
-
-struct last_spec
-{
- explicit last_spec() = default;
-};
-
-class day;
-class month;
-class year;
-
-class weekday;
-class weekday_indexed;
-class weekday_last;
-
-class month_day;
-class month_day_last;
-class month_weekday;
-class month_weekday_last;
-
-class year_month;
-
-class year_month_day;
-class year_month_day_last;
-class year_month_weekday;
-class year_month_weekday_last;
-
-// date composition operators
-
-CONSTCD11 year_month operator/(const year& y, const month& m) NOEXCEPT;
-CONSTCD11 year_month operator/(const year& y, int m) NOEXCEPT;
-
-CONSTCD11 month_day operator/(const day& d, const month& m) NOEXCEPT;
-CONSTCD11 month_day operator/(const day& d, int m) NOEXCEPT;
-CONSTCD11 month_day operator/(const month& m, const day& d) NOEXCEPT;
-CONSTCD11 month_day operator/(const month& m, int d) NOEXCEPT;
-CONSTCD11 month_day operator/(int m, const day& d) NOEXCEPT;
-
-CONSTCD11 month_day_last operator/(const month& m, last_spec) NOEXCEPT;
-CONSTCD11 month_day_last operator/(int m, last_spec) NOEXCEPT;
-CONSTCD11 month_day_last operator/(last_spec, const month& m) NOEXCEPT;
-CONSTCD11 month_day_last operator/(last_spec, int m) NOEXCEPT;
-
-CONSTCD11 month_weekday operator/(const month& m, const weekday_indexed& wdi) NOEXCEPT;
-CONSTCD11 month_weekday operator/(int m, const weekday_indexed& wdi) NOEXCEPT;
-CONSTCD11 month_weekday operator/(const weekday_indexed& wdi, const month& m) NOEXCEPT;
-CONSTCD11 month_weekday operator/(const weekday_indexed& wdi, int m) NOEXCEPT;
-
-CONSTCD11 month_weekday_last operator/(const month& m, const weekday_last& wdl) NOEXCEPT;
-CONSTCD11 month_weekday_last operator/(int m, const weekday_last& wdl) NOEXCEPT;
-CONSTCD11 month_weekday_last operator/(const weekday_last& wdl, const month& m) NOEXCEPT;
-CONSTCD11 month_weekday_last operator/(const weekday_last& wdl, int m) NOEXCEPT;
-
-CONSTCD11 year_month_day operator/(const year_month& ym, const day& d) NOEXCEPT;
-CONSTCD11 year_month_day operator/(const year_month& ym, int d) NOEXCEPT;
-CONSTCD11 year_month_day operator/(const year& y, const month_day& md) NOEXCEPT;
-CONSTCD11 year_month_day operator/(int y, const month_day& md) NOEXCEPT;
-CONSTCD11 year_month_day operator/(const month_day& md, const year& y) NOEXCEPT;
-CONSTCD11 year_month_day operator/(const month_day& md, int y) NOEXCEPT;
-
-CONSTCD11
- year_month_day_last operator/(const year_month& ym, last_spec) NOEXCEPT;
-CONSTCD11
- year_month_day_last operator/(const year& y, const month_day_last& mdl) NOEXCEPT;
-CONSTCD11
- year_month_day_last operator/(int y, const month_day_last& mdl) NOEXCEPT;
-CONSTCD11
- year_month_day_last operator/(const month_day_last& mdl, const year& y) NOEXCEPT;
-CONSTCD11
- year_month_day_last operator/(const month_day_last& mdl, int y) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(const year_month& ym, const weekday_indexed& wdi) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(const year& y, const month_weekday& mwd) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(int y, const month_weekday& mwd) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(const month_weekday& mwd, const year& y) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(const month_weekday& mwd, int y) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(const year_month& ym, const weekday_last& wdl) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(const year& y, const month_weekday_last& mwdl) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(int y, const month_weekday_last& mwdl) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(const month_weekday_last& mwdl, const year& y) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(const month_weekday_last& mwdl, int y) NOEXCEPT;
-
-// Detailed interface
-
-// day
-
-class day
-{
- unsigned char d_;
-
-public:
- day() = default;
- explicit CONSTCD11 day(unsigned d) NOEXCEPT;
-
- CONSTCD14 day& operator++() NOEXCEPT;
- CONSTCD14 day operator++(int) NOEXCEPT;
- CONSTCD14 day& operator--() NOEXCEPT;
- CONSTCD14 day operator--(int) NOEXCEPT;
-
- CONSTCD14 day& operator+=(const days& d) NOEXCEPT;
- CONSTCD14 day& operator-=(const days& d) NOEXCEPT;
-
- CONSTCD11 explicit operator unsigned() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator< (const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator> (const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const day& x, const day& y) NOEXCEPT;
-
-CONSTCD11 day operator+(const day& x, const days& y) NOEXCEPT;
-CONSTCD11 day operator+(const days& x, const day& y) NOEXCEPT;
-CONSTCD11 day operator-(const day& x, const days& y) NOEXCEPT;
-CONSTCD11 days operator-(const day& x, const day& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const day& d);
-
-// month
-
-class month
-{
- unsigned char m_;
-
-public:
- month() = default;
- explicit CONSTCD11 month(unsigned m) NOEXCEPT;
-
- CONSTCD14 month& operator++() NOEXCEPT;
- CONSTCD14 month operator++(int) NOEXCEPT;
- CONSTCD14 month& operator--() NOEXCEPT;
- CONSTCD14 month operator--(int) NOEXCEPT;
-
- CONSTCD14 month& operator+=(const months& m) NOEXCEPT;
- CONSTCD14 month& operator-=(const months& m) NOEXCEPT;
-
- CONSTCD11 explicit operator unsigned() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator< (const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator> (const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const month& x, const month& y) NOEXCEPT;
-
-CONSTCD14 month operator+(const month& x, const months& y) NOEXCEPT;
-CONSTCD14 month operator+(const months& x, const month& y) NOEXCEPT;
-CONSTCD14 month operator-(const month& x, const months& y) NOEXCEPT;
-CONSTCD14 months operator-(const month& x, const month& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month& m);
-
-// year
-
-class year
-{
- short y_;
-
-public:
- year() = default;
- explicit CONSTCD11 year(int y) NOEXCEPT;
-
- CONSTCD14 year& operator++() NOEXCEPT;
- CONSTCD14 year operator++(int) NOEXCEPT;
- CONSTCD14 year& operator--() NOEXCEPT;
- CONSTCD14 year operator--(int) NOEXCEPT;
-
- CONSTCD14 year& operator+=(const years& y) NOEXCEPT;
- CONSTCD14 year& operator-=(const years& y) NOEXCEPT;
-
- CONSTCD11 year operator-() const NOEXCEPT;
- CONSTCD11 year operator+() const NOEXCEPT;
-
- CONSTCD11 bool is_leap() const NOEXCEPT;
-
- CONSTCD11 explicit operator int() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-
- static CONSTCD11 year min() NOEXCEPT { return year{-32767}; }
- static CONSTCD11 year max() NOEXCEPT { return year{32767}; }
-};
-
-CONSTCD11 bool operator==(const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year& x, const year& y) NOEXCEPT;
-
-CONSTCD11 year operator+(const year& x, const years& y) NOEXCEPT;
-CONSTCD11 year operator+(const years& x, const year& y) NOEXCEPT;
-CONSTCD11 year operator-(const year& x, const years& y) NOEXCEPT;
-CONSTCD11 years operator-(const year& x, const year& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year& y);
-
-// weekday
-
-class weekday
-{
- unsigned char wd_;
-public:
- weekday() = default;
- explicit CONSTCD11 weekday(unsigned wd) NOEXCEPT;
- CONSTCD14 weekday(const sys_days& dp) NOEXCEPT;
- CONSTCD14 explicit weekday(const local_days& dp) NOEXCEPT;
-
- CONSTCD14 weekday& operator++() NOEXCEPT;
- CONSTCD14 weekday operator++(int) NOEXCEPT;
- CONSTCD14 weekday& operator--() NOEXCEPT;
- CONSTCD14 weekday operator--(int) NOEXCEPT;
-
- CONSTCD14 weekday& operator+=(const days& d) NOEXCEPT;
- CONSTCD14 weekday& operator-=(const days& d) NOEXCEPT;
-
- CONSTCD11 bool ok() const NOEXCEPT;
-
- CONSTCD11 unsigned c_encoding() const NOEXCEPT;
- CONSTCD11 unsigned iso_encoding() const NOEXCEPT;
-
- CONSTCD11 weekday_indexed operator[](unsigned index) const NOEXCEPT;
- CONSTCD11 weekday_last operator[](last_spec) const NOEXCEPT;
-
-private:
- static CONSTCD14 unsigned char weekday_from_days(int z) NOEXCEPT;
-
- friend CONSTCD11 bool operator==(const weekday& x, const weekday& y) NOEXCEPT;
- friend CONSTCD14 days operator-(const weekday& x, const weekday& y) NOEXCEPT;
- friend CONSTCD14 weekday operator+(const weekday& x, const days& y) NOEXCEPT;
- template<class CharT, class Traits>
- friend std::basic_ostream<CharT, Traits>&
- operator<<(std::basic_ostream<CharT, Traits>& os, const weekday& wd);
- friend class weekday_indexed;
-};
-
-CONSTCD11 bool operator==(const weekday& x, const weekday& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const weekday& x, const weekday& y) NOEXCEPT;
-
-CONSTCD14 weekday operator+(const weekday& x, const days& y) NOEXCEPT;
-CONSTCD14 weekday operator+(const days& x, const weekday& y) NOEXCEPT;
-CONSTCD14 weekday operator-(const weekday& x, const days& y) NOEXCEPT;
-CONSTCD14 days operator-(const weekday& x, const weekday& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday& wd);
-
-// weekday_indexed
-
-class weekday_indexed
-{
- unsigned char wd_ : 4;
- unsigned char index_ : 4;
-
-public:
- weekday_indexed() = default;
- CONSTCD11 weekday_indexed(const date::weekday& wd, unsigned index) NOEXCEPT;
-
- CONSTCD11 date::weekday weekday() const NOEXCEPT;
- CONSTCD11 unsigned index() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday_indexed& wdi);
-
-// weekday_last
-
-class weekday_last
-{
- date::weekday wd_;
-
-public:
- explicit CONSTCD11 weekday_last(const date::weekday& wd) NOEXCEPT;
-
- CONSTCD11 date::weekday weekday() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const weekday_last& x, const weekday_last& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const weekday_last& x, const weekday_last& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday_last& wdl);
-
-namespace detail
-{
-
-struct unspecified_month_disambiguator {};
-
-} // namespace detail
-
-// year_month
-
-class year_month
-{
- date::year y_;
- date::month m_;
-
-public:
- year_month() = default;
- CONSTCD11 year_month(const date::year& y, const date::month& m) NOEXCEPT;
-
- CONSTCD11 date::year year() const NOEXCEPT;
- CONSTCD11 date::month month() const NOEXCEPT;
-
- template<class = detail::unspecified_month_disambiguator>
- CONSTCD14 year_month& operator+=(const months& dm) NOEXCEPT;
- template<class = detail::unspecified_month_disambiguator>
- CONSTCD14 year_month& operator-=(const months& dm) NOEXCEPT;
- CONSTCD14 year_month& operator+=(const years& dy) NOEXCEPT;
- CONSTCD14 year_month& operator-=(const years& dy) NOEXCEPT;
-
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year_month& x, const year_month& y) NOEXCEPT;
-
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14 year_month operator+(const year_month& ym, const months& dm) NOEXCEPT;
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14 year_month operator+(const months& dm, const year_month& ym) NOEXCEPT;
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14 year_month operator-(const year_month& ym, const months& dm) NOEXCEPT;
-
-CONSTCD11 months operator-(const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 year_month operator+(const year_month& ym, const years& dy) NOEXCEPT;
-CONSTCD11 year_month operator+(const years& dy, const year_month& ym) NOEXCEPT;
-CONSTCD11 year_month operator-(const year_month& ym, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month& ym);
-
-// month_day
-
-class month_day
-{
- date::month m_;
- date::day d_;
-
-public:
- month_day() = default;
- CONSTCD11 month_day(const date::month& m, const date::day& d) NOEXCEPT;
-
- CONSTCD11 date::month month() const NOEXCEPT;
- CONSTCD11 date::day day() const NOEXCEPT;
-
- CONSTCD14 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator< (const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator> (const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const month_day& x, const month_day& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_day& md);
-
-// month_day_last
-
-class month_day_last
-{
- date::month m_;
-
-public:
- CONSTCD11 explicit month_day_last(const date::month& m) NOEXCEPT;
-
- CONSTCD11 date::month month() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator< (const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator> (const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const month_day_last& x, const month_day_last& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_day_last& mdl);
-
-// month_weekday
-
-class month_weekday
-{
- date::month m_;
- date::weekday_indexed wdi_;
-public:
- CONSTCD11 month_weekday(const date::month& m,
- const date::weekday_indexed& wdi) NOEXCEPT;
-
- CONSTCD11 date::month month() const NOEXCEPT;
- CONSTCD11 date::weekday_indexed weekday_indexed() const NOEXCEPT;
-
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const month_weekday& x, const month_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const month_weekday& x, const month_weekday& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_weekday& mwd);
-
-// month_weekday_last
-
-class month_weekday_last
-{
- date::month m_;
- date::weekday_last wdl_;
-
-public:
- CONSTCD11 month_weekday_last(const date::month& m,
- const date::weekday_last& wd) NOEXCEPT;
-
- CONSTCD11 date::month month() const NOEXCEPT;
- CONSTCD11 date::weekday_last weekday_last() const NOEXCEPT;
-
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11
- bool operator==(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT;
-CONSTCD11
- bool operator!=(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_weekday_last& mwdl);
-
-// class year_month_day
-
-class year_month_day
-{
- date::year y_;
- date::month m_;
- date::day d_;
-
-public:
- year_month_day() = default;
- CONSTCD11 year_month_day(const date::year& y, const date::month& m,
- const date::day& d) NOEXCEPT;
- CONSTCD14 year_month_day(const year_month_day_last& ymdl) NOEXCEPT;
-
- CONSTCD14 year_month_day(sys_days dp) NOEXCEPT;
- CONSTCD14 explicit year_month_day(local_days dp) NOEXCEPT;
-
- template<class = detail::unspecified_month_disambiguator>
- CONSTCD14 year_month_day& operator+=(const months& m) NOEXCEPT;
- template<class = detail::unspecified_month_disambiguator>
- CONSTCD14 year_month_day& operator-=(const months& m) NOEXCEPT;
- CONSTCD14 year_month_day& operator+=(const years& y) NOEXCEPT;
- CONSTCD14 year_month_day& operator-=(const years& y) NOEXCEPT;
-
- CONSTCD11 date::year year() const NOEXCEPT;
- CONSTCD11 date::month month() const NOEXCEPT;
- CONSTCD11 date::day day() const NOEXCEPT;
-
- CONSTCD14 operator sys_days() const NOEXCEPT;
- CONSTCD14 explicit operator local_days() const NOEXCEPT;
- CONSTCD14 bool ok() const NOEXCEPT;
-
-private:
- static CONSTCD14 year_month_day from_days(days dp) NOEXCEPT;
- CONSTCD14 days to_days() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year_month_day& x, const year_month_day& y) NOEXCEPT;
-
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14 year_month_day operator+(const year_month_day& ymd, const months& dm) NOEXCEPT;
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14 year_month_day operator+(const months& dm, const year_month_day& ymd) NOEXCEPT;
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14 year_month_day operator-(const year_month_day& ymd, const months& dm) NOEXCEPT;
-CONSTCD11 year_month_day operator+(const year_month_day& ymd, const years& dy) NOEXCEPT;
-CONSTCD11 year_month_day operator+(const years& dy, const year_month_day& ymd) NOEXCEPT;
-CONSTCD11 year_month_day operator-(const year_month_day& ymd, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_day& ymd);
-
-// year_month_day_last
-
-class year_month_day_last
-{
- date::year y_;
- date::month_day_last mdl_;
-
-public:
- CONSTCD11 year_month_day_last(const date::year& y,
- const date::month_day_last& mdl) NOEXCEPT;
-
- template<class = detail::unspecified_month_disambiguator>
- CONSTCD14 year_month_day_last& operator+=(const months& m) NOEXCEPT;
- template<class = detail::unspecified_month_disambiguator>
- CONSTCD14 year_month_day_last& operator-=(const months& m) NOEXCEPT;
- CONSTCD14 year_month_day_last& operator+=(const years& y) NOEXCEPT;
- CONSTCD14 year_month_day_last& operator-=(const years& y) NOEXCEPT;
-
- CONSTCD11 date::year year() const NOEXCEPT;
- CONSTCD11 date::month month() const NOEXCEPT;
- CONSTCD11 date::month_day_last month_day_last() const NOEXCEPT;
- CONSTCD14 date::day day() const NOEXCEPT;
-
- CONSTCD14 operator sys_days() const NOEXCEPT;
- CONSTCD14 explicit operator local_days() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11
- bool operator==(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
- bool operator!=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
- bool operator< (const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
- bool operator> (const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
- bool operator<=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
- bool operator>=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14
-year_month_day_last
-operator+(const year_month_day_last& ymdl, const months& dm) NOEXCEPT;
-
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14
-year_month_day_last
-operator+(const months& dm, const year_month_day_last& ymdl) NOEXCEPT;
-
-CONSTCD11
-year_month_day_last
-operator+(const year_month_day_last& ymdl, const years& dy) NOEXCEPT;
-
-CONSTCD11
-year_month_day_last
-operator+(const years& dy, const year_month_day_last& ymdl) NOEXCEPT;
-
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14
-year_month_day_last
-operator-(const year_month_day_last& ymdl, const months& dm) NOEXCEPT;
-
-CONSTCD11
-year_month_day_last
-operator-(const year_month_day_last& ymdl, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_day_last& ymdl);
-
-// year_month_weekday
-
-class year_month_weekday
-{
- date::year y_;
- date::month m_;
- date::weekday_indexed wdi_;
-
-public:
- year_month_weekday() = default;
- CONSTCD11 year_month_weekday(const date::year& y, const date::month& m,
- const date::weekday_indexed& wdi) NOEXCEPT;
- CONSTCD14 year_month_weekday(const sys_days& dp) NOEXCEPT;
- CONSTCD14 explicit year_month_weekday(const local_days& dp) NOEXCEPT;
-
- template<class = detail::unspecified_month_disambiguator>
- CONSTCD14 year_month_weekday& operator+=(const months& m) NOEXCEPT;
- template<class = detail::unspecified_month_disambiguator>
- CONSTCD14 year_month_weekday& operator-=(const months& m) NOEXCEPT;
- CONSTCD14 year_month_weekday& operator+=(const years& y) NOEXCEPT;
- CONSTCD14 year_month_weekday& operator-=(const years& y) NOEXCEPT;
-
- CONSTCD11 date::year year() const NOEXCEPT;
- CONSTCD11 date::month month() const NOEXCEPT;
- CONSTCD11 date::weekday weekday() const NOEXCEPT;
- CONSTCD11 unsigned index() const NOEXCEPT;
- CONSTCD11 date::weekday_indexed weekday_indexed() const NOEXCEPT;
-
- CONSTCD14 operator sys_days() const NOEXCEPT;
- CONSTCD14 explicit operator local_days() const NOEXCEPT;
- CONSTCD14 bool ok() const NOEXCEPT;
-
-private:
- static CONSTCD14 year_month_weekday from_days(days dp) NOEXCEPT;
- CONSTCD14 days to_days() const NOEXCEPT;
-};
-
-CONSTCD11
- bool operator==(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT;
-CONSTCD11
- bool operator!=(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT;
-
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14
-year_month_weekday
-operator+(const year_month_weekday& ymwd, const months& dm) NOEXCEPT;
-
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14
-year_month_weekday
-operator+(const months& dm, const year_month_weekday& ymwd) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator+(const year_month_weekday& ymwd, const years& dy) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator+(const years& dy, const year_month_weekday& ymwd) NOEXCEPT;
-
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14
-year_month_weekday
-operator-(const year_month_weekday& ymwd, const months& dm) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator-(const year_month_weekday& ymwd, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday& ymwdi);
-
-// year_month_weekday_last
-
-class year_month_weekday_last
-{
- date::year y_;
- date::month m_;
- date::weekday_last wdl_;
-
-public:
- CONSTCD11 year_month_weekday_last(const date::year& y, const date::month& m,
- const date::weekday_last& wdl) NOEXCEPT;
-
- template<class = detail::unspecified_month_disambiguator>
- CONSTCD14 year_month_weekday_last& operator+=(const months& m) NOEXCEPT;
- template<class = detail::unspecified_month_disambiguator>
- CONSTCD14 year_month_weekday_last& operator-=(const months& m) NOEXCEPT;
- CONSTCD14 year_month_weekday_last& operator+=(const years& y) NOEXCEPT;
- CONSTCD14 year_month_weekday_last& operator-=(const years& y) NOEXCEPT;
-
- CONSTCD11 date::year year() const NOEXCEPT;
- CONSTCD11 date::month month() const NOEXCEPT;
- CONSTCD11 date::weekday weekday() const NOEXCEPT;
- CONSTCD11 date::weekday_last weekday_last() const NOEXCEPT;
-
- CONSTCD14 operator sys_days() const NOEXCEPT;
- CONSTCD14 explicit operator local_days() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-
-private:
- CONSTCD14 days to_days() const NOEXCEPT;
-};
-
-CONSTCD11
-bool
-operator==(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT;
-
-CONSTCD11
-bool
-operator!=(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT;
-
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14
-year_month_weekday_last
-operator+(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT;
-
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14
-year_month_weekday_last
-operator+(const months& dm, const year_month_weekday_last& ymwdl) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator+(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator+(const years& dy, const year_month_weekday_last& ymwdl) NOEXCEPT;
-
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14
-year_month_weekday_last
-operator-(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator-(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday_last& ymwdl);
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-inline namespace literals
-{
-
-CONSTCD11 date::day operator "" _d(unsigned long long d) NOEXCEPT;
-CONSTCD11 date::year operator "" _y(unsigned long long y) NOEXCEPT;
-
-} // inline namespace literals
-#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900)
-
-// CONSTDATA date::month January{1};
-// CONSTDATA date::month February{2};
-// CONSTDATA date::month March{3};
-// CONSTDATA date::month April{4};
-// CONSTDATA date::month May{5};
-// CONSTDATA date::month June{6};
-// CONSTDATA date::month July{7};
-// CONSTDATA date::month August{8};
-// CONSTDATA date::month September{9};
-// CONSTDATA date::month October{10};
-// CONSTDATA date::month November{11};
-// CONSTDATA date::month December{12};
-//
-// CONSTDATA date::weekday Sunday{0u};
-// CONSTDATA date::weekday Monday{1u};
-// CONSTDATA date::weekday Tuesday{2u};
-// CONSTDATA date::weekday Wednesday{3u};
-// CONSTDATA date::weekday Thursday{4u};
-// CONSTDATA date::weekday Friday{5u};
-// CONSTDATA date::weekday Saturday{6u};
-
-#if HAS_VOID_T
-
-template <class T, class = std::void_t<>>
-struct is_clock
- : std::false_type
-{};
-
-template <class T>
-struct is_clock<T, std::void_t<decltype(T::now()), typename T::rep, typename T::period,
- typename T::duration, typename T::time_point,
- decltype(T::is_steady)>>
- : std::true_type
-{};
-
-#endif // HAS_VOID_T
-
-//----------------+
-// Implementation |
-//----------------+
-
-// utilities
-namespace detail {
-
-template<class CharT, class Traits = std::char_traits<CharT>>
-class save_istream
-{
-protected:
- std::basic_ios<CharT, Traits>& is_;
- CharT fill_;
- std::ios::fmtflags flags_;
- std::streamsize width_;
- std::basic_ostream<CharT, Traits>* tie_;
- std::locale loc_;
-
-public:
- ~save_istream()
- {
- is_.fill(fill_);
- is_.flags(flags_);
- is_.width(width_);
- is_.imbue(loc_);
- is_.tie(tie_);
- }
-
- save_istream(const save_istream&) = delete;
- save_istream& operator=(const save_istream&) = delete;
-
- explicit save_istream(std::basic_ios<CharT, Traits>& is)
- : is_(is)
- , fill_(is.fill())
- , flags_(is.flags())
- , width_(is.width(0))
- , tie_(is.tie(nullptr))
- , loc_(is.getloc())
- {
- if (tie_ != nullptr)
- tie_->flush();
- }
-};
-
-template<class CharT, class Traits = std::char_traits<CharT>>
-class save_ostream
- : private save_istream<CharT, Traits>
-{
-public:
- ~save_ostream()
- {
- if ((this->flags_ & std::ios::unitbuf) &&
-#if HAS_UNCAUGHT_EXCEPTIONS
- std::uncaught_exceptions() == 0 &&
-#else
- !std::uncaught_exception() &&
-#endif
- this->is_.good())
- this->is_.rdbuf()->pubsync();
- }
-
- save_ostream(const save_ostream&) = delete;
- save_ostream& operator=(const save_ostream&) = delete;
-
- explicit save_ostream(std::basic_ios<CharT, Traits>& os)
- : save_istream<CharT, Traits>(os)
- {
- }
-};
-
-template <class T>
-struct choose_trunc_type
-{
- static const int digits = std::numeric_limits<T>::digits;
- using type = typename std::conditional
- <
- digits < 32,
- std::int32_t,
- typename std::conditional
- <
- digits < 64,
- std::int64_t,
-#ifdef __SIZEOF_INT128__
- __int128
-#else
- std::int64_t
-#endif
- >::type
- >::type;
-};
-
-template <class T>
-CONSTCD11
-inline
-typename std::enable_if
-<
- !std::chrono::treat_as_floating_point<T>::value,
- T
->::type
-trunc(T t) NOEXCEPT
-{
- return t;
-}
-
-template <class T>
-CONSTCD14
-inline
-typename std::enable_if
-<
- std::chrono::treat_as_floating_point<T>::value,
- T
->::type
-trunc(T t) NOEXCEPT
-{
- using std::numeric_limits;
- using I = typename choose_trunc_type<T>::type;
- CONSTDATA auto digits = numeric_limits<T>::digits;
- static_assert(digits < numeric_limits<I>::digits, "");
- CONSTDATA auto max = I{1} << (digits-1);
- CONSTDATA auto min = -max;
- const auto negative = t < T{0};
- if (min <= t && t <= max && t != 0 && t == t)
- {
- t = static_cast<T>(static_cast<I>(t));
- if (t == 0 && negative)
- t = -t;
- }
- return t;
-}
-
-template <std::intmax_t Xp, std::intmax_t Yp>
-struct static_gcd
-{
- static const std::intmax_t value = static_gcd<Yp, Xp % Yp>::value;
-};
-
-template <std::intmax_t Xp>
-struct static_gcd<Xp, 0>
-{
- static const std::intmax_t value = Xp;
-};
-
-template <>
-struct static_gcd<0, 0>
-{
- static const std::intmax_t value = 1;
-};
-
-template <class R1, class R2>
-struct no_overflow
-{
-private:
- static const std::intmax_t gcd_n1_n2 = static_gcd<R1::num, R2::num>::value;
- static const std::intmax_t gcd_d1_d2 = static_gcd<R1::den, R2::den>::value;
- static const std::intmax_t n1 = R1::num / gcd_n1_n2;
- static const std::intmax_t d1 = R1::den / gcd_d1_d2;
- static const std::intmax_t n2 = R2::num / gcd_n1_n2;
- static const std::intmax_t d2 = R2::den / gcd_d1_d2;
- static const std::intmax_t max = std::numeric_limits<std::intmax_t>::max();
-
- template <std::intmax_t Xp, std::intmax_t Yp, bool overflow>
- struct mul // overflow == false
- {
- static const std::intmax_t value = Xp * Yp;
- };
-
- template <std::intmax_t Xp, std::intmax_t Yp>
- struct mul<Xp, Yp, true>
- {
- static const std::intmax_t value = 1;
- };
-
-public:
- static const bool value = (n1 <= max / d2) && (n2 <= max / d1);
- typedef std::ratio<mul<n1, d2, !value>::value,
- mul<n2, d1, !value>::value> type;
-};
-
-} // detail
-
-// trunc towards zero
-template <class To, class Rep, class Period>
-CONSTCD11
-inline
-typename std::enable_if
-<
- detail::no_overflow<Period, typename To::period>::value,
- To
->::type
-trunc(const std::chrono::duration<Rep, Period>& d)
-{
- return To{detail::trunc(std::chrono::duration_cast<To>(d).count())};
-}
-
-template <class To, class Rep, class Period>
-CONSTCD11
-inline
-typename std::enable_if
-<
- !detail::no_overflow<Period, typename To::period>::value,
- To
->::type
-trunc(const std::chrono::duration<Rep, Period>& d)
-{
- using std::chrono::duration_cast;
- using std::chrono::duration;
- using rep = typename std::common_type<Rep, typename To::rep>::type;
- return To{detail::trunc(duration_cast<To>(duration_cast<duration<rep>>(d)).count())};
-}
-
-#ifndef HAS_CHRONO_ROUNDING
-# if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 190023918 || (_MSC_FULL_VER >= 190000000 && defined (__clang__)))
-# define HAS_CHRONO_ROUNDING 1
-# elif defined(__cpp_lib_chrono) && __cplusplus > 201402 && __cpp_lib_chrono >= 201510
-# define HAS_CHRONO_ROUNDING 1
-# elif defined(_LIBCPP_VERSION) && __cplusplus > 201402 && _LIBCPP_VERSION >= 3800
-# define HAS_CHRONO_ROUNDING 1
-# else
-# define HAS_CHRONO_ROUNDING 0
-# endif
-#endif // HAS_CHRONO_ROUNDING
-
-#if HAS_CHRONO_ROUNDING == 0
-
-// round down
-template <class To, class Rep, class Period>
-CONSTCD14
-inline
-typename std::enable_if
-<
- detail::no_overflow<Period, typename To::period>::value,
- To
->::type
-floor(const std::chrono::duration<Rep, Period>& d)
-{
- auto t = trunc<To>(d);
- if (t > d)
- return t - To{1};
- return t;
-}
-
-template <class To, class Rep, class Period>
-CONSTCD14
-inline
-typename std::enable_if
-<
- !detail::no_overflow<Period, typename To::period>::value,
- To
->::type
-floor(const std::chrono::duration<Rep, Period>& d)
-{
- using rep = typename std::common_type<Rep, typename To::rep>::type;
- return floor<To>(floor<std::chrono::duration<rep>>(d));
-}
-
-// round to nearest, to even on tie
-template <class To, class Rep, class Period>
-CONSTCD14
-inline
-To
-round(const std::chrono::duration<Rep, Period>& d)
-{
- auto t0 = floor<To>(d);
- auto t1 = t0 + To{1};
- if (t1 == To{0} && t0 < To{0})
- t1 = -t1;
- auto diff0 = d - t0;
- auto diff1 = t1 - d;
- if (diff0 == diff1)
- {
- if (t0 - trunc<To>(t0/2)*2 == To{0})
- return t0;
- return t1;
- }
- if (diff0 < diff1)
- return t0;
- return t1;
-}
-
-// round up
-template <class To, class Rep, class Period>
-CONSTCD14
-inline
-To
-ceil(const std::chrono::duration<Rep, Period>& d)
-{
- auto t = trunc<To>(d);
- if (t < d)
- return t + To{1};
- return t;
-}
-
-template <class Rep, class Period,
- class = typename std::enable_if
- <
- std::numeric_limits<Rep>::is_signed
- >::type>
-CONSTCD11
-std::chrono::duration<Rep, Period>
-abs(std::chrono::duration<Rep, Period> d)
-{
- return d >= d.zero() ? d : -d;
-}
-
-// round down
-template <class To, class Clock, class FromDuration>
-CONSTCD11
-inline
-std::chrono::time_point<Clock, To>
-floor(const std::chrono::time_point<Clock, FromDuration>& tp)
-{
- using std::chrono::time_point;
- return time_point<Clock, To>{date::floor<To>(tp.time_since_epoch())};
-}
-
-// round to nearest, to even on tie
-template <class To, class Clock, class FromDuration>
-CONSTCD11
-inline
-std::chrono::time_point<Clock, To>
-round(const std::chrono::time_point<Clock, FromDuration>& tp)
-{
- using std::chrono::time_point;
- return time_point<Clock, To>{round<To>(tp.time_since_epoch())};
-}
-
-// round up
-template <class To, class Clock, class FromDuration>
-CONSTCD11
-inline
-std::chrono::time_point<Clock, To>
-ceil(const std::chrono::time_point<Clock, FromDuration>& tp)
-{
- using std::chrono::time_point;
- return time_point<Clock, To>{ceil<To>(tp.time_since_epoch())};
-}
-
-#else // HAS_CHRONO_ROUNDING == 1
-
-using std::chrono::floor;
-using std::chrono::ceil;
-using std::chrono::round;
-using std::chrono::abs;
-
-#endif // HAS_CHRONO_ROUNDING
-
-// trunc towards zero
-template <class To, class Clock, class FromDuration>
-CONSTCD11
-inline
-std::chrono::time_point<Clock, To>
-trunc(const std::chrono::time_point<Clock, FromDuration>& tp)
-{
- using std::chrono::time_point;
- return time_point<Clock, To>{trunc<To>(tp.time_since_epoch())};
-}
-
-// day
-
-CONSTCD11 inline day::day(unsigned d) NOEXCEPT : d_(static_cast<decltype(d_)>(d)) {}
-CONSTCD14 inline day& day::operator++() NOEXCEPT {++d_; return *this;}
-CONSTCD14 inline day day::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-CONSTCD14 inline day& day::operator--() NOEXCEPT {--d_; return *this;}
-CONSTCD14 inline day day::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-CONSTCD14 inline day& day::operator+=(const days& d) NOEXCEPT {*this = *this + d; return *this;}
-CONSTCD14 inline day& day::operator-=(const days& d) NOEXCEPT {*this = *this - d; return *this;}
-CONSTCD11 inline day::operator unsigned() const NOEXCEPT {return d_;}
-CONSTCD11 inline bool day::ok() const NOEXCEPT {return 1 <= d_ && d_ <= 31;}
-
-CONSTCD11
-inline
-bool
-operator==(const day& x, const day& y) NOEXCEPT
-{
- return static_cast<unsigned>(x) == static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const day& x, const day& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const day& x, const day& y) NOEXCEPT
-{
- return static_cast<unsigned>(x) < static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator>(const day& x, const day& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const day& x, const day& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const day& x, const day& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-CONSTCD11
-inline
-days
-operator-(const day& x, const day& y) NOEXCEPT
-{
- return days{static_cast<days::rep>(static_cast<unsigned>(x)
- - static_cast<unsigned>(y))};
-}
-
-CONSTCD11
-inline
-day
-operator+(const day& x, const days& y) NOEXCEPT
-{
- return day{static_cast<unsigned>(x) + static_cast<unsigned>(y.count())};
-}
-
-CONSTCD11
-inline
-day
-operator+(const days& x, const day& y) NOEXCEPT
-{
- return y + x;
-}
-
-CONSTCD11
-inline
-day
-operator-(const day& x, const days& y) NOEXCEPT
-{
- return x + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const day& d)
-{
- detail::save_ostream<CharT, Traits> _(os);
- os.fill('0');
- os.flags(std::ios::dec | std::ios::right);
- os.width(2);
- os << static_cast<unsigned>(d);
- if (!d.ok())
- os << " is not a valid day";
- return os;
-}
-
-// month
-
-CONSTCD11 inline month::month(unsigned m) NOEXCEPT : m_(static_cast<decltype(m_)>(m)) {}
-CONSTCD14 inline month& month::operator++() NOEXCEPT {*this += months{1}; return *this;}
-CONSTCD14 inline month month::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-CONSTCD14 inline month& month::operator--() NOEXCEPT {*this -= months{1}; return *this;}
-CONSTCD14 inline month month::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-
-CONSTCD14
-inline
-month&
-month::operator+=(const months& m) NOEXCEPT
-{
- *this = *this + m;
- return *this;
-}
-
-CONSTCD14
-inline
-month&
-month::operator-=(const months& m) NOEXCEPT
-{
- *this = *this - m;
- return *this;
-}
-
-CONSTCD11 inline month::operator unsigned() const NOEXCEPT {return m_;}
-CONSTCD11 inline bool month::ok() const NOEXCEPT {return 1 <= m_ && m_ <= 12;}
-
-CONSTCD11
-inline
-bool
-operator==(const month& x, const month& y) NOEXCEPT
-{
- return static_cast<unsigned>(x) == static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month& x, const month& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const month& x, const month& y) NOEXCEPT
-{
- return static_cast<unsigned>(x) < static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator>(const month& x, const month& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const month& x, const month& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const month& x, const month& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-CONSTCD14
-inline
-months
-operator-(const month& x, const month& y) NOEXCEPT
-{
- auto const d = static_cast<unsigned>(x) - static_cast<unsigned>(y);
- return months(d <= 11 ? d : d + 12);
-}
-
-CONSTCD14
-inline
-month
-operator+(const month& x, const months& y) NOEXCEPT
-{
- auto const mu = static_cast<long long>(static_cast<unsigned>(x)) + (y.count() - 1);
- auto const yr = (mu >= 0 ? mu : mu-11) / 12;
- return month{static_cast<unsigned>(mu - yr * 12 + 1)};
-}
-
-CONSTCD14
-inline
-month
-operator+(const months& x, const month& y) NOEXCEPT
-{
- return y + x;
-}
-
-CONSTCD14
-inline
-month
-operator-(const month& x, const months& y) NOEXCEPT
-{
- return x + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month& m)
-{
- if (m.ok())
- {
- CharT fmt[] = {'%', 'b', 0};
- os << format(os.getloc(), fmt, m);
- }
- else
- os << static_cast<unsigned>(m) << " is not a valid month";
- return os;
-}
-
-// year
-
-CONSTCD11 inline year::year(int y) NOEXCEPT : y_(static_cast<decltype(y_)>(y)) {}
-CONSTCD14 inline year& year::operator++() NOEXCEPT {++y_; return *this;}
-CONSTCD14 inline year year::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-CONSTCD14 inline year& year::operator--() NOEXCEPT {--y_; return *this;}
-CONSTCD14 inline year year::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-CONSTCD14 inline year& year::operator+=(const years& y) NOEXCEPT {*this = *this + y; return *this;}
-CONSTCD14 inline year& year::operator-=(const years& y) NOEXCEPT {*this = *this - y; return *this;}
-CONSTCD11 inline year year::operator-() const NOEXCEPT {return year{-y_};}
-CONSTCD11 inline year year::operator+() const NOEXCEPT {return *this;}
-
-CONSTCD11
-inline
-bool
-year::is_leap() const NOEXCEPT
-{
- return y_ % 4 == 0 && (y_ % 100 != 0 || y_ % 400 == 0);
-}
-
-CONSTCD11 inline year::operator int() const NOEXCEPT {return y_;}
-
-CONSTCD11
-inline
-bool
-year::ok() const NOEXCEPT
-{
- return y_ != std::numeric_limits<short>::min();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year& x, const year& y) NOEXCEPT
-{
- return static_cast<int>(x) == static_cast<int>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year& x, const year& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year& x, const year& y) NOEXCEPT
-{
- return static_cast<int>(x) < static_cast<int>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year& x, const year& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year& x, const year& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year& x, const year& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-CONSTCD11
-inline
-years
-operator-(const year& x, const year& y) NOEXCEPT
-{
- return years{static_cast<int>(x) - static_cast<int>(y)};
-}
-
-CONSTCD11
-inline
-year
-operator+(const year& x, const years& y) NOEXCEPT
-{
- return year{static_cast<int>(x) + y.count()};
-}
-
-CONSTCD11
-inline
-year
-operator+(const years& x, const year& y) NOEXCEPT
-{
- return y + x;
-}
-
-CONSTCD11
-inline
-year
-operator-(const year& x, const years& y) NOEXCEPT
-{
- return year{static_cast<int>(x) - y.count()};
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year& y)
-{
- detail::save_ostream<CharT, Traits> _(os);
- os.fill('0');
- os.flags(std::ios::dec | std::ios::internal);
- os.width(4 + (y < year{0}));
- os.imbue(std::locale::classic());
- os << static_cast<int>(y);
- if (!y.ok())
- os << " is not a valid year";
- return os;
-}
-
-// weekday
-
-CONSTCD14
-inline
-unsigned char
-weekday::weekday_from_days(int z) NOEXCEPT
-{
- auto u = static_cast<unsigned>(z);
- return static_cast<unsigned char>(z >= -4 ? (u+4) % 7 : u % 7);
-}
-
-CONSTCD11
-inline
-weekday::weekday(unsigned wd) NOEXCEPT
- : wd_(static_cast<decltype(wd_)>(wd != 7 ? wd : 0))
- {}
-
-CONSTCD14
-inline
-weekday::weekday(const sys_days& dp) NOEXCEPT
- : wd_(weekday_from_days(dp.time_since_epoch().count()))
- {}
-
-CONSTCD14
-inline
-weekday::weekday(const local_days& dp) NOEXCEPT
- : wd_(weekday_from_days(dp.time_since_epoch().count()))
- {}
-
-CONSTCD14 inline weekday& weekday::operator++() NOEXCEPT {*this += days{1}; return *this;}
-CONSTCD14 inline weekday weekday::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-CONSTCD14 inline weekday& weekday::operator--() NOEXCEPT {*this -= days{1}; return *this;}
-CONSTCD14 inline weekday weekday::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-
-CONSTCD14
-inline
-weekday&
-weekday::operator+=(const days& d) NOEXCEPT
-{
- *this = *this + d;
- return *this;
-}
-
-CONSTCD14
-inline
-weekday&
-weekday::operator-=(const days& d) NOEXCEPT
-{
- *this = *this - d;
- return *this;
-}
-
-CONSTCD11 inline bool weekday::ok() const NOEXCEPT {return wd_ <= 6;}
-
-CONSTCD11
-inline
-unsigned weekday::c_encoding() const NOEXCEPT
-{
- return unsigned{wd_};
-}
-
-CONSTCD11
-inline
-unsigned weekday::iso_encoding() const NOEXCEPT
-{
- return unsigned{((wd_ == 0u) ? 7u : wd_)};
-}
-
-CONSTCD11
-inline
-bool
-operator==(const weekday& x, const weekday& y) NOEXCEPT
-{
- return x.wd_ == y.wd_;
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const weekday& x, const weekday& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD14
-inline
-days
-operator-(const weekday& x, const weekday& y) NOEXCEPT
-{
- auto const wdu = x.wd_ - y.wd_;
- auto const wk = (wdu >= 0 ? wdu : wdu-6) / 7;
- return days{wdu - wk * 7};
-}
-
-CONSTCD14
-inline
-weekday
-operator+(const weekday& x, const days& y) NOEXCEPT
-{
- auto const wdu = static_cast<long long>(static_cast<unsigned>(x.wd_)) + y.count();
- auto const wk = (wdu >= 0 ? wdu : wdu-6) / 7;
- return weekday{static_cast<unsigned>(wdu - wk * 7)};
-}
-
-CONSTCD14
-inline
-weekday
-operator+(const days& x, const weekday& y) NOEXCEPT
-{
- return y + x;
-}
-
-CONSTCD14
-inline
-weekday
-operator-(const weekday& x, const days& y) NOEXCEPT
-{
- return x + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday& wd)
-{
- if (wd.ok())
- {
- CharT fmt[] = {'%', 'a', 0};
- os << format(fmt, wd);
- }
- else
- os << static_cast<unsigned>(wd.wd_) << " is not a valid weekday";
- return os;
-}
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-inline namespace literals
-{
-
-CONSTCD11
-inline
-date::day
-operator "" _d(unsigned long long d) NOEXCEPT
-{
- return date::day{static_cast<unsigned>(d)};
-}
-
-CONSTCD11
-inline
-date::year
-operator "" _y(unsigned long long y) NOEXCEPT
-{
- return date::year(static_cast<int>(y));
-}
-#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900)
-
-CONSTDATA date::last_spec last{};
-
-CONSTDATA date::month jan{1};
-CONSTDATA date::month feb{2};
-CONSTDATA date::month mar{3};
-CONSTDATA date::month apr{4};
-CONSTDATA date::month may{5};
-CONSTDATA date::month jun{6};
-CONSTDATA date::month jul{7};
-CONSTDATA date::month aug{8};
-CONSTDATA date::month sep{9};
-CONSTDATA date::month oct{10};
-CONSTDATA date::month nov{11};
-CONSTDATA date::month dec{12};
-
-CONSTDATA date::weekday sun{0u};
-CONSTDATA date::weekday mon{1u};
-CONSTDATA date::weekday tue{2u};
-CONSTDATA date::weekday wed{3u};
-CONSTDATA date::weekday thu{4u};
-CONSTDATA date::weekday fri{5u};
-CONSTDATA date::weekday sat{6u};
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-} // inline namespace literals
-#endif
-
-CONSTDATA date::month January{1};
-CONSTDATA date::month February{2};
-CONSTDATA date::month March{3};
-CONSTDATA date::month April{4};
-CONSTDATA date::month May{5};
-CONSTDATA date::month June{6};
-CONSTDATA date::month July{7};
-CONSTDATA date::month August{8};
-CONSTDATA date::month September{9};
-CONSTDATA date::month October{10};
-CONSTDATA date::month November{11};
-CONSTDATA date::month December{12};
-
-CONSTDATA date::weekday Monday{1};
-CONSTDATA date::weekday Tuesday{2};
-CONSTDATA date::weekday Wednesday{3};
-CONSTDATA date::weekday Thursday{4};
-CONSTDATA date::weekday Friday{5};
-CONSTDATA date::weekday Saturday{6};
-CONSTDATA date::weekday Sunday{7};
-
-// weekday_indexed
-
-CONSTCD11
-inline
-weekday
-weekday_indexed::weekday() const NOEXCEPT
-{
- return date::weekday{static_cast<unsigned>(wd_)};
-}
-
-CONSTCD11 inline unsigned weekday_indexed::index() const NOEXCEPT {return index_;}
-
-CONSTCD11
-inline
-bool
-weekday_indexed::ok() const NOEXCEPT
-{
- return weekday().ok() && 1 <= index_ && index_ <= 5;
-}
-
-#ifdef __GNUC__
-# pragma GCC diagnostic push
-# pragma GCC diagnostic ignored "-Wconversion"
-#endif // __GNUC__
-
-CONSTCD11
-inline
-weekday_indexed::weekday_indexed(const date::weekday& wd, unsigned index) NOEXCEPT
- : wd_(static_cast<decltype(wd_)>(static_cast<unsigned>(wd.wd_)))
- , index_(static_cast<decltype(index_)>(index))
- {}
-
-#ifdef __GNUC__
-# pragma GCC diagnostic pop
-#endif // __GNUC__
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday_indexed& wdi)
-{
- os << wdi.weekday() << '[' << wdi.index();
- if (!(1 <= wdi.index() && wdi.index() <= 5))
- os << " is not a valid index";
- os << ']';
- return os;
-}
-
-CONSTCD11
-inline
-weekday_indexed
-weekday::operator[](unsigned index) const NOEXCEPT
-{
- return {*this, index};
-}
-
-CONSTCD11
-inline
-bool
-operator==(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT
-{
- return x.weekday() == y.weekday() && x.index() == y.index();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-// weekday_last
-
-CONSTCD11 inline date::weekday weekday_last::weekday() const NOEXCEPT {return wd_;}
-CONSTCD11 inline bool weekday_last::ok() const NOEXCEPT {return wd_.ok();}
-CONSTCD11 inline weekday_last::weekday_last(const date::weekday& wd) NOEXCEPT : wd_(wd) {}
-
-CONSTCD11
-inline
-bool
-operator==(const weekday_last& x, const weekday_last& y) NOEXCEPT
-{
- return x.weekday() == y.weekday();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const weekday_last& x, const weekday_last& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday_last& wdl)
-{
- return os << wdl.weekday() << "[last]";
-}
-
-CONSTCD11
-inline
-weekday_last
-weekday::operator[](last_spec) const NOEXCEPT
-{
- return weekday_last{*this};
-}
-
-// year_month
-
-CONSTCD11
-inline
-year_month::year_month(const date::year& y, const date::month& m) NOEXCEPT
- : y_(y)
- , m_(m)
- {}
-
-CONSTCD11 inline year year_month::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month::month() const NOEXCEPT {return m_;}
-CONSTCD11 inline bool year_month::ok() const NOEXCEPT {return y_.ok() && m_.ok();}
-
-template<class>
-CONSTCD14
-inline
-year_month&
-year_month::operator+=(const months& dm) NOEXCEPT
-{
- *this = *this + dm;
- return *this;
-}
-
-template<class>
-CONSTCD14
-inline
-year_month&
-year_month::operator-=(const months& dm) NOEXCEPT
-{
- *this = *this - dm;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month&
-year_month::operator+=(const years& dy) NOEXCEPT
-{
- *this = *this + dy;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month&
-year_month::operator-=(const years& dy) NOEXCEPT
-{
- *this = *this - dy;
- return *this;
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month& x, const year_month& y) NOEXCEPT
-{
- return x.year() == y.year() && x.month() == y.month();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month& x, const year_month& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_month& x, const year_month& y) NOEXCEPT
-{
- return x.year() < y.year() ? true
- : (x.year() > y.year() ? false
- : (x.month() < y.month()));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_month& x, const year_month& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_month& x, const year_month& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_month& x, const year_month& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-template<class>
-CONSTCD14
-inline
-year_month
-operator+(const year_month& ym, const months& dm) NOEXCEPT
-{
- auto dmi = static_cast<int>(static_cast<unsigned>(ym.month())) - 1 + dm.count();
- auto dy = (dmi >= 0 ? dmi : dmi-11) / 12;
- dmi = dmi - dy * 12 + 1;
- return (ym.year() + years(dy)) / month(static_cast<unsigned>(dmi));
-}
-
-template<class>
-CONSTCD14
-inline
-year_month
-operator+(const months& dm, const year_month& ym) NOEXCEPT
-{
- return ym + dm;
-}
-
-template<class>
-CONSTCD14
-inline
-year_month
-operator-(const year_month& ym, const months& dm) NOEXCEPT
-{
- return ym + -dm;
-}
-
-CONSTCD11
-inline
-months
-operator-(const year_month& x, const year_month& y) NOEXCEPT
-{
- return (x.year() - y.year()) +
- months(static_cast<unsigned>(x.month()) - static_cast<unsigned>(y.month()));
-}
-
-CONSTCD11
-inline
-year_month
-operator+(const year_month& ym, const years& dy) NOEXCEPT
-{
- return (ym.year() + dy) / ym.month();
-}
-
-CONSTCD11
-inline
-year_month
-operator+(const years& dy, const year_month& ym) NOEXCEPT
-{
- return ym + dy;
-}
-
-CONSTCD11
-inline
-year_month
-operator-(const year_month& ym, const years& dy) NOEXCEPT
-{
- return ym + -dy;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month& ym)
-{
- return os << ym.year() << '/' << ym.month();
-}
-
-// month_day
-
-CONSTCD11
-inline
-month_day::month_day(const date::month& m, const date::day& d) NOEXCEPT
- : m_(m)
- , d_(d)
- {}
-
-CONSTCD11 inline date::month month_day::month() const NOEXCEPT {return m_;}
-CONSTCD11 inline date::day month_day::day() const NOEXCEPT {return d_;}
-
-CONSTCD14
-inline
-bool
-month_day::ok() const NOEXCEPT
-{
- CONSTDATA date::day d[] =
- {
- date::day(31), date::day(29), date::day(31),
- date::day(30), date::day(31), date::day(30),
- date::day(31), date::day(31), date::day(30),
- date::day(31), date::day(30), date::day(31)
- };
- return m_.ok() && date::day{1} <= d_ && d_ <= d[static_cast<unsigned>(m_)-1];
-}
-
-CONSTCD11
-inline
-bool
-operator==(const month_day& x, const month_day& y) NOEXCEPT
-{
- return x.month() == y.month() && x.day() == y.day();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month_day& x, const month_day& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const month_day& x, const month_day& y) NOEXCEPT
-{
- return x.month() < y.month() ? true
- : (x.month() > y.month() ? false
- : (x.day() < y.day()));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const month_day& x, const month_day& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const month_day& x, const month_day& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const month_day& x, const month_day& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_day& md)
-{
- return os << md.month() << '/' << md.day();
-}
-
-// month_day_last
-
-CONSTCD11 inline month month_day_last::month() const NOEXCEPT {return m_;}
-CONSTCD11 inline bool month_day_last::ok() const NOEXCEPT {return m_.ok();}
-CONSTCD11 inline month_day_last::month_day_last(const date::month& m) NOEXCEPT : m_(m) {}
-
-CONSTCD11
-inline
-bool
-operator==(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
- return x.month() == y.month();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
- return x.month() < y.month();
-}
-
-CONSTCD11
-inline
-bool
-operator>(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_day_last& mdl)
-{
- return os << mdl.month() << "/last";
-}
-
-// month_weekday
-
-CONSTCD11
-inline
-month_weekday::month_weekday(const date::month& m,
- const date::weekday_indexed& wdi) NOEXCEPT
- : m_(m)
- , wdi_(wdi)
- {}
-
-CONSTCD11 inline month month_weekday::month() const NOEXCEPT {return m_;}
-
-CONSTCD11
-inline
-weekday_indexed
-month_weekday::weekday_indexed() const NOEXCEPT
-{
- return wdi_;
-}
-
-CONSTCD11
-inline
-bool
-month_weekday::ok() const NOEXCEPT
-{
- return m_.ok() && wdi_.ok();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const month_weekday& x, const month_weekday& y) NOEXCEPT
-{
- return x.month() == y.month() && x.weekday_indexed() == y.weekday_indexed();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month_weekday& x, const month_weekday& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_weekday& mwd)
-{
- return os << mwd.month() << '/' << mwd.weekday_indexed();
-}
-
-// month_weekday_last
-
-CONSTCD11
-inline
-month_weekday_last::month_weekday_last(const date::month& m,
- const date::weekday_last& wdl) NOEXCEPT
- : m_(m)
- , wdl_(wdl)
- {}
-
-CONSTCD11 inline month month_weekday_last::month() const NOEXCEPT {return m_;}
-
-CONSTCD11
-inline
-weekday_last
-month_weekday_last::weekday_last() const NOEXCEPT
-{
- return wdl_;
-}
-
-CONSTCD11
-inline
-bool
-month_weekday_last::ok() const NOEXCEPT
-{
- return m_.ok() && wdl_.ok();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT
-{
- return x.month() == y.month() && x.weekday_last() == y.weekday_last();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_weekday_last& mwdl)
-{
- return os << mwdl.month() << '/' << mwdl.weekday_last();
-}
-
-// year_month_day_last
-
-CONSTCD11
-inline
-year_month_day_last::year_month_day_last(const date::year& y,
- const date::month_day_last& mdl) NOEXCEPT
- : y_(y)
- , mdl_(mdl)
- {}
-
-template<class>
-CONSTCD14
-inline
-year_month_day_last&
-year_month_day_last::operator+=(const months& m) NOEXCEPT
-{
- *this = *this + m;
- return *this;
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_day_last&
-year_month_day_last::operator-=(const months& m) NOEXCEPT
-{
- *this = *this - m;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_day_last&
-year_month_day_last::operator+=(const years& y) NOEXCEPT
-{
- *this = *this + y;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_day_last&
-year_month_day_last::operator-=(const years& y) NOEXCEPT
-{
- *this = *this - y;
- return *this;
-}
-
-CONSTCD11 inline year year_month_day_last::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month_day_last::month() const NOEXCEPT {return mdl_.month();}
-
-CONSTCD11
-inline
-month_day_last
-year_month_day_last::month_day_last() const NOEXCEPT
-{
- return mdl_;
-}
-
-CONSTCD14
-inline
-day
-year_month_day_last::day() const NOEXCEPT
-{
- CONSTDATA date::day d[] =
- {
- date::day(31), date::day(28), date::day(31),
- date::day(30), date::day(31), date::day(30),
- date::day(31), date::day(31), date::day(30),
- date::day(31), date::day(30), date::day(31)
- };
- return (month() != February || !y_.is_leap()) && mdl_.ok() ?
- d[static_cast<unsigned>(month()) - 1] : date::day{29};
-}
-
-CONSTCD14
-inline
-year_month_day_last::operator sys_days() const NOEXCEPT
-{
- return sys_days(year()/month()/day());
-}
-
-CONSTCD14
-inline
-year_month_day_last::operator local_days() const NOEXCEPT
-{
- return local_days(year()/month()/day());
-}
-
-CONSTCD11
-inline
-bool
-year_month_day_last::ok() const NOEXCEPT
-{
- return y_.ok() && mdl_.ok();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
- return x.year() == y.year() && x.month_day_last() == y.month_day_last();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
- return x.year() < y.year() ? true
- : (x.year() > y.year() ? false
- : (x.month_day_last() < y.month_day_last()));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_day_last& ymdl)
-{
- return os << ymdl.year() << '/' << ymdl.month_day_last();
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_day_last
-operator+(const year_month_day_last& ymdl, const months& dm) NOEXCEPT
-{
- return (ymdl.year() / ymdl.month() + dm) / last;
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_day_last
-operator+(const months& dm, const year_month_day_last& ymdl) NOEXCEPT
-{
- return ymdl + dm;
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_day_last
-operator-(const year_month_day_last& ymdl, const months& dm) NOEXCEPT
-{
- return ymdl + (-dm);
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator+(const year_month_day_last& ymdl, const years& dy) NOEXCEPT
-{
- return {ymdl.year()+dy, ymdl.month_day_last()};
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator+(const years& dy, const year_month_day_last& ymdl) NOEXCEPT
-{
- return ymdl + dy;
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator-(const year_month_day_last& ymdl, const years& dy) NOEXCEPT
-{
- return ymdl + (-dy);
-}
-
-// year_month_day
-
-CONSTCD11
-inline
-year_month_day::year_month_day(const date::year& y, const date::month& m,
- const date::day& d) NOEXCEPT
- : y_(y)
- , m_(m)
- , d_(d)
- {}
-
-CONSTCD14
-inline
-year_month_day::year_month_day(const year_month_day_last& ymdl) NOEXCEPT
- : y_(ymdl.year())
- , m_(ymdl.month())
- , d_(ymdl.day())
- {}
-
-CONSTCD14
-inline
-year_month_day::year_month_day(sys_days dp) NOEXCEPT
- : year_month_day(from_days(dp.time_since_epoch()))
- {}
-
-CONSTCD14
-inline
-year_month_day::year_month_day(local_days dp) NOEXCEPT
- : year_month_day(from_days(dp.time_since_epoch()))
- {}
-
-CONSTCD11 inline year year_month_day::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month_day::month() const NOEXCEPT {return m_;}
-CONSTCD11 inline day year_month_day::day() const NOEXCEPT {return d_;}
-
-template<class>
-CONSTCD14
-inline
-year_month_day&
-year_month_day::operator+=(const months& m) NOEXCEPT
-{
- *this = *this + m;
- return *this;
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_day&
-year_month_day::operator-=(const months& m) NOEXCEPT
-{
- *this = *this - m;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_day&
-year_month_day::operator+=(const years& y) NOEXCEPT
-{
- *this = *this + y;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_day&
-year_month_day::operator-=(const years& y) NOEXCEPT
-{
- *this = *this - y;
- return *this;
-}
-
-CONSTCD14
-inline
-days
-year_month_day::to_days() const NOEXCEPT
-{
- static_assert(std::numeric_limits<unsigned>::digits >= 18,
- "This algorithm has not been ported to a 16 bit unsigned integer");
- static_assert(std::numeric_limits<int>::digits >= 20,
- "This algorithm has not been ported to a 16 bit signed integer");
- auto const y = static_cast<int>(y_) - (m_ <= February);
- auto const m = static_cast<unsigned>(m_);
- auto const d = static_cast<unsigned>(d_);
- auto const era = (y >= 0 ? y : y-399) / 400;
- auto const yoe = static_cast<unsigned>(y - era * 400); // [0, 399]
- auto const doy = (153*(m > 2 ? m-3 : m+9) + 2)/5 + d-1; // [0, 365]
- auto const doe = yoe * 365 + yoe/4 - yoe/100 + doy; // [0, 146096]
- return days{era * 146097 + static_cast<int>(doe) - 719468};
-}
-
-CONSTCD14
-inline
-year_month_day::operator sys_days() const NOEXCEPT
-{
- return sys_days{to_days()};
-}
-
-CONSTCD14
-inline
-year_month_day::operator local_days() const NOEXCEPT
-{
- return local_days{to_days()};
-}
-
-CONSTCD14
-inline
-bool
-year_month_day::ok() const NOEXCEPT
-{
- if (!(y_.ok() && m_.ok()))
- return false;
- return date::day{1} <= d_ && d_ <= (y_ / m_ / last).day();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
- return x.year() == y.year() && x.month() == y.month() && x.day() == y.day();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
- return x.year() < y.year() ? true
- : (x.year() > y.year() ? false
- : (x.month() < y.month() ? true
- : (x.month() > y.month() ? false
- : (x.day() < y.day()))));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_day& ymd)
-{
- detail::save_ostream<CharT, Traits> _(os);
- os.fill('0');
- os.flags(std::ios::dec | std::ios::right);
- os.imbue(std::locale::classic());
- os << ymd.year() << '-';
- os.width(2);
- os << static_cast<unsigned>(ymd.month()) << '-';
- os << ymd.day();
- if (!ymd.ok())
- os << " is not a valid date";
- return os;
-}
-
-CONSTCD14
-inline
-year_month_day
-year_month_day::from_days(days dp) NOEXCEPT
-{
- static_assert(std::numeric_limits<unsigned>::digits >= 18,
- "This algorithm has not been ported to a 16 bit unsigned integer");
- static_assert(std::numeric_limits<int>::digits >= 20,
- "This algorithm has not been ported to a 16 bit signed integer");
- auto const z = dp.count() + 719468;
- auto const era = (z >= 0 ? z : z - 146096) / 146097;
- auto const doe = static_cast<unsigned>(z - era * 146097); // [0, 146096]
- auto const yoe = (doe - doe/1460 + doe/36524 - doe/146096) / 365; // [0, 399]
- auto const y = static_cast<days::rep>(yoe) + era * 400;
- auto const doy = doe - (365*yoe + yoe/4 - yoe/100); // [0, 365]
- auto const mp = (5*doy + 2)/153; // [0, 11]
- auto const d = doy - (153*mp+2)/5 + 1; // [1, 31]
- auto const m = mp < 10 ? mp+3 : mp-9; // [1, 12]
- return year_month_day{date::year{y + (m <= 2)}, date::month(m), date::day(d)};
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_day
-operator+(const year_month_day& ymd, const months& dm) NOEXCEPT
-{
- return (ymd.year() / ymd.month() + dm) / ymd.day();
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_day
-operator+(const months& dm, const year_month_day& ymd) NOEXCEPT
-{
- return ymd + dm;
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_day
-operator-(const year_month_day& ymd, const months& dm) NOEXCEPT
-{
- return ymd + (-dm);
-}
-
-CONSTCD11
-inline
-year_month_day
-operator+(const year_month_day& ymd, const years& dy) NOEXCEPT
-{
- return (ymd.year() + dy) / ymd.month() / ymd.day();
-}
-
-CONSTCD11
-inline
-year_month_day
-operator+(const years& dy, const year_month_day& ymd) NOEXCEPT
-{
- return ymd + dy;
-}
-
-CONSTCD11
-inline
-year_month_day
-operator-(const year_month_day& ymd, const years& dy) NOEXCEPT
-{
- return ymd + (-dy);
-}
-
-// year_month_weekday
-
-CONSTCD11
-inline
-year_month_weekday::year_month_weekday(const date::year& y, const date::month& m,
- const date::weekday_indexed& wdi)
- NOEXCEPT
- : y_(y)
- , m_(m)
- , wdi_(wdi)
- {}
-
-CONSTCD14
-inline
-year_month_weekday::year_month_weekday(const sys_days& dp) NOEXCEPT
- : year_month_weekday(from_days(dp.time_since_epoch()))
- {}
-
-CONSTCD14
-inline
-year_month_weekday::year_month_weekday(const local_days& dp) NOEXCEPT
- : year_month_weekday(from_days(dp.time_since_epoch()))
- {}
-
-template<class>
-CONSTCD14
-inline
-year_month_weekday&
-year_month_weekday::operator+=(const months& m) NOEXCEPT
-{
- *this = *this + m;
- return *this;
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_weekday&
-year_month_weekday::operator-=(const months& m) NOEXCEPT
-{
- *this = *this - m;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday&
-year_month_weekday::operator+=(const years& y) NOEXCEPT
-{
- *this = *this + y;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday&
-year_month_weekday::operator-=(const years& y) NOEXCEPT
-{
- *this = *this - y;
- return *this;
-}
-
-CONSTCD11 inline year year_month_weekday::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month_weekday::month() const NOEXCEPT {return m_;}
-
-CONSTCD11
-inline
-weekday
-year_month_weekday::weekday() const NOEXCEPT
-{
- return wdi_.weekday();
-}
-
-CONSTCD11
-inline
-unsigned
-year_month_weekday::index() const NOEXCEPT
-{
- return wdi_.index();
-}
-
-CONSTCD11
-inline
-weekday_indexed
-year_month_weekday::weekday_indexed() const NOEXCEPT
-{
- return wdi_;
-}
-
-CONSTCD14
-inline
-year_month_weekday::operator sys_days() const NOEXCEPT
-{
- return sys_days{to_days()};
-}
-
-CONSTCD14
-inline
-year_month_weekday::operator local_days() const NOEXCEPT
-{
- return local_days{to_days()};
-}
-
-CONSTCD14
-inline
-bool
-year_month_weekday::ok() const NOEXCEPT
-{
- if (!y_.ok() || !m_.ok() || !wdi_.weekday().ok() || wdi_.index() < 1)
- return false;
- if (wdi_.index() <= 4)
- return true;
- auto d2 = wdi_.weekday() - date::weekday(static_cast<sys_days>(y_/m_/1)) +
- days((wdi_.index()-1)*7 + 1);
- return static_cast<unsigned>(d2.count()) <= static_cast<unsigned>((y_/m_/last).day());
-}
-
-CONSTCD14
-inline
-year_month_weekday
-year_month_weekday::from_days(days d) NOEXCEPT
-{
- sys_days dp{d};
- auto const wd = date::weekday(dp);
- auto const ymd = year_month_day(dp);
- return {ymd.year(), ymd.month(), wd[(static_cast<unsigned>(ymd.day())-1)/7+1]};
-}
-
-CONSTCD14
-inline
-days
-year_month_weekday::to_days() const NOEXCEPT
-{
- auto d = sys_days(y_/m_/1);
- return (d + (wdi_.weekday() - date::weekday(d) + days{(wdi_.index()-1)*7})
- ).time_since_epoch();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT
-{
- return x.year() == y.year() && x.month() == y.month() &&
- x.weekday_indexed() == y.weekday_indexed();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday& ymwdi)
-{
- return os << ymwdi.year() << '/' << ymwdi.month()
- << '/' << ymwdi.weekday_indexed();
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_weekday
-operator+(const year_month_weekday& ymwd, const months& dm) NOEXCEPT
-{
- return (ymwd.year() / ymwd.month() + dm) / ymwd.weekday_indexed();
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_weekday
-operator+(const months& dm, const year_month_weekday& ymwd) NOEXCEPT
-{
- return ymwd + dm;
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_weekday
-operator-(const year_month_weekday& ymwd, const months& dm) NOEXCEPT
-{
- return ymwd + (-dm);
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator+(const year_month_weekday& ymwd, const years& dy) NOEXCEPT
-{
- return {ymwd.year()+dy, ymwd.month(), ymwd.weekday_indexed()};
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator+(const years& dy, const year_month_weekday& ymwd) NOEXCEPT
-{
- return ymwd + dy;
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator-(const year_month_weekday& ymwd, const years& dy) NOEXCEPT
-{
- return ymwd + (-dy);
-}
-
-// year_month_weekday_last
-
-CONSTCD11
-inline
-year_month_weekday_last::year_month_weekday_last(const date::year& y,
- const date::month& m,
- const date::weekday_last& wdl) NOEXCEPT
- : y_(y)
- , m_(m)
- , wdl_(wdl)
- {}
-
-template<class>
-CONSTCD14
-inline
-year_month_weekday_last&
-year_month_weekday_last::operator+=(const months& m) NOEXCEPT
-{
- *this = *this + m;
- return *this;
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_weekday_last&
-year_month_weekday_last::operator-=(const months& m) NOEXCEPT
-{
- *this = *this - m;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last&
-year_month_weekday_last::operator+=(const years& y) NOEXCEPT
-{
- *this = *this + y;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last&
-year_month_weekday_last::operator-=(const years& y) NOEXCEPT
-{
- *this = *this - y;
- return *this;
-}
-
-CONSTCD11 inline year year_month_weekday_last::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month_weekday_last::month() const NOEXCEPT {return m_;}
-
-CONSTCD11
-inline
-weekday
-year_month_weekday_last::weekday() const NOEXCEPT
-{
- return wdl_.weekday();
-}
-
-CONSTCD11
-inline
-weekday_last
-year_month_weekday_last::weekday_last() const NOEXCEPT
-{
- return wdl_;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last::operator sys_days() const NOEXCEPT
-{
- return sys_days{to_days()};
-}
-
-CONSTCD14
-inline
-year_month_weekday_last::operator local_days() const NOEXCEPT
-{
- return local_days{to_days()};
-}
-
-CONSTCD11
-inline
-bool
-year_month_weekday_last::ok() const NOEXCEPT
-{
- return y_.ok() && m_.ok() && wdl_.ok();
-}
-
-CONSTCD14
-inline
-days
-year_month_weekday_last::to_days() const NOEXCEPT
-{
- auto const d = sys_days(y_/m_/last);
- return (d - (date::weekday{d} - wdl_.weekday())).time_since_epoch();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT
-{
- return x.year() == y.year() && x.month() == y.month() &&
- x.weekday_last() == y.weekday_last();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday_last& ymwdl)
-{
- return os << ymwdl.year() << '/' << ymwdl.month() << '/' << ymwdl.weekday_last();
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_weekday_last
-operator+(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT
-{
- return (ymwdl.year() / ymwdl.month() + dm) / ymwdl.weekday_last();
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_weekday_last
-operator+(const months& dm, const year_month_weekday_last& ymwdl) NOEXCEPT
-{
- return ymwdl + dm;
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_weekday_last
-operator-(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT
-{
- return ymwdl + (-dm);
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator+(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT
-{
- return {ymwdl.year()+dy, ymwdl.month(), ymwdl.weekday_last()};
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator+(const years& dy, const year_month_weekday_last& ymwdl) NOEXCEPT
-{
- return ymwdl + dy;
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator-(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT
-{
- return ymwdl + (-dy);
-}
-
-// year_month from operator/()
-
-CONSTCD11
-inline
-year_month
-operator/(const year& y, const month& m) NOEXCEPT
-{
- return {y, m};
-}
-
-CONSTCD11
-inline
-year_month
-operator/(const year& y, int m) NOEXCEPT
-{
- return y / month(static_cast<unsigned>(m));
-}
-
-// month_day from operator/()
-
-CONSTCD11
-inline
-month_day
-operator/(const month& m, const day& d) NOEXCEPT
-{
- return {m, d};
-}
-
-CONSTCD11
-inline
-month_day
-operator/(const day& d, const month& m) NOEXCEPT
-{
- return m / d;
-}
-
-CONSTCD11
-inline
-month_day
-operator/(const month& m, int d) NOEXCEPT
-{
- return m / day(static_cast<unsigned>(d));
-}
-
-CONSTCD11
-inline
-month_day
-operator/(int m, const day& d) NOEXCEPT
-{
- return month(static_cast<unsigned>(m)) / d;
-}
-
-CONSTCD11 inline month_day operator/(const day& d, int m) NOEXCEPT {return m / d;}
-
-// month_day_last from operator/()
-
-CONSTCD11
-inline
-month_day_last
-operator/(const month& m, last_spec) NOEXCEPT
-{
- return month_day_last{m};
-}
-
-CONSTCD11
-inline
-month_day_last
-operator/(last_spec, const month& m) NOEXCEPT
-{
- return m/last;
-}
-
-CONSTCD11
-inline
-month_day_last
-operator/(int m, last_spec) NOEXCEPT
-{
- return month(static_cast<unsigned>(m))/last;
-}
-
-CONSTCD11
-inline
-month_day_last
-operator/(last_spec, int m) NOEXCEPT
-{
- return m/last;
-}
-
-// month_weekday from operator/()
-
-CONSTCD11
-inline
-month_weekday
-operator/(const month& m, const weekday_indexed& wdi) NOEXCEPT
-{
- return {m, wdi};
-}
-
-CONSTCD11
-inline
-month_weekday
-operator/(const weekday_indexed& wdi, const month& m) NOEXCEPT
-{
- return m / wdi;
-}
-
-CONSTCD11
-inline
-month_weekday
-operator/(int m, const weekday_indexed& wdi) NOEXCEPT
-{
- return month(static_cast<unsigned>(m)) / wdi;
-}
-
-CONSTCD11
-inline
-month_weekday
-operator/(const weekday_indexed& wdi, int m) NOEXCEPT
-{
- return m / wdi;
-}
-
-// month_weekday_last from operator/()
-
-CONSTCD11
-inline
-month_weekday_last
-operator/(const month& m, const weekday_last& wdl) NOEXCEPT
-{
- return {m, wdl};
-}
-
-CONSTCD11
-inline
-month_weekday_last
-operator/(const weekday_last& wdl, const month& m) NOEXCEPT
-{
- return m / wdl;
-}
-
-CONSTCD11
-inline
-month_weekday_last
-operator/(int m, const weekday_last& wdl) NOEXCEPT
-{
- return month(static_cast<unsigned>(m)) / wdl;
-}
-
-CONSTCD11
-inline
-month_weekday_last
-operator/(const weekday_last& wdl, int m) NOEXCEPT
-{
- return m / wdl;
-}
-
-// year_month_day from operator/()
-
-CONSTCD11
-inline
-year_month_day
-operator/(const year_month& ym, const day& d) NOEXCEPT
-{
- return {ym.year(), ym.month(), d};
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(const year_month& ym, int d) NOEXCEPT
-{
- return ym / day(static_cast<unsigned>(d));
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(const year& y, const month_day& md) NOEXCEPT
-{
- return y / md.month() / md.day();
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(int y, const month_day& md) NOEXCEPT
-{
- return year(y) / md;
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(const month_day& md, const year& y) NOEXCEPT
-{
- return y / md;
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(const month_day& md, int y) NOEXCEPT
-{
- return year(y) / md;
-}
-
-// year_month_day_last from operator/()
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(const year_month& ym, last_spec) NOEXCEPT
-{
- return {ym.year(), month_day_last{ym.month()}};
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(const year& y, const month_day_last& mdl) NOEXCEPT
-{
- return {y, mdl};
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(int y, const month_day_last& mdl) NOEXCEPT
-{
- return year(y) / mdl;
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(const month_day_last& mdl, const year& y) NOEXCEPT
-{
- return y / mdl;
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(const month_day_last& mdl, int y) NOEXCEPT
-{
- return year(y) / mdl;
-}
-
-// year_month_weekday from operator/()
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(const year_month& ym, const weekday_indexed& wdi) NOEXCEPT
-{
- return {ym.year(), ym.month(), wdi};
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(const year& y, const month_weekday& mwd) NOEXCEPT
-{
- return {y, mwd.month(), mwd.weekday_indexed()};
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(int y, const month_weekday& mwd) NOEXCEPT
-{
- return year(y) / mwd;
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(const month_weekday& mwd, const year& y) NOEXCEPT
-{
- return y / mwd;
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(const month_weekday& mwd, int y) NOEXCEPT
-{
- return year(y) / mwd;
-}
-
-// year_month_weekday_last from operator/()
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(const year_month& ym, const weekday_last& wdl) NOEXCEPT
-{
- return {ym.year(), ym.month(), wdl};
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(const year& y, const month_weekday_last& mwdl) NOEXCEPT
-{
- return {y, mwdl.month(), mwdl.weekday_last()};
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(int y, const month_weekday_last& mwdl) NOEXCEPT
-{
- return year(y) / mwdl;
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(const month_weekday_last& mwdl, const year& y) NOEXCEPT
-{
- return y / mwdl;
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(const month_weekday_last& mwdl, int y) NOEXCEPT
-{
- return year(y) / mwdl;
-}
-
-template <class Duration>
-struct fields;
-
-template <class CharT, class Traits, class Duration>
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt,
- const fields<Duration>& fds, const std::string* abbrev = nullptr,
- const std::chrono::seconds* offset_sec = nullptr);
-
-template <class CharT, class Traits, class Duration, class Alloc>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt,
- fields<Duration>& fds, std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
- std::chrono::minutes* offset = nullptr);
-
-// hh_mm_ss
-
-namespace detail
-{
-
-struct undocumented {explicit undocumented() = default;};
-
-// width<n>::value is the number of fractional decimal digits in 1/n
-// width<0>::value and width<1>::value are defined to be 0
-// If 1/n takes more than 18 fractional decimal digits,
-// the result is truncated to 19.
-// Example: width<2>::value == 1
-// Example: width<3>::value == 19
-// Example: width<4>::value == 2
-// Example: width<10>::value == 1
-// Example: width<1000>::value == 3
-template <std::uint64_t n, std::uint64_t d = 10, unsigned w = 0,
- bool should_continue = !(n < 2) && d != 0 && (w < 19)>
-struct width
-{
- static CONSTDATA unsigned value = 1 + width<n, d%n*10, w+1>::value;
-};
-
-template <std::uint64_t n, std::uint64_t d, unsigned w>
-struct width<n, d, w, false>
-{
- static CONSTDATA unsigned value = 0;
-};
-
-template <unsigned exp>
-struct static_pow10
-{
-private:
- static CONSTDATA std::uint64_t h = static_pow10<exp/2>::value;
-public:
- static CONSTDATA std::uint64_t value = h * h * (exp % 2 ? 10 : 1);
-};
-
-template <>
-struct static_pow10<0>
-{
- static CONSTDATA std::uint64_t value = 1;
-};
-
-template <class Duration>
-class decimal_format_seconds
-{
- using CT = typename std::common_type<Duration, std::chrono::seconds>::type;
- using rep = typename CT::rep;
-public:
- static unsigned constexpr width = detail::width<CT::period::den>::value < 19 ?
- detail::width<CT::period::den>::value : 6u;
- using precision = std::chrono::duration<rep,
- std::ratio<1, static_pow10<width>::value>>;
-
-private:
- std::chrono::seconds s_;
- precision sub_s_;
-
-public:
- CONSTCD11 decimal_format_seconds()
- : s_()
- , sub_s_()
- {}
-
- CONSTCD11 explicit decimal_format_seconds(const Duration& d) NOEXCEPT
- : s_(std::chrono::duration_cast<std::chrono::seconds>(d))
- , sub_s_(std::chrono::treat_as_floating_point<rep>::value ? d - s_ :
- std::chrono::duration_cast<precision>(d - s_))
- {}
-
- CONSTCD14 std::chrono::seconds& seconds() NOEXCEPT {return s_;}
- CONSTCD11 std::chrono::seconds seconds() const NOEXCEPT {return s_;}
- CONSTCD11 precision subseconds() const NOEXCEPT {return sub_s_;}
-
- CONSTCD14 precision to_duration() const NOEXCEPT
- {
- return s_ + sub_s_;
- }
-
- CONSTCD11 bool in_conventional_range() const NOEXCEPT
- {
- return sub_s_ < std::chrono::seconds{1} && s_ < std::chrono::minutes{1};
- }
-
- template <class CharT, class Traits>
- friend
- std::basic_ostream<CharT, Traits>&
- operator<<(std::basic_ostream<CharT, Traits>& os, const decimal_format_seconds& x)
- {
- return x.print(os, std::chrono::treat_as_floating_point<rep>{});
- }
-
- template <class CharT, class Traits>
- std::basic_ostream<CharT, Traits>&
- print(std::basic_ostream<CharT, Traits>& os, std::true_type) const
- {
- date::detail::save_ostream<CharT, Traits> _(os);
- std::chrono::duration<rep> d = s_ + sub_s_;
- if (d < std::chrono::seconds{10})
- os << '0';
- os << std::fixed << d.count();
- return os;
- }
-
- template <class CharT, class Traits>
- std::basic_ostream<CharT, Traits>&
- print(std::basic_ostream<CharT, Traits>& os, std::false_type) const
- {
- date::detail::save_ostream<CharT, Traits> _(os);
- os.fill('0');
- os.flags(std::ios::dec | std::ios::right);
- os.width(2);
- os << s_.count();
- if (width > 0)
- {
-#if !ONLY_C_LOCALE
- os << std::use_facet<std::numpunct<CharT>>(os.getloc()).decimal_point();
-#else
- os << '.';
-#endif
- date::detail::save_ostream<CharT, Traits> _s(os);
- os.imbue(std::locale::classic());
- os.width(width);
- os << sub_s_.count();
- }
- return os;
- }
-};
-
-template <class Rep, class Period>
-inline
-CONSTCD11
-typename std::enable_if
- <
- std::numeric_limits<Rep>::is_signed,
- std::chrono::duration<Rep, Period>
- >::type
-abs(std::chrono::duration<Rep, Period> d)
-{
- return d >= d.zero() ? +d : -d;
-}
-
-template <class Rep, class Period>
-inline
-CONSTCD11
-typename std::enable_if
- <
- !std::numeric_limits<Rep>::is_signed,
- std::chrono::duration<Rep, Period>
- >::type
-abs(std::chrono::duration<Rep, Period> d)
-{
- return d;
-}
-
-} // namespace detail
-
-template <class Duration>
-class hh_mm_ss
-{
- using dfs = detail::decimal_format_seconds<typename std::common_type<Duration,
- std::chrono::seconds>::type>;
-
- std::chrono::hours h_;
- std::chrono::minutes m_;
- dfs s_;
- bool neg_;
-
-public:
- static unsigned CONSTDATA fractional_width = dfs::width;
- using precision = typename dfs::precision;
-
- CONSTCD11 hh_mm_ss() NOEXCEPT
- : hh_mm_ss(Duration::zero())
- {}
-
- CONSTCD11 explicit hh_mm_ss(Duration d) NOEXCEPT
- : h_(std::chrono::duration_cast<std::chrono::hours>(detail::abs(d)))
- , m_(std::chrono::duration_cast<std::chrono::minutes>(detail::abs(d)) - h_)
- , s_(detail::abs(d) - h_ - m_)
- , neg_(d < Duration::zero())
- {}
-
- CONSTCD11 std::chrono::hours hours() const NOEXCEPT {return h_;}
- CONSTCD11 std::chrono::minutes minutes() const NOEXCEPT {return m_;}
- CONSTCD11 std::chrono::seconds seconds() const NOEXCEPT {return s_.seconds();}
- CONSTCD14 std::chrono::seconds&
- seconds(detail::undocumented) NOEXCEPT {return s_.seconds();}
- CONSTCD11 precision subseconds() const NOEXCEPT {return s_.subseconds();}
- CONSTCD11 bool is_negative() const NOEXCEPT {return neg_;}
-
- CONSTCD11 explicit operator precision() const NOEXCEPT {return to_duration();}
- CONSTCD11 precision to_duration() const NOEXCEPT
- {return (s_.to_duration() + m_ + h_) * (1-2*neg_);}
-
- CONSTCD11 bool in_conventional_range() const NOEXCEPT
- {
- return !neg_ && h_ < days{1} && m_ < std::chrono::hours{1} &&
- s_.in_conventional_range();
- }
-
-private:
-
- template <class charT, class traits>
- friend
- std::basic_ostream<charT, traits>&
- operator<<(std::basic_ostream<charT, traits>& os, hh_mm_ss const& tod)
- {
- if (tod.is_negative())
- os << '-';
- if (tod.h_ < std::chrono::hours{10})
- os << '0';
- os << tod.h_.count() << ':';
- if (tod.m_ < std::chrono::minutes{10})
- os << '0';
- os << tod.m_.count() << ':' << tod.s_;
- return os;
- }
-
- template <class CharT, class Traits, class Duration2>
- friend
- std::basic_ostream<CharT, Traits>&
- date::to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt,
- const fields<Duration2>& fds, const std::string* abbrev,
- const std::chrono::seconds* offset_sec);
-
- template <class CharT, class Traits, class Duration2, class Alloc>
- friend
- std::basic_istream<CharT, Traits>&
- date::from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt,
- fields<Duration2>& fds,
- std::basic_string<CharT, Traits, Alloc>* abbrev, std::chrono::minutes* offset);
-};
-
-inline
-CONSTCD14
-bool
-is_am(std::chrono::hours const& h) NOEXCEPT
-{
- using std::chrono::hours;
- return hours{0} <= h && h < hours{12};
-}
-
-inline
-CONSTCD14
-bool
-is_pm(std::chrono::hours const& h) NOEXCEPT
-{
- using std::chrono::hours;
- return hours{12} <= h && h < hours{24};
-}
-
-inline
-CONSTCD14
-std::chrono::hours
-make12(std::chrono::hours h) NOEXCEPT
-{
- using std::chrono::hours;
- if (h < hours{12})
- {
- if (h == hours{0})
- h = hours{12};
- }
- else
- {
- if (h != hours{12})
- h = h - hours{12};
- }
- return h;
-}
-
-inline
-CONSTCD14
-std::chrono::hours
-make24(std::chrono::hours h, bool is_pm) NOEXCEPT
-{
- using std::chrono::hours;
- if (is_pm)
- {
- if (h != hours{12})
- h = h + hours{12};
- }
- else if (h == hours{12})
- h = hours{0};
- return h;
-}
-
-template <class Duration>
-using time_of_day = hh_mm_ss<Duration>;
-
-template <class Rep, class Period,
- class = typename std::enable_if
- <!std::chrono::treat_as_floating_point<Rep>::value>::type>
-CONSTCD11
-inline
-hh_mm_ss<std::chrono::duration<Rep, Period>>
-make_time(const std::chrono::duration<Rep, Period>& d)
-{
- return hh_mm_ss<std::chrono::duration<Rep, Period>>(d);
-}
-
-template <class CharT, class Traits, class Duration>
-inline
-typename std::enable_if
-<
- !std::chrono::treat_as_floating_point<typename Duration::rep>::value &&
- std::ratio_less<typename Duration::period, days::period>::value
- , std::basic_ostream<CharT, Traits>&
->::type
-operator<<(std::basic_ostream<CharT, Traits>& os, const sys_time<Duration>& tp)
-{
- auto const dp = date::floor<days>(tp);
- return os << year_month_day(dp) << ' ' << make_time(tp-dp);
-}
-
-template <class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const sys_days& dp)
-{
- return os << year_month_day(dp);
-}
-
-template <class CharT, class Traits, class Duration>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const local_time<Duration>& ut)
-{
- return (os << sys_time<Duration>{ut.time_since_epoch()});
-}
-
-namespace detail
-{
-
-template <class CharT, std::size_t N>
-class string_literal;
-
-template <class CharT1, class CharT2, std::size_t N1, std::size_t N2>
-inline
-CONSTCD14
-string_literal<typename std::conditional<sizeof(CharT2) <= sizeof(CharT1), CharT1, CharT2>::type,
- N1 + N2 - 1>
-operator+(const string_literal<CharT1, N1>& x, const string_literal<CharT2, N2>& y) NOEXCEPT;
-
-template <class CharT, std::size_t N>
-class string_literal
-{
- CharT p_[N];
-
- CONSTCD11 string_literal() NOEXCEPT
- : p_{}
- {}
-
-public:
- using const_iterator = const CharT*;
-
- string_literal(string_literal const&) = default;
- string_literal& operator=(string_literal const&) = delete;
-
- template <std::size_t N1 = 2,
- class = typename std::enable_if<N1 == N>::type>
- CONSTCD11 string_literal(CharT c) NOEXCEPT
- : p_{c}
- {
- }
-
- template <std::size_t N1 = 3,
- class = typename std::enable_if<N1 == N>::type>
- CONSTCD11 string_literal(CharT c1, CharT c2) NOEXCEPT
- : p_{c1, c2}
- {
- }
-
- template <std::size_t N1 = 4,
- class = typename std::enable_if<N1 == N>::type>
- CONSTCD11 string_literal(CharT c1, CharT c2, CharT c3) NOEXCEPT
- : p_{c1, c2, c3}
- {
- }
-
- CONSTCD14 string_literal(const CharT(&a)[N]) NOEXCEPT
- : p_{}
- {
- for (std::size_t i = 0; i < N; ++i)
- p_[i] = a[i];
- }
-
- template <class U = CharT,
- class = typename std::enable_if<(1 < sizeof(U))>::type>
- CONSTCD14 string_literal(const char(&a)[N]) NOEXCEPT
- : p_{}
- {
- for (std::size_t i = 0; i < N; ++i)
- p_[i] = a[i];
- }
-
- template <class CharT2,
- class = typename std::enable_if<!std::is_same<CharT2, CharT>::value>::type>
- CONSTCD14 string_literal(string_literal<CharT2, N> const& a) NOEXCEPT
- : p_{}
- {
- for (std::size_t i = 0; i < N; ++i)
- p_[i] = a[i];
- }
-
- CONSTCD11 const CharT* data() const NOEXCEPT {return p_;}
- CONSTCD11 std::size_t size() const NOEXCEPT {return N-1;}
-
- CONSTCD11 const_iterator begin() const NOEXCEPT {return p_;}
- CONSTCD11 const_iterator end() const NOEXCEPT {return p_ + N-1;}
-
- CONSTCD11 CharT const& operator[](std::size_t n) const NOEXCEPT
- {
- return p_[n];
- }
-
- template <class Traits>
- friend
- std::basic_ostream<CharT, Traits>&
- operator<<(std::basic_ostream<CharT, Traits>& os, const string_literal& s)
- {
- return os << s.p_;
- }
-
- template <class CharT1, class CharT2, std::size_t N1, std::size_t N2>
- friend
- CONSTCD14
- string_literal<typename std::conditional<sizeof(CharT2) <= sizeof(CharT1), CharT1, CharT2>::type,
- N1 + N2 - 1>
- operator+(const string_literal<CharT1, N1>& x, const string_literal<CharT2, N2>& y) NOEXCEPT;
-};
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 3>
-operator+(const string_literal<CharT, 2>& x, const string_literal<CharT, 2>& y) NOEXCEPT
-{
- return string_literal<CharT, 3>(x[0], y[0]);
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 4>
-operator+(const string_literal<CharT, 3>& x, const string_literal<CharT, 2>& y) NOEXCEPT
-{
- return string_literal<CharT, 4>(x[0], x[1], y[0]);
-}
-
-template <class CharT1, class CharT2, std::size_t N1, std::size_t N2>
-CONSTCD14
-inline
-string_literal<typename std::conditional<sizeof(CharT2) <= sizeof(CharT1), CharT1, CharT2>::type,
- N1 + N2 - 1>
-operator+(const string_literal<CharT1, N1>& x, const string_literal<CharT2, N2>& y) NOEXCEPT
-{
- using CT = typename std::conditional<sizeof(CharT2) <= sizeof(CharT1), CharT1, CharT2>::type;
-
- string_literal<CT, N1 + N2 - 1> r;
- std::size_t i = 0;
- for (; i < N1-1; ++i)
- r.p_[i] = CT(x.p_[i]);
- for (std::size_t j = 0; j < N2; ++j, ++i)
- r.p_[i] = CT(y.p_[j]);
-
- return r;
-}
-
-
-template <class CharT, class Traits, class Alloc, std::size_t N>
-inline
-std::basic_string<CharT, Traits, Alloc>
-operator+(std::basic_string<CharT, Traits, Alloc> x, const string_literal<CharT, N>& y)
-{
- x.append(y.data(), y.size());
- return x;
-}
-
-#if __cplusplus >= 201402 && (!defined(__EDG_VERSION__) || __EDG_VERSION__ > 411) \
- && (!defined(__SUNPRO_CC) || __SUNPRO_CC > 0x5150)
-
-template <class CharT,
- class = std::enable_if_t<std::is_same<CharT, char>{} ||
- std::is_same<CharT, wchar_t>{} ||
- std::is_same<CharT, char16_t>{} ||
- std::is_same<CharT, char32_t>{}>>
-CONSTCD14
-inline
-string_literal<CharT, 2>
-msl(CharT c) NOEXCEPT
-{
- return string_literal<CharT, 2>{c};
-}
-
-CONSTCD14
-inline
-std::size_t
-to_string_len(std::intmax_t i)
-{
- std::size_t r = 0;
- do
- {
- i /= 10;
- ++r;
- } while (i > 0);
- return r;
-}
-
-template <std::intmax_t N>
-CONSTCD14
-inline
-std::enable_if_t
-<
- N < 10,
- string_literal<char, to_string_len(N)+1>
->
-msl() NOEXCEPT
-{
- return msl(char(N % 10 + '0'));
-}
-
-template <std::intmax_t N>
-CONSTCD14
-inline
-std::enable_if_t
-<
- 10 <= N,
- string_literal<char, to_string_len(N)+1>
->
-msl() NOEXCEPT
-{
- return msl<N/10>() + msl(char(N % 10 + '0'));
-}
-
-template <class CharT, std::intmax_t N, std::intmax_t D>
-CONSTCD14
-inline
-std::enable_if_t
-<
- std::ratio<N, D>::type::den != 1,
- string_literal<CharT, to_string_len(std::ratio<N, D>::type::num) +
- to_string_len(std::ratio<N, D>::type::den) + 4>
->
-msl(std::ratio<N, D>) NOEXCEPT
-{
- using R = typename std::ratio<N, D>::type;
- return msl(CharT{'['}) + msl<R::num>() + msl(CharT{'/'}) +
- msl<R::den>() + msl(CharT{']'});
-}
-
-template <class CharT, std::intmax_t N, std::intmax_t D>
-CONSTCD14
-inline
-std::enable_if_t
-<
- std::ratio<N, D>::type::den == 1,
- string_literal<CharT, to_string_len(std::ratio<N, D>::type::num) + 3>
->
-msl(std::ratio<N, D>) NOEXCEPT
-{
- using R = typename std::ratio<N, D>::type;
- return msl(CharT{'['}) + msl<R::num>() + msl(CharT{']'});
-}
-
-
-#else // __cplusplus < 201402 || (defined(__EDG_VERSION__) && __EDG_VERSION__ <= 411)
-
-inline
-std::string
-to_string(std::uint64_t x)
-{
- return std::to_string(x);
-}
-
-template <class CharT>
-inline
-std::basic_string<CharT>
-to_string(std::uint64_t x)
-{
- auto y = std::to_string(x);
- return std::basic_string<CharT>(y.begin(), y.end());
-}
-
-template <class CharT, std::intmax_t N, std::intmax_t D>
-inline
-typename std::enable_if
-<
- std::ratio<N, D>::type::den != 1,
- std::basic_string<CharT>
->::type
-msl(std::ratio<N, D>)
-{
- using R = typename std::ratio<N, D>::type;
- return std::basic_string<CharT>(1, '[') + to_string<CharT>(R::num) + CharT{'/'} +
- to_string<CharT>(R::den) + CharT{']'};
-}
-
-template <class CharT, std::intmax_t N, std::intmax_t D>
-inline
-typename std::enable_if
-<
- std::ratio<N, D>::type::den == 1,
- std::basic_string<CharT>
->::type
-msl(std::ratio<N, D>)
-{
- using R = typename std::ratio<N, D>::type;
- return std::basic_string<CharT>(1, '[') + to_string<CharT>(R::num) + CharT{']'};
-}
-
-#endif // __cplusplus < 201402 || (defined(__EDG_VERSION__) && __EDG_VERSION__ <= 411)
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::atto) NOEXCEPT
-{
- return string_literal<CharT, 2>{'a'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::femto) NOEXCEPT
-{
- return string_literal<CharT, 2>{'f'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::pico) NOEXCEPT
-{
- return string_literal<CharT, 2>{'p'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::nano) NOEXCEPT
-{
- return string_literal<CharT, 2>{'n'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-typename std::enable_if
-<
- std::is_same<CharT, char>::value,
- string_literal<char, 3>
->::type
-msl(std::micro) NOEXCEPT
-{
- return string_literal<char, 3>{'\xC2', '\xB5'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-typename std::enable_if
-<
- !std::is_same<CharT, char>::value,
- string_literal<CharT, 2>
->::type
-msl(std::micro) NOEXCEPT
-{
- return string_literal<CharT, 2>{CharT{static_cast<unsigned char>('\xB5')}};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::milli) NOEXCEPT
-{
- return string_literal<CharT, 2>{'m'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::centi) NOEXCEPT
-{
- return string_literal<CharT, 2>{'c'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 3>
-msl(std::deca) NOEXCEPT
-{
- return string_literal<CharT, 3>{'d', 'a'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::deci) NOEXCEPT
-{
- return string_literal<CharT, 2>{'d'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::hecto) NOEXCEPT
-{
- return string_literal<CharT, 2>{'h'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::kilo) NOEXCEPT
-{
- return string_literal<CharT, 2>{'k'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::mega) NOEXCEPT
-{
- return string_literal<CharT, 2>{'M'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::giga) NOEXCEPT
-{
- return string_literal<CharT, 2>{'G'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::tera) NOEXCEPT
-{
- return string_literal<CharT, 2>{'T'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::peta) NOEXCEPT
-{
- return string_literal<CharT, 2>{'P'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::exa) NOEXCEPT
-{
- return string_literal<CharT, 2>{'E'};
-}
-
-template <class CharT, class Period>
-CONSTCD11
-inline
-auto
-get_units(Period p)
- -> decltype(msl<CharT>(p) + string_literal<CharT, 2>{'s'})
-{
- return msl<CharT>(p) + string_literal<CharT, 2>{'s'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-get_units(std::ratio<1>)
-{
- return string_literal<CharT, 2>{'s'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-get_units(std::ratio<3600>)
-{
- return string_literal<CharT, 2>{'h'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 4>
-get_units(std::ratio<60>)
-{
- return string_literal<CharT, 4>{'m', 'i', 'n'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-get_units(std::ratio<86400>)
-{
- return string_literal<CharT, 2>{'d'};
-}
-
-template <class CharT, class Traits = std::char_traits<CharT>>
-struct make_string;
-
-template <>
-struct make_string<char>
-{
- template <class Rep>
- static
- std::string
- from(Rep n)
- {
- return std::to_string(n);
- }
-};
-
-template <class Traits>
-struct make_string<char, Traits>
-{
- template <class Rep>
- static
- std::basic_string<char, Traits>
- from(Rep n)
- {
- auto s = std::to_string(n);
- return std::basic_string<char, Traits>(s.begin(), s.end());
- }
-};
-
-template <>
-struct make_string<wchar_t>
-{
- template <class Rep>
- static
- std::wstring
- from(Rep n)
- {
- return std::to_wstring(n);
- }
-};
-
-template <class Traits>
-struct make_string<wchar_t, Traits>
-{
- template <class Rep>
- static
- std::basic_string<wchar_t, Traits>
- from(Rep n)
- {
- auto s = std::to_wstring(n);
- return std::basic_string<wchar_t, Traits>(s.begin(), s.end());
- }
-};
-
-} // namespace detail
-
-// to_stream
-
-CONSTDATA year nanyear{-32768};
-
-template <class Duration>
-struct fields
-{
- year_month_day ymd{nanyear/0/0};
- weekday wd{8u};
- hh_mm_ss<Duration> tod{};
- bool has_tod = false;
-
- fields() = default;
-
- fields(year_month_day ymd_) : ymd(ymd_) {}
- fields(weekday wd_) : wd(wd_) {}
- fields(hh_mm_ss<Duration> tod_) : tod(tod_), has_tod(true) {}
-
- fields(year_month_day ymd_, weekday wd_) : ymd(ymd_), wd(wd_) {}
- fields(year_month_day ymd_, hh_mm_ss<Duration> tod_) : ymd(ymd_), tod(tod_),
- has_tod(true) {}
-
- fields(weekday wd_, hh_mm_ss<Duration> tod_) : wd(wd_), tod(tod_), has_tod(true) {}
-
- fields(year_month_day ymd_, weekday wd_, hh_mm_ss<Duration> tod_)
- : ymd(ymd_)
- , wd(wd_)
- , tod(tod_)
- , has_tod(true)
- {}
-};
-
-namespace detail
-{
-
-template <class CharT, class Traits, class Duration>
-unsigned
-extract_weekday(std::basic_ostream<CharT, Traits>& os, const fields<Duration>& fds)
-{
- if (!fds.ymd.ok() && !fds.wd.ok())
- {
- // fds does not contain a valid weekday
- os.setstate(std::ios::failbit);
- return 8;
- }
- weekday wd;
- if (fds.ymd.ok())
- {
- wd = weekday{sys_days(fds.ymd)};
- if (fds.wd.ok() && wd != fds.wd)
- {
- // fds.ymd and fds.wd are inconsistent
- os.setstate(std::ios::failbit);
- return 8;
- }
- }
- else
- wd = fds.wd;
- return static_cast<unsigned>((wd - Sunday).count());
-}
-
-template <class CharT, class Traits, class Duration>
-unsigned
-extract_month(std::basic_ostream<CharT, Traits>& os, const fields<Duration>& fds)
-{
- if (!fds.ymd.month().ok())
- {
- // fds does not contain a valid month
- os.setstate(std::ios::failbit);
- return 0;
- }
- return static_cast<unsigned>(fds.ymd.month());
-}
-
-} // namespace detail
-
-#if ONLY_C_LOCALE
-
-namespace detail
-{
-
-inline
-std::pair<const std::string*, const std::string*>
-weekday_names()
-{
- static const std::string nm[] =
- {
- "Sunday",
- "Monday",
- "Tuesday",
- "Wednesday",
- "Thursday",
- "Friday",
- "Saturday",
- "Sun",
- "Mon",
- "Tue",
- "Wed",
- "Thu",
- "Fri",
- "Sat"
- };
- return std::make_pair(nm, nm+sizeof(nm)/sizeof(nm[0]));
-}
-
-inline
-std::pair<const std::string*, const std::string*>
-month_names()
-{
- static const std::string nm[] =
- {
- "January",
- "February",
- "March",
- "April",
- "May",
- "June",
- "July",
- "August",
- "September",
- "October",
- "November",
- "December",
- "Jan",
- "Feb",
- "Mar",
- "Apr",
- "May",
- "Jun",
- "Jul",
- "Aug",
- "Sep",
- "Oct",
- "Nov",
- "Dec"
- };
- return std::make_pair(nm, nm+sizeof(nm)/sizeof(nm[0]));
-}
-
-inline
-std::pair<const std::string*, const std::string*>
-ampm_names()
-{
- static const std::string nm[] =
- {
- "AM",
- "PM"
- };
- return std::make_pair(nm, nm+sizeof(nm)/sizeof(nm[0]));
-}
-
-template <class CharT, class Traits, class FwdIter>
-FwdIter
-scan_keyword(std::basic_istream<CharT, Traits>& is, FwdIter kb, FwdIter ke)
-{
- size_t nkw = static_cast<size_t>(std::distance(kb, ke));
- const unsigned char doesnt_match = '\0';
- const unsigned char might_match = '\1';
- const unsigned char does_match = '\2';
- unsigned char statbuf[100];
- unsigned char* status = statbuf;
- std::unique_ptr<unsigned char, void(*)(void*)> stat_hold(0, free);
- if (nkw > sizeof(statbuf))
- {
- status = (unsigned char*)std::malloc(nkw);
- if (status == nullptr)
- throw std::bad_alloc();
- stat_hold.reset(status);
- }
- size_t n_might_match = nkw; // At this point, any keyword might match
- size_t n_does_match = 0; // but none of them definitely do
- // Initialize all statuses to might_match, except for "" keywords are does_match
- unsigned char* st = status;
- for (auto ky = kb; ky != ke; ++ky, ++st)
- {
- if (!ky->empty())
- *st = might_match;
- else
- {
- *st = does_match;
- --n_might_match;
- ++n_does_match;
- }
- }
- // While there might be a match, test keywords against the next CharT
- for (size_t indx = 0; is && n_might_match > 0; ++indx)
- {
- // Peek at the next CharT but don't consume it
- auto ic = is.peek();
- if (ic == EOF)
- {
- is.setstate(std::ios::eofbit);
- break;
- }
- auto c = static_cast<char>(toupper(ic));
- bool consume = false;
- // For each keyword which might match, see if the indx character is c
- // If a match if found, consume c
- // If a match is found, and that is the last character in the keyword,
- // then that keyword matches.
- // If the keyword doesn't match this character, then change the keyword
- // to doesn't match
- st = status;
- for (auto ky = kb; ky != ke; ++ky, ++st)
- {
- if (*st == might_match)
- {
- if (c == static_cast<char>(toupper((*ky)[indx])))
- {
- consume = true;
- if (ky->size() == indx+1)
- {
- *st = does_match;
- --n_might_match;
- ++n_does_match;
- }
- }
- else
- {
- *st = doesnt_match;
- --n_might_match;
- }
- }
- }
- // consume if we matched a character
- if (consume)
- {
- (void)is.get();
- // If we consumed a character and there might be a matched keyword that
- // was marked matched on a previous iteration, then such keywords
- // are now marked as not matching.
- if (n_might_match + n_does_match > 1)
- {
- st = status;
- for (auto ky = kb; ky != ke; ++ky, ++st)
- {
- if (*st == does_match && ky->size() != indx+1)
- {
- *st = doesnt_match;
- --n_does_match;
- }
- }
- }
- }
- }
- // We've exited the loop because we hit eof and/or we have no more "might matches".
- // Return the first matching result
- for (st = status; kb != ke; ++kb, ++st)
- if (*st == does_match)
- break;
- if (kb == ke)
- is.setstate(std::ios::failbit);
- return kb;
-}
-
-} // namespace detail
-
-#endif // ONLY_C_LOCALE
-
-template <class CharT, class Traits, class Duration>
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt,
- const fields<Duration>& fds, const std::string* abbrev,
- const std::chrono::seconds* offset_sec)
-{
-#if ONLY_C_LOCALE
- using detail::weekday_names;
- using detail::month_names;
- using detail::ampm_names;
-#endif
- using detail::save_ostream;
- using detail::get_units;
- using detail::extract_weekday;
- using detail::extract_month;
- using std::ios;
- using std::chrono::duration_cast;
- using std::chrono::seconds;
- using std::chrono::minutes;
- using std::chrono::hours;
- date::detail::save_ostream<CharT, Traits> ss(os);
- os.fill(' ');
- os.flags(std::ios::skipws | std::ios::dec);
- os.width(0);
- tm tm{};
- bool insert_negative = fds.has_tod && fds.tod.to_duration() < Duration::zero();
-#if !ONLY_C_LOCALE
- auto& facet = std::use_facet<std::time_put<CharT>>(os.getloc());
-#endif
- const CharT* command = nullptr;
- CharT modified = CharT{};
- for (; *fmt; ++fmt)
- {
- switch (*fmt)
- {
- case 'a':
- case 'A':
- if (command)
- {
- if (modified == CharT{})
- {
- tm.tm_wday = static_cast<int>(extract_weekday(os, fds));
- if (os.fail())
- return os;
-#if !ONLY_C_LOCALE
- const CharT f[] = {'%', *fmt};
- facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
-#else // ONLY_C_LOCALE
- os << weekday_names().first[tm.tm_wday+7*(*fmt == 'a')];
-#endif // ONLY_C_LOCALE
- }
- else
- {
- os << CharT{'%'} << modified << *fmt;
- modified = CharT{};
- }
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 'b':
- case 'B':
- case 'h':
- if (command)
- {
- if (modified == CharT{})
- {
- tm.tm_mon = static_cast<int>(extract_month(os, fds)) - 1;
-#if !ONLY_C_LOCALE
- const CharT f[] = {'%', *fmt};
- facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
-#else // ONLY_C_LOCALE
- os << month_names().first[tm.tm_mon+12*(*fmt != 'B')];
-#endif // ONLY_C_LOCALE
- }
- else
- {
- os << CharT{'%'} << modified << *fmt;
- modified = CharT{};
- }
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 'c':
- case 'x':
- if (command)
- {
- if (modified == CharT{'O'})
- os << CharT{'%'} << modified << *fmt;
- else
- {
- if (!fds.ymd.ok())
- os.setstate(std::ios::failbit);
- if (*fmt == 'c' && !fds.has_tod)
- os.setstate(std::ios::failbit);
-#if !ONLY_C_LOCALE
- tm = std::tm{};
- auto const& ymd = fds.ymd;
- auto ld = local_days(ymd);
- if (*fmt == 'c')
- {
- tm.tm_sec = static_cast<int>(fds.tod.seconds().count());
- tm.tm_min = static_cast<int>(fds.tod.minutes().count());
- tm.tm_hour = static_cast<int>(fds.tod.hours().count());
- }
- tm.tm_mday = static_cast<int>(static_cast<unsigned>(ymd.day()));
- tm.tm_mon = static_cast<int>(extract_month(os, fds) - 1);
- tm.tm_year = static_cast<int>(ymd.year()) - 1900;
- tm.tm_wday = static_cast<int>(extract_weekday(os, fds));
- if (os.fail())
- return os;
- tm.tm_yday = static_cast<int>((ld - local_days(ymd.year()/1/1)).count());
- CharT f[3] = {'%'};
- auto fe = std::begin(f) + 1;
- if (modified == CharT{'E'})
- *fe++ = modified;
- *fe++ = *fmt;
- facet.put(os, os, os.fill(), &tm, std::begin(f), fe);
-#else // ONLY_C_LOCALE
- if (*fmt == 'c')
- {
- auto wd = static_cast<int>(extract_weekday(os, fds));
- os << weekday_names().first[static_cast<unsigned>(wd)+7]
- << ' ';
- os << month_names().first[extract_month(os, fds)-1+12] << ' ';
- auto d = static_cast<int>(static_cast<unsigned>(fds.ymd.day()));
- if (d < 10)
- os << ' ';
- os << d << ' '
- << make_time(duration_cast<seconds>(fds.tod.to_duration()))
- << ' ' << fds.ymd.year();
-
- }
- else // *fmt == 'x'
- {
- auto const& ymd = fds.ymd;
- save_ostream<CharT, Traits> _(os);
- os.fill('0');
- os.flags(std::ios::dec | std::ios::right);
- os.width(2);
- os << static_cast<unsigned>(ymd.month()) << CharT{'/'};
- os.width(2);
- os << static_cast<unsigned>(ymd.day()) << CharT{'/'};
- os.width(2);
- os << static_cast<int>(ymd.year()) % 100;
- }
-#endif // ONLY_C_LOCALE
- }
- command = nullptr;
- modified = CharT{};
- }
- else
- os << *fmt;
- break;
- case 'C':
- if (command)
- {
- if (modified == CharT{'O'})
- os << CharT{'%'} << modified << *fmt;
- else
- {
- if (!fds.ymd.year().ok())
- os.setstate(std::ios::failbit);
- auto y = static_cast<int>(fds.ymd.year());
-#if !ONLY_C_LOCALE
- if (modified == CharT{})
-#endif
- {
- save_ostream<CharT, Traits> _(os);
- os.fill('0');
- os.flags(std::ios::dec | std::ios::right);
- if (y >= 0)
- {
- os.width(2);
- os << y/100;
- }
- else
- {
- os << CharT{'-'};
- os.width(2);
- os << -(y-99)/100;
- }
- }
-#if !ONLY_C_LOCALE
- else if (modified == CharT{'E'})
- {
- tm.tm_year = y - 1900;
- CharT f[3] = {'%', 'E', 'C'};
- facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
- }
-#endif
- }
- command = nullptr;
- modified = CharT{};
- }
- else
- os << *fmt;
- break;
- case 'd':
- case 'e':
- if (command)
- {
- if (modified == CharT{'E'})
- os << CharT{'%'} << modified << *fmt;
- else
- {
- if (!fds.ymd.day().ok())
- os.setstate(std::ios::failbit);
- auto d = static_cast<int>(static_cast<unsigned>(fds.ymd.day()));
-#if !ONLY_C_LOCALE
- if (modified == CharT{})
-#endif
- {
- save_ostream<CharT, Traits> _(os);
- if (*fmt == CharT{'d'})
- os.fill('0');
- else
- os.fill(' ');
- os.flags(std::ios::dec | std::ios::right);
- os.width(2);
- os << d;
- }
-#if !ONLY_C_LOCALE
- else if (modified == CharT{'O'})
- {
- tm.tm_mday = d;
- CharT f[3] = {'%', 'O', *fmt};
- facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
- }
-#endif
- }
- command = nullptr;
- modified = CharT{};
- }
- else
- os << *fmt;
- break;
- case 'D':
- if (command)
- {
- if (modified == CharT{})
- {
- if (!fds.ymd.ok())
- os.setstate(std::ios::failbit);
- auto const& ymd = fds.ymd;
- save_ostream<CharT, Traits> _(os);
- os.fill('0');
- os.flags(std::ios::dec | std::ios::right);
- os.width(2);
- os << static_cast<unsigned>(ymd.month()) << CharT{'/'};
- os.width(2);
- os << static_cast<unsigned>(ymd.day()) << CharT{'/'};
- os.width(2);
- os << static_cast<int>(ymd.year()) % 100;
- }
- else
- {
- os << CharT{'%'} << modified << *fmt;
- modified = CharT{};
- }
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 'F':
- if (command)
- {
- if (modified == CharT{})
- {
- if (!fds.ymd.ok())
- os.setstate(std::ios::failbit);
- auto const& ymd = fds.ymd;
- save_ostream<CharT, Traits> _(os);
- os.imbue(std::locale::classic());
- os.fill('0');
- os.flags(std::ios::dec | std::ios::right);
- os.width(4);
- os << static_cast<int>(ymd.year()) << CharT{'-'};
- os.width(2);
- os << static_cast<unsigned>(ymd.month()) << CharT{'-'};
- os.width(2);
- os << static_cast<unsigned>(ymd.day());
- }
- else
- {
- os << CharT{'%'} << modified << *fmt;
- modified = CharT{};
- }
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 'g':
- case 'G':
- if (command)
- {
- if (modified == CharT{})
- {
- if (!fds.ymd.ok())
- os.setstate(std::ios::failbit);
- auto ld = local_days(fds.ymd);
- auto y = year_month_day{ld + days{3}}.year();
- auto start = local_days((y-years{1})/December/Thursday[last]) +
- (Monday-Thursday);
- if (ld < start)
- --y;
- if (*fmt == CharT{'G'})
- os << y;
- else
- {
- save_ostream<CharT, Traits> _(os);
- os.fill('0');
- os.flags(std::ios::dec | std::ios::right);
- os.width(2);
- os << std::abs(static_cast<int>(y)) % 100;
- }
- }
- else
- {
- os << CharT{'%'} << modified << *fmt;
- modified = CharT{};
- }
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 'H':
- case 'I':
- if (command)
- {
- if (modified == CharT{'E'})
- os << CharT{'%'} << modified << *fmt;
- else
- {
- if (!fds.has_tod)
- os.setstate(std::ios::failbit);
- if (insert_negative)
- {
- os << '-';
- insert_negative = false;
- }
- auto hms = fds.tod;
-#if !ONLY_C_LOCALE
- if (modified == CharT{})
-#endif
- {
- auto h = *fmt == CharT{'I'} ? date::make12(hms.hours()) : hms.hours();
- if (h < hours{10})
- os << CharT{'0'};
- os << h.count();
- }
-#if !ONLY_C_LOCALE
- else if (modified == CharT{'O'})
- {
- const CharT f[] = {'%', modified, *fmt};
- tm.tm_hour = static_cast<int>(hms.hours().count());
- facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
- }
-#endif
- }
- modified = CharT{};
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 'j':
- if (command)
- {
- if (modified == CharT{})
- {
- if (fds.ymd.ok() || fds.has_tod)
- {
- days doy;
- if (fds.ymd.ok())
- {
- auto ld = local_days(fds.ymd);
- auto y = fds.ymd.year();
- doy = ld - local_days(y/January/1) + days{1};
- }
- else
- {
- doy = duration_cast<days>(fds.tod.to_duration());
- }
- save_ostream<CharT, Traits> _(os);
- os.fill('0');
- os.flags(std::ios::dec | std::ios::right);
- os.width(3);
- os << doy.count();
- }
- else
- {
- os.setstate(std::ios::failbit);
- }
- }
- else
- {
- os << CharT{'%'} << modified << *fmt;
- modified = CharT{};
- }
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 'm':
- if (command)
- {
- if (modified == CharT{'E'})
- os << CharT{'%'} << modified << *fmt;
- else
- {
- if (!fds.ymd.month().ok())
- os.setstate(std::ios::failbit);
- auto m = static_cast<unsigned>(fds.ymd.month());
-#if !ONLY_C_LOCALE
- if (modified == CharT{})
-#endif
- {
- if (m < 10)
- os << CharT{'0'};
- os << m;
- }
-#if !ONLY_C_LOCALE
- else if (modified == CharT{'O'})
- {
- const CharT f[] = {'%', modified, *fmt};
- tm.tm_mon = static_cast<int>(m-1);
- facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
- }
-#endif
- }
- modified = CharT{};
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 'M':
- if (command)
- {
- if (modified == CharT{'E'})
- os << CharT{'%'} << modified << *fmt;
- else
- {
- if (!fds.has_tod)
- os.setstate(std::ios::failbit);
- if (insert_negative)
- {
- os << '-';
- insert_negative = false;
- }
-#if !ONLY_C_LOCALE
- if (modified == CharT{})
-#endif
- {
- if (fds.tod.minutes() < minutes{10})
- os << CharT{'0'};
- os << fds.tod.minutes().count();
- }
-#if !ONLY_C_LOCALE
- else if (modified == CharT{'O'})
- {
- const CharT f[] = {'%', modified, *fmt};
- tm.tm_min = static_cast<int>(fds.tod.minutes().count());
- facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
- }
-#endif
- }
- modified = CharT{};
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 'n':
- if (command)
- {
- if (modified == CharT{})
- os << CharT{'\n'};
- else
- {
- os << CharT{'%'} << modified << *fmt;
- modified = CharT{};
- }
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 'p':
- if (command)
- {
- if (modified == CharT{})
- {
- if (!fds.has_tod)
- os.setstate(std::ios::failbit);
-#if !ONLY_C_LOCALE
- const CharT f[] = {'%', *fmt};
- tm.tm_hour = static_cast<int>(fds.tod.hours().count());
- facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
-#else
- if (date::is_am(fds.tod.hours()))
- os << ampm_names().first[0];
- else
- os << ampm_names().first[1];
-#endif
- }
- else
- {
- os << CharT{'%'} << modified << *fmt;
- }
- modified = CharT{};
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 'Q':
- case 'q':
- if (command)
- {
- if (modified == CharT{})
- {
- if (!fds.has_tod)
- os.setstate(std::ios::failbit);
- auto d = fds.tod.to_duration();
- if (*fmt == 'q')
- os << get_units<CharT>(typename decltype(d)::period::type{});
- else
- os << d.count();
- }
- else
- {
- os << CharT{'%'} << modified << *fmt;
- }
- modified = CharT{};
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 'r':
- if (command)
- {
- if (modified == CharT{})
- {
- if (!fds.has_tod)
- os.setstate(std::ios::failbit);
-#if !ONLY_C_LOCALE
- const CharT f[] = {'%', *fmt};
- tm.tm_hour = static_cast<int>(fds.tod.hours().count());
- tm.tm_min = static_cast<int>(fds.tod.minutes().count());
- tm.tm_sec = static_cast<int>(fds.tod.seconds().count());
- facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
-#else
- hh_mm_ss<seconds> tod(duration_cast<seconds>(fds.tod.to_duration()));
- save_ostream<CharT, Traits> _(os);
- os.fill('0');
- os.width(2);
- os << date::make12(tod.hours()).count() << CharT{':'};
- os.width(2);
- os << tod.minutes().count() << CharT{':'};
- os.width(2);
- os << tod.seconds().count() << CharT{' '};
- if (date::is_am(tod.hours()))
- os << ampm_names().first[0];
- else
- os << ampm_names().first[1];
-#endif
- }
- else
- {
- os << CharT{'%'} << modified << *fmt;
- }
- modified = CharT{};
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 'R':
- if (command)
- {
- if (modified == CharT{})
- {
- if (!fds.has_tod)
- os.setstate(std::ios::failbit);
- if (fds.tod.hours() < hours{10})
- os << CharT{'0'};
- os << fds.tod.hours().count() << CharT{':'};
- if (fds.tod.minutes() < minutes{10})
- os << CharT{'0'};
- os << fds.tod.minutes().count();
- }
- else
- {
- os << CharT{'%'} << modified << *fmt;
- modified = CharT{};
- }
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 'S':
- if (command)
- {
- if (modified == CharT{'E'})
- os << CharT{'%'} << modified << *fmt;
- else
- {
- if (!fds.has_tod)
- os.setstate(std::ios::failbit);
- if (insert_negative)
- {
- os << '-';
- insert_negative = false;
- }
-#if !ONLY_C_LOCALE
- if (modified == CharT{})
-#endif
- {
- os << fds.tod.s_;
- }
-#if !ONLY_C_LOCALE
- else if (modified == CharT{'O'})
- {
- const CharT f[] = {'%', modified, *fmt};
- tm.tm_sec = static_cast<int>(fds.tod.s_.seconds().count());
- facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
- }
-#endif
- }
- modified = CharT{};
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 't':
- if (command)
- {
- if (modified == CharT{})
- os << CharT{'\t'};
- else
- {
- os << CharT{'%'} << modified << *fmt;
- modified = CharT{};
- }
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 'T':
- if (command)
- {
- if (modified == CharT{})
- {
- if (!fds.has_tod)
- os.setstate(std::ios::failbit);
- os << fds.tod;
- }
- else
- {
- os << CharT{'%'} << modified << *fmt;
- modified = CharT{};
- }
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 'u':
- if (command)
- {
- if (modified == CharT{'E'})
- os << CharT{'%'} << modified << *fmt;
- else
- {
- auto wd = extract_weekday(os, fds);
-#if !ONLY_C_LOCALE
- if (modified == CharT{})
-#endif
- {
- os << (wd != 0 ? wd : 7u);
- }
-#if !ONLY_C_LOCALE
- else if (modified == CharT{'O'})
- {
- const CharT f[] = {'%', modified, *fmt};
- tm.tm_wday = static_cast<int>(wd);
- facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
- }
-#endif
- }
- modified = CharT{};
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 'U':
- if (command)
- {
- if (modified == CharT{'E'})
- os << CharT{'%'} << modified << *fmt;
- else
- {
- auto const& ymd = fds.ymd;
- if (!ymd.ok())
- os.setstate(std::ios::failbit);
- auto ld = local_days(ymd);
-#if !ONLY_C_LOCALE
- if (modified == CharT{})
-#endif
- {
- auto st = local_days(Sunday[1]/January/ymd.year());
- if (ld < st)
- os << CharT{'0'} << CharT{'0'};
- else
- {
- auto wn = duration_cast<weeks>(ld - st).count() + 1;
- if (wn < 10)
- os << CharT{'0'};
- os << wn;
- }
- }
- #if !ONLY_C_LOCALE
- else if (modified == CharT{'O'})
- {
- const CharT f[] = {'%', modified, *fmt};
- tm.tm_year = static_cast<int>(ymd.year()) - 1900;
- tm.tm_wday = static_cast<int>(extract_weekday(os, fds));
- if (os.fail())
- return os;
- tm.tm_yday = static_cast<int>((ld - local_days(ymd.year()/1/1)).count());
- facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
- }
-#endif
- }
- modified = CharT{};
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 'V':
- if (command)
- {
- if (modified == CharT{'E'})
- os << CharT{'%'} << modified << *fmt;
- else
- {
- if (!fds.ymd.ok())
- os.setstate(std::ios::failbit);
- auto ld = local_days(fds.ymd);
-#if !ONLY_C_LOCALE
- if (modified == CharT{})
-#endif
- {
- auto y = year_month_day{ld + days{3}}.year();
- auto st = local_days((y-years{1})/12/Thursday[last]) +
- (Monday-Thursday);
- if (ld < st)
- {
- --y;
- st = local_days((y - years{1})/12/Thursday[last]) +
- (Monday-Thursday);
- }
- auto wn = duration_cast<weeks>(ld - st).count() + 1;
- if (wn < 10)
- os << CharT{'0'};
- os << wn;
- }
-#if !ONLY_C_LOCALE
- else if (modified == CharT{'O'})
- {
- const CharT f[] = {'%', modified, *fmt};
- auto const& ymd = fds.ymd;
- tm.tm_year = static_cast<int>(ymd.year()) - 1900;
- tm.tm_wday = static_cast<int>(extract_weekday(os, fds));
- if (os.fail())
- return os;
- tm.tm_yday = static_cast<int>((ld - local_days(ymd.year()/1/1)).count());
- facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
- }
-#endif
- }
- modified = CharT{};
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 'w':
- if (command)
- {
- auto wd = extract_weekday(os, fds);
- if (os.fail())
- return os;
-#if !ONLY_C_LOCALE
- if (modified == CharT{})
-#else
- if (modified != CharT{'E'})
-#endif
- {
- os << wd;
- }
-#if !ONLY_C_LOCALE
- else if (modified == CharT{'O'})
- {
- const CharT f[] = {'%', modified, *fmt};
- tm.tm_wday = static_cast<int>(wd);
- facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
- }
-#endif
- else
- {
- os << CharT{'%'} << modified << *fmt;
- }
- modified = CharT{};
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 'W':
- if (command)
- {
- if (modified == CharT{'E'})
- os << CharT{'%'} << modified << *fmt;
- else
- {
- auto const& ymd = fds.ymd;
- if (!ymd.ok())
- os.setstate(std::ios::failbit);
- auto ld = local_days(ymd);
-#if !ONLY_C_LOCALE
- if (modified == CharT{})
-#endif
- {
- auto st = local_days(Monday[1]/January/ymd.year());
- if (ld < st)
- os << CharT{'0'} << CharT{'0'};
- else
- {
- auto wn = duration_cast<weeks>(ld - st).count() + 1;
- if (wn < 10)
- os << CharT{'0'};
- os << wn;
- }
- }
-#if !ONLY_C_LOCALE
- else if (modified == CharT{'O'})
- {
- const CharT f[] = {'%', modified, *fmt};
- tm.tm_year = static_cast<int>(ymd.year()) - 1900;
- tm.tm_wday = static_cast<int>(extract_weekday(os, fds));
- if (os.fail())
- return os;
- tm.tm_yday = static_cast<int>((ld - local_days(ymd.year()/1/1)).count());
- facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
- }
-#endif
- }
- modified = CharT{};
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 'X':
- if (command)
- {
- if (modified == CharT{'O'})
- os << CharT{'%'} << modified << *fmt;
- else
- {
- if (!fds.has_tod)
- os.setstate(std::ios::failbit);
-#if !ONLY_C_LOCALE
- tm = std::tm{};
- tm.tm_sec = static_cast<int>(fds.tod.seconds().count());
- tm.tm_min = static_cast<int>(fds.tod.minutes().count());
- tm.tm_hour = static_cast<int>(fds.tod.hours().count());
- CharT f[3] = {'%'};
- auto fe = std::begin(f) + 1;
- if (modified == CharT{'E'})
- *fe++ = modified;
- *fe++ = *fmt;
- facet.put(os, os, os.fill(), &tm, std::begin(f), fe);
-#else
- os << fds.tod;
-#endif
- }
- command = nullptr;
- modified = CharT{};
- }
- else
- os << *fmt;
- break;
- case 'y':
- if (command)
- {
- if (!fds.ymd.year().ok())
- os.setstate(std::ios::failbit);
- auto y = static_cast<int>(fds.ymd.year());
-#if !ONLY_C_LOCALE
- if (modified == CharT{})
- {
-#endif
- y = std::abs(y) % 100;
- if (y < 10)
- os << CharT{'0'};
- os << y;
-#if !ONLY_C_LOCALE
- }
- else
- {
- const CharT f[] = {'%', modified, *fmt};
- tm.tm_year = y - 1900;
- facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
- }
-#endif
- modified = CharT{};
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 'Y':
- if (command)
- {
- if (modified == CharT{'O'})
- os << CharT{'%'} << modified << *fmt;
- else
- {
- if (!fds.ymd.year().ok())
- os.setstate(std::ios::failbit);
- auto y = fds.ymd.year();
-#if !ONLY_C_LOCALE
- if (modified == CharT{})
-#endif
- {
- save_ostream<CharT, Traits> _(os);
- os.imbue(std::locale::classic());
- os << y;
- }
-#if !ONLY_C_LOCALE
- else if (modified == CharT{'E'})
- {
- const CharT f[] = {'%', modified, *fmt};
- tm.tm_year = static_cast<int>(y) - 1900;
- facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
- }
-#endif
- }
- modified = CharT{};
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 'z':
- if (command)
- {
- if (offset_sec == nullptr)
- {
- // Can not format %z with unknown offset
- os.setstate(ios::failbit);
- return os;
- }
- auto m = duration_cast<minutes>(*offset_sec);
- auto neg = m < minutes{0};
- m = date::abs(m);
- auto h = duration_cast<hours>(m);
- m -= h;
- if (neg)
- os << CharT{'-'};
- else
- os << CharT{'+'};
- if (h < hours{10})
- os << CharT{'0'};
- os << h.count();
- if (modified != CharT{})
- os << CharT{':'};
- if (m < minutes{10})
- os << CharT{'0'};
- os << m.count();
- command = nullptr;
- modified = CharT{};
- }
- else
- os << *fmt;
- break;
- case 'Z':
- if (command)
- {
- if (modified == CharT{})
- {
- if (abbrev == nullptr)
- {
- // Can not format %Z with unknown time_zone
- os.setstate(ios::failbit);
- return os;
- }
- for (auto c : *abbrev)
- os << CharT(c);
- }
- else
- {
- os << CharT{'%'} << modified << *fmt;
- modified = CharT{};
- }
- command = nullptr;
- }
- else
- os << *fmt;
- break;
- case 'E':
- case 'O':
- if (command)
- {
- if (modified == CharT{})
- {
- modified = *fmt;
- }
- else
- {
- os << CharT{'%'} << modified << *fmt;
- command = nullptr;
- modified = CharT{};
- }
- }
- else
- os << *fmt;
- break;
- case '%':
- if (command)
- {
- if (modified == CharT{})
- {
- os << CharT{'%'};
- command = nullptr;
- }
- else
- {
- os << CharT{'%'} << modified << CharT{'%'};
- command = nullptr;
- modified = CharT{};
- }
- }
- else
- command = fmt;
- break;
- default:
- if (command)
- {
- os << CharT{'%'};
- command = nullptr;
- }
- if (modified != CharT{})
- {
- os << modified;
- modified = CharT{};
- }
- os << *fmt;
- break;
- }
- }
- if (command)
- os << CharT{'%'};
- if (modified != CharT{})
- os << modified;
- return os;
-}
-
-template <class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt, const year& y)
-{
- using CT = std::chrono::seconds;
- fields<CT> fds{y/0/0};
- return to_stream(os, fmt, fds);
-}
-
-template <class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt, const month& m)
-{
- using CT = std::chrono::seconds;
- fields<CT> fds{m/0/nanyear};
- return to_stream(os, fmt, fds);
-}
-
-template <class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt, const day& d)
-{
- using CT = std::chrono::seconds;
- fields<CT> fds{d/0/nanyear};
- return to_stream(os, fmt, fds);
-}
-
-template <class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt, const weekday& wd)
-{
- using CT = std::chrono::seconds;
- fields<CT> fds{wd};
- return to_stream(os, fmt, fds);
-}
-
-template <class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt, const year_month& ym)
-{
- using CT = std::chrono::seconds;
- fields<CT> fds{ym/0};
- return to_stream(os, fmt, fds);
-}
-
-template <class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt, const month_day& md)
-{
- using CT = std::chrono::seconds;
- fields<CT> fds{md/nanyear};
- return to_stream(os, fmt, fds);
-}
-
-template <class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt,
- const year_month_day& ymd)
-{
- using CT = std::chrono::seconds;
- fields<CT> fds{ymd};
- return to_stream(os, fmt, fds);
-}
-
-template <class CharT, class Traits, class Rep, class Period>
-inline
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt,
- const std::chrono::duration<Rep, Period>& d)
-{
- using Duration = std::chrono::duration<Rep, Period>;
- using CT = typename std::common_type<Duration, std::chrono::seconds>::type;
- fields<CT> fds{hh_mm_ss<CT>{d}};
- return to_stream(os, fmt, fds);
-}
-
-template <class CharT, class Traits, class Duration>
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt,
- const local_time<Duration>& tp, const std::string* abbrev = nullptr,
- const std::chrono::seconds* offset_sec = nullptr)
-{
- using CT = typename std::common_type<Duration, std::chrono::seconds>::type;
- auto ld = floor<days>(tp);
- fields<CT> fds{year_month_day{ld}, hh_mm_ss<CT>{tp-local_seconds{ld}}};
- return to_stream(os, fmt, fds, abbrev, offset_sec);
-}
-
-template <class CharT, class Traits, class Duration>
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt,
- const sys_time<Duration>& tp)
-{
- using std::chrono::seconds;
- using CT = typename std::common_type<Duration, seconds>::type;
- const std::string abbrev("UTC");
- CONSTDATA seconds offset{0};
- auto sd = floor<days>(tp);
- fields<CT> fds{year_month_day{sd}, hh_mm_ss<CT>{tp-sys_seconds{sd}}};
- return to_stream(os, fmt, fds, &abbrev, &offset);
-}
-
-// format
-
-template <class CharT, class Streamable>
-auto
-format(const std::locale& loc, const CharT* fmt, const Streamable& tp)
- -> decltype(to_stream(std::declval<std::basic_ostream<CharT>&>(), fmt, tp),
- std::basic_string<CharT>{})
-{
- std::basic_ostringstream<CharT> os;
- os.exceptions(std::ios::failbit | std::ios::badbit);
- os.imbue(loc);
- to_stream(os, fmt, tp);
- return os.str();
-}
-
-template <class CharT, class Streamable>
-auto
-format(const CharT* fmt, const Streamable& tp)
- -> decltype(to_stream(std::declval<std::basic_ostream<CharT>&>(), fmt, tp),
- std::basic_string<CharT>{})
-{
- std::basic_ostringstream<CharT> os;
- os.exceptions(std::ios::failbit | std::ios::badbit);
- to_stream(os, fmt, tp);
- return os.str();
-}
-
-template <class CharT, class Traits, class Alloc, class Streamable>
-auto
-format(const std::locale& loc, const std::basic_string<CharT, Traits, Alloc>& fmt,
- const Streamable& tp)
- -> decltype(to_stream(std::declval<std::basic_ostream<CharT, Traits>&>(), fmt.c_str(), tp),
- std::basic_string<CharT, Traits, Alloc>{})
-{
- std::basic_ostringstream<CharT, Traits, Alloc> os;
- os.exceptions(std::ios::failbit | std::ios::badbit);
- os.imbue(loc);
- to_stream(os, fmt.c_str(), tp);
- return os.str();
-}
-
-template <class CharT, class Traits, class Alloc, class Streamable>
-auto
-format(const std::basic_string<CharT, Traits, Alloc>& fmt, const Streamable& tp)
- -> decltype(to_stream(std::declval<std::basic_ostream<CharT, Traits>&>(), fmt.c_str(), tp),
- std::basic_string<CharT, Traits, Alloc>{})
-{
- std::basic_ostringstream<CharT, Traits, Alloc> os;
- os.exceptions(std::ios::failbit | std::ios::badbit);
- to_stream(os, fmt.c_str(), tp);
- return os.str();
-}
-
-// parse
-
-namespace detail
-{
-
-template <class CharT, class Traits>
-bool
-read_char(std::basic_istream<CharT, Traits>& is, CharT fmt, std::ios::iostate& err)
-{
- auto ic = is.get();
- if (Traits::eq_int_type(ic, Traits::eof()) ||
- !Traits::eq(Traits::to_char_type(ic), fmt))
- {
- err |= std::ios::failbit;
- is.setstate(std::ios::failbit);
- return false;
- }
- return true;
-}
-
-template <class CharT, class Traits>
-unsigned
-read_unsigned(std::basic_istream<CharT, Traits>& is, unsigned m = 1, unsigned M = 10)
-{
- unsigned x = 0;
- unsigned count = 0;
- while (true)
- {
- auto ic = is.peek();
- if (Traits::eq_int_type(ic, Traits::eof()))
- break;
- auto c = static_cast<char>(Traits::to_char_type(ic));
- if (!('0' <= c && c <= '9'))
- break;
- (void)is.get();
- ++count;
- x = 10*x + static_cast<unsigned>(c - '0');
- if (count == M)
- break;
- }
- if (count < m)
- is.setstate(std::ios::failbit);
- return x;
-}
-
-template <class CharT, class Traits>
-int
-read_signed(std::basic_istream<CharT, Traits>& is, unsigned m = 1, unsigned M = 10)
-{
- auto ic = is.peek();
- if (!Traits::eq_int_type(ic, Traits::eof()))
- {
- auto c = static_cast<char>(Traits::to_char_type(ic));
- if (('0' <= c && c <= '9') || c == '-' || c == '+')
- {
- if (c == '-' || c == '+')
- (void)is.get();
- auto x = static_cast<int>(read_unsigned(is, std::max(m, 1u), M));
- if (!is.fail())
- {
- if (c == '-')
- x = -x;
- return x;
- }
- }
- }
- if (m > 0)
- is.setstate(std::ios::failbit);
- return 0;
-}
-
-template <class CharT, class Traits>
-long double
-read_long_double(std::basic_istream<CharT, Traits>& is, unsigned m = 1, unsigned M = 10)
-{
- unsigned count = 0;
- auto decimal_point = Traits::to_int_type(
- std::use_facet<std::numpunct<CharT>>(is.getloc()).decimal_point());
- std::string buf;
- while (true)
- {
- auto ic = is.peek();
- if (Traits::eq_int_type(ic, Traits::eof()))
- break;
- if (Traits::eq_int_type(ic, decimal_point))
- {
- buf += '.';
- decimal_point = Traits::eof();
- is.get();
- }
- else
- {
- auto c = static_cast<char>(Traits::to_char_type(ic));
- if (!('0' <= c && c <= '9'))
- break;
- buf += c;
- (void)is.get();
- }
- if (++count == M)
- break;
- }
- if (count < m)
- {
- is.setstate(std::ios::failbit);
- return 0;
- }
- return std::stold(buf);
-}
-
-struct rs
-{
- int& i;
- unsigned m;
- unsigned M;
-};
-
-struct ru
-{
- int& i;
- unsigned m;
- unsigned M;
-};
-
-struct rld
-{
- long double& i;
- unsigned m;
- unsigned M;
-};
-
-template <class CharT, class Traits>
-void
-read(std::basic_istream<CharT, Traits>&)
-{
-}
-
-template <class CharT, class Traits, class ...Args>
-void
-read(std::basic_istream<CharT, Traits>& is, CharT a0, Args&& ...args);
-
-template <class CharT, class Traits, class ...Args>
-void
-read(std::basic_istream<CharT, Traits>& is, rs a0, Args&& ...args);
-
-template <class CharT, class Traits, class ...Args>
-void
-read(std::basic_istream<CharT, Traits>& is, ru a0, Args&& ...args);
-
-template <class CharT, class Traits, class ...Args>
-void
-read(std::basic_istream<CharT, Traits>& is, int a0, Args&& ...args);
-
-template <class CharT, class Traits, class ...Args>
-void
-read(std::basic_istream<CharT, Traits>& is, rld a0, Args&& ...args);
-
-template <class CharT, class Traits, class ...Args>
-void
-read(std::basic_istream<CharT, Traits>& is, CharT a0, Args&& ...args)
-{
- // No-op if a0 == CharT{}
- if (a0 != CharT{})
- {
- auto ic = is.peek();
- if (Traits::eq_int_type(ic, Traits::eof()))
- {
- is.setstate(std::ios::failbit | std::ios::eofbit);
- return;
- }
- if (!Traits::eq(Traits::to_char_type(ic), a0))
- {
- is.setstate(std::ios::failbit);
- return;
- }
- (void)is.get();
- }
- read(is, std::forward<Args>(args)...);
-}
-
-template <class CharT, class Traits, class ...Args>
-void
-read(std::basic_istream<CharT, Traits>& is, rs a0, Args&& ...args)
-{
- auto x = read_signed(is, a0.m, a0.M);
- if (is.fail())
- return;
- a0.i = x;
- read(is, std::forward<Args>(args)...);
-}
-
-template <class CharT, class Traits, class ...Args>
-void
-read(std::basic_istream<CharT, Traits>& is, ru a0, Args&& ...args)
-{
- auto x = read_unsigned(is, a0.m, a0.M);
- if (is.fail())
- return;
- a0.i = static_cast<int>(x);
- read(is, std::forward<Args>(args)...);
-}
-
-template <class CharT, class Traits, class ...Args>
-void
-read(std::basic_istream<CharT, Traits>& is, int a0, Args&& ...args)
-{
- if (a0 != -1)
- {
- auto u = static_cast<unsigned>(a0);
- CharT buf[std::numeric_limits<unsigned>::digits10+2u] = {};
- auto e = buf;
- do
- {
- *e++ = static_cast<CharT>(CharT(u % 10) + CharT{'0'});
- u /= 10;
- } while (u > 0);
- std::reverse(buf, e);
- for (auto p = buf; p != e && is.rdstate() == std::ios::goodbit; ++p)
- read(is, *p);
- }
- if (is.rdstate() == std::ios::goodbit)
- read(is, std::forward<Args>(args)...);
-}
-
-template <class CharT, class Traits, class ...Args>
-void
-read(std::basic_istream<CharT, Traits>& is, rld a0, Args&& ...args)
-{
- auto x = read_long_double(is, a0.m, a0.M);
- if (is.fail())
- return;
- a0.i = x;
- read(is, std::forward<Args>(args)...);
-}
-
-template <class T, class CharT, class Traits>
-inline
-void
-checked_set(T& value, T from, T not_a_value, std::basic_ios<CharT, Traits>& is)
-{
- if (!is.fail())
- {
- if (value == not_a_value)
- value = std::move(from);
- else if (value != from)
- is.setstate(std::ios::failbit);
- }
-}
-
-} // namespace detail;
-
-template <class CharT, class Traits, class Duration, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt,
- fields<Duration>& fds, std::basic_string<CharT, Traits, Alloc>* abbrev,
- std::chrono::minutes* offset)
-{
- using std::numeric_limits;
- using std::ios;
- using std::chrono::duration;
- using std::chrono::duration_cast;
- using std::chrono::seconds;
- using std::chrono::minutes;
- using std::chrono::hours;
- typename std::basic_istream<CharT, Traits>::sentry ok{is, true};
- if (ok)
- {
- date::detail::save_istream<CharT, Traits> ss(is);
- is.fill(' ');
- is.flags(std::ios::skipws | std::ios::dec);
- is.width(0);
-#if !ONLY_C_LOCALE
- auto& f = std::use_facet<std::time_get<CharT>>(is.getloc());
- std::tm tm{};
-#endif
- const CharT* command = nullptr;
- auto modified = CharT{};
- auto width = -1;
-
- CONSTDATA int not_a_year = numeric_limits<int>::min();
- CONSTDATA int not_a_2digit_year = 100;
- CONSTDATA int not_a_century = not_a_year / 100;
- CONSTDATA int not_a_month = 0;
- CONSTDATA int not_a_day = 0;
- CONSTDATA int not_a_hour = numeric_limits<int>::min();
- CONSTDATA int not_a_hour_12_value = 0;
- CONSTDATA int not_a_minute = not_a_hour;
- CONSTDATA Duration not_a_second = Duration::min();
- CONSTDATA int not_a_doy = -1;
- CONSTDATA int not_a_weekday = 8;
- CONSTDATA int not_a_week_num = 100;
- CONSTDATA int not_a_ampm = -1;
- CONSTDATA minutes not_a_offset = minutes::min();
-
- int Y = not_a_year; // c, F, Y *
- int y = not_a_2digit_year; // D, x, y *
- int g = not_a_2digit_year; // g *
- int G = not_a_year; // G *
- int C = not_a_century; // C *
- int m = not_a_month; // b, B, h, m, c, D, F, x *
- int d = not_a_day; // c, d, D, e, F, x *
- int j = not_a_doy; // j *
- int wd = not_a_weekday; // a, A, u, w *
- int H = not_a_hour; // c, H, R, T, X *
- int I = not_a_hour_12_value; // I, r *
- int p = not_a_ampm; // p, r *
- int M = not_a_minute; // c, M, r, R, T, X *
- Duration s = not_a_second; // c, r, S, T, X *
- int U = not_a_week_num; // U *
- int V = not_a_week_num; // V *
- int W = not_a_week_num; // W *
- std::basic_string<CharT, Traits, Alloc> temp_abbrev; // Z *
- minutes temp_offset = not_a_offset; // z *
-
- using detail::read;
- using detail::rs;
- using detail::ru;
- using detail::rld;
- using detail::checked_set;
- for (; *fmt != CharT{} && !is.fail(); ++fmt)
- {
- switch (*fmt)
- {
- case 'a':
- case 'A':
- case 'u':
- case 'w': // wd: a, A, u, w
- if (command)
- {
- int trial_wd = not_a_weekday;
- if (*fmt == 'a' || *fmt == 'A')
- {
- if (modified == CharT{})
- {
-#if !ONLY_C_LOCALE
- ios::iostate err = ios::goodbit;
- f.get(is, nullptr, is, err, &tm, command, fmt+1);
- is.setstate(err);
- if (!is.fail())
- trial_wd = tm.tm_wday;
-#else
- auto nm = detail::weekday_names();
- auto i = detail::scan_keyword(is, nm.first, nm.second) - nm.first;
- if (!is.fail())
- trial_wd = i % 7;
-#endif
- }
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- }
- else // *fmt == 'u' || *fmt == 'w'
- {
-#if !ONLY_C_LOCALE
- if (modified == CharT{})
-#else
- if (modified != CharT{'E'})
-#endif
- {
- read(is, ru{trial_wd, 1, width == -1 ?
- 1u : static_cast<unsigned>(width)});
- if (!is.fail())
- {
- if (*fmt == 'u')
- {
- if (!(1 <= trial_wd && trial_wd <= 7))
- {
- trial_wd = not_a_weekday;
- is.setstate(ios::failbit);
- }
- else if (trial_wd == 7)
- trial_wd = 0;
- }
- else // *fmt == 'w'
- {
- if (!(0 <= trial_wd && trial_wd <= 6))
- {
- trial_wd = not_a_weekday;
- is.setstate(ios::failbit);
- }
- }
- }
- }
-#if !ONLY_C_LOCALE
- else if (modified == CharT{'O'})
- {
- ios::iostate err = ios::goodbit;
- f.get(is, nullptr, is, err, &tm, command, fmt+1);
- is.setstate(err);
- if (!is.fail())
- trial_wd = tm.tm_wday;
- }
-#endif
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- }
- if (trial_wd != not_a_weekday)
- checked_set(wd, trial_wd, not_a_weekday, is);
- }
- else // !command
- read(is, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- break;
- case 'b':
- case 'B':
- case 'h':
- if (command)
- {
- if (modified == CharT{})
- {
- int ttm = not_a_month;
-#if !ONLY_C_LOCALE
- ios::iostate err = ios::goodbit;
- f.get(is, nullptr, is, err, &tm, command, fmt+1);
- if ((err & ios::failbit) == 0)
- ttm = tm.tm_mon + 1;
- is.setstate(err);
-#else
- auto nm = detail::month_names();
- auto i = detail::scan_keyword(is, nm.first, nm.second) - nm.first;
- if (!is.fail())
- ttm = i % 12 + 1;
-#endif
- checked_set(m, ttm, not_a_month, is);
- }
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'c':
- if (command)
- {
- if (modified != CharT{'O'})
- {
-#if !ONLY_C_LOCALE
- ios::iostate err = ios::goodbit;
- f.get(is, nullptr, is, err, &tm, command, fmt+1);
- if ((err & ios::failbit) == 0)
- {
- checked_set(Y, tm.tm_year + 1900, not_a_year, is);
- checked_set(m, tm.tm_mon + 1, not_a_month, is);
- checked_set(d, tm.tm_mday, not_a_day, is);
- checked_set(H, tm.tm_hour, not_a_hour, is);
- checked_set(M, tm.tm_min, not_a_minute, is);
- checked_set(s, duration_cast<Duration>(seconds{tm.tm_sec}),
- not_a_second, is);
- }
- is.setstate(err);
-#else
- // "%a %b %e %T %Y"
- auto nm = detail::weekday_names();
- auto i = detail::scan_keyword(is, nm.first, nm.second) - nm.first;
- checked_set(wd, static_cast<int>(i % 7), not_a_weekday, is);
- ws(is);
- nm = detail::month_names();
- i = detail::scan_keyword(is, nm.first, nm.second) - nm.first;
- checked_set(m, static_cast<int>(i % 12 + 1), not_a_month, is);
- ws(is);
- int td = not_a_day;
- read(is, rs{td, 1, 2});
- checked_set(d, td, not_a_day, is);
- ws(is);
- using dfs = detail::decimal_format_seconds<Duration>;
- CONSTDATA auto w = Duration::period::den == 1 ? 2 : 3 + dfs::width;
- int tH;
- int tM;
- long double S;
- read(is, ru{tH, 1, 2}, CharT{':'}, ru{tM, 1, 2},
- CharT{':'}, rld{S, 1, w});
- checked_set(H, tH, not_a_hour, is);
- checked_set(M, tM, not_a_minute, is);
- checked_set(s, round<Duration>(duration<long double>{S}),
- not_a_second, is);
- ws(is);
- int tY = not_a_year;
- read(is, rs{tY, 1, 4u});
- checked_set(Y, tY, not_a_year, is);
-#endif
- }
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'x':
- if (command)
- {
- if (modified != CharT{'O'})
- {
-#if !ONLY_C_LOCALE
- ios::iostate err = ios::goodbit;
- f.get(is, nullptr, is, err, &tm, command, fmt+1);
- if ((err & ios::failbit) == 0)
- {
- checked_set(Y, tm.tm_year + 1900, not_a_year, is);
- checked_set(m, tm.tm_mon + 1, not_a_month, is);
- checked_set(d, tm.tm_mday, not_a_day, is);
- }
- is.setstate(err);
-#else
- // "%m/%d/%y"
- int ty = not_a_2digit_year;
- int tm = not_a_month;
- int td = not_a_day;
- read(is, ru{tm, 1, 2}, CharT{'/'}, ru{td, 1, 2}, CharT{'/'},
- rs{ty, 1, 2});
- checked_set(y, ty, not_a_2digit_year, is);
- checked_set(m, tm, not_a_month, is);
- checked_set(d, td, not_a_day, is);
-#endif
- }
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'X':
- if (command)
- {
- if (modified != CharT{'O'})
- {
-#if !ONLY_C_LOCALE
- ios::iostate err = ios::goodbit;
- f.get(is, nullptr, is, err, &tm, command, fmt+1);
- if ((err & ios::failbit) == 0)
- {
- checked_set(H, tm.tm_hour, not_a_hour, is);
- checked_set(M, tm.tm_min, not_a_minute, is);
- checked_set(s, duration_cast<Duration>(seconds{tm.tm_sec}),
- not_a_second, is);
- }
- is.setstate(err);
-#else
- // "%T"
- using dfs = detail::decimal_format_seconds<Duration>;
- CONSTDATA auto w = Duration::period::den == 1 ? 2 : 3 + dfs::width;
- int tH = not_a_hour;
- int tM = not_a_minute;
- long double S;
- read(is, ru{tH, 1, 2}, CharT{':'}, ru{tM, 1, 2},
- CharT{':'}, rld{S, 1, w});
- checked_set(H, tH, not_a_hour, is);
- checked_set(M, tM, not_a_minute, is);
- checked_set(s, round<Duration>(duration<long double>{S}),
- not_a_second, is);
-#endif
- }
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'C':
- if (command)
- {
- int tC = not_a_century;
-#if !ONLY_C_LOCALE
- if (modified == CharT{})
- {
-#endif
- read(is, rs{tC, 1, width == -1 ? 2u : static_cast<unsigned>(width)});
-#if !ONLY_C_LOCALE
- }
- else
- {
- ios::iostate err = ios::goodbit;
- f.get(is, nullptr, is, err, &tm, command, fmt+1);
- if ((err & ios::failbit) == 0)
- {
- auto tY = tm.tm_year + 1900;
- tC = (tY >= 0 ? tY : tY-99) / 100;
- }
- is.setstate(err);
- }
-#endif
- checked_set(C, tC, not_a_century, is);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'D':
- if (command)
- {
- if (modified == CharT{})
- {
- int tn = not_a_month;
- int td = not_a_day;
- int ty = not_a_2digit_year;
- read(is, ru{tn, 1, 2}, CharT{'\0'}, CharT{'/'}, CharT{'\0'},
- ru{td, 1, 2}, CharT{'\0'}, CharT{'/'}, CharT{'\0'},
- rs{ty, 1, 2});
- checked_set(y, ty, not_a_2digit_year, is);
- checked_set(m, tn, not_a_month, is);
- checked_set(d, td, not_a_day, is);
- }
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'F':
- if (command)
- {
- if (modified == CharT{})
- {
- int tY = not_a_year;
- int tn = not_a_month;
- int td = not_a_day;
- read(is, rs{tY, 1, width == -1 ? 4u : static_cast<unsigned>(width)},
- CharT{'-'}, ru{tn, 1, 2}, CharT{'-'}, ru{td, 1, 2});
- checked_set(Y, tY, not_a_year, is);
- checked_set(m, tn, not_a_month, is);
- checked_set(d, td, not_a_day, is);
- }
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'd':
- case 'e':
- if (command)
- {
-#if !ONLY_C_LOCALE
- if (modified == CharT{})
-#else
- if (modified != CharT{'E'})
-#endif
- {
- int td = not_a_day;
- read(is, rs{td, 1, width == -1 ? 2u : static_cast<unsigned>(width)});
- checked_set(d, td, not_a_day, is);
- }
-#if !ONLY_C_LOCALE
- else if (modified == CharT{'O'})
- {
- ios::iostate err = ios::goodbit;
- f.get(is, nullptr, is, err, &tm, command, fmt+1);
- command = nullptr;
- width = -1;
- modified = CharT{};
- if ((err & ios::failbit) == 0)
- checked_set(d, tm.tm_mday, not_a_day, is);
- is.setstate(err);
- }
-#endif
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'H':
- if (command)
- {
-#if !ONLY_C_LOCALE
- if (modified == CharT{})
-#else
- if (modified != CharT{'E'})
-#endif
- {
- int tH = not_a_hour;
- read(is, ru{tH, 1, width == -1 ? 2u : static_cast<unsigned>(width)});
- checked_set(H, tH, not_a_hour, is);
- }
-#if !ONLY_C_LOCALE
- else if (modified == CharT{'O'})
- {
- ios::iostate err = ios::goodbit;
- f.get(is, nullptr, is, err, &tm, command, fmt+1);
- if ((err & ios::failbit) == 0)
- checked_set(H, tm.tm_hour, not_a_hour, is);
- is.setstate(err);
- }
-#endif
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'I':
- if (command)
- {
- if (modified == CharT{})
- {
- int tI = not_a_hour_12_value;
- // reads in an hour into I, but most be in [1, 12]
- read(is, rs{tI, 1, width == -1 ? 2u : static_cast<unsigned>(width)});
- if (!(1 <= tI && tI <= 12))
- is.setstate(ios::failbit);
- checked_set(I, tI, not_a_hour_12_value, is);
- }
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'j':
- if (command)
- {
- if (modified == CharT{})
- {
- int tj = not_a_doy;
- read(is, ru{tj, 1, width == -1 ? 3u : static_cast<unsigned>(width)});
- checked_set(j, tj, not_a_doy, is);
- }
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'M':
- if (command)
- {
-#if !ONLY_C_LOCALE
- if (modified == CharT{})
-#else
- if (modified != CharT{'E'})
-#endif
- {
- int tM = not_a_minute;
- read(is, ru{tM, 1, width == -1 ? 2u : static_cast<unsigned>(width)});
- checked_set(M, tM, not_a_minute, is);
- }
-#if !ONLY_C_LOCALE
- else if (modified == CharT{'O'})
- {
- ios::iostate err = ios::goodbit;
- f.get(is, nullptr, is, err, &tm, command, fmt+1);
- if ((err & ios::failbit) == 0)
- checked_set(M, tm.tm_min, not_a_minute, is);
- is.setstate(err);
- }
-#endif
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'm':
- if (command)
- {
-#if !ONLY_C_LOCALE
- if (modified == CharT{})
-#else
- if (modified != CharT{'E'})
-#endif
- {
- int tn = not_a_month;
- read(is, rs{tn, 1, width == -1 ? 2u : static_cast<unsigned>(width)});
- checked_set(m, tn, not_a_month, is);
- }
-#if !ONLY_C_LOCALE
- else if (modified == CharT{'O'})
- {
- ios::iostate err = ios::goodbit;
- f.get(is, nullptr, is, err, &tm, command, fmt+1);
- if ((err & ios::failbit) == 0)
- checked_set(m, tm.tm_mon + 1, not_a_month, is);
- is.setstate(err);
- }
-#endif
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'n':
- case 't':
- if (command)
- {
- if (modified == CharT{})
- {
- // %n matches a single white space character
- // %t matches 0 or 1 white space characters
- auto ic = is.peek();
- if (Traits::eq_int_type(ic, Traits::eof()))
- {
- ios::iostate err = ios::eofbit;
- if (*fmt == 'n')
- err |= ios::failbit;
- is.setstate(err);
- break;
- }
- if (isspace(ic))
- {
- (void)is.get();
- }
- else if (*fmt == 'n')
- is.setstate(ios::failbit);
- }
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'p':
- if (command)
- {
- if (modified == CharT{})
- {
- int tp = not_a_ampm;
-#if !ONLY_C_LOCALE
- tm = std::tm{};
- tm.tm_hour = 1;
- ios::iostate err = ios::goodbit;
- f.get(is, nullptr, is, err, &tm, command, fmt+1);
- is.setstate(err);
- if (tm.tm_hour == 1)
- tp = 0;
- else if (tm.tm_hour == 13)
- tp = 1;
- else
- is.setstate(err);
-#else
- auto nm = detail::ampm_names();
- auto i = detail::scan_keyword(is, nm.first, nm.second) - nm.first;
- tp = i;
-#endif
- checked_set(p, tp, not_a_ampm, is);
- }
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
-
- break;
- case 'r':
- if (command)
- {
- if (modified == CharT{})
- {
-#if !ONLY_C_LOCALE
- ios::iostate err = ios::goodbit;
- f.get(is, nullptr, is, err, &tm, command, fmt+1);
- if ((err & ios::failbit) == 0)
- {
- checked_set(H, tm.tm_hour, not_a_hour, is);
- checked_set(M, tm.tm_min, not_a_hour, is);
- checked_set(s, duration_cast<Duration>(seconds{tm.tm_sec}),
- not_a_second, is);
- }
- is.setstate(err);
-#else
- // "%I:%M:%S %p"
- using dfs = detail::decimal_format_seconds<Duration>;
- CONSTDATA auto w = Duration::period::den == 1 ? 2 : 3 + dfs::width;
- long double S;
- int tI = not_a_hour_12_value;
- int tM = not_a_minute;
- read(is, ru{tI, 1, 2}, CharT{':'}, ru{tM, 1, 2},
- CharT{':'}, rld{S, 1, w});
- checked_set(I, tI, not_a_hour_12_value, is);
- checked_set(M, tM, not_a_minute, is);
- checked_set(s, round<Duration>(duration<long double>{S}),
- not_a_second, is);
- ws(is);
- auto nm = detail::ampm_names();
- auto i = detail::scan_keyword(is, nm.first, nm.second) - nm.first;
- checked_set(p, static_cast<int>(i), not_a_ampm, is);
-#endif
- }
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'R':
- if (command)
- {
- if (modified == CharT{})
- {
- int tH = not_a_hour;
- int tM = not_a_minute;
- read(is, ru{tH, 1, 2}, CharT{'\0'}, CharT{':'}, CharT{'\0'},
- ru{tM, 1, 2}, CharT{'\0'});
- checked_set(H, tH, not_a_hour, is);
- checked_set(M, tM, not_a_minute, is);
- }
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'S':
- if (command)
- {
- #if !ONLY_C_LOCALE
- if (modified == CharT{})
-#else
- if (modified != CharT{'E'})
-#endif
- {
- using dfs = detail::decimal_format_seconds<Duration>;
- CONSTDATA auto w = Duration::period::den == 1 ? 2 : 3 + dfs::width;
- long double S;
- read(is, rld{S, 1, width == -1 ? w : static_cast<unsigned>(width)});
- checked_set(s, round<Duration>(duration<long double>{S}),
- not_a_second, is);
- }
-#if !ONLY_C_LOCALE
- else if (modified == CharT{'O'})
- {
- ios::iostate err = ios::goodbit;
- f.get(is, nullptr, is, err, &tm, command, fmt+1);
- if ((err & ios::failbit) == 0)
- checked_set(s, duration_cast<Duration>(seconds{tm.tm_sec}),
- not_a_second, is);
- is.setstate(err);
- }
-#endif
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'T':
- if (command)
- {
- if (modified == CharT{})
- {
- using dfs = detail::decimal_format_seconds<Duration>;
- CONSTDATA auto w = Duration::period::den == 1 ? 2 : 3 + dfs::width;
- int tH = not_a_hour;
- int tM = not_a_minute;
- long double S;
- read(is, ru{tH, 1, 2}, CharT{':'}, ru{tM, 1, 2},
- CharT{':'}, rld{S, 1, w});
- checked_set(H, tH, not_a_hour, is);
- checked_set(M, tM, not_a_minute, is);
- checked_set(s, round<Duration>(duration<long double>{S}),
- not_a_second, is);
- }
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'Y':
- if (command)
- {
-#if !ONLY_C_LOCALE
- if (modified == CharT{})
-#else
- if (modified != CharT{'O'})
-#endif
- {
- int tY = not_a_year;
- read(is, rs{tY, 1, width == -1 ? 4u : static_cast<unsigned>(width)});
- checked_set(Y, tY, not_a_year, is);
- }
-#if !ONLY_C_LOCALE
- else if (modified == CharT{'E'})
- {
- ios::iostate err = ios::goodbit;
- f.get(is, nullptr, is, err, &tm, command, fmt+1);
- if ((err & ios::failbit) == 0)
- checked_set(Y, tm.tm_year + 1900, not_a_year, is);
- is.setstate(err);
- }
-#endif
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'y':
- if (command)
- {
-#if !ONLY_C_LOCALE
- if (modified == CharT{})
-#endif
- {
- int ty = not_a_2digit_year;
- read(is, ru{ty, 1, width == -1 ? 2u : static_cast<unsigned>(width)});
- checked_set(y, ty, not_a_2digit_year, is);
- }
-#if !ONLY_C_LOCALE
- else
- {
- ios::iostate err = ios::goodbit;
- f.get(is, nullptr, is, err, &tm, command, fmt+1);
- if ((err & ios::failbit) == 0)
- checked_set(Y, tm.tm_year + 1900, not_a_year, is);
- is.setstate(err);
- }
-#endif
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'g':
- if (command)
- {
- if (modified == CharT{})
- {
- int tg = not_a_2digit_year;
- read(is, ru{tg, 1, width == -1 ? 2u : static_cast<unsigned>(width)});
- checked_set(g, tg, not_a_2digit_year, is);
- }
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'G':
- if (command)
- {
- if (modified == CharT{})
- {
- int tG = not_a_year;
- read(is, rs{tG, 1, width == -1 ? 4u : static_cast<unsigned>(width)});
- checked_set(G, tG, not_a_year, is);
- }
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'U':
- if (command)
- {
- if (modified == CharT{})
- {
- int tU = not_a_week_num;
- read(is, ru{tU, 1, width == -1 ? 2u : static_cast<unsigned>(width)});
- checked_set(U, tU, not_a_week_num, is);
- }
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'V':
- if (command)
- {
- if (modified == CharT{})
- {
- int tV = not_a_week_num;
- read(is, ru{tV, 1, width == -1 ? 2u : static_cast<unsigned>(width)});
- checked_set(V, tV, not_a_week_num, is);
- }
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'W':
- if (command)
- {
- if (modified == CharT{})
- {
- int tW = not_a_week_num;
- read(is, ru{tW, 1, width == -1 ? 2u : static_cast<unsigned>(width)});
- checked_set(W, tW, not_a_week_num, is);
- }
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'E':
- case 'O':
- if (command)
- {
- if (modified == CharT{})
- {
- modified = *fmt;
- }
- else
- {
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- }
- else
- read(is, *fmt);
- break;
- case '%':
- if (command)
- {
- if (modified == CharT{})
- read(is, *fmt);
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- command = fmt;
- break;
- case 'z':
- if (command)
- {
- int tH, tM;
- minutes toff = not_a_offset;
- bool neg = false;
- auto ic = is.peek();
- if (!Traits::eq_int_type(ic, Traits::eof()))
- {
- auto c = static_cast<char>(Traits::to_char_type(ic));
- if (c == '-')
- neg = true;
- }
- if (modified == CharT{})
- {
- read(is, rs{tH, 2, 2});
- if (!is.fail())
- toff = hours{std::abs(tH)};
- if (is.good())
- {
- ic = is.peek();
- if (!Traits::eq_int_type(ic, Traits::eof()))
- {
- auto c = static_cast<char>(Traits::to_char_type(ic));
- if ('0' <= c && c <= '9')
- {
- read(is, ru{tM, 2, 2});
- if (!is.fail())
- toff += minutes{tM};
- }
- }
- }
- }
- else
- {
- read(is, rs{tH, 1, 2});
- if (!is.fail())
- toff = hours{std::abs(tH)};
- if (is.good())
- {
- ic = is.peek();
- if (!Traits::eq_int_type(ic, Traits::eof()))
- {
- auto c = static_cast<char>(Traits::to_char_type(ic));
- if (c == ':')
- {
- (void)is.get();
- read(is, ru{tM, 2, 2});
- if (!is.fail())
- toff += minutes{tM};
- }
- }
- }
- }
- if (neg)
- toff = -toff;
- checked_set(temp_offset, toff, not_a_offset, is);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- case 'Z':
- if (command)
- {
- if (modified == CharT{})
- {
- std::basic_string<CharT, Traits, Alloc> buf;
- while (is.rdstate() == std::ios::goodbit)
- {
- auto i = is.rdbuf()->sgetc();
- if (Traits::eq_int_type(i, Traits::eof()))
- {
- is.setstate(ios::eofbit);
- break;
- }
- auto wc = Traits::to_char_type(i);
- auto c = static_cast<char>(wc);
- // is c a valid time zone name or abbreviation character?
- if (!(CharT{1} < wc && wc < CharT{127}) || !(isalnum(c) ||
- c == '_' || c == '/' || c == '-' || c == '+'))
- break;
- buf.push_back(c);
- is.rdbuf()->sbumpc();
- }
- if (buf.empty())
- is.setstate(ios::failbit);
- checked_set(temp_abbrev, buf, {}, is);
- }
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- else
- read(is, *fmt);
- break;
- default:
- if (command)
- {
- if (width == -1 && modified == CharT{} && '0' <= *fmt && *fmt <= '9')
- {
- width = static_cast<char>(*fmt) - '0';
- while ('0' <= fmt[1] && fmt[1] <= '9')
- width = 10*width + static_cast<char>(*++fmt) - '0';
- }
- else
- {
- if (modified == CharT{})
- read(is, CharT{'%'}, width, *fmt);
- else
- read(is, CharT{'%'}, width, modified, *fmt);
- command = nullptr;
- width = -1;
- modified = CharT{};
- }
- }
- else // !command
- {
- if (isspace(static_cast<unsigned char>(*fmt)))
- {
- // space matches 0 or more white space characters
- if (is.good())
- ws(is);
- }
- else
- read(is, *fmt);
- }
- break;
- }
- }
- // is.fail() || *fmt == CharT{}
- if (is.rdstate() == ios::goodbit && command)
- {
- if (modified == CharT{})
- read(is, CharT{'%'}, width);
- else
- read(is, CharT{'%'}, width, modified);
- }
- if (!is.fail())
- {
- if (y != not_a_2digit_year)
- {
- // Convert y and an optional C to Y
- if (!(0 <= y && y <= 99))
- goto broken;
- if (C == not_a_century)
- {
- if (Y == not_a_year)
- {
- if (y >= 69)
- C = 19;
- else
- C = 20;
- }
- else
- {
- C = (Y >= 0 ? Y : Y-100) / 100;
- }
- }
- int tY;
- if (C >= 0)
- tY = 100*C + y;
- else
- tY = 100*(C+1) - (y == 0 ? 100 : y);
- if (Y != not_a_year && Y != tY)
- goto broken;
- Y = tY;
- }
- if (g != not_a_2digit_year)
- {
- // Convert g and an optional C to G
- if (!(0 <= g && g <= 99))
- goto broken;
- if (C == not_a_century)
- {
- if (G == not_a_year)
- {
- if (g >= 69)
- C = 19;
- else
- C = 20;
- }
- else
- {
- C = (G >= 0 ? G : G-100) / 100;
- }
- }
- int tG;
- if (C >= 0)
- tG = 100*C + g;
- else
- tG = 100*(C+1) - (g == 0 ? 100 : g);
- if (G != not_a_year && G != tG)
- goto broken;
- G = tG;
- }
- if (Y < static_cast<int>(year::min()) || Y > static_cast<int>(year::max()))
- Y = not_a_year;
- bool computed = false;
- if (G != not_a_year && V != not_a_week_num && wd != not_a_weekday)
- {
- year_month_day ymd_trial = sys_days(year{G-1}/December/Thursday[last]) +
- (Monday-Thursday) + weeks{V-1} +
- (weekday{static_cast<unsigned>(wd)}-Monday);
- if (Y == not_a_year)
- Y = static_cast<int>(ymd_trial.year());
- else if (year{Y} != ymd_trial.year())
- goto broken;
- if (m == not_a_month)
- m = static_cast<int>(static_cast<unsigned>(ymd_trial.month()));
- else if (month(static_cast<unsigned>(m)) != ymd_trial.month())
- goto broken;
- if (d == not_a_day)
- d = static_cast<int>(static_cast<unsigned>(ymd_trial.day()));
- else if (day(static_cast<unsigned>(d)) != ymd_trial.day())
- goto broken;
- computed = true;
- }
- if (Y != not_a_year && U != not_a_week_num && wd != not_a_weekday)
- {
- year_month_day ymd_trial = sys_days(year{Y}/January/Sunday[1]) +
- weeks{U-1} +
- (weekday{static_cast<unsigned>(wd)} - Sunday);
- if (Y == not_a_year)
- Y = static_cast<int>(ymd_trial.year());
- else if (year{Y} != ymd_trial.year())
- goto broken;
- if (m == not_a_month)
- m = static_cast<int>(static_cast<unsigned>(ymd_trial.month()));
- else if (month(static_cast<unsigned>(m)) != ymd_trial.month())
- goto broken;
- if (d == not_a_day)
- d = static_cast<int>(static_cast<unsigned>(ymd_trial.day()));
- else if (day(static_cast<unsigned>(d)) != ymd_trial.day())
- goto broken;
- computed = true;
- }
- if (Y != not_a_year && W != not_a_week_num && wd != not_a_weekday)
- {
- year_month_day ymd_trial = sys_days(year{Y}/January/Monday[1]) +
- weeks{W-1} +
- (weekday{static_cast<unsigned>(wd)} - Monday);
- if (Y == not_a_year)
- Y = static_cast<int>(ymd_trial.year());
- else if (year{Y} != ymd_trial.year())
- goto broken;
- if (m == not_a_month)
- m = static_cast<int>(static_cast<unsigned>(ymd_trial.month()));
- else if (month(static_cast<unsigned>(m)) != ymd_trial.month())
- goto broken;
- if (d == not_a_day)
- d = static_cast<int>(static_cast<unsigned>(ymd_trial.day()));
- else if (day(static_cast<unsigned>(d)) != ymd_trial.day())
- goto broken;
- computed = true;
- }
- if (j != not_a_doy && Y != not_a_year)
- {
- auto ymd_trial = year_month_day{local_days(year{Y}/1/1) + days{j-1}};
- if (m == 0)
- m = static_cast<int>(static_cast<unsigned>(ymd_trial.month()));
- else if (month(static_cast<unsigned>(m)) != ymd_trial.month())
- goto broken;
- if (d == 0)
- d = static_cast<int>(static_cast<unsigned>(ymd_trial.day()));
- else if (day(static_cast<unsigned>(d)) != ymd_trial.day())
- goto broken;
- j = not_a_doy;
- }
- auto ymd = year{Y}/m/d;
- if (ymd.ok())
- {
- if (wd == not_a_weekday)
- wd = static_cast<int>((weekday(sys_days(ymd)) - Sunday).count());
- else if (wd != static_cast<int>((weekday(sys_days(ymd)) - Sunday).count()))
- goto broken;
- if (!computed)
- {
- if (G != not_a_year || V != not_a_week_num)
- {
- sys_days sd = ymd;
- auto G_trial = year_month_day{sd + days{3}}.year();
- auto start = sys_days((G_trial - years{1})/December/Thursday[last]) +
- (Monday - Thursday);
- if (sd < start)
- {
- --G_trial;
- if (V != not_a_week_num)
- start = sys_days((G_trial - years{1})/December/Thursday[last])
- + (Monday - Thursday);
- }
- if (G != not_a_year && G != static_cast<int>(G_trial))
- goto broken;
- if (V != not_a_week_num)
- {
- auto V_trial = duration_cast<weeks>(sd - start).count() + 1;
- if (V != V_trial)
- goto broken;
- }
- }
- if (U != not_a_week_num)
- {
- auto start = sys_days(Sunday[1]/January/ymd.year());
- auto U_trial = floor<weeks>(sys_days(ymd) - start).count() + 1;
- if (U != U_trial)
- goto broken;
- }
- if (W != not_a_week_num)
- {
- auto start = sys_days(Monday[1]/January/ymd.year());
- auto W_trial = floor<weeks>(sys_days(ymd) - start).count() + 1;
- if (W != W_trial)
- goto broken;
- }
- }
- }
- fds.ymd = ymd;
- if (I != not_a_hour_12_value)
- {
- if (!(1 <= I && I <= 12))
- goto broken;
- if (p != not_a_ampm)
- {
- // p is in [0, 1] == [AM, PM]
- // Store trial H in I
- if (I == 12)
- --p;
- I += p*12;
- // Either set H from I or make sure H and I are consistent
- if (H == not_a_hour)
- H = I;
- else if (I != H)
- goto broken;
- }
- else // p == not_a_ampm
- {
- // if H, make sure H and I could be consistent
- if (H != not_a_hour)
- {
- if (I == 12)
- {
- if (H != 0 && H != 12)
- goto broken;
- }
- else if (!(I == H || I == H+12))
- {
- goto broken;
- }
- }
- }
- }
- if (H != not_a_hour)
- {
- fds.has_tod = true;
- fds.tod = hh_mm_ss<Duration>{hours{H}};
- }
- if (M != not_a_minute)
- {
- fds.has_tod = true;
- fds.tod.m_ = minutes{M};
- }
- if (s != not_a_second)
- {
- fds.has_tod = true;
- fds.tod.s_ = detail::decimal_format_seconds<Duration>{s};
- }
- if (j != not_a_doy)
- {
- fds.has_tod = true;
- fds.tod.h_ += hours{days{j}};
- }
- if (wd != not_a_weekday)
- fds.wd = weekday{static_cast<unsigned>(wd)};
- if (abbrev != nullptr)
- *abbrev = std::move(temp_abbrev);
- if (offset != nullptr && temp_offset != not_a_offset)
- *offset = temp_offset;
- }
- return is;
- }
-broken:
- is.setstate(ios::failbit);
- return is;
-}
-
-template <class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt, year& y,
- std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
- std::chrono::minutes* offset = nullptr)
-{
- using CT = std::chrono::seconds;
- fields<CT> fds{};
- from_stream(is, fmt, fds, abbrev, offset);
- if (!fds.ymd.year().ok())
- is.setstate(std::ios::failbit);
- if (!is.fail())
- y = fds.ymd.year();
- return is;
-}
-
-template <class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt, month& m,
- std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
- std::chrono::minutes* offset = nullptr)
-{
- using CT = std::chrono::seconds;
- fields<CT> fds{};
- from_stream(is, fmt, fds, abbrev, offset);
- if (!fds.ymd.month().ok())
- is.setstate(std::ios::failbit);
- if (!is.fail())
- m = fds.ymd.month();
- return is;
-}
-
-template <class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt, day& d,
- std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
- std::chrono::minutes* offset = nullptr)
-{
- using CT = std::chrono::seconds;
- fields<CT> fds{};
- from_stream(is, fmt, fds, abbrev, offset);
- if (!fds.ymd.day().ok())
- is.setstate(std::ios::failbit);
- if (!is.fail())
- d = fds.ymd.day();
- return is;
-}
-
-template <class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt, weekday& wd,
- std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
- std::chrono::minutes* offset = nullptr)
-{
- using CT = std::chrono::seconds;
- fields<CT> fds{};
- from_stream(is, fmt, fds, abbrev, offset);
- if (!fds.wd.ok())
- is.setstate(std::ios::failbit);
- if (!is.fail())
- wd = fds.wd;
- return is;
-}
-
-template <class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt, year_month& ym,
- std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
- std::chrono::minutes* offset = nullptr)
-{
- using CT = std::chrono::seconds;
- fields<CT> fds{};
- from_stream(is, fmt, fds, abbrev, offset);
- if (!fds.ymd.month().ok())
- is.setstate(std::ios::failbit);
- if (!is.fail())
- ym = fds.ymd.year()/fds.ymd.month();
- return is;
-}
-
-template <class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt, month_day& md,
- std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
- std::chrono::minutes* offset = nullptr)
-{
- using CT = std::chrono::seconds;
- fields<CT> fds{};
- from_stream(is, fmt, fds, abbrev, offset);
- if (!fds.ymd.month().ok() || !fds.ymd.day().ok())
- is.setstate(std::ios::failbit);
- if (!is.fail())
- md = fds.ymd.month()/fds.ymd.day();
- return is;
-}
-
-template <class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt,
- year_month_day& ymd, std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
- std::chrono::minutes* offset = nullptr)
-{
- using CT = std::chrono::seconds;
- fields<CT> fds{};
- from_stream(is, fmt, fds, abbrev, offset);
- if (!fds.ymd.ok())
- is.setstate(std::ios::failbit);
- if (!is.fail())
- ymd = fds.ymd;
- return is;
-}
-
-template <class Duration, class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt,
- sys_time<Duration>& tp, std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
- std::chrono::minutes* offset = nullptr)
-{
- using CT = typename std::common_type<Duration, std::chrono::seconds>::type;
- std::chrono::minutes offset_local{};
- auto offptr = offset ? offset : &offset_local;
- fields<CT> fds{};
- fds.has_tod = true;
- from_stream(is, fmt, fds, abbrev, offptr);
- if (!fds.ymd.ok() || !fds.tod.in_conventional_range())
- is.setstate(std::ios::failbit);
- if (!is.fail())
- tp = round<Duration>(sys_days(fds.ymd) - *offptr + fds.tod.to_duration());
- return is;
-}
-
-template <class Duration, class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt,
- local_time<Duration>& tp, std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
- std::chrono::minutes* offset = nullptr)
-{
- using CT = typename std::common_type<Duration, std::chrono::seconds>::type;
- fields<CT> fds{};
- fds.has_tod = true;
- from_stream(is, fmt, fds, abbrev, offset);
- if (!fds.ymd.ok() || !fds.tod.in_conventional_range())
- is.setstate(std::ios::failbit);
- if (!is.fail())
- tp = round<Duration>(local_seconds{local_days(fds.ymd)} + fds.tod.to_duration());
- return is;
-}
-
-template <class Rep, class Period, class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt,
- std::chrono::duration<Rep, Period>& d,
- std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
- std::chrono::minutes* offset = nullptr)
-{
- using Duration = std::chrono::duration<Rep, Period>;
- using CT = typename std::common_type<Duration, std::chrono::seconds>::type;
- fields<CT> fds{};
- from_stream(is, fmt, fds, abbrev, offset);
- if (!fds.has_tod)
- is.setstate(std::ios::failbit);
- if (!is.fail())
- d = std::chrono::duration_cast<Duration>(fds.tod.to_duration());
- return is;
-}
-
-template <class Parsable, class CharT, class Traits = std::char_traits<CharT>,
- class Alloc = std::allocator<CharT>>
-struct parse_manip
-{
- const std::basic_string<CharT, Traits, Alloc> format_;
- Parsable& tp_;
- std::basic_string<CharT, Traits, Alloc>* abbrev_;
- std::chrono::minutes* offset_;
-
-public:
- parse_manip(std::basic_string<CharT, Traits, Alloc> format, Parsable& tp,
- std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
- std::chrono::minutes* offset = nullptr)
- : format_(std::move(format))
- , tp_(tp)
- , abbrev_(abbrev)
- , offset_(offset)
- {}
-
-};
-
-template <class Parsable, class CharT, class Traits, class Alloc>
-std::basic_istream<CharT, Traits>&
-operator>>(std::basic_istream<CharT, Traits>& is,
- const parse_manip<Parsable, CharT, Traits, Alloc>& x)
-{
- return from_stream(is, x.format_.c_str(), x.tp_, x.abbrev_, x.offset_);
-}
-
-template <class Parsable, class CharT, class Traits, class Alloc>
-inline
-auto
-parse(const std::basic_string<CharT, Traits, Alloc>& format, Parsable& tp)
- -> decltype(from_stream(std::declval<std::basic_istream<CharT, Traits>&>(),
- format.c_str(), tp),
- parse_manip<Parsable, CharT, Traits, Alloc>{format, tp})
-{
- return {format, tp};
-}
-
-template <class Parsable, class CharT, class Traits, class Alloc>
-inline
-auto
-parse(const std::basic_string<CharT, Traits, Alloc>& format, Parsable& tp,
- std::basic_string<CharT, Traits, Alloc>& abbrev)
- -> decltype(from_stream(std::declval<std::basic_istream<CharT, Traits>&>(),
- format.c_str(), tp, &abbrev),
- parse_manip<Parsable, CharT, Traits, Alloc>{format, tp, &abbrev})
-{
- return {format, tp, &abbrev};
-}
-
-template <class Parsable, class CharT, class Traits, class Alloc>
-inline
-auto
-parse(const std::basic_string<CharT, Traits, Alloc>& format, Parsable& tp,
- std::chrono::minutes& offset)
- -> decltype(from_stream(std::declval<std::basic_istream<CharT, Traits>&>(),
- format.c_str(), tp,
- std::declval<std::basic_string<CharT, Traits, Alloc>*>(),
- &offset),
- parse_manip<Parsable, CharT, Traits, Alloc>{format, tp, nullptr, &offset})
-{
- return {format, tp, nullptr, &offset};
-}
-
-template <class Parsable, class CharT, class Traits, class Alloc>
-inline
-auto
-parse(const std::basic_string<CharT, Traits, Alloc>& format, Parsable& tp,
- std::basic_string<CharT, Traits, Alloc>& abbrev, std::chrono::minutes& offset)
- -> decltype(from_stream(std::declval<std::basic_istream<CharT, Traits>&>(),
- format.c_str(), tp, &abbrev, &offset),
- parse_manip<Parsable, CharT, Traits, Alloc>{format, tp, &abbrev, &offset})
-{
- return {format, tp, &abbrev, &offset};
-}
-
-// const CharT* formats
-
-template <class Parsable, class CharT>
-inline
-auto
-parse(const CharT* format, Parsable& tp)
- -> decltype(from_stream(std::declval<std::basic_istream<CharT>&>(), format, tp),
- parse_manip<Parsable, CharT>{format, tp})
-{
- return {format, tp};
-}
-
-template <class Parsable, class CharT, class Traits, class Alloc>
-inline
-auto
-parse(const CharT* format, Parsable& tp, std::basic_string<CharT, Traits, Alloc>& abbrev)
- -> decltype(from_stream(std::declval<std::basic_istream<CharT, Traits>&>(), format,
- tp, &abbrev),
- parse_manip<Parsable, CharT, Traits, Alloc>{format, tp, &abbrev})
-{
- return {format, tp, &abbrev};
-}
-
-template <class Parsable, class CharT>
-inline
-auto
-parse(const CharT* format, Parsable& tp, std::chrono::minutes& offset)
- -> decltype(from_stream(std::declval<std::basic_istream<CharT>&>(), format,
- tp, std::declval<std::basic_string<CharT>*>(), &offset),
- parse_manip<Parsable, CharT>{format, tp, nullptr, &offset})
-{
- return {format, tp, nullptr, &offset};
-}
-
-template <class Parsable, class CharT, class Traits, class Alloc>
-inline
-auto
-parse(const CharT* format, Parsable& tp,
- std::basic_string<CharT, Traits, Alloc>& abbrev, std::chrono::minutes& offset)
- -> decltype(from_stream(std::declval<std::basic_istream<CharT, Traits>&>(), format,
- tp, &abbrev, &offset),
- parse_manip<Parsable, CharT, Traits, Alloc>{format, tp, &abbrev, &offset})
-{
- return {format, tp, &abbrev, &offset};
-}
-
-// duration streaming
-
-template <class CharT, class Traits, class Rep, class Period>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os,
- const std::chrono::duration<Rep, Period>& d)
-{
- return os << detail::make_string<CharT, Traits>::from(d.count()) +
- detail::get_units<CharT>(typename Period::type{});
-}
-
-} // namespace date
-
-#ifdef _MSC_VER
-# pragma warning(pop)
-#endif
-
-#ifdef __GNUC__
-# pragma GCC diagnostic pop
-#endif
-
-#endif // DATE_H
diff --git a/src/libs/date/includes/date/ios.h b/src/libs/date/includes/date/ios.h
deleted file mode 100644
index ee54b9d0..00000000
--- a/src/libs/date/includes/date/ios.h
+++ /dev/null
@@ -1,50 +0,0 @@
-//
-// ios.h
-// DateTimeLib
-//
-// The MIT License (MIT)
-//
-// Copyright (c) 2016 Alexander Kormanovsky
-//
-// 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.
-
-#ifndef ios_hpp
-#define ios_hpp
-
-#if __APPLE__
-# include <TargetConditionals.h>
-# if TARGET_OS_IPHONE
-# include <string>
-
- namespace date
- {
- namespace iOSUtils
- {
-
- std::string get_tzdata_path();
- std::string get_current_timezone();
-
- } // namespace iOSUtils
- } // namespace date
-
-# endif // TARGET_OS_IPHONE
-#else // !__APPLE__
-# define TARGET_OS_IPHONE 0
-#endif // !__APPLE__
-#endif // ios_hpp
diff --git a/src/libs/date/includes/date/islamic.h b/src/libs/date/includes/date/islamic.h
deleted file mode 100644
index 82ed6597..00000000
--- a/src/libs/date/includes/date/islamic.h
+++ /dev/null
@@ -1,3031 +0,0 @@
-#ifndef ISLAMIC_H
-#define ISLAMIC_H
-
-// The MIT License (MIT)
-//
-// Copyright (c) 2016 Howard Hinnant
-//
-// 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.
-
-#include "date.h"
-
-namespace islamic
-{
-
-// durations
-
-using days = date::days;
-
-using weeks = date::weeks;
-
-using years = std::chrono::duration
- <int, date::detail::ratio_multiply<std::ratio<10631, 30>, days::period>>;
-
-using months = std::chrono::duration
- <int, date::detail::ratio_divide<years::period, std::ratio<12>>>;
-
-// time_point
-
-using sys_days = date::sys_days;
-using local_days = date::local_days;
-
-// types
-
-struct last_spec
-{
- explicit last_spec() = default;
-};
-
-class day;
-class month;
-class year;
-
-class weekday;
-class weekday_indexed;
-class weekday_last;
-
-class month_day;
-class month_day_last;
-class month_weekday;
-class month_weekday_last;
-
-class year_month;
-
-class year_month_day;
-class year_month_day_last;
-class year_month_weekday;
-class year_month_weekday_last;
-
-// date composition operators
-
-CONSTCD11 year_month operator/(const year& y, const month& m) NOEXCEPT;
-CONSTCD11 year_month operator/(const year& y, int m) NOEXCEPT;
-
-CONSTCD11 month_day operator/(const day& d, const month& m) NOEXCEPT;
-CONSTCD11 month_day operator/(const day& d, int m) NOEXCEPT;
-CONSTCD11 month_day operator/(const month& m, const day& d) NOEXCEPT;
-CONSTCD11 month_day operator/(const month& m, int d) NOEXCEPT;
-CONSTCD11 month_day operator/(int m, const day& d) NOEXCEPT;
-
-CONSTCD11 month_day_last operator/(const month& m, last_spec) NOEXCEPT;
-CONSTCD11 month_day_last operator/(int m, last_spec) NOEXCEPT;
-CONSTCD11 month_day_last operator/(last_spec, const month& m) NOEXCEPT;
-CONSTCD11 month_day_last operator/(last_spec, int m) NOEXCEPT;
-
-CONSTCD11 month_weekday operator/(const month& m, const weekday_indexed& wdi) NOEXCEPT;
-CONSTCD11 month_weekday operator/(int m, const weekday_indexed& wdi) NOEXCEPT;
-CONSTCD11 month_weekday operator/(const weekday_indexed& wdi, const month& m) NOEXCEPT;
-CONSTCD11 month_weekday operator/(const weekday_indexed& wdi, int m) NOEXCEPT;
-
-CONSTCD11 month_weekday_last operator/(const month& m, const weekday_last& wdl) NOEXCEPT;
-CONSTCD11 month_weekday_last operator/(int m, const weekday_last& wdl) NOEXCEPT;
-CONSTCD11 month_weekday_last operator/(const weekday_last& wdl, const month& m) NOEXCEPT;
-CONSTCD11 month_weekday_last operator/(const weekday_last& wdl, int m) NOEXCEPT;
-
-CONSTCD11 year_month_day operator/(const year_month& ym, const day& d) NOEXCEPT;
-CONSTCD11 year_month_day operator/(const year_month& ym, int d) NOEXCEPT;
-CONSTCD11 year_month_day operator/(const year& y, const month_day& md) NOEXCEPT;
-CONSTCD11 year_month_day operator/(int y, const month_day& md) NOEXCEPT;
-CONSTCD11 year_month_day operator/(const month_day& md, const year& y) NOEXCEPT;
-CONSTCD11 year_month_day operator/(const month_day& md, int y) NOEXCEPT;
-
-CONSTCD11
- year_month_day_last operator/(const year_month& ym, last_spec) NOEXCEPT;
-CONSTCD11
- year_month_day_last operator/(const year& y, const month_day_last& mdl) NOEXCEPT;
-CONSTCD11
- year_month_day_last operator/(int y, const month_day_last& mdl) NOEXCEPT;
-CONSTCD11
- year_month_day_last operator/(const month_day_last& mdl, const year& y) NOEXCEPT;
-CONSTCD11
- year_month_day_last operator/(const month_day_last& mdl, int y) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(const year_month& ym, const weekday_indexed& wdi) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(const year& y, const month_weekday& mwd) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(int y, const month_weekday& mwd) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(const month_weekday& mwd, const year& y) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(const month_weekday& mwd, int y) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(const year_month& ym, const weekday_last& wdl) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(const year& y, const month_weekday_last& mwdl) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(int y, const month_weekday_last& mwdl) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(const month_weekday_last& mwdl, const year& y) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(const month_weekday_last& mwdl, int y) NOEXCEPT;
-
-// Detailed interface
-
-// day
-
-class day
-{
- unsigned char d_;
-
-public:
- explicit CONSTCD11 day(unsigned d) NOEXCEPT;
-
- CONSTCD14 day& operator++() NOEXCEPT;
- CONSTCD14 day operator++(int) NOEXCEPT;
- CONSTCD14 day& operator--() NOEXCEPT;
- CONSTCD14 day operator--(int) NOEXCEPT;
-
- CONSTCD14 day& operator+=(const days& d) NOEXCEPT;
- CONSTCD14 day& operator-=(const days& d) NOEXCEPT;
-
- CONSTCD11 explicit operator unsigned() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator< (const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator> (const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const day& x, const day& y) NOEXCEPT;
-
-CONSTCD11 day operator+(const day& x, const days& y) NOEXCEPT;
-CONSTCD11 day operator+(const days& x, const day& y) NOEXCEPT;
-CONSTCD11 day operator-(const day& x, const days& y) NOEXCEPT;
-CONSTCD11 days operator-(const day& x, const day& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const day& d);
-
-// month
-
-class month
-{
- unsigned char m_;
-
-public:
- explicit CONSTCD11 month(unsigned m) NOEXCEPT;
-
- CONSTCD14 month& operator++() NOEXCEPT;
- CONSTCD14 month operator++(int) NOEXCEPT;
- CONSTCD14 month& operator--() NOEXCEPT;
- CONSTCD14 month operator--(int) NOEXCEPT;
-
- CONSTCD14 month& operator+=(const months& m) NOEXCEPT;
- CONSTCD14 month& operator-=(const months& m) NOEXCEPT;
-
- CONSTCD11 explicit operator unsigned() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator< (const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator> (const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const month& x, const month& y) NOEXCEPT;
-
-CONSTCD14 month operator+(const month& x, const months& y) NOEXCEPT;
-CONSTCD14 month operator+(const months& x, const month& y) NOEXCEPT;
-CONSTCD14 month operator-(const month& x, const months& y) NOEXCEPT;
-CONSTCD14 months operator-(const month& x, const month& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month& m);
-
-// year
-
-class year
-{
- short y_;
-
-public:
- explicit CONSTCD11 year(int y) NOEXCEPT;
-
- CONSTCD14 year& operator++() NOEXCEPT;
- CONSTCD14 year operator++(int) NOEXCEPT;
- CONSTCD14 year& operator--() NOEXCEPT;
- CONSTCD14 year operator--(int) NOEXCEPT;
-
- CONSTCD14 year& operator+=(const years& y) NOEXCEPT;
- CONSTCD14 year& operator-=(const years& y) NOEXCEPT;
-
- CONSTCD14 bool is_leap() const NOEXCEPT;
-
- CONSTCD11 explicit operator int() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-
- static CONSTCD11 year min() NOEXCEPT;
- static CONSTCD11 year max() NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year& x, const year& y) NOEXCEPT;
-
-CONSTCD11 year operator+(const year& x, const years& y) NOEXCEPT;
-CONSTCD11 year operator+(const years& x, const year& y) NOEXCEPT;
-CONSTCD11 year operator-(const year& x, const years& y) NOEXCEPT;
-CONSTCD11 years operator-(const year& x, const year& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year& y);
-
-// weekday
-
-class weekday
-{
- unsigned char wd_;
-public:
- explicit CONSTCD11 weekday(unsigned wd) NOEXCEPT;
- explicit weekday(int) = delete;
- CONSTCD11 weekday(const sys_days& dp) NOEXCEPT;
- CONSTCD11 explicit weekday(const local_days& dp) NOEXCEPT;
-
- CONSTCD14 weekday& operator++() NOEXCEPT;
- CONSTCD14 weekday operator++(int) NOEXCEPT;
- CONSTCD14 weekday& operator--() NOEXCEPT;
- CONSTCD14 weekday operator--(int) NOEXCEPT;
-
- CONSTCD14 weekday& operator+=(const days& d) NOEXCEPT;
- CONSTCD14 weekday& operator-=(const days& d) NOEXCEPT;
-
- CONSTCD11 explicit operator unsigned() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-
- CONSTCD11 weekday_indexed operator[](unsigned index) const NOEXCEPT;
- CONSTCD11 weekday_last operator[](last_spec) const NOEXCEPT;
-
-private:
- static CONSTCD11 unsigned char weekday_from_days(int z) NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const weekday& x, const weekday& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const weekday& x, const weekday& y) NOEXCEPT;
-
-CONSTCD14 weekday operator+(const weekday& x, const days& y) NOEXCEPT;
-CONSTCD14 weekday operator+(const days& x, const weekday& y) NOEXCEPT;
-CONSTCD14 weekday operator-(const weekday& x, const days& y) NOEXCEPT;
-CONSTCD14 days operator-(const weekday& x, const weekday& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday& wd);
-
-// weekday_indexed
-
-class weekday_indexed
-{
- unsigned char wd_ : 4;
- unsigned char index_ : 4;
-
-public:
- CONSTCD11 weekday_indexed(const islamic::weekday& wd, unsigned index) NOEXCEPT;
-
- CONSTCD11 islamic::weekday weekday() const NOEXCEPT;
- CONSTCD11 unsigned index() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday_indexed& wdi);
-
-// weekday_last
-
-class weekday_last
-{
- islamic::weekday wd_;
-
-public:
- explicit CONSTCD11 weekday_last(const islamic::weekday& wd) NOEXCEPT;
-
- CONSTCD11 islamic::weekday weekday() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const weekday_last& x, const weekday_last& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const weekday_last& x, const weekday_last& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday_last& wdl);
-
-// year_month
-
-class year_month
-{
- islamic::year y_;
- islamic::month m_;
-
-public:
- CONSTCD11 year_month(const islamic::year& y, const islamic::month& m) NOEXCEPT;
-
- CONSTCD11 islamic::year year() const NOEXCEPT;
- CONSTCD11 islamic::month month() const NOEXCEPT;
-
- CONSTCD14 year_month& operator+=(const months& dm) NOEXCEPT;
- CONSTCD14 year_month& operator-=(const months& dm) NOEXCEPT;
- CONSTCD14 year_month& operator+=(const years& dy) NOEXCEPT;
- CONSTCD14 year_month& operator-=(const years& dy) NOEXCEPT;
-
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year_month& x, const year_month& y) NOEXCEPT;
-
-CONSTCD14 year_month operator+(const year_month& ym, const months& dm) NOEXCEPT;
-CONSTCD14 year_month operator+(const months& dm, const year_month& ym) NOEXCEPT;
-CONSTCD14 year_month operator-(const year_month& ym, const months& dm) NOEXCEPT;
-
-CONSTCD11 months operator-(const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 year_month operator+(const year_month& ym, const years& dy) NOEXCEPT;
-CONSTCD11 year_month operator+(const years& dy, const year_month& ym) NOEXCEPT;
-CONSTCD11 year_month operator-(const year_month& ym, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month& ym);
-
-// month_day
-
-class month_day
-{
- islamic::month m_;
- islamic::day d_;
-
-public:
- CONSTCD11 month_day(const islamic::month& m, const islamic::day& d) NOEXCEPT;
-
- CONSTCD11 islamic::month month() const NOEXCEPT;
- CONSTCD11 islamic::day day() const NOEXCEPT;
-
- CONSTCD14 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator< (const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator> (const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const month_day& x, const month_day& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_day& md);
-
-// month_day_last
-
-class month_day_last
-{
- islamic::month m_;
-
-public:
- CONSTCD11 explicit month_day_last(const islamic::month& m) NOEXCEPT;
-
- CONSTCD11 islamic::month month() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator< (const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator> (const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const month_day_last& x, const month_day_last& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_day_last& mdl);
-
-// month_weekday
-
-class month_weekday
-{
- islamic::month m_;
- islamic::weekday_indexed wdi_;
-public:
- CONSTCD11 month_weekday(const islamic::month& m,
- const islamic::weekday_indexed& wdi) NOEXCEPT;
-
- CONSTCD11 islamic::month month() const NOEXCEPT;
- CONSTCD11 islamic::weekday_indexed weekday_indexed() const NOEXCEPT;
-
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const month_weekday& x, const month_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const month_weekday& x, const month_weekday& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_weekday& mwd);
-
-// month_weekday_last
-
-class month_weekday_last
-{
- islamic::month m_;
- islamic::weekday_last wdl_;
-
-public:
- CONSTCD11 month_weekday_last(const islamic::month& m,
- const islamic::weekday_last& wd) NOEXCEPT;
-
- CONSTCD11 islamic::month month() const NOEXCEPT;
- CONSTCD11 islamic::weekday_last weekday_last() const NOEXCEPT;
-
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11
- bool operator==(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT;
-CONSTCD11
- bool operator!=(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_weekday_last& mwdl);
-
-// class year_month_day
-
-class year_month_day
-{
- islamic::year y_;
- islamic::month m_;
- islamic::day d_;
-
-public:
- CONSTCD11 year_month_day(const islamic::year& y, const islamic::month& m,
- const islamic::day& d) NOEXCEPT;
- CONSTCD14 year_month_day(const year_month_day_last& ymdl) NOEXCEPT;
-
- CONSTCD14 year_month_day(sys_days dp) NOEXCEPT;
- CONSTCD14 explicit year_month_day(local_days dp) NOEXCEPT;
-
- CONSTCD14 year_month_day& operator+=(const months& m) NOEXCEPT;
- CONSTCD14 year_month_day& operator-=(const months& m) NOEXCEPT;
- CONSTCD14 year_month_day& operator+=(const years& y) NOEXCEPT;
- CONSTCD14 year_month_day& operator-=(const years& y) NOEXCEPT;
-
- CONSTCD11 islamic::year year() const NOEXCEPT;
- CONSTCD11 islamic::month month() const NOEXCEPT;
- CONSTCD11 islamic::day day() const NOEXCEPT;
-
- CONSTCD14 operator sys_days() const NOEXCEPT;
- CONSTCD14 explicit operator local_days() const NOEXCEPT;
- CONSTCD14 bool ok() const NOEXCEPT;
-
-private:
- static CONSTCD14 year_month_day from_days(days dp) NOEXCEPT;
- CONSTCD14 days to_days() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year_month_day& x, const year_month_day& y) NOEXCEPT;
-
-CONSTCD14 year_month_day operator+(const year_month_day& ymd, const months& dm) NOEXCEPT;
-CONSTCD14 year_month_day operator+(const months& dm, const year_month_day& ymd) NOEXCEPT;
-CONSTCD14 year_month_day operator-(const year_month_day& ymd, const months& dm) NOEXCEPT;
-CONSTCD11 year_month_day operator+(const year_month_day& ymd, const years& dy) NOEXCEPT;
-CONSTCD11 year_month_day operator+(const years& dy, const year_month_day& ymd) NOEXCEPT;
-CONSTCD11 year_month_day operator-(const year_month_day& ymd, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_day& ymd);
-
-// year_month_day_last
-
-class year_month_day_last
-{
- islamic::year y_;
- islamic::month_day_last mdl_;
-
-public:
- CONSTCD11 year_month_day_last(const islamic::year& y,
- const islamic::month_day_last& mdl) NOEXCEPT;
-
- CONSTCD14 year_month_day_last& operator+=(const months& m) NOEXCEPT;
- CONSTCD14 year_month_day_last& operator-=(const months& m) NOEXCEPT;
- CONSTCD14 year_month_day_last& operator+=(const years& y) NOEXCEPT;
- CONSTCD14 year_month_day_last& operator-=(const years& y) NOEXCEPT;
-
- CONSTCD11 islamic::year year() const NOEXCEPT;
- CONSTCD11 islamic::month month() const NOEXCEPT;
- CONSTCD11 islamic::month_day_last month_day_last() const NOEXCEPT;
- CONSTCD14 islamic::day day() const NOEXCEPT;
-
- CONSTCD14 operator sys_days() const NOEXCEPT;
- CONSTCD14 explicit operator local_days() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11
- bool operator==(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
- bool operator!=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
- bool operator< (const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
- bool operator> (const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
- bool operator<=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
- bool operator>=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-
-CONSTCD14
-year_month_day_last
-operator+(const year_month_day_last& ymdl, const months& dm) NOEXCEPT;
-
-CONSTCD14
-year_month_day_last
-operator+(const months& dm, const year_month_day_last& ymdl) NOEXCEPT;
-
-CONSTCD11
-year_month_day_last
-operator+(const year_month_day_last& ymdl, const years& dy) NOEXCEPT;
-
-CONSTCD11
-year_month_day_last
-operator+(const years& dy, const year_month_day_last& ymdl) NOEXCEPT;
-
-CONSTCD14
-year_month_day_last
-operator-(const year_month_day_last& ymdl, const months& dm) NOEXCEPT;
-
-CONSTCD11
-year_month_day_last
-operator-(const year_month_day_last& ymdl, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_day_last& ymdl);
-
-// year_month_weekday
-
-class year_month_weekday
-{
- islamic::year y_;
- islamic::month m_;
- islamic::weekday_indexed wdi_;
-
-public:
- CONSTCD11 year_month_weekday(const islamic::year& y, const islamic::month& m,
- const islamic::weekday_indexed& wdi) NOEXCEPT;
- CONSTCD14 year_month_weekday(const sys_days& dp) NOEXCEPT;
- CONSTCD14 explicit year_month_weekday(const local_days& dp) NOEXCEPT;
-
- CONSTCD14 year_month_weekday& operator+=(const months& m) NOEXCEPT;
- CONSTCD14 year_month_weekday& operator-=(const months& m) NOEXCEPT;
- CONSTCD14 year_month_weekday& operator+=(const years& y) NOEXCEPT;
- CONSTCD14 year_month_weekday& operator-=(const years& y) NOEXCEPT;
-
- CONSTCD11 islamic::year year() const NOEXCEPT;
- CONSTCD11 islamic::month month() const NOEXCEPT;
- CONSTCD11 islamic::weekday weekday() const NOEXCEPT;
- CONSTCD11 unsigned index() const NOEXCEPT;
- CONSTCD11 islamic::weekday_indexed weekday_indexed() const NOEXCEPT;
-
- CONSTCD14 operator sys_days() const NOEXCEPT;
- CONSTCD14 explicit operator local_days() const NOEXCEPT;
- CONSTCD14 bool ok() const NOEXCEPT;
-
-private:
- static CONSTCD14 year_month_weekday from_days(days dp) NOEXCEPT;
- CONSTCD14 days to_days() const NOEXCEPT;
-};
-
-CONSTCD11
- bool operator==(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT;
-CONSTCD11
- bool operator!=(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT;
-
-CONSTCD14
-year_month_weekday
-operator+(const year_month_weekday& ymwd, const months& dm) NOEXCEPT;
-
-CONSTCD14
-year_month_weekday
-operator+(const months& dm, const year_month_weekday& ymwd) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator+(const year_month_weekday& ymwd, const years& dy) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator+(const years& dy, const year_month_weekday& ymwd) NOEXCEPT;
-
-CONSTCD14
-year_month_weekday
-operator-(const year_month_weekday& ymwd, const months& dm) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator-(const year_month_weekday& ymwd, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday& ymwdi);
-
-// year_month_weekday_last
-
-class year_month_weekday_last
-{
- islamic::year y_;
- islamic::month m_;
- islamic::weekday_last wdl_;
-
-public:
- CONSTCD11 year_month_weekday_last(const islamic::year& y, const islamic::month& m,
- const islamic::weekday_last& wdl) NOEXCEPT;
-
- CONSTCD14 year_month_weekday_last& operator+=(const months& m) NOEXCEPT;
- CONSTCD14 year_month_weekday_last& operator-=(const months& m) NOEXCEPT;
- CONSTCD14 year_month_weekday_last& operator+=(const years& y) NOEXCEPT;
- CONSTCD14 year_month_weekday_last& operator-=(const years& y) NOEXCEPT;
-
- CONSTCD11 islamic::year year() const NOEXCEPT;
- CONSTCD11 islamic::month month() const NOEXCEPT;
- CONSTCD11 islamic::weekday weekday() const NOEXCEPT;
- CONSTCD11 islamic::weekday_last weekday_last() const NOEXCEPT;
-
- CONSTCD14 operator sys_days() const NOEXCEPT;
- CONSTCD14 explicit operator local_days() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-
-private:
- CONSTCD14 days to_days() const NOEXCEPT;
-};
-
-CONSTCD11
-bool
-operator==(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT;
-
-CONSTCD11
-bool
-operator!=(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT;
-
-CONSTCD14
-year_month_weekday_last
-operator+(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT;
-
-CONSTCD14
-year_month_weekday_last
-operator+(const months& dm, const year_month_weekday_last& ymwdl) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator+(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator+(const years& dy, const year_month_weekday_last& ymwdl) NOEXCEPT;
-
-CONSTCD14
-year_month_weekday_last
-operator-(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator-(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday_last& ymwdl);
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-inline namespace literals
-{
-
-CONSTCD11 islamic::day operator "" _d(unsigned long long d) NOEXCEPT;
-CONSTCD11 islamic::year operator "" _y(unsigned long long y) NOEXCEPT;
-
-} // inline namespace literals
-#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900)
-
-//----------------+
-// Implementation |
-//----------------+
-
-// day
-
-CONSTCD11 inline day::day(unsigned d) NOEXCEPT : d_(static_cast<unsigned char>(d)) {}
-CONSTCD14 inline day& day::operator++() NOEXCEPT {++d_; return *this;}
-CONSTCD14 inline day day::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-CONSTCD14 inline day& day::operator--() NOEXCEPT {--d_; return *this;}
-CONSTCD14 inline day day::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-CONSTCD14 inline day& day::operator+=(const days& d) NOEXCEPT {*this = *this + d; return *this;}
-CONSTCD14 inline day& day::operator-=(const days& d) NOEXCEPT {*this = *this - d; return *this;}
-CONSTCD11 inline day::operator unsigned() const NOEXCEPT {return d_;}
-CONSTCD11 inline bool day::ok() const NOEXCEPT {return 1 <= d_ && d_ <= 30;}
-
-CONSTCD11
-inline
-bool
-operator==(const day& x, const day& y) NOEXCEPT
-{
- return static_cast<unsigned>(x) == static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const day& x, const day& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const day& x, const day& y) NOEXCEPT
-{
- return static_cast<unsigned>(x) < static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator>(const day& x, const day& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const day& x, const day& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const day& x, const day& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-CONSTCD11
-inline
-days
-operator-(const day& x, const day& y) NOEXCEPT
-{
- return days{static_cast<days::rep>(static_cast<unsigned>(x)
- - static_cast<unsigned>(y))};
-}
-
-CONSTCD11
-inline
-day
-operator+(const day& x, const days& y) NOEXCEPT
-{
- return day{static_cast<unsigned>(x) + static_cast<unsigned>(y.count())};
-}
-
-CONSTCD11
-inline
-day
-operator+(const days& x, const day& y) NOEXCEPT
-{
- return y + x;
-}
-
-CONSTCD11
-inline
-day
-operator-(const day& x, const days& y) NOEXCEPT
-{
- return x + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const day& d)
-{
- date::detail::save_ostream<CharT, Traits> _(os);
- os.fill('0');
- os.flags(std::ios::dec | std::ios::right);
- os.width(2);
- os << static_cast<unsigned>(d);
- return os;
-}
-
-// month
-
-CONSTCD11 inline month::month(unsigned m) NOEXCEPT : m_(static_cast<decltype(m_)>(m)) {}
-CONSTCD14 inline month& month::operator++() NOEXCEPT {if (++m_ == 13) m_ = 1; return *this;}
-CONSTCD14 inline month month::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-CONSTCD14 inline month& month::operator--() NOEXCEPT {if (--m_ == 0) m_ = 12; return *this;}
-CONSTCD14 inline month month::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-
-CONSTCD14
-inline
-month&
-month::operator+=(const months& m) NOEXCEPT
-{
- *this = *this + m;
- return *this;
-}
-
-CONSTCD14
-inline
-month&
-month::operator-=(const months& m) NOEXCEPT
-{
- *this = *this - m;
- return *this;
-}
-
-CONSTCD11 inline month::operator unsigned() const NOEXCEPT {return m_;}
-CONSTCD11 inline bool month::ok() const NOEXCEPT {return 1 <= m_ && m_ <= 12;}
-
-CONSTCD11
-inline
-bool
-operator==(const month& x, const month& y) NOEXCEPT
-{
- return static_cast<unsigned>(x) == static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month& x, const month& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const month& x, const month& y) NOEXCEPT
-{
- return static_cast<unsigned>(x) < static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator>(const month& x, const month& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const month& x, const month& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const month& x, const month& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-CONSTCD14
-inline
-months
-operator-(const month& x, const month& y) NOEXCEPT
-{
- auto const d = static_cast<unsigned>(x) - static_cast<unsigned>(y);
- return months(d <= 11 ? d : d + 12);
-}
-
-CONSTCD14
-inline
-month
-operator+(const month& x, const months& y) NOEXCEPT
-{
- auto const mu = static_cast<long long>(static_cast<unsigned>(x)) - 1 + y.count();
- auto const yr = (mu >= 0 ? mu : mu-11) / 12;
- return month{static_cast<unsigned>(mu - yr * 12 + 1)};
-}
-
-CONSTCD14
-inline
-month
-operator+(const months& x, const month& y) NOEXCEPT
-{
- return y + x;
-}
-
-CONSTCD14
-inline
-month
-operator-(const month& x, const months& y) NOEXCEPT
-{
- return x + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month& m)
-{
- switch (static_cast<unsigned>(m))
- {
- case 1:
- os << "Muharram";
- break;
- case 2:
- os << "Safar";
- break;
- case 3:
- os << "Rabi' al-awwal";
- break;
- case 4:
- os << "Rabi' al-thani";
- break;
- case 5:
- os << "Jumada al-awwal";
- break;
- case 6:
- os << "Jumada al-Thani";
- break;
- case 7:
- os << "Rajab";
- break;
- case 8:
- os << "Sha'ban";
- break;
- case 9:
- os << "Ramadan";
- break;
- case 10:
- os << "Shawwal";
- break;
- case 11:
- os << "Dhu al-Qi'dah";
- break;
- case 12:
- os << "Dhu al-Hijjah";
- break;
- default:
- os << static_cast<unsigned>(m) << " is not a valid month";
- break;
- }
- return os;
-}
-
-// year
-
-CONSTCD11 inline year::year(int y) NOEXCEPT : y_(static_cast<decltype(y_)>(y)) {}
-CONSTCD14 inline year& year::operator++() NOEXCEPT {++y_; return *this;}
-CONSTCD14 inline year year::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-CONSTCD14 inline year& year::operator--() NOEXCEPT {--y_; return *this;}
-CONSTCD14 inline year year::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-CONSTCD14 inline year& year::operator+=(const years& y) NOEXCEPT {*this = *this + y; return *this;}
-CONSTCD14 inline year& year::operator-=(const years& y) NOEXCEPT {*this = *this - y; return *this;}
-
-CONSTCD14
-inline
-bool
-year::is_leap() const NOEXCEPT
-{
- int y = y_ - 1;
- const int era = (y >= 0 ? y : y-29) / 30;
- const unsigned yoe = static_cast<unsigned>(y - era * 30);
- switch (yoe)
- {
- case 1:
- case 4:
- case 6:
- case 9:
- case 12:
- case 15:
- case 17:
- case 20:
- case 23:
- case 25:
- case 28:
- return true;
- default:
- return false;
- }
-}
-
-CONSTCD11 inline year::operator int() const NOEXCEPT {return y_;}
-CONSTCD11 inline bool year::ok() const NOEXCEPT {return true;}
-
-CONSTCD11
-inline
-year
-year::min() NOEXCEPT
-{
- return year{std::numeric_limits<short>::min()};
-}
-
-CONSTCD11
-inline
-year
-year::max() NOEXCEPT
-{
- return year{std::numeric_limits<short>::max()};
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year& x, const year& y) NOEXCEPT
-{
- return static_cast<int>(x) == static_cast<int>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year& x, const year& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year& x, const year& y) NOEXCEPT
-{
- return static_cast<int>(x) < static_cast<int>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year& x, const year& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year& x, const year& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year& x, const year& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-CONSTCD11
-inline
-years
-operator-(const year& x, const year& y) NOEXCEPT
-{
- return years{static_cast<int>(x) - static_cast<int>(y)};
-}
-
-CONSTCD11
-inline
-year
-operator+(const year& x, const years& y) NOEXCEPT
-{
- return year{static_cast<int>(x) + y.count()};
-}
-
-CONSTCD11
-inline
-year
-operator+(const years& x, const year& y) NOEXCEPT
-{
- return y + x;
-}
-
-CONSTCD11
-inline
-year
-operator-(const year& x, const years& y) NOEXCEPT
-{
- return year{static_cast<int>(x) - y.count()};
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year& y)
-{
- date::detail::save_ostream<CharT, Traits> _(os);
- os.fill('0');
- os.flags(std::ios::dec | std::ios::internal);
- os.width(4 + (y < year{0}));
- os << static_cast<int>(y);
- return os;
-}
-
-// weekday
-
-CONSTCD11
-inline
-unsigned char
-weekday::weekday_from_days(int z) NOEXCEPT
-{
- return static_cast<unsigned char>(static_cast<unsigned>(
- z >= -4 ? (z+4) % 7 : (z+5) % 7 + 6));
-}
-
-CONSTCD11
-inline
-weekday::weekday(unsigned wd) NOEXCEPT
- : wd_(static_cast<decltype(wd_)>(wd))
- {}
-
-CONSTCD11
-inline
-weekday::weekday(const sys_days& dp) NOEXCEPT
- : wd_(weekday_from_days(dp.time_since_epoch().count()))
- {}
-
-CONSTCD11
-inline
-weekday::weekday(const local_days& dp) NOEXCEPT
- : wd_(weekday_from_days(dp.time_since_epoch().count()))
- {}
-
-CONSTCD14 inline weekday& weekday::operator++() NOEXCEPT {if (++wd_ == 7) wd_ = 0; return *this;}
-CONSTCD14 inline weekday weekday::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-CONSTCD14 inline weekday& weekday::operator--() NOEXCEPT {if (wd_-- == 0) wd_ = 6; return *this;}
-CONSTCD14 inline weekday weekday::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-
-CONSTCD14
-inline
-weekday&
-weekday::operator+=(const days& d) NOEXCEPT
-{
- *this = *this + d;
- return *this;
-}
-
-CONSTCD14
-inline
-weekday&
-weekday::operator-=(const days& d) NOEXCEPT
-{
- *this = *this - d;
- return *this;
-}
-
-CONSTCD11
-inline
-weekday::operator unsigned() const NOEXCEPT
-{
- return static_cast<unsigned>(wd_);
-}
-
-CONSTCD11 inline bool weekday::ok() const NOEXCEPT {return wd_ <= 6;}
-
-CONSTCD11
-inline
-bool
-operator==(const weekday& x, const weekday& y) NOEXCEPT
-{
- return static_cast<unsigned>(x) == static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const weekday& x, const weekday& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD14
-inline
-days
-operator-(const weekday& x, const weekday& y) NOEXCEPT
-{
- auto const diff = static_cast<unsigned>(x) - static_cast<unsigned>(y);
- return days{diff <= 6 ? diff : diff + 7};
-}
-
-CONSTCD14
-inline
-weekday
-operator+(const weekday& x, const days& y) NOEXCEPT
-{
- auto const wdu = static_cast<long long>(static_cast<unsigned>(x)) + y.count();
- auto const wk = (wdu >= 0 ? wdu : wdu-6) / 7;
- return weekday{static_cast<unsigned>(wdu - wk * 7)};
-}
-
-CONSTCD14
-inline
-weekday
-operator+(const days& x, const weekday& y) NOEXCEPT
-{
- return y + x;
-}
-
-CONSTCD14
-inline
-weekday
-operator-(const weekday& x, const days& y) NOEXCEPT
-{
- return x + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday& wd)
-{
- switch (static_cast<unsigned>(wd))
- {
- case 0:
- os << "al-Aáž„ad";
- break;
- case 1:
- os << "al-Ithnayn";
- break;
- case 2:
- os << "ath-Thulāthā’";
- break;
- case 3:
- os << "al-Arba‘ā’";
- break;
- case 4:
- os << "al-Khamīs";
- break;
- case 5:
- os << "al-Jum‘ah";
- break;
- case 6:
- os << "as-Sabt";
- break;
- default:
- os << static_cast<unsigned>(wd) << " is not a valid weekday";
- break;
- }
- return os;
-}
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-inline namespace literals
-{
-
-CONSTCD11
-inline
-islamic::day
-operator "" _d(unsigned long long d) NOEXCEPT
-{
- return islamic::day{static_cast<unsigned>(d)};
-}
-
-CONSTCD11
-inline
-islamic::year
-operator "" _y(unsigned long long y) NOEXCEPT
-{
- return islamic::year(static_cast<int>(y));
-}
-#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900)
-
-CONSTDATA islamic::last_spec last{};
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-} // inline namespace literals
-#endif
-
-// weekday_indexed
-
-CONSTCD11
-inline
-weekday
-weekday_indexed::weekday() const NOEXCEPT
-{
- return islamic::weekday{static_cast<unsigned>(wd_)};
-}
-
-CONSTCD11 inline unsigned weekday_indexed::index() const NOEXCEPT {return index_;}
-
-CONSTCD11
-inline
-bool
-weekday_indexed::ok() const NOEXCEPT
-{
- return weekday().ok() && 1 <= index_ && index_ <= 5;
-}
-
-CONSTCD11
-inline
-weekday_indexed::weekday_indexed(const islamic::weekday& wd, unsigned index) NOEXCEPT
- : wd_(static_cast<decltype(wd_)>(static_cast<unsigned>(wd)))
- , index_(static_cast<decltype(index_)>(index))
- {}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday_indexed& wdi)
-{
- return os << wdi.weekday() << '[' << wdi.index() << ']';
-}
-
-CONSTCD11
-inline
-weekday_indexed
-weekday::operator[](unsigned index) const NOEXCEPT
-{
- return {*this, index};
-}
-
-CONSTCD11
-inline
-bool
-operator==(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT
-{
- return x.weekday() == y.weekday() && x.index() == y.index();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-// weekday_last
-
-CONSTCD11 inline islamic::weekday weekday_last::weekday() const NOEXCEPT {return wd_;}
-CONSTCD11 inline bool weekday_last::ok() const NOEXCEPT {return wd_.ok();}
-CONSTCD11 inline weekday_last::weekday_last(const islamic::weekday& wd) NOEXCEPT : wd_(wd) {}
-
-CONSTCD11
-inline
-bool
-operator==(const weekday_last& x, const weekday_last& y) NOEXCEPT
-{
- return x.weekday() == y.weekday();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const weekday_last& x, const weekday_last& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday_last& wdl)
-{
- return os << wdl.weekday() << "[last]";
-}
-
-CONSTCD11
-inline
-weekday_last
-weekday::operator[](last_spec) const NOEXCEPT
-{
- return weekday_last{*this};
-}
-
-// year_month
-
-CONSTCD11
-inline
-year_month::year_month(const islamic::year& y, const islamic::month& m) NOEXCEPT
- : y_(y)
- , m_(m)
- {}
-
-CONSTCD11 inline year year_month::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month::month() const NOEXCEPT {return m_;}
-CONSTCD11 inline bool year_month::ok() const NOEXCEPT {return y_.ok() && m_.ok();}
-
-CONSTCD14
-inline
-year_month&
-year_month::operator+=(const months& dm) NOEXCEPT
-{
- *this = *this + dm;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month&
-year_month::operator-=(const months& dm) NOEXCEPT
-{
- *this = *this - dm;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month&
-year_month::operator+=(const years& dy) NOEXCEPT
-{
- *this = *this + dy;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month&
-year_month::operator-=(const years& dy) NOEXCEPT
-{
- *this = *this - dy;
- return *this;
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month& x, const year_month& y) NOEXCEPT
-{
- return x.year() == y.year() && x.month() == y.month();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month& x, const year_month& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_month& x, const year_month& y) NOEXCEPT
-{
- return x.year() < y.year() ? true
- : (x.year() > y.year() ? false
- : (x.month() < y.month()));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_month& x, const year_month& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_month& x, const year_month& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_month& x, const year_month& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-CONSTCD14
-inline
-year_month
-operator+(const year_month& ym, const months& dm) NOEXCEPT
-{
- auto dmi = static_cast<int>(static_cast<unsigned>(ym.month())) - 1 + dm.count();
- auto dy = (dmi >= 0 ? dmi : dmi-11) / 12;
- dmi = dmi - dy * 12 + 1;
- return (ym.year() + years(dy)) / month(static_cast<unsigned>(dmi));
-}
-
-CONSTCD14
-inline
-year_month
-operator+(const months& dm, const year_month& ym) NOEXCEPT
-{
- return ym + dm;
-}
-
-CONSTCD14
-inline
-year_month
-operator-(const year_month& ym, const months& dm) NOEXCEPT
-{
- return ym + -dm;
-}
-
-CONSTCD11
-inline
-months
-operator-(const year_month& x, const year_month& y) NOEXCEPT
-{
- return (x.year() - y.year()) +
- months(static_cast<unsigned>(x.month()) - static_cast<unsigned>(y.month()));
-}
-
-CONSTCD11
-inline
-year_month
-operator+(const year_month& ym, const years& dy) NOEXCEPT
-{
- return (ym.year() + dy) / ym.month();
-}
-
-CONSTCD11
-inline
-year_month
-operator+(const years& dy, const year_month& ym) NOEXCEPT
-{
- return ym + dy;
-}
-
-CONSTCD11
-inline
-year_month
-operator-(const year_month& ym, const years& dy) NOEXCEPT
-{
- return ym + -dy;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month& ym)
-{
- return os << ym.year() << '/' << ym.month();
-}
-
-// month_day
-
-CONSTCD11
-inline
-month_day::month_day(const islamic::month& m, const islamic::day& d) NOEXCEPT
- : m_(m)
- , d_(d)
- {}
-
-CONSTCD11 inline islamic::month month_day::month() const NOEXCEPT {return m_;}
-CONSTCD11 inline islamic::day month_day::day() const NOEXCEPT {return d_;}
-
-CONSTCD14
-inline
-bool
-month_day::ok() const NOEXCEPT
-{
- CONSTDATA islamic::day d[] =
- {30_d, 29_d, 30_d, 29_d, 30_d, 29_d, 30_d, 29_d, 30_d, 29_d, 30_d, 30_d};
- return m_.ok() && 1_d <= d_ && d_ <= d[static_cast<unsigned>(m_)-1];
-}
-
-CONSTCD11
-inline
-bool
-operator==(const month_day& x, const month_day& y) NOEXCEPT
-{
- return x.month() == y.month() && x.day() == y.day();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month_day& x, const month_day& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const month_day& x, const month_day& y) NOEXCEPT
-{
- return x.month() < y.month() ? true
- : (x.month() > y.month() ? false
- : (x.day() < y.day()));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const month_day& x, const month_day& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const month_day& x, const month_day& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const month_day& x, const month_day& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_day& md)
-{
- return os << md.month() << '/' << md.day();
-}
-
-// month_day_last
-
-CONSTCD11 inline month month_day_last::month() const NOEXCEPT {return m_;}
-CONSTCD11 inline bool month_day_last::ok() const NOEXCEPT {return m_.ok();}
-CONSTCD11 inline month_day_last::month_day_last(const islamic::month& m) NOEXCEPT : m_(m) {}
-
-CONSTCD11
-inline
-bool
-operator==(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
- return x.month() == y.month();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
- return x.month() < y.month();
-}
-
-CONSTCD11
-inline
-bool
-operator>(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_day_last& mdl)
-{
- return os << mdl.month() << "/last";
-}
-
-// month_weekday
-
-CONSTCD11
-inline
-month_weekday::month_weekday(const islamic::month& m,
- const islamic::weekday_indexed& wdi) NOEXCEPT
- : m_(m)
- , wdi_(wdi)
- {}
-
-CONSTCD11 inline month month_weekday::month() const NOEXCEPT {return m_;}
-
-CONSTCD11
-inline
-weekday_indexed
-month_weekday::weekday_indexed() const NOEXCEPT
-{
- return wdi_;
-}
-
-CONSTCD11
-inline
-bool
-month_weekday::ok() const NOEXCEPT
-{
- return m_.ok() && wdi_.ok();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const month_weekday& x, const month_weekday& y) NOEXCEPT
-{
- return x.month() == y.month() && x.weekday_indexed() == y.weekday_indexed();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month_weekday& x, const month_weekday& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_weekday& mwd)
-{
- return os << mwd.month() << '/' << mwd.weekday_indexed();
-}
-
-// month_weekday_last
-
-CONSTCD11
-inline
-month_weekday_last::month_weekday_last(const islamic::month& m,
- const islamic::weekday_last& wdl) NOEXCEPT
- : m_(m)
- , wdl_(wdl)
- {}
-
-CONSTCD11 inline month month_weekday_last::month() const NOEXCEPT {return m_;}
-
-CONSTCD11
-inline
-weekday_last
-month_weekday_last::weekday_last() const NOEXCEPT
-{
- return wdl_;
-}
-
-CONSTCD11
-inline
-bool
-month_weekday_last::ok() const NOEXCEPT
-{
- return m_.ok() && wdl_.ok();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT
-{
- return x.month() == y.month() && x.weekday_last() == y.weekday_last();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_weekday_last& mwdl)
-{
- return os << mwdl.month() << '/' << mwdl.weekday_last();
-}
-
-// year_month_day_last
-
-CONSTCD11
-inline
-year_month_day_last::year_month_day_last(const islamic::year& y,
- const islamic::month_day_last& mdl) NOEXCEPT
- : y_(y)
- , mdl_(mdl)
- {}
-
-CONSTCD14
-inline
-year_month_day_last&
-year_month_day_last::operator+=(const months& m) NOEXCEPT
-{
- *this = *this + m;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_day_last&
-year_month_day_last::operator-=(const months& m) NOEXCEPT
-{
- *this = *this - m;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_day_last&
-year_month_day_last::operator+=(const years& y) NOEXCEPT
-{
- *this = *this + y;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_day_last&
-year_month_day_last::operator-=(const years& y) NOEXCEPT
-{
- *this = *this - y;
- return *this;
-}
-
-CONSTCD11 inline year year_month_day_last::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month_day_last::month() const NOEXCEPT {return mdl_.month();}
-
-CONSTCD11
-inline
-month_day_last
-year_month_day_last::month_day_last() const NOEXCEPT
-{
- return mdl_;
-}
-
-CONSTCD14
-inline
-day
-year_month_day_last::day() const NOEXCEPT
-{
- CONSTDATA islamic::day d[] =
- {30_d, 29_d, 30_d, 29_d, 30_d, 29_d, 30_d, 29_d, 30_d, 29_d, 30_d, 29_d};
- return month() != islamic::month(12) || !y_.is_leap() ?
- d[static_cast<unsigned>(month())-1] : 30_d;
-}
-
-CONSTCD14
-inline
-year_month_day_last::operator sys_days() const NOEXCEPT
-{
- return sys_days(year()/month()/day());
-}
-
-CONSTCD14
-inline
-year_month_day_last::operator local_days() const NOEXCEPT
-{
- return local_days(year()/month()/day());
-}
-
-CONSTCD11
-inline
-bool
-year_month_day_last::ok() const NOEXCEPT
-{
- return y_.ok() && mdl_.ok();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
- return x.year() == y.year() && x.month_day_last() == y.month_day_last();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
- return x.year() < y.year() ? true
- : (x.year() > y.year() ? false
- : (x.month_day_last() < y.month_day_last()));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_day_last& ymdl)
-{
- return os << ymdl.year() << '/' << ymdl.month_day_last();
-}
-
-CONSTCD14
-inline
-year_month_day_last
-operator+(const year_month_day_last& ymdl, const months& dm) NOEXCEPT
-{
- return (ymdl.year() / ymdl.month() + dm) / last;
-}
-
-CONSTCD14
-inline
-year_month_day_last
-operator+(const months& dm, const year_month_day_last& ymdl) NOEXCEPT
-{
- return ymdl + dm;
-}
-
-CONSTCD14
-inline
-year_month_day_last
-operator-(const year_month_day_last& ymdl, const months& dm) NOEXCEPT
-{
- return ymdl + (-dm);
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator+(const year_month_day_last& ymdl, const years& dy) NOEXCEPT
-{
- return {ymdl.year()+dy, ymdl.month_day_last()};
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator+(const years& dy, const year_month_day_last& ymdl) NOEXCEPT
-{
- return ymdl + dy;
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator-(const year_month_day_last& ymdl, const years& dy) NOEXCEPT
-{
- return ymdl + (-dy);
-}
-
-// year_month_day
-
-CONSTCD11
-inline
-year_month_day::year_month_day(const islamic::year& y, const islamic::month& m,
- const islamic::day& d) NOEXCEPT
- : y_(y)
- , m_(m)
- , d_(d)
- {}
-
-CONSTCD14
-inline
-year_month_day::year_month_day(const year_month_day_last& ymdl) NOEXCEPT
- : y_(ymdl.year())
- , m_(ymdl.month())
- , d_(ymdl.day())
- {}
-
-CONSTCD14
-inline
-year_month_day::year_month_day(sys_days dp) NOEXCEPT
- : year_month_day(from_days(dp.time_since_epoch()))
- {}
-
-CONSTCD14
-inline
-year_month_day::year_month_day(local_days dp) NOEXCEPT
- : year_month_day(from_days(dp.time_since_epoch()))
- {}
-
-CONSTCD11 inline year year_month_day::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month_day::month() const NOEXCEPT {return m_;}
-CONSTCD11 inline day year_month_day::day() const NOEXCEPT {return d_;}
-
-CONSTCD14
-inline
-year_month_day&
-year_month_day::operator+=(const months& m) NOEXCEPT
-{
- *this = *this + m;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_day&
-year_month_day::operator-=(const months& m) NOEXCEPT
-{
- *this = *this - m;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_day&
-year_month_day::operator+=(const years& y) NOEXCEPT
-{
- *this = *this + y;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_day&
-year_month_day::operator-=(const years& y) NOEXCEPT
-{
- *this = *this - y;
- return *this;
-}
-
-CONSTCD14
-inline
-days
-year_month_day::to_days() const NOEXCEPT
-{
- static_assert(std::numeric_limits<unsigned>::digits >= 18,
- "This algorithm has not been ported to a 16 bit unsigned integer");
- static_assert(std::numeric_limits<int>::digits >= 20,
- "This algorithm has not been ported to a 16 bit signed integer");
- auto const y = static_cast<int>(y_) - 1;
- auto const m = static_cast<unsigned>(m_);
- auto const d = static_cast<unsigned>(d_);
- auto const era = (y >= 0 ? y : y-29) / 30;
- auto const yoe = static_cast<unsigned>(y - era * 30); // [0, 29]
- auto const doy = 29*(m-1) + m/2 + d-1; // [0, 354]
- auto const doe = yoe * 354 + (11*(yoe+1)+3)/30 + doy; // [0, 10630]
- return days{era * 10631 + static_cast<int>(doe) - 492148};
-}
-
-CONSTCD14
-inline
-year_month_day::operator sys_days() const NOEXCEPT
-{
- return sys_days{to_days()};
-}
-
-CONSTCD14
-inline
-year_month_day::operator local_days() const NOEXCEPT
-{
- return local_days{to_days()};
-}
-
-CONSTCD14
-inline
-bool
-year_month_day::ok() const NOEXCEPT
-{
- if (!(y_.ok() && m_.ok()))
- return false;
- return 1_d <= d_ && d_ <= (y_/m_/last).day();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
- return x.year() == y.year() && x.month() == y.month() && x.day() == y.day();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
- return x.year() < y.year() ? true
- : (x.year() > y.year() ? false
- : (x.month() < y.month() ? true
- : (x.month() > y.month() ? false
- : (x.day() < y.day()))));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_day& ymd)
-{
- date::detail::save_ostream<CharT, Traits> _(os);
- os.fill('0');
- os.flags(std::ios::dec | std::ios::right);
- os << ymd.year() << '-';
- os.width(2);
- os << static_cast<unsigned>(ymd.month()) << '-';
- os << ymd.day();
- return os;
-}
-
-CONSTCD14
-inline
-year_month_day
-year_month_day::from_days(days dp) NOEXCEPT
-{
- static_assert(std::numeric_limits<unsigned>::digits >= 18,
- "This algorithm has not been ported to a 16 bit unsigned integer");
- static_assert(std::numeric_limits<int>::digits >= 20,
- "This algorithm has not been ported to a 16 bit signed integer");
- auto const z = dp.count() + 492148;
- auto const era = (z >= 0 ? z : z - 10630) / 10631;
- auto const doe = static_cast<unsigned>(z - era * 10631); // [0, 10630]
- auto const yoe = (30*doe + 10646)/10631 - 1; // [0, 29]
- auto const y = static_cast<sys_days::rep>(yoe) + era * 30 + 1;
- auto const doy = doe - (yoe * 354 + (11*(yoe+1)+3)/30); // [0, 354]
- auto const m = (11*doy + 330) / 325; // [1, 12]
- auto const d = doy - (29*(m-1) + m/2) + 1; // [1, 30]
- return year_month_day{islamic::year{y}, islamic::month(m), islamic::day(d)};
-}
-
-CONSTCD14
-inline
-year_month_day
-operator+(const year_month_day& ymd, const months& dm) NOEXCEPT
-{
- return (ymd.year() / ymd.month() + dm) / ymd.day();
-}
-
-CONSTCD14
-inline
-year_month_day
-operator+(const months& dm, const year_month_day& ymd) NOEXCEPT
-{
- return ymd + dm;
-}
-
-CONSTCD14
-inline
-year_month_day
-operator-(const year_month_day& ymd, const months& dm) NOEXCEPT
-{
- return ymd + (-dm);
-}
-
-CONSTCD11
-inline
-year_month_day
-operator+(const year_month_day& ymd, const years& dy) NOEXCEPT
-{
- return (ymd.year() + dy) / ymd.month() / ymd.day();
-}
-
-CONSTCD11
-inline
-year_month_day
-operator+(const years& dy, const year_month_day& ymd) NOEXCEPT
-{
- return ymd + dy;
-}
-
-CONSTCD11
-inline
-year_month_day
-operator-(const year_month_day& ymd, const years& dy) NOEXCEPT
-{
- return ymd + (-dy);
-}
-
-// year_month_weekday
-
-CONSTCD11
-inline
-year_month_weekday::year_month_weekday(const islamic::year& y, const islamic::month& m,
- const islamic::weekday_indexed& wdi)
- NOEXCEPT
- : y_(y)
- , m_(m)
- , wdi_(wdi)
- {}
-
-CONSTCD14
-inline
-year_month_weekday::year_month_weekday(const sys_days& dp) NOEXCEPT
- : year_month_weekday(from_days(dp.time_since_epoch()))
- {}
-
-CONSTCD14
-inline
-year_month_weekday::year_month_weekday(const local_days& dp) NOEXCEPT
- : year_month_weekday(from_days(dp.time_since_epoch()))
- {}
-
-CONSTCD14
-inline
-year_month_weekday&
-year_month_weekday::operator+=(const months& m) NOEXCEPT
-{
- *this = *this + m;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday&
-year_month_weekday::operator-=(const months& m) NOEXCEPT
-{
- *this = *this - m;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday&
-year_month_weekday::operator+=(const years& y) NOEXCEPT
-{
- *this = *this + y;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday&
-year_month_weekday::operator-=(const years& y) NOEXCEPT
-{
- *this = *this - y;
- return *this;
-}
-
-CONSTCD11 inline year year_month_weekday::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month_weekday::month() const NOEXCEPT {return m_;}
-
-CONSTCD11
-inline
-weekday
-year_month_weekday::weekday() const NOEXCEPT
-{
- return wdi_.weekday();
-}
-
-CONSTCD11
-inline
-unsigned
-year_month_weekday::index() const NOEXCEPT
-{
- return wdi_.index();
-}
-
-CONSTCD11
-inline
-weekday_indexed
-year_month_weekday::weekday_indexed() const NOEXCEPT
-{
- return wdi_;
-}
-
-CONSTCD14
-inline
-year_month_weekday::operator sys_days() const NOEXCEPT
-{
- return sys_days{to_days()};
-}
-
-CONSTCD14
-inline
-year_month_weekday::operator local_days() const NOEXCEPT
-{
- return local_days{to_days()};
-}
-
-CONSTCD14
-inline
-bool
-year_month_weekday::ok() const NOEXCEPT
-{
- if (!y_.ok() || !m_.ok() || !wdi_.weekday().ok() || wdi_.index() < 1)
- return false;
- if (wdi_.index() <= 4)
- return true;
- auto d2 = wdi_.weekday() - islamic::weekday(y_/m_/1) + days((wdi_.index()-1)*7 + 1);
- return static_cast<unsigned>(d2.count()) <= static_cast<unsigned>((y_/m_/last).day());
-}
-
-CONSTCD14
-inline
-year_month_weekday
-year_month_weekday::from_days(days d) NOEXCEPT
-{
- sys_days dp{d};
- auto const wd = islamic::weekday(dp);
- auto const ymd = year_month_day(dp);
- return {ymd.year(), ymd.month(), wd[(static_cast<unsigned>(ymd.day())-1)/7+1]};
-}
-
-CONSTCD14
-inline
-days
-year_month_weekday::to_days() const NOEXCEPT
-{
- auto d = sys_days(y_/m_/1);
- return (d + (wdi_.weekday() - islamic::weekday(d) + days{(wdi_.index()-1)*7})
- ).time_since_epoch();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT
-{
- return x.year() == y.year() && x.month() == y.month() &&
- x.weekday_indexed() == y.weekday_indexed();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday& ymwdi)
-{
- return os << ymwdi.year() << '/' << ymwdi.month()
- << '/' << ymwdi.weekday_indexed();
-}
-
-CONSTCD14
-inline
-year_month_weekday
-operator+(const year_month_weekday& ymwd, const months& dm) NOEXCEPT
-{
- return (ymwd.year() / ymwd.month() + dm) / ymwd.weekday_indexed();
-}
-
-CONSTCD14
-inline
-year_month_weekday
-operator+(const months& dm, const year_month_weekday& ymwd) NOEXCEPT
-{
- return ymwd + dm;
-}
-
-CONSTCD14
-inline
-year_month_weekday
-operator-(const year_month_weekday& ymwd, const months& dm) NOEXCEPT
-{
- return ymwd + (-dm);
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator+(const year_month_weekday& ymwd, const years& dy) NOEXCEPT
-{
- return {ymwd.year()+dy, ymwd.month(), ymwd.weekday_indexed()};
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator+(const years& dy, const year_month_weekday& ymwd) NOEXCEPT
-{
- return ymwd + dy;
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator-(const year_month_weekday& ymwd, const years& dy) NOEXCEPT
-{
- return ymwd + (-dy);
-}
-
-// year_month_weekday_last
-
-CONSTCD11
-inline
-year_month_weekday_last::year_month_weekday_last(const islamic::year& y,
- const islamic::month& m,
- const islamic::weekday_last& wdl) NOEXCEPT
- : y_(y)
- , m_(m)
- , wdl_(wdl)
- {}
-
-CONSTCD14
-inline
-year_month_weekday_last&
-year_month_weekday_last::operator+=(const months& m) NOEXCEPT
-{
- *this = *this + m;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last&
-year_month_weekday_last::operator-=(const months& m) NOEXCEPT
-{
- *this = *this - m;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last&
-year_month_weekday_last::operator+=(const years& y) NOEXCEPT
-{
- *this = *this + y;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last&
-year_month_weekday_last::operator-=(const years& y) NOEXCEPT
-{
- *this = *this - y;
- return *this;
-}
-
-CONSTCD11 inline year year_month_weekday_last::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month_weekday_last::month() const NOEXCEPT {return m_;}
-
-CONSTCD11
-inline
-weekday
-year_month_weekday_last::weekday() const NOEXCEPT
-{
- return wdl_.weekday();
-}
-
-CONSTCD11
-inline
-weekday_last
-year_month_weekday_last::weekday_last() const NOEXCEPT
-{
- return wdl_;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last::operator sys_days() const NOEXCEPT
-{
- return sys_days{to_days()};
-}
-
-CONSTCD14
-inline
-year_month_weekday_last::operator local_days() const NOEXCEPT
-{
- return local_days{to_days()};
-}
-
-CONSTCD11
-inline
-bool
-year_month_weekday_last::ok() const NOEXCEPT
-{
- return y_.ok() && m_.ok() && wdl_.ok();
-}
-
-CONSTCD14
-inline
-days
-year_month_weekday_last::to_days() const NOEXCEPT
-{
- auto const d = sys_days(y_/m_/last);
- return (d - (islamic::weekday{d} - wdl_.weekday())).time_since_epoch();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT
-{
- return x.year() == y.year() && x.month() == y.month() &&
- x.weekday_last() == y.weekday_last();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday_last& ymwdl)
-{
- return os << ymwdl.year() << '/' << ymwdl.month() << '/' << ymwdl.weekday_last();
-}
-
-CONSTCD14
-inline
-year_month_weekday_last
-operator+(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT
-{
- return (ymwdl.year() / ymwdl.month() + dm) / ymwdl.weekday_last();
-}
-
-CONSTCD14
-inline
-year_month_weekday_last
-operator+(const months& dm, const year_month_weekday_last& ymwdl) NOEXCEPT
-{
- return ymwdl + dm;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last
-operator-(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT
-{
- return ymwdl + (-dm);
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator+(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT
-{
- return {ymwdl.year()+dy, ymwdl.month(), ymwdl.weekday_last()};
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator+(const years& dy, const year_month_weekday_last& ymwdl) NOEXCEPT
-{
- return ymwdl + dy;
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator-(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT
-{
- return ymwdl + (-dy);
-}
-
-// year_month from operator/()
-
-CONSTCD11
-inline
-year_month
-operator/(const year& y, const month& m) NOEXCEPT
-{
- return {y, m};
-}
-
-CONSTCD11
-inline
-year_month
-operator/(const year& y, int m) NOEXCEPT
-{
- return y / month(static_cast<unsigned>(m));
-}
-
-// month_day from operator/()
-
-CONSTCD11
-inline
-month_day
-operator/(const month& m, const day& d) NOEXCEPT
-{
- return {m, d};
-}
-
-CONSTCD11
-inline
-month_day
-operator/(const day& d, const month& m) NOEXCEPT
-{
- return m / d;
-}
-
-CONSTCD11
-inline
-month_day
-operator/(const month& m, int d) NOEXCEPT
-{
- return m / day(static_cast<unsigned>(d));
-}
-
-CONSTCD11
-inline
-month_day
-operator/(int m, const day& d) NOEXCEPT
-{
- return month(static_cast<unsigned>(m)) / d;
-}
-
-CONSTCD11 inline month_day operator/(const day& d, int m) NOEXCEPT {return m / d;}
-
-// month_day_last from operator/()
-
-CONSTCD11
-inline
-month_day_last
-operator/(const month& m, last_spec) NOEXCEPT
-{
- return month_day_last{m};
-}
-
-CONSTCD11
-inline
-month_day_last
-operator/(last_spec, const month& m) NOEXCEPT
-{
- return m/last;
-}
-
-CONSTCD11
-inline
-month_day_last
-operator/(int m, last_spec) NOEXCEPT
-{
- return month(static_cast<unsigned>(m))/last;
-}
-
-CONSTCD11
-inline
-month_day_last
-operator/(last_spec, int m) NOEXCEPT
-{
- return m/last;
-}
-
-// month_weekday from operator/()
-
-CONSTCD11
-inline
-month_weekday
-operator/(const month& m, const weekday_indexed& wdi) NOEXCEPT
-{
- return {m, wdi};
-}
-
-CONSTCD11
-inline
-month_weekday
-operator/(const weekday_indexed& wdi, const month& m) NOEXCEPT
-{
- return m / wdi;
-}
-
-CONSTCD11
-inline
-month_weekday
-operator/(int m, const weekday_indexed& wdi) NOEXCEPT
-{
- return month(static_cast<unsigned>(m)) / wdi;
-}
-
-CONSTCD11
-inline
-month_weekday
-operator/(const weekday_indexed& wdi, int m) NOEXCEPT
-{
- return m / wdi;
-}
-
-// month_weekday_last from operator/()
-
-CONSTCD11
-inline
-month_weekday_last
-operator/(const month& m, const weekday_last& wdl) NOEXCEPT
-{
- return {m, wdl};
-}
-
-CONSTCD11
-inline
-month_weekday_last
-operator/(const weekday_last& wdl, const month& m) NOEXCEPT
-{
- return m / wdl;
-}
-
-CONSTCD11
-inline
-month_weekday_last
-operator/(int m, const weekday_last& wdl) NOEXCEPT
-{
- return month(static_cast<unsigned>(m)) / wdl;
-}
-
-CONSTCD11
-inline
-month_weekday_last
-operator/(const weekday_last& wdl, int m) NOEXCEPT
-{
- return m / wdl;
-}
-
-// year_month_day from operator/()
-
-CONSTCD11
-inline
-year_month_day
-operator/(const year_month& ym, const day& d) NOEXCEPT
-{
- return {ym.year(), ym.month(), d};
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(const year_month& ym, int d) NOEXCEPT
-{
- return ym / day(static_cast<unsigned>(d));
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(const year& y, const month_day& md) NOEXCEPT
-{
- return y / md.month() / md.day();
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(int y, const month_day& md) NOEXCEPT
-{
- return year(y) / md;
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(const month_day& md, const year& y) NOEXCEPT
-{
- return y / md;
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(const month_day& md, int y) NOEXCEPT
-{
- return year(y) / md;
-}
-
-// year_month_day_last from operator/()
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(const year_month& ym, last_spec) NOEXCEPT
-{
- return {ym.year(), month_day_last{ym.month()}};
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(const year& y, const month_day_last& mdl) NOEXCEPT
-{
- return {y, mdl};
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(int y, const month_day_last& mdl) NOEXCEPT
-{
- return year(y) / mdl;
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(const month_day_last& mdl, const year& y) NOEXCEPT
-{
- return y / mdl;
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(const month_day_last& mdl, int y) NOEXCEPT
-{
- return year(y) / mdl;
-}
-
-// year_month_weekday from operator/()
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(const year_month& ym, const weekday_indexed& wdi) NOEXCEPT
-{
- return {ym.year(), ym.month(), wdi};
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(const year& y, const month_weekday& mwd) NOEXCEPT
-{
- return {y, mwd.month(), mwd.weekday_indexed()};
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(int y, const month_weekday& mwd) NOEXCEPT
-{
- return year(y) / mwd;
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(const month_weekday& mwd, const year& y) NOEXCEPT
-{
- return y / mwd;
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(const month_weekday& mwd, int y) NOEXCEPT
-{
- return year(y) / mwd;
-}
-
-// year_month_weekday_last from operator/()
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(const year_month& ym, const weekday_last& wdl) NOEXCEPT
-{
- return {ym.year(), ym.month(), wdl};
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(const year& y, const month_weekday_last& mwdl) NOEXCEPT
-{
- return {y, mwdl.month(), mwdl.weekday_last()};
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(int y, const month_weekday_last& mwdl) NOEXCEPT
-{
- return year(y) / mwdl;
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(const month_weekday_last& mwdl, const year& y) NOEXCEPT
-{
- return y / mwdl;
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(const month_weekday_last& mwdl, int y) NOEXCEPT
-{
- return year(y) / mwdl;
-}
-
-} // namespace islamic
-
-#endif // ISLAMIC_H
diff --git a/src/libs/date/includes/date/iso_week.h b/src/libs/date/includes/date/iso_week.h
deleted file mode 100644
index 4a0a4a9b..00000000
--- a/src/libs/date/includes/date/iso_week.h
+++ /dev/null
@@ -1,1751 +0,0 @@
-#ifndef ISO_WEEK_H
-#define ISO_WEEK_H
-
-// The MIT License (MIT)
-//
-// Copyright (c) 2015, 2016, 2017 Howard Hinnant
-//
-// 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.
-
-#include "date.h"
-
-#include <climits>
-
-namespace iso_week
-{
-
-// y/wn/wd
-// wn/wd/y
-// wd/wn/y
-
-using days = date::days;
-using weeks = date::weeks;
-using years = date::years;
-
-// time_point
-
-using sys_days = date::sys_days;
-using local_days = date::local_days;
-
-// types
-
-struct last_week
-{
- explicit last_week() = default;
-};
-
-class weekday;
-class weeknum;
-class year;
-
-class year_weeknum;
-class year_lastweek;
-class weeknum_weekday;
-class lastweek_weekday;
-
-class year_weeknum_weekday;
-class year_lastweek_weekday;
-
-// date composition operators
-
-CONSTCD11 year_weeknum operator/(const year& y, const weeknum& wn) NOEXCEPT;
-CONSTCD11 year_weeknum operator/(const year& y, int wn) NOEXCEPT;
-
-CONSTCD11 year_lastweek operator/(const year& y, last_week wn) NOEXCEPT;
-
-CONSTCD11 weeknum_weekday operator/(const weeknum& wn, const weekday& wd) NOEXCEPT;
-CONSTCD11 weeknum_weekday operator/(const weeknum& wn, int wd) NOEXCEPT;
-CONSTCD11 weeknum_weekday operator/(const weekday& wd, const weeknum& wn) NOEXCEPT;
-CONSTCD11 weeknum_weekday operator/(const weekday& wd, int wn) NOEXCEPT;
-
-CONSTCD11 lastweek_weekday operator/(const last_week& wn, const weekday& wd) NOEXCEPT;
-CONSTCD11 lastweek_weekday operator/(const last_week& wn, int wd) NOEXCEPT;
-CONSTCD11 lastweek_weekday operator/(const weekday& wd, const last_week& wn) NOEXCEPT;
-
-CONSTCD11 year_weeknum_weekday operator/(const year_weeknum& ywn, const weekday& wd) NOEXCEPT;
-CONSTCD11 year_weeknum_weekday operator/(const year_weeknum& ywn, int wd) NOEXCEPT;
-CONSTCD11 year_weeknum_weekday operator/(const weeknum_weekday& wnwd, const year& y) NOEXCEPT;
-CONSTCD11 year_weeknum_weekday operator/(const weeknum_weekday& wnwd, int y) NOEXCEPT;
-
-CONSTCD11 year_lastweek_weekday operator/(const year_lastweek& ylw, const weekday& wd) NOEXCEPT;
-CONSTCD11 year_lastweek_weekday operator/(const year_lastweek& ylw, int wd) NOEXCEPT;
-
-CONSTCD11 year_lastweek_weekday operator/(const lastweek_weekday& lwwd, const year& y) NOEXCEPT;
-CONSTCD11 year_lastweek_weekday operator/(const lastweek_weekday& lwwd, int y) NOEXCEPT;
-
-// weekday
-
-class weekday
-{
- unsigned char wd_;
-public:
- explicit CONSTCD11 weekday(unsigned wd) NOEXCEPT;
- CONSTCD11 weekday(date::weekday wd) NOEXCEPT;
- explicit weekday(int) = delete;
- CONSTCD11 weekday(const sys_days& dp) NOEXCEPT;
- CONSTCD11 explicit weekday(const local_days& dp) NOEXCEPT;
-
- weekday& operator++() NOEXCEPT;
- weekday operator++(int) NOEXCEPT;
- weekday& operator--() NOEXCEPT;
- weekday operator--(int) NOEXCEPT;
-
- weekday& operator+=(const days& d) NOEXCEPT;
- weekday& operator-=(const days& d) NOEXCEPT;
-
- CONSTCD11 explicit operator unsigned() const NOEXCEPT;
- CONSTCD11 operator date::weekday() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-
-private:
- static CONSTCD11 unsigned char weekday_from_days(int z) NOEXCEPT;
- static CONSTCD11 unsigned char to_iso_encoding(unsigned char) NOEXCEPT;
- static CONSTCD11 unsigned from_iso_encoding(unsigned) NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const weekday& x, const weekday& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const weekday& x, const weekday& y) NOEXCEPT;
-
-CONSTCD14 weekday operator+(const weekday& x, const days& y) NOEXCEPT;
-CONSTCD14 weekday operator+(const days& x, const weekday& y) NOEXCEPT;
-CONSTCD14 weekday operator-(const weekday& x, const days& y) NOEXCEPT;
-CONSTCD14 days operator-(const weekday& x, const weekday& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday& wd);
-
-// year
-
-class year
-{
- short y_;
-
-public:
- explicit CONSTCD11 year(int y) NOEXCEPT;
-
- year& operator++() NOEXCEPT;
- year operator++(int) NOEXCEPT;
- year& operator--() NOEXCEPT;
- year operator--(int) NOEXCEPT;
-
- year& operator+=(const years& y) NOEXCEPT;
- year& operator-=(const years& y) NOEXCEPT;
-
- CONSTCD11 explicit operator int() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-
- static CONSTCD11 year min() NOEXCEPT;
- static CONSTCD11 year max() NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year& x, const year& y) NOEXCEPT;
-
-CONSTCD11 year operator+(const year& x, const years& y) NOEXCEPT;
-CONSTCD11 year operator+(const years& x, const year& y) NOEXCEPT;
-CONSTCD11 year operator-(const year& x, const years& y) NOEXCEPT;
-CONSTCD11 years operator-(const year& x, const year& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year& y);
-
-// weeknum
-
-class weeknum
-{
- unsigned char wn_;
-
-public:
- explicit CONSTCD11 weeknum(unsigned wn) NOEXCEPT;
-
- weeknum& operator++() NOEXCEPT;
- weeknum operator++(int) NOEXCEPT;
- weeknum& operator--() NOEXCEPT;
- weeknum operator--(int) NOEXCEPT;
-
- weeknum& operator+=(const weeks& y) NOEXCEPT;
- weeknum& operator-=(const weeks& y) NOEXCEPT;
-
- CONSTCD11 explicit operator unsigned() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const weeknum& x, const weeknum& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const weeknum& x, const weeknum& y) NOEXCEPT;
-CONSTCD11 bool operator< (const weeknum& x, const weeknum& y) NOEXCEPT;
-CONSTCD11 bool operator> (const weeknum& x, const weeknum& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const weeknum& x, const weeknum& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const weeknum& x, const weeknum& y) NOEXCEPT;
-
-CONSTCD11 weeknum operator+(const weeknum& x, const weeks& y) NOEXCEPT;
-CONSTCD11 weeknum operator+(const weeks& x, const weeknum& y) NOEXCEPT;
-CONSTCD11 weeknum operator-(const weeknum& x, const weeks& y) NOEXCEPT;
-CONSTCD11 weeks operator-(const weeknum& x, const weeknum& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weeknum& wn);
-
-// year_weeknum
-
-class year_weeknum
-{
- iso_week::year y_;
- iso_week::weeknum wn_;
-
-public:
- CONSTCD11 year_weeknum(const iso_week::year& y, const iso_week::weeknum& wn) NOEXCEPT;
-
- CONSTCD11 iso_week::year year() const NOEXCEPT;
- CONSTCD11 iso_week::weeknum weeknum() const NOEXCEPT;
-
- year_weeknum& operator+=(const years& dy) NOEXCEPT;
- year_weeknum& operator-=(const years& dy) NOEXCEPT;
-
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year_weeknum& x, const year_weeknum& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year_weeknum& x, const year_weeknum& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year_weeknum& x, const year_weeknum& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year_weeknum& x, const year_weeknum& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year_weeknum& x, const year_weeknum& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year_weeknum& x, const year_weeknum& y) NOEXCEPT;
-
-CONSTCD11 year_weeknum operator+(const year_weeknum& ym, const years& dy) NOEXCEPT;
-CONSTCD11 year_weeknum operator+(const years& dy, const year_weeknum& ym) NOEXCEPT;
-CONSTCD11 year_weeknum operator-(const year_weeknum& ym, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_weeknum& ym);
-
-// year_lastweek
-
-class year_lastweek
-{
- iso_week::year y_;
-
-public:
- CONSTCD11 explicit year_lastweek(const iso_week::year& y) NOEXCEPT;
-
- CONSTCD11 iso_week::year year() const NOEXCEPT;
- CONSTCD14 iso_week::weeknum weeknum() const NOEXCEPT;
-
- year_lastweek& operator+=(const years& dy) NOEXCEPT;
- year_lastweek& operator-=(const years& dy) NOEXCEPT;
-
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year_lastweek& x, const year_lastweek& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year_lastweek& x, const year_lastweek& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year_lastweek& x, const year_lastweek& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year_lastweek& x, const year_lastweek& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year_lastweek& x, const year_lastweek& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year_lastweek& x, const year_lastweek& y) NOEXCEPT;
-
-CONSTCD11 year_lastweek operator+(const year_lastweek& ym, const years& dy) NOEXCEPT;
-CONSTCD11 year_lastweek operator+(const years& dy, const year_lastweek& ym) NOEXCEPT;
-CONSTCD11 year_lastweek operator-(const year_lastweek& ym, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_lastweek& ym);
-
-// weeknum_weekday
-
-class weeknum_weekday
-{
- iso_week::weeknum wn_;
- iso_week::weekday wd_;
-
-public:
- CONSTCD11 weeknum_weekday(const iso_week::weeknum& wn,
- const iso_week::weekday& wd) NOEXCEPT;
-
- CONSTCD11 iso_week::weeknum weeknum() const NOEXCEPT;
- CONSTCD11 iso_week::weekday weekday() const NOEXCEPT;
-
- CONSTCD14 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator< (const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator> (const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weeknum_weekday& md);
-
-// lastweek_weekday
-
-class lastweek_weekday
-{
- iso_week::weekday wd_;
-
-public:
- CONSTCD11 explicit lastweek_weekday(const iso_week::weekday& wd) NOEXCEPT;
-
- CONSTCD11 iso_week::weekday weekday() const NOEXCEPT;
-
- CONSTCD14 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator< (const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator> (const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const lastweek_weekday& md);
-
-// year_lastweek_weekday
-
-class year_lastweek_weekday
-{
- iso_week::year y_;
- iso_week::weekday wd_;
-
-public:
- CONSTCD11 year_lastweek_weekday(const iso_week::year& y,
- const iso_week::weekday& wd) NOEXCEPT;
-
- year_lastweek_weekday& operator+=(const years& y) NOEXCEPT;
- year_lastweek_weekday& operator-=(const years& y) NOEXCEPT;
-
- CONSTCD11 iso_week::year year() const NOEXCEPT;
- CONSTCD14 iso_week::weeknum weeknum() const NOEXCEPT;
- CONSTCD11 iso_week::weekday weekday() const NOEXCEPT;
-
- CONSTCD14 operator sys_days() const NOEXCEPT;
- CONSTCD14 explicit operator local_days() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT;
-
-CONSTCD11 year_lastweek_weekday operator+(const year_lastweek_weekday& ywnwd, const years& y) NOEXCEPT;
-CONSTCD11 year_lastweek_weekday operator+(const years& y, const year_lastweek_weekday& ywnwd) NOEXCEPT;
-CONSTCD11 year_lastweek_weekday operator-(const year_lastweek_weekday& ywnwd, const years& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_lastweek_weekday& ywnwd);
-
-// class year_weeknum_weekday
-
-class year_weeknum_weekday
-{
- iso_week::year y_;
- iso_week::weeknum wn_;
- iso_week::weekday wd_;
-
-public:
- CONSTCD11 year_weeknum_weekday(const iso_week::year& y, const iso_week::weeknum& wn,
- const iso_week::weekday& wd) NOEXCEPT;
- CONSTCD14 year_weeknum_weekday(const year_lastweek_weekday& ylwwd) NOEXCEPT;
- CONSTCD14 year_weeknum_weekday(const sys_days& dp) NOEXCEPT;
- CONSTCD14 explicit year_weeknum_weekday(const local_days& dp) NOEXCEPT;
-
- year_weeknum_weekday& operator+=(const years& y) NOEXCEPT;
- year_weeknum_weekday& operator-=(const years& y) NOEXCEPT;
-
- CONSTCD11 iso_week::year year() const NOEXCEPT;
- CONSTCD11 iso_week::weeknum weeknum() const NOEXCEPT;
- CONSTCD11 iso_week::weekday weekday() const NOEXCEPT;
-
- CONSTCD14 operator sys_days() const NOEXCEPT;
- CONSTCD14 explicit operator local_days() const NOEXCEPT;
- CONSTCD14 bool ok() const NOEXCEPT;
-
-private:
- static CONSTCD14 year_weeknum_weekday from_days(days dp) NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT;
-
-CONSTCD11 year_weeknum_weekday operator+(const year_weeknum_weekday& ywnwd, const years& y) NOEXCEPT;
-CONSTCD11 year_weeknum_weekday operator+(const years& y, const year_weeknum_weekday& ywnwd) NOEXCEPT;
-CONSTCD11 year_weeknum_weekday operator-(const year_weeknum_weekday& ywnwd, const years& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_weeknum_weekday& ywnwd);
-
-//----------------+
-// Implementation |
-//----------------+
-
-// weekday
-
-CONSTCD11
-inline
-unsigned char
-weekday::to_iso_encoding(unsigned char z) NOEXCEPT
-{
- return z != 0 ? z : (unsigned char)7;
-}
-
-CONSTCD11
-inline
-unsigned
-weekday::from_iso_encoding(unsigned z) NOEXCEPT
-{
- return z != 7 ? z : 0u;
-}
-
-CONSTCD11
-inline
-unsigned char
-weekday::weekday_from_days(int z) NOEXCEPT
-{
- return to_iso_encoding(static_cast<unsigned char>(static_cast<unsigned>(
- z >= -4 ? (z+4) % 7 : (z+5) % 7 + 6)));
-}
-
-CONSTCD11
-inline
-weekday::weekday(unsigned wd) NOEXCEPT
- : wd_(static_cast<decltype(wd_)>(wd))
- {}
-
-CONSTCD11
-inline
-weekday::weekday(date::weekday wd) NOEXCEPT
- : wd_(wd.iso_encoding())
- {}
-
-CONSTCD11
-inline
-weekday::weekday(const sys_days& dp) NOEXCEPT
- : wd_(weekday_from_days(dp.time_since_epoch().count()))
- {}
-
-CONSTCD11
-inline
-weekday::weekday(const local_days& dp) NOEXCEPT
- : wd_(weekday_from_days(dp.time_since_epoch().count()))
- {}
-
-inline weekday& weekday::operator++() NOEXCEPT {if (++wd_ == 8) wd_ = 1; return *this;}
-inline weekday weekday::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-inline weekday& weekday::operator--() NOEXCEPT {if (wd_-- == 1) wd_ = 7; return *this;}
-inline weekday weekday::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-
-inline
-weekday&
-weekday::operator+=(const days& d) NOEXCEPT
-{
- *this = *this + d;
- return *this;
-}
-
-inline
-weekday&
-weekday::operator-=(const days& d) NOEXCEPT
-{
- *this = *this - d;
- return *this;
-}
-
-CONSTCD11
-inline
-weekday::operator unsigned() const NOEXCEPT
-{
- return wd_;
-}
-
-CONSTCD11
-inline
-weekday::operator date::weekday() const NOEXCEPT
-{
- return date::weekday{from_iso_encoding(unsigned{wd_})};
-}
-
-CONSTCD11 inline bool weekday::ok() const NOEXCEPT {return 1 <= wd_ && wd_ <= 7;}
-
-CONSTCD11
-inline
-bool
-operator==(const weekday& x, const weekday& y) NOEXCEPT
-{
- return static_cast<unsigned>(x) == static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const weekday& x, const weekday& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD14
-inline
-days
-operator-(const weekday& x, const weekday& y) NOEXCEPT
-{
- auto const diff = static_cast<unsigned>(x) - static_cast<unsigned>(y);
- return days{diff <= 6 ? diff : diff + 7};
-}
-
-CONSTCD14
-inline
-weekday
-operator+(const weekday& x, const days& y) NOEXCEPT
-{
- auto const wdu = static_cast<long long>(static_cast<unsigned>(x) - 1u) + y.count();
- auto const wk = (wdu >= 0 ? wdu : wdu-6) / 7;
- return weekday{static_cast<unsigned>(wdu - wk * 7) + 1u};
-}
-
-CONSTCD14
-inline
-weekday
-operator+(const days& x, const weekday& y) NOEXCEPT
-{
- return y + x;
-}
-
-CONSTCD14
-inline
-weekday
-operator-(const weekday& x, const days& y) NOEXCEPT
-{
- return x + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday& wd)
-{
- switch (static_cast<unsigned>(wd))
- {
- case 7:
- os << "Sun";
- break;
- case 1:
- os << "Mon";
- break;
- case 2:
- os << "Tue";
- break;
- case 3:
- os << "Wed";
- break;
- case 4:
- os << "Thu";
- break;
- case 5:
- os << "Fri";
- break;
- case 6:
- os << "Sat";
- break;
- default:
- os << static_cast<unsigned>(wd) << " is not a valid weekday";
- break;
- }
- return os;
-}
-
-// year
-
-CONSTCD11 inline year::year(int y) NOEXCEPT : y_(static_cast<decltype(y_)>(y)) {}
-inline year& year::operator++() NOEXCEPT {++y_; return *this;}
-inline year year::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-inline year& year::operator--() NOEXCEPT {--y_; return *this;}
-inline year year::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-inline year& year::operator+=(const years& y) NOEXCEPT {*this = *this + y; return *this;}
-inline year& year::operator-=(const years& y) NOEXCEPT {*this = *this - y; return *this;}
-
-CONSTCD11 inline year::operator int() const NOEXCEPT {return y_;}
-CONSTCD11 inline bool year::ok() const NOEXCEPT {return min() <= *this && *this <= max();}
-
-CONSTCD11
-inline
-year
-year::min() NOEXCEPT
-{
- using std::chrono::seconds;
- using std::chrono::minutes;
- using std::chrono::hours;
- using std::chrono::duration_cast;
- static_assert(sizeof(seconds)*CHAR_BIT >= 41, "seconds may overflow");
- static_assert(sizeof(hours)*CHAR_BIT >= 30, "hours may overflow");
- return sizeof(minutes)*CHAR_BIT < 34 ?
- year{1970} + duration_cast<years>(minutes::min()) :
- year{std::numeric_limits<short>::min()};
-}
-
-CONSTCD11
-inline
-year
-year::max() NOEXCEPT
-{
- using std::chrono::seconds;
- using std::chrono::minutes;
- using std::chrono::hours;
- using std::chrono::duration_cast;
- static_assert(sizeof(seconds)*CHAR_BIT >= 41, "seconds may overflow");
- static_assert(sizeof(hours)*CHAR_BIT >= 30, "hours may overflow");
- return sizeof(minutes)*CHAR_BIT < 34 ?
- year{1969} + duration_cast<years>(minutes::max()) :
- year{std::numeric_limits<short>::max()};
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year& x, const year& y) NOEXCEPT
-{
- return static_cast<int>(x) == static_cast<int>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year& x, const year& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year& x, const year& y) NOEXCEPT
-{
- return static_cast<int>(x) < static_cast<int>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year& x, const year& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year& x, const year& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year& x, const year& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-CONSTCD11
-inline
-years
-operator-(const year& x, const year& y) NOEXCEPT
-{
- return years{static_cast<int>(x) - static_cast<int>(y)};
-}
-
-CONSTCD11
-inline
-year
-operator+(const year& x, const years& y) NOEXCEPT
-{
- return year{static_cast<int>(x) + y.count()};
-}
-
-CONSTCD11
-inline
-year
-operator+(const years& x, const year& y) NOEXCEPT
-{
- return y + x;
-}
-
-CONSTCD11
-inline
-year
-operator-(const year& x, const years& y) NOEXCEPT
-{
- return year{static_cast<int>(x) - y.count()};
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year& y)
-{
- date::detail::save_ostream<CharT, Traits> _(os);
- os.fill('0');
- os.flags(std::ios::dec | std::ios::internal);
- os.width(4 + (y < year{0}));
- os << static_cast<int>(y);
- return os;
-}
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-inline namespace literals
-{
-
-CONSTCD11
-inline
-iso_week::year
-operator "" _y(unsigned long long y) NOEXCEPT
-{
- return iso_week::year(static_cast<int>(y));
-}
-
-CONSTCD11
-inline
-iso_week::weeknum
-operator "" _w(unsigned long long wn) NOEXCEPT
-{
- return iso_week::weeknum(static_cast<unsigned>(wn));
-}
-
-#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900)
-
-CONSTDATA iso_week::last_week last{};
-
-CONSTDATA iso_week::weekday sun{7u};
-CONSTDATA iso_week::weekday mon{1u};
-CONSTDATA iso_week::weekday tue{2u};
-CONSTDATA iso_week::weekday wed{3u};
-CONSTDATA iso_week::weekday thu{4u};
-CONSTDATA iso_week::weekday fri{5u};
-CONSTDATA iso_week::weekday sat{6u};
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-} // inline namespace literals
-#endif
-
-// weeknum
-
-CONSTCD11
-inline
-weeknum::weeknum(unsigned wn) NOEXCEPT
- : wn_(static_cast<decltype(wn_)>(wn))
- {}
-
-inline weeknum& weeknum::operator++() NOEXCEPT {++wn_; return *this;}
-inline weeknum weeknum::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-inline weeknum& weeknum::operator--() NOEXCEPT {--wn_; return *this;}
-inline weeknum weeknum::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-
-inline
-weeknum&
-weeknum::operator+=(const weeks& y) NOEXCEPT
-{
- *this = *this + y;
- return *this;
-}
-
-inline
-weeknum&
-weeknum::operator-=(const weeks& y) NOEXCEPT
-{
- *this = *this - y;
- return *this;
-}
-
-CONSTCD11 inline weeknum::operator unsigned() const NOEXCEPT {return wn_;}
-CONSTCD11 inline bool weeknum::ok() const NOEXCEPT {return 1 <= wn_ && wn_ <= 53;}
-
-CONSTCD11
-inline
-bool
-operator==(const weeknum& x, const weeknum& y) NOEXCEPT
-{
- return static_cast<unsigned>(x) == static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const weeknum& x, const weeknum& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const weeknum& x, const weeknum& y) NOEXCEPT
-{
- return static_cast<unsigned>(x) < static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator>(const weeknum& x, const weeknum& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const weeknum& x, const weeknum& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const weeknum& x, const weeknum& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-CONSTCD11
-inline
-weeks
-operator-(const weeknum& x, const weeknum& y) NOEXCEPT
-{
- return weeks{static_cast<weeks::rep>(static_cast<unsigned>(x)) -
- static_cast<weeks::rep>(static_cast<unsigned>(y))};
-}
-
-CONSTCD11
-inline
-weeknum
-operator+(const weeknum& x, const weeks& y) NOEXCEPT
-{
- return weeknum{static_cast<unsigned>(x) + static_cast<unsigned>(y.count())};
-}
-
-CONSTCD11
-inline
-weeknum
-operator+(const weeks& x, const weeknum& y) NOEXCEPT
-{
- return y + x;
-}
-
-CONSTCD11
-inline
-weeknum
-operator-(const weeknum& x, const weeks& y) NOEXCEPT
-{
- return x + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weeknum& wn)
-{
- date::detail::save_ostream<CharT, Traits> _(os);
- os << 'W';
- os.fill('0');
- os.flags(std::ios::dec | std::ios::right);
- os.width(2);
- os << static_cast<unsigned>(wn);
- return os;
-}
-
-// year_weeknum
-
-CONSTCD11
-inline
-year_weeknum::year_weeknum(const iso_week::year& y, const iso_week::weeknum& wn) NOEXCEPT
- : y_(y)
- , wn_(wn)
- {}
-
-CONSTCD11 inline year year_weeknum::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline weeknum year_weeknum::weeknum() const NOEXCEPT {return wn_;}
-CONSTCD11 inline bool year_weeknum::ok() const NOEXCEPT
-{
- return y_.ok() && 1u <= static_cast<unsigned>(wn_) && wn_ <= (y_/last).weeknum();
-}
-
-inline
-year_weeknum&
-year_weeknum::operator+=(const years& dy) NOEXCEPT
-{
- *this = *this + dy;
- return *this;
-}
-
-inline
-year_weeknum&
-year_weeknum::operator-=(const years& dy) NOEXCEPT
-{
- *this = *this - dy;
- return *this;
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_weeknum& x, const year_weeknum& y) NOEXCEPT
-{
- return x.year() == y.year() && x.weeknum() == y.weeknum();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_weeknum& x, const year_weeknum& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_weeknum& x, const year_weeknum& y) NOEXCEPT
-{
- return x.year() < y.year() ? true
- : (x.year() > y.year() ? false
- : (x.weeknum() < y.weeknum()));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_weeknum& x, const year_weeknum& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_weeknum& x, const year_weeknum& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_weeknum& x, const year_weeknum& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-CONSTCD11
-inline
-year_weeknum
-operator+(const year_weeknum& ym, const years& dy) NOEXCEPT
-{
- return (ym.year() + dy) / ym.weeknum();
-}
-
-CONSTCD11
-inline
-year_weeknum
-operator+(const years& dy, const year_weeknum& ym) NOEXCEPT
-{
- return ym + dy;
-}
-
-CONSTCD11
-inline
-year_weeknum
-operator-(const year_weeknum& ym, const years& dy) NOEXCEPT
-{
- return ym + -dy;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_weeknum& ywn)
-{
- return os << ywn.year() << '-' << ywn.weeknum();
-}
-
-
-// year_lastweek
-
-CONSTCD11
-inline
-year_lastweek::year_lastweek(const iso_week::year& y) NOEXCEPT
- : y_(y)
- {}
-
-CONSTCD11 inline year year_lastweek::year() const NOEXCEPT {return y_;}
-
-CONSTCD14
-inline
-weeknum
-year_lastweek::weeknum() const NOEXCEPT
-{
- const auto y = date::year{static_cast<int>(y_)};
- const auto s0 = sys_days((y-years{1})/12/date::thu[date::last]);
- const auto s1 = sys_days(y/12/date::thu[date::last]);
- return iso_week::weeknum(static_cast<unsigned>(date::trunc<weeks>(s1-s0).count()));
-}
-
-CONSTCD11 inline bool year_lastweek::ok() const NOEXCEPT {return y_.ok();}
-
-inline
-year_lastweek&
-year_lastweek::operator+=(const years& dy) NOEXCEPT
-{
- *this = *this + dy;
- return *this;
-}
-
-inline
-year_lastweek&
-year_lastweek::operator-=(const years& dy) NOEXCEPT
-{
- *this = *this - dy;
- return *this;
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_lastweek& x, const year_lastweek& y) NOEXCEPT
-{
- return x.year() == y.year();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_lastweek& x, const year_lastweek& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_lastweek& x, const year_lastweek& y) NOEXCEPT
-{
- return x.year() < y.year();
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_lastweek& x, const year_lastweek& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_lastweek& x, const year_lastweek& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_lastweek& x, const year_lastweek& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-CONSTCD11
-inline
-year_lastweek
-operator+(const year_lastweek& ym, const years& dy) NOEXCEPT
-{
- return year_lastweek{ym.year() + dy};
-}
-
-CONSTCD11
-inline
-year_lastweek
-operator+(const years& dy, const year_lastweek& ym) NOEXCEPT
-{
- return ym + dy;
-}
-
-CONSTCD11
-inline
-year_lastweek
-operator-(const year_lastweek& ym, const years& dy) NOEXCEPT
-{
- return ym + -dy;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_lastweek& ywn)
-{
- return os << ywn.year() << "-W last";
-}
-
-// weeknum_weekday
-
-CONSTCD11
-inline
-weeknum_weekday::weeknum_weekday(const iso_week::weeknum& wn,
- const iso_week::weekday& wd) NOEXCEPT
- : wn_(wn)
- , wd_(wd)
- {}
-
-CONSTCD11 inline weeknum weeknum_weekday::weeknum() const NOEXCEPT {return wn_;}
-CONSTCD11 inline weekday weeknum_weekday::weekday() const NOEXCEPT {return wd_;}
-
-CONSTCD14
-inline
-bool
-weeknum_weekday::ok() const NOEXCEPT
-{
- return wn_.ok() && wd_.ok();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT
-{
- return x.weeknum() == y.weeknum() && x.weekday() == y.weekday();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT
-{
- return x.weeknum() < y.weeknum() ? true
- : (x.weeknum() > y.weeknum() ? false
- : (static_cast<unsigned>(x.weekday()) < static_cast<unsigned>(y.weekday())));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weeknum_weekday& md)
-{
- return os << md.weeknum() << '-' << md.weekday();
-}
-
-// lastweek_weekday
-
-CONSTCD11
-inline
-lastweek_weekday::lastweek_weekday(const iso_week::weekday& wd) NOEXCEPT
- : wd_(wd)
- {}
-
-CONSTCD11 inline weekday lastweek_weekday::weekday() const NOEXCEPT {return wd_;}
-
-CONSTCD14
-inline
-bool
-lastweek_weekday::ok() const NOEXCEPT
-{
- return wd_.ok();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT
-{
- return x.weekday() == y.weekday();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT
-{
- return static_cast<unsigned>(x.weekday()) < static_cast<unsigned>(y.weekday());
-}
-
-CONSTCD11
-inline
-bool
-operator>(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const lastweek_weekday& md)
-{
- return os << "W last-" << md.weekday();
-}
-
-// year_lastweek_weekday
-
-CONSTCD11
-inline
-year_lastweek_weekday::year_lastweek_weekday(const iso_week::year& y,
- const iso_week::weekday& wd) NOEXCEPT
- : y_(y)
- , wd_(wd)
- {}
-
-inline
-year_lastweek_weekday&
-year_lastweek_weekday::operator+=(const years& y) NOEXCEPT
-{
- *this = *this + y;
- return *this;
-}
-
-inline
-year_lastweek_weekday&
-year_lastweek_weekday::operator-=(const years& y) NOEXCEPT
-{
- *this = *this - y;
- return *this;
-}
-
-CONSTCD11 inline year year_lastweek_weekday::year() const NOEXCEPT {return y_;}
-
-CONSTCD14
-inline
-weeknum
-year_lastweek_weekday::weeknum() const NOEXCEPT
-{
- return (y_ / last).weeknum();
-}
-
-CONSTCD11 inline weekday year_lastweek_weekday::weekday() const NOEXCEPT {return wd_;}
-
-CONSTCD14
-inline
-year_lastweek_weekday::operator sys_days() const NOEXCEPT
-{
- return sys_days(date::year{static_cast<int>(y_)}/date::dec/date::thu[date::last])
- + (sun - thu) - (sun - wd_);
-}
-
-CONSTCD14
-inline
-year_lastweek_weekday::operator local_days() const NOEXCEPT
-{
- return local_days(date::year{static_cast<int>(y_)}/date::dec/date::thu[date::last])
- + (sun - thu) - (sun - wd_);
-}
-
-CONSTCD11
-inline
-bool
-year_lastweek_weekday::ok() const NOEXCEPT
-{
- return y_.ok() && wd_.ok();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT
-{
- return x.year() == y.year() && x.weekday() == y.weekday();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT
-{
- return x.year() < y.year() ? true
- : (x.year() > y.year() ? false
- : (static_cast<unsigned>(x.weekday()) < static_cast<unsigned>(y.weekday())));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-CONSTCD11
-inline
-year_lastweek_weekday
-operator+(const year_lastweek_weekday& ywnwd, const years& y) NOEXCEPT
-{
- return (ywnwd.year() + y) / last / ywnwd.weekday();
-}
-
-CONSTCD11
-inline
-year_lastweek_weekday
-operator+(const years& y, const year_lastweek_weekday& ywnwd) NOEXCEPT
-{
- return ywnwd + y;
-}
-
-CONSTCD11
-inline
-year_lastweek_weekday
-operator-(const year_lastweek_weekday& ywnwd, const years& y) NOEXCEPT
-{
- return ywnwd + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_lastweek_weekday& ywnwd)
-{
- return os << ywnwd.year() << "-W last-" << ywnwd.weekday();
-}
-
-// year_weeknum_weekday
-
-CONSTCD11
-inline
-year_weeknum_weekday::year_weeknum_weekday(const iso_week::year& y,
- const iso_week::weeknum& wn,
- const iso_week::weekday& wd) NOEXCEPT
- : y_(y)
- , wn_(wn)
- , wd_(wd)
- {}
-
-CONSTCD14
-inline
-year_weeknum_weekday::year_weeknum_weekday(const year_lastweek_weekday& ylwwd) NOEXCEPT
- : y_(ylwwd.year())
- , wn_(ylwwd.weeknum())
- , wd_(ylwwd.weekday())
- {}
-
-CONSTCD14
-inline
-year_weeknum_weekday::year_weeknum_weekday(const sys_days& dp) NOEXCEPT
- : year_weeknum_weekday(from_days(dp.time_since_epoch()))
- {}
-
-CONSTCD14
-inline
-year_weeknum_weekday::year_weeknum_weekday(const local_days& dp) NOEXCEPT
- : year_weeknum_weekday(from_days(dp.time_since_epoch()))
- {}
-
-inline
-year_weeknum_weekday&
-year_weeknum_weekday::operator+=(const years& y) NOEXCEPT
-{
- *this = *this + y;
- return *this;
-}
-
-inline
-year_weeknum_weekday&
-year_weeknum_weekday::operator-=(const years& y) NOEXCEPT
-{
- *this = *this - y;
- return *this;
-}
-
-CONSTCD11 inline year year_weeknum_weekday::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline weeknum year_weeknum_weekday::weeknum() const NOEXCEPT {return wn_;}
-CONSTCD11 inline weekday year_weeknum_weekday::weekday() const NOEXCEPT {return wd_;}
-
-CONSTCD14
-inline
-year_weeknum_weekday::operator sys_days() const NOEXCEPT
-{
- return sys_days(date::year{static_cast<int>(y_)-1}/date::dec/date::thu[date::last])
- + (date::mon - date::thu) + weeks{static_cast<unsigned>(wn_)-1} + (wd_ - mon);
-}
-
-CONSTCD14
-inline
-year_weeknum_weekday::operator local_days() const NOEXCEPT
-{
- return local_days(date::year{static_cast<int>(y_)-1}/date::dec/date::thu[date::last])
- + (date::mon - date::thu) + weeks{static_cast<unsigned>(wn_)-1} + (wd_ - mon);
-}
-
-CONSTCD14
-inline
-bool
-year_weeknum_weekday::ok() const NOEXCEPT
-{
- return y_.ok() && wd_.ok() && iso_week::weeknum{1u} <= wn_ && wn_ <= year_lastweek{y_}.weeknum();
-}
-
-CONSTCD14
-inline
-year_weeknum_weekday
-year_weeknum_weekday::from_days(days d) NOEXCEPT
-{
- const auto dp = sys_days{d};
- const auto wd = iso_week::weekday{dp};
- auto y = date::year_month_day{dp + days{3}}.year();
- auto start = sys_days((y - date::years{1})/date::dec/date::thu[date::last]) + (mon-thu);
- if (dp < start)
- {
- --y;
- start = sys_days((y - date::years{1})/date::dec/date::thu[date::last]) + (mon-thu);
- }
- const auto wn = iso_week::weeknum(
- static_cast<unsigned>(date::trunc<weeks>(dp - start).count() + 1));
- return {iso_week::year(static_cast<int>(y)), wn, wd};
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT
-{
- return x.year() == y.year() && x.weeknum() == y.weeknum() && x.weekday() == y.weekday();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT
-{
- return x.year() < y.year() ? true
- : (x.year() > y.year() ? false
- : (x.weeknum() < y.weeknum() ? true
- : (x.weeknum() > y.weeknum() ? false
- : (static_cast<unsigned>(x.weekday()) < static_cast<unsigned>(y.weekday())))));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-CONSTCD11
-inline
-year_weeknum_weekday
-operator+(const year_weeknum_weekday& ywnwd, const years& y) NOEXCEPT
-{
- return (ywnwd.year() + y) / ywnwd.weeknum() / ywnwd.weekday();
-}
-
-CONSTCD11
-inline
-year_weeknum_weekday
-operator+(const years& y, const year_weeknum_weekday& ywnwd) NOEXCEPT
-{
- return ywnwd + y;
-}
-
-CONSTCD11
-inline
-year_weeknum_weekday
-operator-(const year_weeknum_weekday& ywnwd, const years& y) NOEXCEPT
-{
- return ywnwd + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_weeknum_weekday& ywnwd)
-{
- return os << ywnwd.year() << '-' << ywnwd.weeknum() << '-' << ywnwd.weekday();
-}
-
-// date composition operators
-
-CONSTCD11
-inline
-year_weeknum
-operator/(const year& y, const weeknum& wn) NOEXCEPT
-{
- return {y, wn};
-}
-
-CONSTCD11
-inline
-year_weeknum
-operator/(const year& y, int wn) NOEXCEPT
-{
- return y/weeknum(static_cast<unsigned>(wn));
-}
-
-CONSTCD11
-inline
-year_lastweek
-operator/(const year& y, last_week) NOEXCEPT
-{
- return year_lastweek{y};
-}
-
-CONSTCD11
-inline
-weeknum_weekday
-operator/(const weeknum& wn, const weekday& wd) NOEXCEPT
-{
- return {wn, wd};
-}
-
-CONSTCD11
-inline
-weeknum_weekday
-operator/(const weeknum& wn, int wd) NOEXCEPT
-{
- return wn/weekday{static_cast<unsigned>(wd)};
-}
-
-CONSTCD11
-inline
-weeknum_weekday
-operator/(const weekday& wd, const weeknum& wn) NOEXCEPT
-{
- return wn/wd;
-}
-
-CONSTCD11
-inline
-weeknum_weekday
-operator/(const weekday& wd, int wn) NOEXCEPT
-{
- return weeknum{static_cast<unsigned>(wn)}/wd;
-}
-
-CONSTCD11
-inline
-lastweek_weekday
-operator/(const last_week&, const weekday& wd) NOEXCEPT
-{
- return lastweek_weekday{wd};
-}
-
-CONSTCD11
-inline
-lastweek_weekday
-operator/(const last_week& wn, int wd) NOEXCEPT
-{
- return wn / weekday{static_cast<unsigned>(wd)};
-}
-
-CONSTCD11
-inline
-lastweek_weekday
-operator/(const weekday& wd, const last_week& wn) NOEXCEPT
-{
- return wn / wd;
-}
-
-CONSTCD11
-inline
-year_weeknum_weekday
-operator/(const year_weeknum& ywn, const weekday& wd) NOEXCEPT
-{
- return {ywn.year(), ywn.weeknum(), wd};
-}
-
-CONSTCD11
-inline
-year_weeknum_weekday
-operator/(const year_weeknum& ywn, int wd) NOEXCEPT
-{
- return ywn / weekday(static_cast<unsigned>(wd));
-}
-
-CONSTCD11
-inline
-year_weeknum_weekday
-operator/(const weeknum_weekday& wnwd, const year& y) NOEXCEPT
-{
- return {y, wnwd.weeknum(), wnwd.weekday()};
-}
-
-CONSTCD11
-inline
-year_weeknum_weekday
-operator/(const weeknum_weekday& wnwd, int y) NOEXCEPT
-{
- return wnwd / year{y};
-}
-
-CONSTCD11
-inline
-year_lastweek_weekday
-operator/(const year_lastweek& ylw, const weekday& wd) NOEXCEPT
-{
- return {ylw.year(), wd};
-}
-
-CONSTCD11
-inline
-year_lastweek_weekday
-operator/(const year_lastweek& ylw, int wd) NOEXCEPT
-{
- return ylw / weekday(static_cast<unsigned>(wd));
-}
-
-CONSTCD11
-inline
-year_lastweek_weekday
-operator/(const lastweek_weekday& lwwd, const year& y) NOEXCEPT
-{
- return {y, lwwd.weekday()};
-}
-
-CONSTCD11
-inline
-year_lastweek_weekday
-operator/(const lastweek_weekday& lwwd, int y) NOEXCEPT
-{
- return lwwd / year{y};
-}
-
-} // namespace iso_week
-
-#endif // ISO_WEEK_H
diff --git a/src/libs/date/includes/date/julian.h b/src/libs/date/includes/date/julian.h
deleted file mode 100644
index 7869792b..00000000
--- a/src/libs/date/includes/date/julian.h
+++ /dev/null
@@ -1,3046 +0,0 @@
-#ifndef JULIAN_H
-#define JULIAN_H
-
-// The MIT License (MIT)
-//
-// Copyright (c) 2016 Howard Hinnant
-//
-// 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.
-
-#include "date.h"
-
-namespace julian
-{
-
-// durations
-
-using days = date::days;
-
-using weeks = date::weeks;
-
-using years = std::chrono::duration
- <int, date::detail::ratio_multiply<std::ratio<1461, 4>, days::period>>;
-
-using months = std::chrono::duration
- <int, date::detail::ratio_divide<years::period, std::ratio<12>>>;
-
-// time_point
-
-using sys_days = date::sys_days;
-using local_days = date::local_days;
-
-// types
-
-struct last_spec
-{
- explicit last_spec() = default;
-};
-
-class day;
-class month;
-class year;
-
-class weekday;
-class weekday_indexed;
-class weekday_last;
-
-class month_day;
-class month_day_last;
-class month_weekday;
-class month_weekday_last;
-
-class year_month;
-
-class year_month_day;
-class year_month_day_last;
-class year_month_weekday;
-class year_month_weekday_last;
-
-// date composition operators
-
-CONSTCD11 year_month operator/(const year& y, const month& m) NOEXCEPT;
-CONSTCD11 year_month operator/(const year& y, int m) NOEXCEPT;
-
-CONSTCD11 month_day operator/(const day& d, const month& m) NOEXCEPT;
-CONSTCD11 month_day operator/(const day& d, int m) NOEXCEPT;
-CONSTCD11 month_day operator/(const month& m, const day& d) NOEXCEPT;
-CONSTCD11 month_day operator/(const month& m, int d) NOEXCEPT;
-CONSTCD11 month_day operator/(int m, const day& d) NOEXCEPT;
-
-CONSTCD11 month_day_last operator/(const month& m, last_spec) NOEXCEPT;
-CONSTCD11 month_day_last operator/(int m, last_spec) NOEXCEPT;
-CONSTCD11 month_day_last operator/(last_spec, const month& m) NOEXCEPT;
-CONSTCD11 month_day_last operator/(last_spec, int m) NOEXCEPT;
-
-CONSTCD11 month_weekday operator/(const month& m, const weekday_indexed& wdi) NOEXCEPT;
-CONSTCD11 month_weekday operator/(int m, const weekday_indexed& wdi) NOEXCEPT;
-CONSTCD11 month_weekday operator/(const weekday_indexed& wdi, const month& m) NOEXCEPT;
-CONSTCD11 month_weekday operator/(const weekday_indexed& wdi, int m) NOEXCEPT;
-
-CONSTCD11 month_weekday_last operator/(const month& m, const weekday_last& wdl) NOEXCEPT;
-CONSTCD11 month_weekday_last operator/(int m, const weekday_last& wdl) NOEXCEPT;
-CONSTCD11 month_weekday_last operator/(const weekday_last& wdl, const month& m) NOEXCEPT;
-CONSTCD11 month_weekday_last operator/(const weekday_last& wdl, int m) NOEXCEPT;
-
-CONSTCD11 year_month_day operator/(const year_month& ym, const day& d) NOEXCEPT;
-CONSTCD11 year_month_day operator/(const year_month& ym, int d) NOEXCEPT;
-CONSTCD11 year_month_day operator/(const year& y, const month_day& md) NOEXCEPT;
-CONSTCD11 year_month_day operator/(int y, const month_day& md) NOEXCEPT;
-CONSTCD11 year_month_day operator/(const month_day& md, const year& y) NOEXCEPT;
-CONSTCD11 year_month_day operator/(const month_day& md, int y) NOEXCEPT;
-
-CONSTCD11
- year_month_day_last operator/(const year_month& ym, last_spec) NOEXCEPT;
-CONSTCD11
- year_month_day_last operator/(const year& y, const month_day_last& mdl) NOEXCEPT;
-CONSTCD11
- year_month_day_last operator/(int y, const month_day_last& mdl) NOEXCEPT;
-CONSTCD11
- year_month_day_last operator/(const month_day_last& mdl, const year& y) NOEXCEPT;
-CONSTCD11
- year_month_day_last operator/(const month_day_last& mdl, int y) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(const year_month& ym, const weekday_indexed& wdi) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(const year& y, const month_weekday& mwd) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(int y, const month_weekday& mwd) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(const month_weekday& mwd, const year& y) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(const month_weekday& mwd, int y) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(const year_month& ym, const weekday_last& wdl) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(const year& y, const month_weekday_last& mwdl) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(int y, const month_weekday_last& mwdl) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(const month_weekday_last& mwdl, const year& y) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(const month_weekday_last& mwdl, int y) NOEXCEPT;
-
-// Detailed interface
-
-// day
-
-class day
-{
- unsigned char d_;
-
-public:
- explicit CONSTCD11 day(unsigned d) NOEXCEPT;
-
- CONSTCD14 day& operator++() NOEXCEPT;
- CONSTCD14 day operator++(int) NOEXCEPT;
- CONSTCD14 day& operator--() NOEXCEPT;
- CONSTCD14 day operator--(int) NOEXCEPT;
-
- CONSTCD14 day& operator+=(const days& d) NOEXCEPT;
- CONSTCD14 day& operator-=(const days& d) NOEXCEPT;
-
- CONSTCD11 explicit operator unsigned() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator< (const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator> (const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const day& x, const day& y) NOEXCEPT;
-
-CONSTCD11 day operator+(const day& x, const days& y) NOEXCEPT;
-CONSTCD11 day operator+(const days& x, const day& y) NOEXCEPT;
-CONSTCD11 day operator-(const day& x, const days& y) NOEXCEPT;
-CONSTCD11 days operator-(const day& x, const day& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const day& d);
-
-// month
-
-class month
-{
- unsigned char m_;
-
-public:
- explicit CONSTCD11 month(unsigned m) NOEXCEPT;
-
- CONSTCD14 month& operator++() NOEXCEPT;
- CONSTCD14 month operator++(int) NOEXCEPT;
- CONSTCD14 month& operator--() NOEXCEPT;
- CONSTCD14 month operator--(int) NOEXCEPT;
-
- CONSTCD14 month& operator+=(const months& m) NOEXCEPT;
- CONSTCD14 month& operator-=(const months& m) NOEXCEPT;
-
- CONSTCD11 explicit operator unsigned() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator< (const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator> (const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const month& x, const month& y) NOEXCEPT;
-
-CONSTCD14 month operator+(const month& x, const months& y) NOEXCEPT;
-CONSTCD14 month operator+(const months& x, const month& y) NOEXCEPT;
-CONSTCD14 month operator-(const month& x, const months& y) NOEXCEPT;
-CONSTCD14 months operator-(const month& x, const month& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month& m);
-
-// year
-
-class year
-{
- short y_;
-
-public:
- explicit CONSTCD11 year(int y) NOEXCEPT;
-
- CONSTCD14 year& operator++() NOEXCEPT;
- CONSTCD14 year operator++(int) NOEXCEPT;
- CONSTCD14 year& operator--() NOEXCEPT;
- CONSTCD14 year operator--(int) NOEXCEPT;
-
- CONSTCD14 year& operator+=(const years& y) NOEXCEPT;
- CONSTCD14 year& operator-=(const years& y) NOEXCEPT;
-
- CONSTCD11 bool is_leap() const NOEXCEPT;
-
- CONSTCD11 explicit operator int() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-
- static CONSTCD11 year min() NOEXCEPT;
- static CONSTCD11 year max() NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year& x, const year& y) NOEXCEPT;
-
-CONSTCD11 year operator+(const year& x, const years& y) NOEXCEPT;
-CONSTCD11 year operator+(const years& x, const year& y) NOEXCEPT;
-CONSTCD11 year operator-(const year& x, const years& y) NOEXCEPT;
-CONSTCD11 years operator-(const year& x, const year& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year& y);
-
-// weekday
-
-class weekday
-{
- unsigned char wd_;
-public:
- explicit CONSTCD11 weekday(unsigned wd) NOEXCEPT;
- explicit weekday(int) = delete;
- CONSTCD11 weekday(const sys_days& dp) NOEXCEPT;
- CONSTCD11 explicit weekday(const local_days& dp) NOEXCEPT;
-
- CONSTCD14 weekday& operator++() NOEXCEPT;
- CONSTCD14 weekday operator++(int) NOEXCEPT;
- CONSTCD14 weekday& operator--() NOEXCEPT;
- CONSTCD14 weekday operator--(int) NOEXCEPT;
-
- CONSTCD14 weekday& operator+=(const days& d) NOEXCEPT;
- CONSTCD14 weekday& operator-=(const days& d) NOEXCEPT;
-
- CONSTCD11 explicit operator unsigned() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-
- CONSTCD11 weekday_indexed operator[](unsigned index) const NOEXCEPT;
- CONSTCD11 weekday_last operator[](last_spec) const NOEXCEPT;
-
-private:
- static CONSTCD11 unsigned char weekday_from_days(int z) NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const weekday& x, const weekday& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const weekday& x, const weekday& y) NOEXCEPT;
-
-CONSTCD14 weekday operator+(const weekday& x, const days& y) NOEXCEPT;
-CONSTCD14 weekday operator+(const days& x, const weekday& y) NOEXCEPT;
-CONSTCD14 weekday operator-(const weekday& x, const days& y) NOEXCEPT;
-CONSTCD14 days operator-(const weekday& x, const weekday& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday& wd);
-
-// weekday_indexed
-
-class weekday_indexed
-{
- unsigned char wd_ : 4;
- unsigned char index_ : 4;
-
-public:
- CONSTCD11 weekday_indexed(const julian::weekday& wd, unsigned index) NOEXCEPT;
-
- CONSTCD11 julian::weekday weekday() const NOEXCEPT;
- CONSTCD11 unsigned index() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday_indexed& wdi);
-
-// weekday_last
-
-class weekday_last
-{
- julian::weekday wd_;
-
-public:
- explicit CONSTCD11 weekday_last(const julian::weekday& wd) NOEXCEPT;
-
- CONSTCD11 julian::weekday weekday() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const weekday_last& x, const weekday_last& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const weekday_last& x, const weekday_last& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday_last& wdl);
-
-// year_month
-
-class year_month
-{
- julian::year y_;
- julian::month m_;
-
-public:
- CONSTCD11 year_month(const julian::year& y, const julian::month& m) NOEXCEPT;
-
- CONSTCD11 julian::year year() const NOEXCEPT;
- CONSTCD11 julian::month month() const NOEXCEPT;
-
- CONSTCD14 year_month& operator+=(const months& dm) NOEXCEPT;
- CONSTCD14 year_month& operator-=(const months& dm) NOEXCEPT;
- CONSTCD14 year_month& operator+=(const years& dy) NOEXCEPT;
- CONSTCD14 year_month& operator-=(const years& dy) NOEXCEPT;
-
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year_month& x, const year_month& y) NOEXCEPT;
-
-CONSTCD14 year_month operator+(const year_month& ym, const months& dm) NOEXCEPT;
-CONSTCD14 year_month operator+(const months& dm, const year_month& ym) NOEXCEPT;
-CONSTCD14 year_month operator-(const year_month& ym, const months& dm) NOEXCEPT;
-
-CONSTCD11 months operator-(const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 year_month operator+(const year_month& ym, const years& dy) NOEXCEPT;
-CONSTCD11 year_month operator+(const years& dy, const year_month& ym) NOEXCEPT;
-CONSTCD11 year_month operator-(const year_month& ym, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month& ym);
-
-// month_day
-
-class month_day
-{
- julian::month m_;
- julian::day d_;
-
-public:
- CONSTCD11 month_day(const julian::month& m, const julian::day& d) NOEXCEPT;
-
- CONSTCD11 julian::month month() const NOEXCEPT;
- CONSTCD11 julian::day day() const NOEXCEPT;
-
- CONSTCD14 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator< (const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator> (const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const month_day& x, const month_day& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_day& md);
-
-// month_day_last
-
-class month_day_last
-{
- julian::month m_;
-
-public:
- CONSTCD11 explicit month_day_last(const julian::month& m) NOEXCEPT;
-
- CONSTCD11 julian::month month() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator< (const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator> (const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const month_day_last& x, const month_day_last& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_day_last& mdl);
-
-// month_weekday
-
-class month_weekday
-{
- julian::month m_;
- julian::weekday_indexed wdi_;
-public:
- CONSTCD11 month_weekday(const julian::month& m,
- const julian::weekday_indexed& wdi) NOEXCEPT;
-
- CONSTCD11 julian::month month() const NOEXCEPT;
- CONSTCD11 julian::weekday_indexed weekday_indexed() const NOEXCEPT;
-
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const month_weekday& x, const month_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const month_weekday& x, const month_weekday& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_weekday& mwd);
-
-// month_weekday_last
-
-class month_weekday_last
-{
- julian::month m_;
- julian::weekday_last wdl_;
-
-public:
- CONSTCD11 month_weekday_last(const julian::month& m,
- const julian::weekday_last& wd) NOEXCEPT;
-
- CONSTCD11 julian::month month() const NOEXCEPT;
- CONSTCD11 julian::weekday_last weekday_last() const NOEXCEPT;
-
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11
- bool operator==(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT;
-CONSTCD11
- bool operator!=(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_weekday_last& mwdl);
-
-// class year_month_day
-
-class year_month_day
-{
- julian::year y_;
- julian::month m_;
- julian::day d_;
-
-public:
- CONSTCD11 year_month_day(const julian::year& y, const julian::month& m,
- const julian::day& d) NOEXCEPT;
- CONSTCD14 year_month_day(const year_month_day_last& ymdl) NOEXCEPT;
-
- CONSTCD14 year_month_day(sys_days dp) NOEXCEPT;
- CONSTCD14 explicit year_month_day(local_days dp) NOEXCEPT;
-
- CONSTCD14 year_month_day& operator+=(const months& m) NOEXCEPT;
- CONSTCD14 year_month_day& operator-=(const months& m) NOEXCEPT;
- CONSTCD14 year_month_day& operator+=(const years& y) NOEXCEPT;
- CONSTCD14 year_month_day& operator-=(const years& y) NOEXCEPT;
-
- CONSTCD11 julian::year year() const NOEXCEPT;
- CONSTCD11 julian::month month() const NOEXCEPT;
- CONSTCD11 julian::day day() const NOEXCEPT;
-
- CONSTCD14 operator sys_days() const NOEXCEPT;
- CONSTCD14 explicit operator local_days() const NOEXCEPT;
- CONSTCD14 bool ok() const NOEXCEPT;
-
-private:
- static CONSTCD14 year_month_day from_days(days dp) NOEXCEPT;
- CONSTCD14 days to_days() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year_month_day& x, const year_month_day& y) NOEXCEPT;
-
-CONSTCD14 year_month_day operator+(const year_month_day& ymd, const months& dm) NOEXCEPT;
-CONSTCD14 year_month_day operator+(const months& dm, const year_month_day& ymd) NOEXCEPT;
-CONSTCD14 year_month_day operator-(const year_month_day& ymd, const months& dm) NOEXCEPT;
-CONSTCD11 year_month_day operator+(const year_month_day& ymd, const years& dy) NOEXCEPT;
-CONSTCD11 year_month_day operator+(const years& dy, const year_month_day& ymd) NOEXCEPT;
-CONSTCD11 year_month_day operator-(const year_month_day& ymd, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_day& ymd);
-
-// year_month_day_last
-
-class year_month_day_last
-{
- julian::year y_;
- julian::month_day_last mdl_;
-
-public:
- CONSTCD11 year_month_day_last(const julian::year& y,
- const julian::month_day_last& mdl) NOEXCEPT;
-
- CONSTCD14 year_month_day_last& operator+=(const months& m) NOEXCEPT;
- CONSTCD14 year_month_day_last& operator-=(const months& m) NOEXCEPT;
- CONSTCD14 year_month_day_last& operator+=(const years& y) NOEXCEPT;
- CONSTCD14 year_month_day_last& operator-=(const years& y) NOEXCEPT;
-
- CONSTCD11 julian::year year() const NOEXCEPT;
- CONSTCD11 julian::month month() const NOEXCEPT;
- CONSTCD11 julian::month_day_last month_day_last() const NOEXCEPT;
- CONSTCD14 julian::day day() const NOEXCEPT;
-
- CONSTCD14 operator sys_days() const NOEXCEPT;
- CONSTCD14 explicit operator local_days() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11
- bool operator==(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
- bool operator!=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
- bool operator< (const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
- bool operator> (const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
- bool operator<=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
- bool operator>=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-
-CONSTCD14
-year_month_day_last
-operator+(const year_month_day_last& ymdl, const months& dm) NOEXCEPT;
-
-CONSTCD14
-year_month_day_last
-operator+(const months& dm, const year_month_day_last& ymdl) NOEXCEPT;
-
-CONSTCD11
-year_month_day_last
-operator+(const year_month_day_last& ymdl, const years& dy) NOEXCEPT;
-
-CONSTCD11
-year_month_day_last
-operator+(const years& dy, const year_month_day_last& ymdl) NOEXCEPT;
-
-CONSTCD14
-year_month_day_last
-operator-(const year_month_day_last& ymdl, const months& dm) NOEXCEPT;
-
-CONSTCD11
-year_month_day_last
-operator-(const year_month_day_last& ymdl, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_day_last& ymdl);
-
-// year_month_weekday
-
-class year_month_weekday
-{
- julian::year y_;
- julian::month m_;
- julian::weekday_indexed wdi_;
-
-public:
- CONSTCD11 year_month_weekday(const julian::year& y, const julian::month& m,
- const julian::weekday_indexed& wdi) NOEXCEPT;
- CONSTCD14 year_month_weekday(const sys_days& dp) NOEXCEPT;
- CONSTCD14 explicit year_month_weekday(const local_days& dp) NOEXCEPT;
-
- CONSTCD14 year_month_weekday& operator+=(const months& m) NOEXCEPT;
- CONSTCD14 year_month_weekday& operator-=(const months& m) NOEXCEPT;
- CONSTCD14 year_month_weekday& operator+=(const years& y) NOEXCEPT;
- CONSTCD14 year_month_weekday& operator-=(const years& y) NOEXCEPT;
-
- CONSTCD11 julian::year year() const NOEXCEPT;
- CONSTCD11 julian::month month() const NOEXCEPT;
- CONSTCD11 julian::weekday weekday() const NOEXCEPT;
- CONSTCD11 unsigned index() const NOEXCEPT;
- CONSTCD11 julian::weekday_indexed weekday_indexed() const NOEXCEPT;
-
- CONSTCD14 operator sys_days() const NOEXCEPT;
- CONSTCD14 explicit operator local_days() const NOEXCEPT;
- CONSTCD14 bool ok() const NOEXCEPT;
-
-private:
- static CONSTCD14 year_month_weekday from_days(days dp) NOEXCEPT;
- CONSTCD14 days to_days() const NOEXCEPT;
-};
-
-CONSTCD11
- bool operator==(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT;
-CONSTCD11
- bool operator!=(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT;
-
-CONSTCD14
-year_month_weekday
-operator+(const year_month_weekday& ymwd, const months& dm) NOEXCEPT;
-
-CONSTCD14
-year_month_weekday
-operator+(const months& dm, const year_month_weekday& ymwd) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator+(const year_month_weekday& ymwd, const years& dy) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator+(const years& dy, const year_month_weekday& ymwd) NOEXCEPT;
-
-CONSTCD14
-year_month_weekday
-operator-(const year_month_weekday& ymwd, const months& dm) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator-(const year_month_weekday& ymwd, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday& ymwdi);
-
-// year_month_weekday_last
-
-class year_month_weekday_last
-{
- julian::year y_;
- julian::month m_;
- julian::weekday_last wdl_;
-
-public:
- CONSTCD11 year_month_weekday_last(const julian::year& y, const julian::month& m,
- const julian::weekday_last& wdl) NOEXCEPT;
-
- CONSTCD14 year_month_weekday_last& operator+=(const months& m) NOEXCEPT;
- CONSTCD14 year_month_weekday_last& operator-=(const months& m) NOEXCEPT;
- CONSTCD14 year_month_weekday_last& operator+=(const years& y) NOEXCEPT;
- CONSTCD14 year_month_weekday_last& operator-=(const years& y) NOEXCEPT;
-
- CONSTCD11 julian::year year() const NOEXCEPT;
- CONSTCD11 julian::month month() const NOEXCEPT;
- CONSTCD11 julian::weekday weekday() const NOEXCEPT;
- CONSTCD11 julian::weekday_last weekday_last() const NOEXCEPT;
-
- CONSTCD14 operator sys_days() const NOEXCEPT;
- CONSTCD14 explicit operator local_days() const NOEXCEPT;
- CONSTCD11 bool ok() const NOEXCEPT;
-
-private:
- CONSTCD14 days to_days() const NOEXCEPT;
-};
-
-CONSTCD11
-bool
-operator==(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT;
-
-CONSTCD11
-bool
-operator!=(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT;
-
-CONSTCD14
-year_month_weekday_last
-operator+(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT;
-
-CONSTCD14
-year_month_weekday_last
-operator+(const months& dm, const year_month_weekday_last& ymwdl) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator+(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator+(const years& dy, const year_month_weekday_last& ymwdl) NOEXCEPT;
-
-CONSTCD14
-year_month_weekday_last
-operator-(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator-(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday_last& ymwdl);
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-inline namespace literals
-{
-
-CONSTCD11 julian::day operator "" _d(unsigned long long d) NOEXCEPT;
-CONSTCD11 julian::year operator "" _y(unsigned long long y) NOEXCEPT;
-
-// CONSTDATA julian::month jan{1};
-// CONSTDATA julian::month feb{2};
-// CONSTDATA julian::month mar{3};
-// CONSTDATA julian::month apr{4};
-// CONSTDATA julian::month may{5};
-// CONSTDATA julian::month jun{6};
-// CONSTDATA julian::month jul{7};
-// CONSTDATA julian::month aug{8};
-// CONSTDATA julian::month sep{9};
-// CONSTDATA julian::month oct{10};
-// CONSTDATA julian::month nov{11};
-// CONSTDATA julian::month dec{12};
-
-} // inline namespace literals
-#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900)
-
-//----------------+
-// Implementation |
-//----------------+
-
-// day
-
-CONSTCD11 inline day::day(unsigned d) NOEXCEPT : d_(static_cast<unsigned char>(d)) {}
-CONSTCD14 inline day& day::operator++() NOEXCEPT {++d_; return *this;}
-CONSTCD14 inline day day::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-CONSTCD14 inline day& day::operator--() NOEXCEPT {--d_; return *this;}
-CONSTCD14 inline day day::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-CONSTCD14 inline day& day::operator+=(const days& d) NOEXCEPT {*this = *this + d; return *this;}
-CONSTCD14 inline day& day::operator-=(const days& d) NOEXCEPT {*this = *this - d; return *this;}
-CONSTCD11 inline day::operator unsigned() const NOEXCEPT {return d_;}
-CONSTCD11 inline bool day::ok() const NOEXCEPT {return 1 <= d_ && d_ <= 31;}
-
-CONSTCD11
-inline
-bool
-operator==(const day& x, const day& y) NOEXCEPT
-{
- return static_cast<unsigned>(x) == static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const day& x, const day& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const day& x, const day& y) NOEXCEPT
-{
- return static_cast<unsigned>(x) < static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator>(const day& x, const day& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const day& x, const day& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const day& x, const day& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-CONSTCD11
-inline
-days
-operator-(const day& x, const day& y) NOEXCEPT
-{
- return days{static_cast<days::rep>(static_cast<unsigned>(x)
- - static_cast<unsigned>(y))};
-}
-
-CONSTCD11
-inline
-day
-operator+(const day& x, const days& y) NOEXCEPT
-{
- return day{static_cast<unsigned>(x) + static_cast<unsigned>(y.count())};
-}
-
-CONSTCD11
-inline
-day
-operator+(const days& x, const day& y) NOEXCEPT
-{
- return y + x;
-}
-
-CONSTCD11
-inline
-day
-operator-(const day& x, const days& y) NOEXCEPT
-{
- return x + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const day& d)
-{
- date::detail::save_ostream<CharT, Traits> _(os);
- os.fill('0');
- os.flags(std::ios::dec | std::ios::right);
- os.width(2);
- os << static_cast<unsigned>(d);
- return os;
-}
-
-// month
-
-CONSTCD11 inline month::month(unsigned m) NOEXCEPT : m_(static_cast<decltype(m_)>(m)) {}
-CONSTCD14 inline month& month::operator++() NOEXCEPT {if (++m_ == 13) m_ = 1; return *this;}
-CONSTCD14 inline month month::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-CONSTCD14 inline month& month::operator--() NOEXCEPT {if (--m_ == 0) m_ = 12; return *this;}
-CONSTCD14 inline month month::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-
-CONSTCD14
-inline
-month&
-month::operator+=(const months& m) NOEXCEPT
-{
- *this = *this + m;
- return *this;
-}
-
-CONSTCD14
-inline
-month&
-month::operator-=(const months& m) NOEXCEPT
-{
- *this = *this - m;
- return *this;
-}
-
-CONSTCD11 inline month::operator unsigned() const NOEXCEPT {return m_;}
-CONSTCD11 inline bool month::ok() const NOEXCEPT {return 1 <= m_ && m_ <= 12;}
-
-CONSTCD11
-inline
-bool
-operator==(const month& x, const month& y) NOEXCEPT
-{
- return static_cast<unsigned>(x) == static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month& x, const month& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const month& x, const month& y) NOEXCEPT
-{
- return static_cast<unsigned>(x) < static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator>(const month& x, const month& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const month& x, const month& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const month& x, const month& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-CONSTCD14
-inline
-months
-operator-(const month& x, const month& y) NOEXCEPT
-{
- auto const d = static_cast<unsigned>(x) - static_cast<unsigned>(y);
- return months(d <= 11 ? d : d + 12);
-}
-
-CONSTCD14
-inline
-month
-operator+(const month& x, const months& y) NOEXCEPT
-{
- auto const mu = static_cast<long long>(static_cast<unsigned>(x)) - 1 + y.count();
- auto const yr = (mu >= 0 ? mu : mu-11) / 12;
- return month{static_cast<unsigned>(mu - yr * 12 + 1)};
-}
-
-CONSTCD14
-inline
-month
-operator+(const months& x, const month& y) NOEXCEPT
-{
- return y + x;
-}
-
-CONSTCD14
-inline
-month
-operator-(const month& x, const months& y) NOEXCEPT
-{
- return x + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month& m)
-{
- switch (static_cast<unsigned>(m))
- {
- case 1:
- os << "Jan";
- break;
- case 2:
- os << "Feb";
- break;
- case 3:
- os << "Mar";
- break;
- case 4:
- os << "Apr";
- break;
- case 5:
- os << "May";
- break;
- case 6:
- os << "Jun";
- break;
- case 7:
- os << "Jul";
- break;
- case 8:
- os << "Aug";
- break;
- case 9:
- os << "Sep";
- break;
- case 10:
- os << "Oct";
- break;
- case 11:
- os << "Nov";
- break;
- case 12:
- os << "Dec";
- break;
- default:
- os << static_cast<unsigned>(m) << " is not a valid month";
- break;
- }
- return os;
-}
-
-// year
-
-CONSTCD11 inline year::year(int y) NOEXCEPT : y_(static_cast<decltype(y_)>(y)) {}
-CONSTCD14 inline year& year::operator++() NOEXCEPT {++y_; return *this;}
-CONSTCD14 inline year year::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-CONSTCD14 inline year& year::operator--() NOEXCEPT {--y_; return *this;}
-CONSTCD14 inline year year::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-CONSTCD14 inline year& year::operator+=(const years& y) NOEXCEPT {*this = *this + y; return *this;}
-CONSTCD14 inline year& year::operator-=(const years& y) NOEXCEPT {*this = *this - y; return *this;}
-
-CONSTCD11
-inline
-bool
-year::is_leap() const NOEXCEPT
-{
- return y_ % 4 == 0;
-}
-
-CONSTCD11 inline year::operator int() const NOEXCEPT {return y_;}
-CONSTCD11 inline bool year::ok() const NOEXCEPT {return true;}
-
-CONSTCD11
-inline
-year
-year::min() NOEXCEPT
-{
- return year{std::numeric_limits<short>::min()};
-}
-
-CONSTCD11
-inline
-year
-year::max() NOEXCEPT
-{
- return year{std::numeric_limits<short>::max()};
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year& x, const year& y) NOEXCEPT
-{
- return static_cast<int>(x) == static_cast<int>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year& x, const year& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year& x, const year& y) NOEXCEPT
-{
- return static_cast<int>(x) < static_cast<int>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year& x, const year& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year& x, const year& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year& x, const year& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-CONSTCD11
-inline
-years
-operator-(const year& x, const year& y) NOEXCEPT
-{
- return years{static_cast<int>(x) - static_cast<int>(y)};
-}
-
-CONSTCD11
-inline
-year
-operator+(const year& x, const years& y) NOEXCEPT
-{
- return year{static_cast<int>(x) + y.count()};
-}
-
-CONSTCD11
-inline
-year
-operator+(const years& x, const year& y) NOEXCEPT
-{
- return y + x;
-}
-
-CONSTCD11
-inline
-year
-operator-(const year& x, const years& y) NOEXCEPT
-{
- return year{static_cast<int>(x) - y.count()};
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year& y)
-{
- date::detail::save_ostream<CharT, Traits> _(os);
- os.fill('0');
- os.flags(std::ios::dec | std::ios::internal);
- os.width(4 + (y < year{0}));
- os << static_cast<int>(y);
- return os;
-}
-
-// weekday
-
-CONSTCD11
-inline
-unsigned char
-weekday::weekday_from_days(int z) NOEXCEPT
-{
- return static_cast<unsigned char>(static_cast<unsigned>(
- z >= -4 ? (z+4) % 7 : (z+5) % 7 + 6));
-}
-
-CONSTCD11
-inline
-weekday::weekday(unsigned wd) NOEXCEPT
- : wd_(static_cast<decltype(wd_)>(wd))
- {}
-
-CONSTCD11
-inline
-weekday::weekday(const sys_days& dp) NOEXCEPT
- : wd_(weekday_from_days(dp.time_since_epoch().count()))
- {}
-
-CONSTCD11
-inline
-weekday::weekday(const local_days& dp) NOEXCEPT
- : wd_(weekday_from_days(dp.time_since_epoch().count()))
- {}
-
-CONSTCD14 inline weekday& weekday::operator++() NOEXCEPT {if (++wd_ == 7) wd_ = 0; return *this;}
-CONSTCD14 inline weekday weekday::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-CONSTCD14 inline weekday& weekday::operator--() NOEXCEPT {if (wd_-- == 0) wd_ = 6; return *this;}
-CONSTCD14 inline weekday weekday::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-
-CONSTCD14
-inline
-weekday&
-weekday::operator+=(const days& d) NOEXCEPT
-{
- *this = *this + d;
- return *this;
-}
-
-CONSTCD14
-inline
-weekday&
-weekday::operator-=(const days& d) NOEXCEPT
-{
- *this = *this - d;
- return *this;
-}
-
-CONSTCD11
-inline
-weekday::operator unsigned() const NOEXCEPT
-{
- return static_cast<unsigned>(wd_);
-}
-
-CONSTCD11 inline bool weekday::ok() const NOEXCEPT {return wd_ <= 6;}
-
-CONSTCD11
-inline
-bool
-operator==(const weekday& x, const weekday& y) NOEXCEPT
-{
- return static_cast<unsigned>(x) == static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const weekday& x, const weekday& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD14
-inline
-days
-operator-(const weekday& x, const weekday& y) NOEXCEPT
-{
- auto const diff = static_cast<unsigned>(x) - static_cast<unsigned>(y);
- return days{diff <= 6 ? diff : diff + 7};
-}
-
-CONSTCD14
-inline
-weekday
-operator+(const weekday& x, const days& y) NOEXCEPT
-{
- auto const wdu = static_cast<long long>(static_cast<unsigned>(x)) + y.count();
- auto const wk = (wdu >= 0 ? wdu : wdu-6) / 7;
- return weekday{static_cast<unsigned>(wdu - wk * 7)};
-}
-
-CONSTCD14
-inline
-weekday
-operator+(const days& x, const weekday& y) NOEXCEPT
-{
- return y + x;
-}
-
-CONSTCD14
-inline
-weekday
-operator-(const weekday& x, const days& y) NOEXCEPT
-{
- return x + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday& wd)
-{
- switch (static_cast<unsigned>(wd))
- {
- case 0:
- os << "Sun";
- break;
- case 1:
- os << "Mon";
- break;
- case 2:
- os << "Tue";
- break;
- case 3:
- os << "Wed";
- break;
- case 4:
- os << "Thu";
- break;
- case 5:
- os << "Fri";
- break;
- case 6:
- os << "Sat";
- break;
- default:
- os << static_cast<unsigned>(wd) << " is not a valid weekday";
- break;
- }
- return os;
-}
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-inline namespace literals
-{
-
-CONSTCD11
-inline
-julian::day
-operator "" _d(unsigned long long d) NOEXCEPT
-{
- return julian::day{static_cast<unsigned>(d)};
-}
-
-CONSTCD11
-inline
-julian::year
-operator "" _y(unsigned long long y) NOEXCEPT
-{
- return julian::year(static_cast<int>(y));
-}
-#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900)
-
-CONSTDATA julian::last_spec last{};
-
-CONSTDATA julian::month jan{1};
-CONSTDATA julian::month feb{2};
-CONSTDATA julian::month mar{3};
-CONSTDATA julian::month apr{4};
-CONSTDATA julian::month may{5};
-CONSTDATA julian::month jun{6};
-CONSTDATA julian::month jul{7};
-CONSTDATA julian::month aug{8};
-CONSTDATA julian::month sep{9};
-CONSTDATA julian::month oct{10};
-CONSTDATA julian::month nov{11};
-CONSTDATA julian::month dec{12};
-
-CONSTDATA julian::weekday sun{0u};
-CONSTDATA julian::weekday mon{1u};
-CONSTDATA julian::weekday tue{2u};
-CONSTDATA julian::weekday wed{3u};
-CONSTDATA julian::weekday thu{4u};
-CONSTDATA julian::weekday fri{5u};
-CONSTDATA julian::weekday sat{6u};
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-} // inline namespace literals
-#endif
-
-// weekday_indexed
-
-CONSTCD11
-inline
-weekday
-weekday_indexed::weekday() const NOEXCEPT
-{
- return julian::weekday{static_cast<unsigned>(wd_)};
-}
-
-CONSTCD11 inline unsigned weekday_indexed::index() const NOEXCEPT {return index_;}
-
-CONSTCD11
-inline
-bool
-weekday_indexed::ok() const NOEXCEPT
-{
- return weekday().ok() && 1 <= index_ && index_ <= 5;
-}
-
-CONSTCD11
-inline
-weekday_indexed::weekday_indexed(const julian::weekday& wd, unsigned index) NOEXCEPT
- : wd_(static_cast<decltype(wd_)>(static_cast<unsigned>(wd)))
- , index_(static_cast<decltype(index_)>(index))
- {}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday_indexed& wdi)
-{
- return os << wdi.weekday() << '[' << wdi.index() << ']';
-}
-
-CONSTCD11
-inline
-weekday_indexed
-weekday::operator[](unsigned index) const NOEXCEPT
-{
- return {*this, index};
-}
-
-CONSTCD11
-inline
-bool
-operator==(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT
-{
- return x.weekday() == y.weekday() && x.index() == y.index();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-// weekday_last
-
-CONSTCD11 inline julian::weekday weekday_last::weekday() const NOEXCEPT {return wd_;}
-CONSTCD11 inline bool weekday_last::ok() const NOEXCEPT {return wd_.ok();}
-CONSTCD11 inline weekday_last::weekday_last(const julian::weekday& wd) NOEXCEPT : wd_(wd) {}
-
-CONSTCD11
-inline
-bool
-operator==(const weekday_last& x, const weekday_last& y) NOEXCEPT
-{
- return x.weekday() == y.weekday();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const weekday_last& x, const weekday_last& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday_last& wdl)
-{
- return os << wdl.weekday() << "[last]";
-}
-
-CONSTCD11
-inline
-weekday_last
-weekday::operator[](last_spec) const NOEXCEPT
-{
- return weekday_last{*this};
-}
-
-// year_month
-
-CONSTCD11
-inline
-year_month::year_month(const julian::year& y, const julian::month& m) NOEXCEPT
- : y_(y)
- , m_(m)
- {}
-
-CONSTCD11 inline year year_month::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month::month() const NOEXCEPT {return m_;}
-CONSTCD11 inline bool year_month::ok() const NOEXCEPT {return y_.ok() && m_.ok();}
-
-CONSTCD14
-inline
-year_month&
-year_month::operator+=(const months& dm) NOEXCEPT
-{
- *this = *this + dm;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month&
-year_month::operator-=(const months& dm) NOEXCEPT
-{
- *this = *this - dm;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month&
-year_month::operator+=(const years& dy) NOEXCEPT
-{
- *this = *this + dy;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month&
-year_month::operator-=(const years& dy) NOEXCEPT
-{
- *this = *this - dy;
- return *this;
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month& x, const year_month& y) NOEXCEPT
-{
- return x.year() == y.year() && x.month() == y.month();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month& x, const year_month& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_month& x, const year_month& y) NOEXCEPT
-{
- return x.year() < y.year() ? true
- : (x.year() > y.year() ? false
- : (x.month() < y.month()));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_month& x, const year_month& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_month& x, const year_month& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_month& x, const year_month& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-CONSTCD14
-inline
-year_month
-operator+(const year_month& ym, const months& dm) NOEXCEPT
-{
- auto dmi = static_cast<int>(static_cast<unsigned>(ym.month())) - 1 + dm.count();
- auto dy = (dmi >= 0 ? dmi : dmi-11) / 12;
- dmi = dmi - dy * 12 + 1;
- return (ym.year() + years(dy)) / month(static_cast<unsigned>(dmi));
-}
-
-CONSTCD14
-inline
-year_month
-operator+(const months& dm, const year_month& ym) NOEXCEPT
-{
- return ym + dm;
-}
-
-CONSTCD14
-inline
-year_month
-operator-(const year_month& ym, const months& dm) NOEXCEPT
-{
- return ym + -dm;
-}
-
-CONSTCD11
-inline
-months
-operator-(const year_month& x, const year_month& y) NOEXCEPT
-{
- return (x.year() - y.year()) +
- months(static_cast<unsigned>(x.month()) - static_cast<unsigned>(y.month()));
-}
-
-CONSTCD11
-inline
-year_month
-operator+(const year_month& ym, const years& dy) NOEXCEPT
-{
- return (ym.year() + dy) / ym.month();
-}
-
-CONSTCD11
-inline
-year_month
-operator+(const years& dy, const year_month& ym) NOEXCEPT
-{
- return ym + dy;
-}
-
-CONSTCD11
-inline
-year_month
-operator-(const year_month& ym, const years& dy) NOEXCEPT
-{
- return ym + -dy;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month& ym)
-{
- return os << ym.year() << '/' << ym.month();
-}
-
-// month_day
-
-CONSTCD11
-inline
-month_day::month_day(const julian::month& m, const julian::day& d) NOEXCEPT
- : m_(m)
- , d_(d)
- {}
-
-CONSTCD11 inline julian::month month_day::month() const NOEXCEPT {return m_;}
-CONSTCD11 inline julian::day month_day::day() const NOEXCEPT {return d_;}
-
-CONSTCD14
-inline
-bool
-month_day::ok() const NOEXCEPT
-{
- CONSTDATA julian::day d[] =
- {31_d, 29_d, 31_d, 30_d, 31_d, 30_d, 31_d, 31_d, 30_d, 31_d, 30_d, 31_d};
- return m_.ok() && 1_d <= d_ && d_ <= d[static_cast<unsigned>(m_)-1];
-}
-
-CONSTCD11
-inline
-bool
-operator==(const month_day& x, const month_day& y) NOEXCEPT
-{
- return x.month() == y.month() && x.day() == y.day();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month_day& x, const month_day& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const month_day& x, const month_day& y) NOEXCEPT
-{
- return x.month() < y.month() ? true
- : (x.month() > y.month() ? false
- : (x.day() < y.day()));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const month_day& x, const month_day& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const month_day& x, const month_day& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const month_day& x, const month_day& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_day& md)
-{
- return os << md.month() << '/' << md.day();
-}
-
-// month_day_last
-
-CONSTCD11 inline month month_day_last::month() const NOEXCEPT {return m_;}
-CONSTCD11 inline bool month_day_last::ok() const NOEXCEPT {return m_.ok();}
-CONSTCD11 inline month_day_last::month_day_last(const julian::month& m) NOEXCEPT : m_(m) {}
-
-CONSTCD11
-inline
-bool
-operator==(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
- return x.month() == y.month();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
- return x.month() < y.month();
-}
-
-CONSTCD11
-inline
-bool
-operator>(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_day_last& mdl)
-{
- return os << mdl.month() << "/last";
-}
-
-// month_weekday
-
-CONSTCD11
-inline
-month_weekday::month_weekday(const julian::month& m,
- const julian::weekday_indexed& wdi) NOEXCEPT
- : m_(m)
- , wdi_(wdi)
- {}
-
-CONSTCD11 inline month month_weekday::month() const NOEXCEPT {return m_;}
-
-CONSTCD11
-inline
-weekday_indexed
-month_weekday::weekday_indexed() const NOEXCEPT
-{
- return wdi_;
-}
-
-CONSTCD11
-inline
-bool
-month_weekday::ok() const NOEXCEPT
-{
- return m_.ok() && wdi_.ok();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const month_weekday& x, const month_weekday& y) NOEXCEPT
-{
- return x.month() == y.month() && x.weekday_indexed() == y.weekday_indexed();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month_weekday& x, const month_weekday& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_weekday& mwd)
-{
- return os << mwd.month() << '/' << mwd.weekday_indexed();
-}
-
-// month_weekday_last
-
-CONSTCD11
-inline
-month_weekday_last::month_weekday_last(const julian::month& m,
- const julian::weekday_last& wdl) NOEXCEPT
- : m_(m)
- , wdl_(wdl)
- {}
-
-CONSTCD11 inline month month_weekday_last::month() const NOEXCEPT {return m_;}
-
-CONSTCD11
-inline
-weekday_last
-month_weekday_last::weekday_last() const NOEXCEPT
-{
- return wdl_;
-}
-
-CONSTCD11
-inline
-bool
-month_weekday_last::ok() const NOEXCEPT
-{
- return m_.ok() && wdl_.ok();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT
-{
- return x.month() == y.month() && x.weekday_last() == y.weekday_last();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_weekday_last& mwdl)
-{
- return os << mwdl.month() << '/' << mwdl.weekday_last();
-}
-
-// year_month_day_last
-
-CONSTCD11
-inline
-year_month_day_last::year_month_day_last(const julian::year& y,
- const julian::month_day_last& mdl) NOEXCEPT
- : y_(y)
- , mdl_(mdl)
- {}
-
-CONSTCD14
-inline
-year_month_day_last&
-year_month_day_last::operator+=(const months& m) NOEXCEPT
-{
- *this = *this + m;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_day_last&
-year_month_day_last::operator-=(const months& m) NOEXCEPT
-{
- *this = *this - m;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_day_last&
-year_month_day_last::operator+=(const years& y) NOEXCEPT
-{
- *this = *this + y;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_day_last&
-year_month_day_last::operator-=(const years& y) NOEXCEPT
-{
- *this = *this - y;
- return *this;
-}
-
-CONSTCD11 inline year year_month_day_last::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month_day_last::month() const NOEXCEPT {return mdl_.month();}
-
-CONSTCD11
-inline
-month_day_last
-year_month_day_last::month_day_last() const NOEXCEPT
-{
- return mdl_;
-}
-
-CONSTCD14
-inline
-day
-year_month_day_last::day() const NOEXCEPT
-{
- CONSTDATA julian::day d[] =
- {31_d, 28_d, 31_d, 30_d, 31_d, 30_d, 31_d, 31_d, 30_d, 31_d, 30_d, 31_d};
- return month() != feb || !y_.is_leap() ? d[static_cast<unsigned>(month())-1] : 29_d;
-}
-
-CONSTCD14
-inline
-year_month_day_last::operator sys_days() const NOEXCEPT
-{
- return sys_days(year()/month()/day());
-}
-
-CONSTCD14
-inline
-year_month_day_last::operator local_days() const NOEXCEPT
-{
- return local_days(year()/month()/day());
-}
-
-CONSTCD11
-inline
-bool
-year_month_day_last::ok() const NOEXCEPT
-{
- return y_.ok() && mdl_.ok();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
- return x.year() == y.year() && x.month_day_last() == y.month_day_last();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
- return x.year() < y.year() ? true
- : (x.year() > y.year() ? false
- : (x.month_day_last() < y.month_day_last()));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_day_last& ymdl)
-{
- return os << ymdl.year() << '/' << ymdl.month_day_last();
-}
-
-CONSTCD14
-inline
-year_month_day_last
-operator+(const year_month_day_last& ymdl, const months& dm) NOEXCEPT
-{
- return (ymdl.year() / ymdl.month() + dm) / last;
-}
-
-CONSTCD14
-inline
-year_month_day_last
-operator+(const months& dm, const year_month_day_last& ymdl) NOEXCEPT
-{
- return ymdl + dm;
-}
-
-CONSTCD14
-inline
-year_month_day_last
-operator-(const year_month_day_last& ymdl, const months& dm) NOEXCEPT
-{
- return ymdl + (-dm);
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator+(const year_month_day_last& ymdl, const years& dy) NOEXCEPT
-{
- return {ymdl.year()+dy, ymdl.month_day_last()};
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator+(const years& dy, const year_month_day_last& ymdl) NOEXCEPT
-{
- return ymdl + dy;
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator-(const year_month_day_last& ymdl, const years& dy) NOEXCEPT
-{
- return ymdl + (-dy);
-}
-
-// year_month_day
-
-CONSTCD11
-inline
-year_month_day::year_month_day(const julian::year& y, const julian::month& m,
- const julian::day& d) NOEXCEPT
- : y_(y)
- , m_(m)
- , d_(d)
- {}
-
-CONSTCD14
-inline
-year_month_day::year_month_day(const year_month_day_last& ymdl) NOEXCEPT
- : y_(ymdl.year())
- , m_(ymdl.month())
- , d_(ymdl.day())
- {}
-
-CONSTCD14
-inline
-year_month_day::year_month_day(sys_days dp) NOEXCEPT
- : year_month_day(from_days(dp.time_since_epoch()))
- {}
-
-CONSTCD14
-inline
-year_month_day::year_month_day(local_days dp) NOEXCEPT
- : year_month_day(from_days(dp.time_since_epoch()))
- {}
-
-CONSTCD11 inline year year_month_day::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month_day::month() const NOEXCEPT {return m_;}
-CONSTCD11 inline day year_month_day::day() const NOEXCEPT {return d_;}
-
-CONSTCD14
-inline
-year_month_day&
-year_month_day::operator+=(const months& m) NOEXCEPT
-{
- *this = *this + m;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_day&
-year_month_day::operator-=(const months& m) NOEXCEPT
-{
- *this = *this - m;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_day&
-year_month_day::operator+=(const years& y) NOEXCEPT
-{
- *this = *this + y;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_day&
-year_month_day::operator-=(const years& y) NOEXCEPT
-{
- *this = *this - y;
- return *this;
-}
-
-CONSTCD14
-inline
-days
-year_month_day::to_days() const NOEXCEPT
-{
- static_assert(std::numeric_limits<unsigned>::digits >= 18,
- "This algorithm has not been ported to a 16 bit unsigned integer");
- static_assert(std::numeric_limits<int>::digits >= 20,
- "This algorithm has not been ported to a 16 bit signed integer");
- auto const y = static_cast<int>(y_) - (m_ <= feb);
- auto const m = static_cast<unsigned>(m_);
- auto const d = static_cast<unsigned>(d_);
- auto const era = (y >= 0 ? y : y-3) / 4;
- auto const yoe = static_cast<unsigned>(y - era * 4); // [0, 3]
- auto const doy = (153*(m > 2 ? m-3 : m+9) + 2)/5 + d-1; // [0, 365]
- auto const doe = yoe * 365 + doy; // [0, 1460]
- return days{era * 1461 + static_cast<int>(doe) - 719470};
-}
-
-CONSTCD14
-inline
-year_month_day::operator sys_days() const NOEXCEPT
-{
- return sys_days{to_days()};
-}
-
-CONSTCD14
-inline
-year_month_day::operator local_days() const NOEXCEPT
-{
- return local_days{to_days()};
-}
-
-CONSTCD14
-inline
-bool
-year_month_day::ok() const NOEXCEPT
-{
- if (!(y_.ok() && m_.ok()))
- return false;
- return 1_d <= d_ && d_ <= (y_/m_/last).day();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
- return x.year() == y.year() && x.month() == y.month() && x.day() == y.day();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
- return x.year() < y.year() ? true
- : (x.year() > y.year() ? false
- : (x.month() < y.month() ? true
- : (x.month() > y.month() ? false
- : (x.day() < y.day()))));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
- return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
- return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
- return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_day& ymd)
-{
- date::detail::save_ostream<CharT, Traits> _(os);
- os.fill('0');
- os.flags(std::ios::dec | std::ios::right);
- os << ymd.year() << '-';
- os.width(2);
- os << static_cast<unsigned>(ymd.month()) << '-';
- os << ymd.day();
- return os;
-}
-
-CONSTCD14
-inline
-year_month_day
-year_month_day::from_days(days dp) NOEXCEPT
-{
- static_assert(std::numeric_limits<unsigned>::digits >= 18,
- "This algorithm has not been ported to a 16 bit unsigned integer");
- static_assert(std::numeric_limits<int>::digits >= 20,
- "This algorithm has not been ported to a 16 bit signed integer");
- auto const z = dp.count() + 719470;
- auto const era = (z >= 0 ? z : z - 1460) / 1461;
- auto const doe = static_cast<unsigned>(z - era * 1461); // [0, 1460]
- auto const yoe = (doe - doe/1460) / 365; // [0, 3]
- auto const y = static_cast<sys_days::rep>(yoe) + era * 4;
- auto const doy = doe - 365*yoe; // [0, 365]
- auto const mp = (5*doy + 2)/153; // [0, 11]
- auto const d = doy - (153*mp+2)/5 + 1; // [1, 31]
- auto const m = mp < 10 ? mp+3 : mp-9; // [1, 12]
- return year_month_day{julian::year{y + (m <= 2)}, julian::month(m), julian::day(d)};
-}
-
-CONSTCD14
-inline
-year_month_day
-operator+(const year_month_day& ymd, const months& dm) NOEXCEPT
-{
- return (ymd.year() / ymd.month() + dm) / ymd.day();
-}
-
-CONSTCD14
-inline
-year_month_day
-operator+(const months& dm, const year_month_day& ymd) NOEXCEPT
-{
- return ymd + dm;
-}
-
-CONSTCD14
-inline
-year_month_day
-operator-(const year_month_day& ymd, const months& dm) NOEXCEPT
-{
- return ymd + (-dm);
-}
-
-CONSTCD11
-inline
-year_month_day
-operator+(const year_month_day& ymd, const years& dy) NOEXCEPT
-{
- return (ymd.year() + dy) / ymd.month() / ymd.day();
-}
-
-CONSTCD11
-inline
-year_month_day
-operator+(const years& dy, const year_month_day& ymd) NOEXCEPT
-{
- return ymd + dy;
-}
-
-CONSTCD11
-inline
-year_month_day
-operator-(const year_month_day& ymd, const years& dy) NOEXCEPT
-{
- return ymd + (-dy);
-}
-
-// year_month_weekday
-
-CONSTCD11
-inline
-year_month_weekday::year_month_weekday(const julian::year& y, const julian::month& m,
- const julian::weekday_indexed& wdi)
- NOEXCEPT
- : y_(y)
- , m_(m)
- , wdi_(wdi)
- {}
-
-CONSTCD14
-inline
-year_month_weekday::year_month_weekday(const sys_days& dp) NOEXCEPT
- : year_month_weekday(from_days(dp.time_since_epoch()))
- {}
-
-CONSTCD14
-inline
-year_month_weekday::year_month_weekday(const local_days& dp) NOEXCEPT
- : year_month_weekday(from_days(dp.time_since_epoch()))
- {}
-
-CONSTCD14
-inline
-year_month_weekday&
-year_month_weekday::operator+=(const months& m) NOEXCEPT
-{
- *this = *this + m;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday&
-year_month_weekday::operator-=(const months& m) NOEXCEPT
-{
- *this = *this - m;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday&
-year_month_weekday::operator+=(const years& y) NOEXCEPT
-{
- *this = *this + y;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday&
-year_month_weekday::operator-=(const years& y) NOEXCEPT
-{
- *this = *this - y;
- return *this;
-}
-
-CONSTCD11 inline year year_month_weekday::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month_weekday::month() const NOEXCEPT {return m_;}
-
-CONSTCD11
-inline
-weekday
-year_month_weekday::weekday() const NOEXCEPT
-{
- return wdi_.weekday();
-}
-
-CONSTCD11
-inline
-unsigned
-year_month_weekday::index() const NOEXCEPT
-{
- return wdi_.index();
-}
-
-CONSTCD11
-inline
-weekday_indexed
-year_month_weekday::weekday_indexed() const NOEXCEPT
-{
- return wdi_;
-}
-
-CONSTCD14
-inline
-year_month_weekday::operator sys_days() const NOEXCEPT
-{
- return sys_days{to_days()};
-}
-
-CONSTCD14
-inline
-year_month_weekday::operator local_days() const NOEXCEPT
-{
- return local_days{to_days()};
-}
-
-CONSTCD14
-inline
-bool
-year_month_weekday::ok() const NOEXCEPT
-{
- if (!y_.ok() || !m_.ok() || !wdi_.weekday().ok() || wdi_.index() < 1)
- return false;
- if (wdi_.index() <= 4)
- return true;
- auto d2 = wdi_.weekday() - julian::weekday(y_/m_/1) + days((wdi_.index()-1)*7 + 1);
- return static_cast<unsigned>(d2.count()) <= static_cast<unsigned>((y_/m_/last).day());
-}
-
-CONSTCD14
-inline
-year_month_weekday
-year_month_weekday::from_days(days d) NOEXCEPT
-{
- sys_days dp{d};
- auto const wd = julian::weekday(dp);
- auto const ymd = year_month_day(dp);
- return {ymd.year(), ymd.month(), wd[(static_cast<unsigned>(ymd.day())-1)/7+1]};
-}
-
-CONSTCD14
-inline
-days
-year_month_weekday::to_days() const NOEXCEPT
-{
- auto d = sys_days(y_/m_/1);
- return (d + (wdi_.weekday() - julian::weekday(d) + days{(wdi_.index()-1)*7})
- ).time_since_epoch();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT
-{
- return x.year() == y.year() && x.month() == y.month() &&
- x.weekday_indexed() == y.weekday_indexed();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday& ymwdi)
-{
- return os << ymwdi.year() << '/' << ymwdi.month()
- << '/' << ymwdi.weekday_indexed();
-}
-
-CONSTCD14
-inline
-year_month_weekday
-operator+(const year_month_weekday& ymwd, const months& dm) NOEXCEPT
-{
- return (ymwd.year() / ymwd.month() + dm) / ymwd.weekday_indexed();
-}
-
-CONSTCD14
-inline
-year_month_weekday
-operator+(const months& dm, const year_month_weekday& ymwd) NOEXCEPT
-{
- return ymwd + dm;
-}
-
-CONSTCD14
-inline
-year_month_weekday
-operator-(const year_month_weekday& ymwd, const months& dm) NOEXCEPT
-{
- return ymwd + (-dm);
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator+(const year_month_weekday& ymwd, const years& dy) NOEXCEPT
-{
- return {ymwd.year()+dy, ymwd.month(), ymwd.weekday_indexed()};
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator+(const years& dy, const year_month_weekday& ymwd) NOEXCEPT
-{
- return ymwd + dy;
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator-(const year_month_weekday& ymwd, const years& dy) NOEXCEPT
-{
- return ymwd + (-dy);
-}
-
-// year_month_weekday_last
-
-CONSTCD11
-inline
-year_month_weekday_last::year_month_weekday_last(const julian::year& y,
- const julian::month& m,
- const julian::weekday_last& wdl) NOEXCEPT
- : y_(y)
- , m_(m)
- , wdl_(wdl)
- {}
-
-CONSTCD14
-inline
-year_month_weekday_last&
-year_month_weekday_last::operator+=(const months& m) NOEXCEPT
-{
- *this = *this + m;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last&
-year_month_weekday_last::operator-=(const months& m) NOEXCEPT
-{
- *this = *this - m;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last&
-year_month_weekday_last::operator+=(const years& y) NOEXCEPT
-{
- *this = *this + y;
- return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last&
-year_month_weekday_last::operator-=(const years& y) NOEXCEPT
-{
- *this = *this - y;
- return *this;
-}
-
-CONSTCD11 inline year year_month_weekday_last::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month_weekday_last::month() const NOEXCEPT {return m_;}
-
-CONSTCD11
-inline
-weekday
-year_month_weekday_last::weekday() const NOEXCEPT
-{
- return wdl_.weekday();
-}
-
-CONSTCD11
-inline
-weekday_last
-year_month_weekday_last::weekday_last() const NOEXCEPT
-{
- return wdl_;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last::operator sys_days() const NOEXCEPT
-{
- return sys_days{to_days()};
-}
-
-CONSTCD14
-inline
-year_month_weekday_last::operator local_days() const NOEXCEPT
-{
- return local_days{to_days()};
-}
-
-CONSTCD11
-inline
-bool
-year_month_weekday_last::ok() const NOEXCEPT
-{
- return y_.ok() && m_.ok() && wdl_.ok();
-}
-
-CONSTCD14
-inline
-days
-year_month_weekday_last::to_days() const NOEXCEPT
-{
- auto const d = sys_days(y_/m_/last);
- return (d - (julian::weekday{d} - wdl_.weekday())).time_since_epoch();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT
-{
- return x.year() == y.year() && x.month() == y.month() &&
- x.weekday_last() == y.weekday_last();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT
-{
- return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday_last& ymwdl)
-{
- return os << ymwdl.year() << '/' << ymwdl.month() << '/' << ymwdl.weekday_last();
-}
-
-CONSTCD14
-inline
-year_month_weekday_last
-operator+(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT
-{
- return (ymwdl.year() / ymwdl.month() + dm) / ymwdl.weekday_last();
-}
-
-CONSTCD14
-inline
-year_month_weekday_last
-operator+(const months& dm, const year_month_weekday_last& ymwdl) NOEXCEPT
-{
- return ymwdl + dm;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last
-operator-(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT
-{
- return ymwdl + (-dm);
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator+(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT
-{
- return {ymwdl.year()+dy, ymwdl.month(), ymwdl.weekday_last()};
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator+(const years& dy, const year_month_weekday_last& ymwdl) NOEXCEPT
-{
- return ymwdl + dy;
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator-(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT
-{
- return ymwdl + (-dy);
-}
-
-// year_month from operator/()
-
-CONSTCD11
-inline
-year_month
-operator/(const year& y, const month& m) NOEXCEPT
-{
- return {y, m};
-}
-
-CONSTCD11
-inline
-year_month
-operator/(const year& y, int m) NOEXCEPT
-{
- return y / month(static_cast<unsigned>(m));
-}
-
-// month_day from operator/()
-
-CONSTCD11
-inline
-month_day
-operator/(const month& m, const day& d) NOEXCEPT
-{
- return {m, d};
-}
-
-CONSTCD11
-inline
-month_day
-operator/(const day& d, const month& m) NOEXCEPT
-{
- return m / d;
-}
-
-CONSTCD11
-inline
-month_day
-operator/(const month& m, int d) NOEXCEPT
-{
- return m / day(static_cast<unsigned>(d));
-}
-
-CONSTCD11
-inline
-month_day
-operator/(int m, const day& d) NOEXCEPT
-{
- return month(static_cast<unsigned>(m)) / d;
-}
-
-CONSTCD11 inline month_day operator/(const day& d, int m) NOEXCEPT {return m / d;}
-
-// month_day_last from operator/()
-
-CONSTCD11
-inline
-month_day_last
-operator/(const month& m, last_spec) NOEXCEPT
-{
- return month_day_last{m};
-}
-
-CONSTCD11
-inline
-month_day_last
-operator/(last_spec, const month& m) NOEXCEPT
-{
- return m/last;
-}
-
-CONSTCD11
-inline
-month_day_last
-operator/(int m, last_spec) NOEXCEPT
-{
- return month(static_cast<unsigned>(m))/last;
-}
-
-CONSTCD11
-inline
-month_day_last
-operator/(last_spec, int m) NOEXCEPT
-{
- return m/last;
-}
-
-// month_weekday from operator/()
-
-CONSTCD11
-inline
-month_weekday
-operator/(const month& m, const weekday_indexed& wdi) NOEXCEPT
-{
- return {m, wdi};
-}
-
-CONSTCD11
-inline
-month_weekday
-operator/(const weekday_indexed& wdi, const month& m) NOEXCEPT
-{
- return m / wdi;
-}
-
-CONSTCD11
-inline
-month_weekday
-operator/(int m, const weekday_indexed& wdi) NOEXCEPT
-{
- return month(static_cast<unsigned>(m)) / wdi;
-}
-
-CONSTCD11
-inline
-month_weekday
-operator/(const weekday_indexed& wdi, int m) NOEXCEPT
-{
- return m / wdi;
-}
-
-// month_weekday_last from operator/()
-
-CONSTCD11
-inline
-month_weekday_last
-operator/(const month& m, const weekday_last& wdl) NOEXCEPT
-{
- return {m, wdl};
-}
-
-CONSTCD11
-inline
-month_weekday_last
-operator/(const weekday_last& wdl, const month& m) NOEXCEPT
-{
- return m / wdl;
-}
-
-CONSTCD11
-inline
-month_weekday_last
-operator/(int m, const weekday_last& wdl) NOEXCEPT
-{
- return month(static_cast<unsigned>(m)) / wdl;
-}
-
-CONSTCD11
-inline
-month_weekday_last
-operator/(const weekday_last& wdl, int m) NOEXCEPT
-{
- return m / wdl;
-}
-
-// year_month_day from operator/()
-
-CONSTCD11
-inline
-year_month_day
-operator/(const year_month& ym, const day& d) NOEXCEPT
-{
- return {ym.year(), ym.month(), d};
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(const year_month& ym, int d) NOEXCEPT
-{
- return ym / day(static_cast<unsigned>(d));
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(const year& y, const month_day& md) NOEXCEPT
-{
- return y / md.month() / md.day();
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(int y, const month_day& md) NOEXCEPT
-{
- return year(y) / md;
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(const month_day& md, const year& y) NOEXCEPT
-{
- return y / md;
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(const month_day& md, int y) NOEXCEPT
-{
- return year(y) / md;
-}
-
-// year_month_day_last from operator/()
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(const year_month& ym, last_spec) NOEXCEPT
-{
- return {ym.year(), month_day_last{ym.month()}};
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(const year& y, const month_day_last& mdl) NOEXCEPT
-{
- return {y, mdl};
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(int y, const month_day_last& mdl) NOEXCEPT
-{
- return year(y) / mdl;
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(const month_day_last& mdl, const year& y) NOEXCEPT
-{
- return y / mdl;
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(const month_day_last& mdl, int y) NOEXCEPT
-{
- return year(y) / mdl;
-}
-
-// year_month_weekday from operator/()
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(const year_month& ym, const weekday_indexed& wdi) NOEXCEPT
-{
- return {ym.year(), ym.month(), wdi};
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(const year& y, const month_weekday& mwd) NOEXCEPT
-{
- return {y, mwd.month(), mwd.weekday_indexed()};
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(int y, const month_weekday& mwd) NOEXCEPT
-{
- return year(y) / mwd;
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(const month_weekday& mwd, const year& y) NOEXCEPT
-{
- return y / mwd;
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(const month_weekday& mwd, int y) NOEXCEPT
-{
- return year(y) / mwd;
-}
-
-// year_month_weekday_last from operator/()
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(const year_month& ym, const weekday_last& wdl) NOEXCEPT
-{
- return {ym.year(), ym.month(), wdl};
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(const year& y, const month_weekday_last& mwdl) NOEXCEPT
-{
- return {y, mwdl.month(), mwdl.weekday_last()};
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(int y, const month_weekday_last& mwdl) NOEXCEPT
-{
- return year(y) / mwdl;
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(const month_weekday_last& mwdl, const year& y) NOEXCEPT
-{
- return y / mwdl;
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(const month_weekday_last& mwdl, int y) NOEXCEPT
-{
- return year(y) / mwdl;
-}
-
-} // namespace julian
-
-#endif // JULIAN_H
diff --git a/src/libs/date/includes/date/ptz.h b/src/libs/date/includes/date/ptz.h
deleted file mode 100644
index 6ff1ab9b..00000000
--- a/src/libs/date/includes/date/ptz.h
+++ /dev/null
@@ -1,627 +0,0 @@
-#ifndef PTZ_H
-#define PTZ_H
-
-// The MIT License (MIT)
-//
-// Copyright (c) 2017 Howard Hinnant
-//
-// 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.
-
-// This header allows Posix-style time zones as specified for TZ here:
-// http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03
-//
-// Posix::time_zone can be constructed with a posix-style string and then used in
-// a zoned_time like so:
-//
-// zoned_time<system_clock::duration, Posix::time_zone> zt{"EST5EDT,M3.2.0,M11.1.0",
-// system_clock::now()};
-// or:
-//
-// Posix::time_zone tz{"EST5EDT,M3.2.0,M11.1.0"};
-// zoned_time<system_clock::duration, Posix::time_zone> zt{tz, system_clock::now()};
-//
-// Note, Posix-style time zones are not recommended for all of the reasons described here:
-// https://stackoverflow.com/tags/timezone/info
-//
-// They are provided here as a non-trivial custom time zone example, and if you really
-// have to have Posix time zones, you're welcome to use this one.
-
-#include "date/tz.h"
-#include <cctype>
-#include <ostream>
-#include <string>
-
-namespace Posix
-{
-
-namespace detail
-{
-
-#if HAS_STRING_VIEW
-
-using string_t = std::string_view;
-
-#else // !HAS_STRING_VIEW
-
-using string_t = std::string;
-
-#endif // !HAS_STRING_VIEW
-
-class rule;
-
-void throw_invalid(const string_t& s, unsigned i, const string_t& message);
-unsigned read_date(const string_t& s, unsigned i, rule& r);
-unsigned read_name(const string_t& s, unsigned i, std::string& name);
-unsigned read_signed_time(const string_t& s, unsigned i, std::chrono::seconds& t);
-unsigned read_unsigned_time(const string_t& s, unsigned i, std::chrono::seconds& t);
-unsigned read_unsigned(const string_t& s, unsigned i, unsigned limit, unsigned& u);
-
-class rule
-{
- enum {off, J, M, N};
-
- date::month m_;
- date::weekday wd_;
- unsigned short n_ : 14;
- unsigned short mode_ : 2;
- std::chrono::duration<std::int32_t> time_ = std::chrono::hours{2};
-
-public:
- rule() : mode_(off) {}
-
- bool ok() const {return mode_ != off;}
- date::local_seconds operator()(date::year y) const;
-
- friend std::ostream& operator<<(std::ostream& os, const rule& r);
- friend unsigned read_date(const string_t& s, unsigned i, rule& r);
-};
-
-inline
-date::local_seconds
-rule::operator()(date::year y) const
-{
- using date::local_days;
- using date::January;
- using date::days;
- using date::last;
- using sec = std::chrono::seconds;
- date::local_seconds t;
- switch (mode_)
- {
- case J:
- t = local_days{y/January/0} + days{n_ + (y.is_leap() && n_ > 59)} + sec{time_};
- break;
- case M:
- t = (n_ == 5 ? local_days{y/m_/wd_[last]} : local_days{y/m_/wd_[n_]}) + sec{time_};
- break;
- case N:
- t = local_days{y/January/1} + days{n_} + sec{time_};
- break;
- default:
- assert(!"rule called with bad mode");
- }
- return t;
-}
-
-inline
-std::ostream&
-operator<<(std::ostream& os, const rule& r)
-{
- switch (r.mode_)
- {
- case rule::J:
- os << 'J' << r.n_ << date::format(" %T", r.time_);
- break;
- case rule::M:
- if (r.n_ == 5)
- os << r.m_/r.wd_[date::last];
- else
- os << r.m_/r.wd_[r.n_];
- os << date::format(" %T", r.time_);
- break;
- case rule::N:
- os << r.n_ << date::format(" %T", r.time_);
- break;
- default:
- break;
- }
- return os;
-}
-
-} // namespace detail
-
-class time_zone
-{
- std::string std_abbrev_;
- std::string dst_abbrev_ = {};
- std::chrono::seconds offset_;
- std::chrono::seconds save_ = std::chrono::hours{1};
- detail::rule start_rule_;
- detail::rule end_rule_;
-
-public:
- explicit time_zone(const detail::string_t& name);
-
- template <class Duration>
- date::sys_info get_info(date::sys_time<Duration> st) const;
- template <class Duration>
- date::local_info get_info(date::local_time<Duration> tp) const;
-
- template <class Duration>
- date::sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
- to_sys(date::local_time<Duration> tp) const;
-
- template <class Duration>
- date::sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
- to_sys(date::local_time<Duration> tp, date::choose z) const;
-
- template <class Duration>
- date::local_time<typename std::common_type<Duration, std::chrono::seconds>::type>
- to_local(date::sys_time<Duration> tp) const;
-
- friend std::ostream& operator<<(std::ostream& os, const time_zone& z);
-
- const time_zone* operator->() const {return this;}
-};
-
-inline
-time_zone::time_zone(const detail::string_t& s)
-{
- using detail::read_name;
- using detail::read_signed_time;
- using detail::throw_invalid;
- auto i = read_name(s, 0, std_abbrev_);
- i = read_signed_time(s, i, offset_);
- offset_ = -offset_;
- if (i != s.size())
- {
- i = read_name(s, i, dst_abbrev_);
- if (i != s.size())
- {
- if (s[i] != ',')
- i = read_signed_time(s, i, save_);
- if (i != s.size())
- {
- if (s[i] != ',')
- throw_invalid(s, i, "Expecting end of string or ',' to start rule");
- ++i;
- i = read_date(s, i, start_rule_);
- if (i == s.size() || s[i] != ',')
- throw_invalid(s, i, "Expecting ',' and then the ending rule");
- ++i;
- i = read_date(s, i, end_rule_);
- if (i != s.size())
- throw_invalid(s, i, "Found unexpected trailing characters");
- }
- }
- }
-}
-
-template <class Duration>
-date::sys_info
-time_zone::get_info(date::sys_time<Duration> st) const
-{
- using date::sys_info;
- using date::year_month_day;
- using date::sys_seconds;
- using date::sys_days;
- using date::floor;
- using date::ceil;
- using date::days;
- using date::years;
- using date::year;
- using date::January;
- using date::December;
- using date::last;
- using std::chrono::minutes;
- sys_info r{};
- r.offset = offset_;
- if (start_rule_.ok())
- {
- auto y = year_month_day{floor<days>(st)}.year();
- auto start = sys_seconds{(start_rule_(y) - offset_).time_since_epoch()};
- auto end = sys_seconds{(end_rule_(y) - (offset_ + save_)).time_since_epoch()};
- if (start <= st && st < end)
- {
- r.begin = start;
- r.end = end;
- r.offset += save_;
- r.save = ceil<minutes>(save_);
- r.abbrev = dst_abbrev_;
- }
- else if (st < start)
- {
- r.begin = sys_seconds{(end_rule_(y-years{1}) -
- (offset_ + save_)).time_since_epoch()};
- r.end = start;
- r.abbrev = std_abbrev_;
- }
- else // st >= end
- {
- r.begin = end;
- r.end = sys_seconds{(start_rule_(y+years{1}) - offset_).time_since_epoch()};
- r.abbrev = std_abbrev_;
- }
- }
- else // constant offset
- {
- r.begin = sys_days{year::min()/January/1};
- r.end = sys_days{year::max()/December/last};
- r.abbrev = std_abbrev_;
- }
- return r;
-}
-
-template <class Duration>
-date::local_info
-time_zone::get_info(date::local_time<Duration> tp) const
-{
- using date::local_info;
- using date::year_month_day;
- using date::days;
- using date::sys_days;
- using date::sys_seconds;
- using date::years;
- using date::year;
- using date::ceil;
- using date::January;
- using date::December;
- using date::last;
- using std::chrono::seconds;
- using std::chrono::minutes;
- local_info r{};
- using date::floor;
- if (start_rule_.ok())
- {
- auto y = year_month_day{floor<days>(tp)}.year();
- auto start = sys_seconds{(start_rule_(y) - offset_).time_since_epoch()};
- auto end = sys_seconds{(end_rule_(y) - (offset_ + save_)).time_since_epoch()};
- auto utcs = sys_seconds{floor<seconds>(tp - offset_).time_since_epoch()};
- auto utcd = sys_seconds{floor<seconds>(tp - (offset_ + save_)).time_since_epoch()};
- if ((utcs < start) != (utcd < start))
- {
- r.first.begin = sys_seconds{(end_rule_(y-years{1}) -
- (offset_ + save_)).time_since_epoch()};
- r.first.end = start;
- r.first.offset = offset_;
- r.first.abbrev = std_abbrev_;
- r.second.begin = start;
- r.second.end = end;
- r.second.abbrev = dst_abbrev_;
- r.second.offset = offset_ + save_;
- r.second.save = ceil<minutes>(save_);
- r.result = save_ > seconds{0} ? local_info::nonexistent
- : local_info::ambiguous;
- }
- else if ((utcs < end) != (utcd < end))
- {
- r.first.begin = start;
- r.first.end = end;
- r.first.offset = offset_ + save_;
- r.first.save = ceil<minutes>(save_);
- r.first.abbrev = dst_abbrev_;
- r.second.begin = end;
- r.second.end = sys_seconds{(start_rule_(y+years{1}) -
- offset_).time_since_epoch()};
- r.second.abbrev = std_abbrev_;
- r.second.offset = offset_;
- r.result = save_ > seconds{0} ? local_info::ambiguous
- : local_info::nonexistent;
- }
- else if (utcs < start)
- {
- r.first.begin = sys_seconds{(end_rule_(y-years{1}) -
- (offset_ + save_)).time_since_epoch()};
- r.first.end = start;
- r.first.offset = offset_;
- r.first.abbrev = std_abbrev_;
- }
- else if (utcs < end)
- {
- r.first.begin = start;
- r.first.end = end;
- r.first.offset = offset_ + save_;
- r.first.save = ceil<minutes>(save_);
- r.first.abbrev = dst_abbrev_;
- }
- else
- {
- r.first.begin = end;
- r.first.end = sys_seconds{(start_rule_(y+years{1}) -
- offset_).time_since_epoch()};
- r.first.abbrev = std_abbrev_;
- r.first.offset = offset_;
- }
- }
- else // constant offset
- {
- r.first.begin = sys_days{year::min()/January/1};
- r.first.end = sys_days{year::max()/December/last};
- r.first.abbrev = std_abbrev_;
- r.first.offset = offset_;
- }
- return r;
-}
-
-template <class Duration>
-date::sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-time_zone::to_sys(date::local_time<Duration> tp) const
-{
- using date::local_info;
- using date::sys_time;
- using date::ambiguous_local_time;
- 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<Duration>{tp.time_since_epoch()} - i.first.offset;
-}
-
-template <class Duration>
-date::sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-time_zone::to_sys(date::local_time<Duration> tp, date::choose z) const
-{
- using date::local_info;
- using date::sys_time;
- using date::choose;
- 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<Duration>{tp.time_since_epoch()} - i.second.offset;
- }
- return sys_time<Duration>{tp.time_since_epoch()} - i.first.offset;
-}
-
-template <class Duration>
-date::local_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-time_zone::to_local(date::sys_time<Duration> tp) const
-{
- using date::local_time;
- using std::chrono::seconds;
- using LT = local_time<typename std::common_type<Duration, seconds>::type>;
- auto i = get_info(tp);
- return LT{(tp + i.offset).time_since_epoch()};
-}
-
-inline
-std::ostream&
-operator<<(std::ostream& os, const time_zone& z)
-{
- using date::operator<<;
- os << '{';
- os << z.std_abbrev_ << ", " << z.dst_abbrev_ << date::format(", %T, ", z.offset_)
- << date::format("%T, [", z.save_) << z.start_rule_ << ", " << z.end_rule_ << ")}";
- return os;
-}
-
-namespace detail
-{
-
-inline
-void
-throw_invalid(const string_t& s, unsigned i, const string_t& message)
-{
- throw std::runtime_error(std::string("Invalid time_zone initializer.\n") +
- std::string(message) + ":\n" +
- std::string(s) + '\n' +
- "\x1b[1;32m" +
- std::string(i, '~') + '^' +
- std::string(s.size()-i-1, '~') +
- "\x1b[0m");
-}
-
-inline
-unsigned
-read_date(const string_t& s, unsigned i, rule& r)
-{
- using date::month;
- using date::weekday;
- if (i == s.size())
- throw_invalid(s, i, "Expected rule but found end of string");
- if (s[i] == 'J')
- {
- ++i;
- unsigned n;
- i = read_unsigned(s, i, 3, n);
- r.mode_ = rule::J;
- r.n_ = n;
- }
- else if (s[i] == 'M')
- {
- ++i;
- unsigned m;
- i = read_unsigned(s, i, 2, m);
- if (i == s.size() || s[i] != '.')
- throw_invalid(s, i, "Expected '.' after month");
- ++i;
- unsigned n;
- i = read_unsigned(s, i, 1, n);
- if (i == s.size() || s[i] != '.')
- throw_invalid(s, i, "Expected '.' after weekday index");
- ++i;
- unsigned wd;
- i = read_unsigned(s, i, 1, wd);
- r.mode_ = rule::M;
- r.m_ = month{m};
- r.wd_ = weekday{wd};
- r.n_ = n;
- }
- else if (std::isdigit(s[i]))
- {
- unsigned n;
- i = read_unsigned(s, i, 3, n);
- r.mode_ = rule::N;
- r.n_ = n;
- }
- else
- throw_invalid(s, i, "Expected 'J', 'M', or a digit to start rule");
- if (i != s.size() && s[i] == '/')
- {
- ++i;
- std::chrono::seconds t;
- i = read_unsigned_time(s, i, t);
- r.time_ = t;
- }
- return i;
-}
-
-inline
-unsigned
-read_name(const string_t& s, unsigned i, std::string& name)
-{
- if (i == s.size())
- throw_invalid(s, i, "Expected a name but found end of string");
- if (s[i] == '<')
- {
- ++i;
- while (true)
- {
- if (i == s.size())
- throw_invalid(s, i,
- "Expected to find closing '>', but found end of string");
- if (s[i] == '>')
- break;
- name.push_back(s[i]);
- ++i;
- }
- ++i;
- }
- else
- {
- while (i != s.size() && std::isalpha(s[i]))
- {
- name.push_back(s[i]);
- ++i;
- }
- }
- if (name.size() < 3)
- throw_invalid(s, i, "Found name to be shorter than 3 characters");
- return i;
-}
-
-inline
-unsigned
-read_signed_time(const string_t& s, unsigned i,
- std::chrono::seconds& t)
-{
- if (i == s.size())
- throw_invalid(s, i, "Expected to read signed time, but found end of string");
- bool negative = false;
- if (s[i] == '-')
- {
- negative = true;
- ++i;
- }
- else if (s[i] == '+')
- ++i;
- i = read_unsigned_time(s, i, t);
- if (negative)
- t = -t;
- return i;
-}
-
-inline
-unsigned
-read_unsigned_time(const string_t& s, unsigned i, std::chrono::seconds& t)
-{
- using std::chrono::seconds;
- using std::chrono::minutes;
- using std::chrono::hours;
- if (i == s.size())
- throw_invalid(s, i, "Expected to read unsigned time, but found end of string");
- unsigned x;
- i = read_unsigned(s, i, 2, x);
- t = hours{x};
- if (i != s.size() && s[i] == ':')
- {
- ++i;
- i = read_unsigned(s, i, 2, x);
- t += minutes{x};
- if (i != s.size() && s[i] == ':')
- {
- ++i;
- i = read_unsigned(s, i, 2, x);
- t += seconds{x};
- }
- }
- return i;
-}
-
-inline
-unsigned
-read_unsigned(const string_t& s, unsigned i, unsigned limit, unsigned& u)
-{
- if (i == s.size() || !std::isdigit(s[i]))
- throw_invalid(s, i, "Expected to find a decimal digit");
- u = static_cast<unsigned>(s[i] - '0');
- unsigned count = 1;
- for (++i; count < limit && i != s.size() && std::isdigit(s[i]); ++i, ++count)
- u = u * 10 + static_cast<unsigned>(s[i] - '0');
- return i;
-}
-
-} // namespace detail
-
-} // namespace Posix
-
-namespace date
-{
-
-template <>
-struct zoned_traits<Posix::time_zone>
-{
-
-#if HAS_STRING_VIEW
-
- static
- Posix::time_zone
- locate_zone(std::string_view name)
- {
- return Posix::time_zone{name};
- }
-
-#else // !HAS_STRING_VIEW
-
- static
- Posix::time_zone
- locate_zone(const std::string& name)
- {
- return Posix::time_zone{name};
- }
-
- static
- Posix::time_zone
- locate_zone(const char* name)
- {
- return Posix::time_zone{name};
- }
-
-#endif // !HAS_STRING_VIEW
-
-};
-
-} // namespace date
-
-#endif // PTZ_H
diff --git a/src/libs/date/includes/date/tz.h b/src/libs/date/includes/date/tz.h
deleted file mode 100644
index 22eac555..00000000
--- a/src/libs/date/includes/date/tz.h
+++ /dev/null
@@ -1,2775 +0,0 @@
-#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.
-
-#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
-# ifndef MISSING_LEAP_SECONDS
-# ifdef __APPLE__
-# define MISSING_LEAP_SECONDS 1
-# else
-# define MISSING_LEAP_SECONDS 0
-# endif
-# endif
-#else
-# define MISSING_LEAP_SECONDS 0
-#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 <algorithm>
-#include <atomic>
-#include <cassert>
-#include <chrono>
-#include <istream>
-#include <locale>
-#include <memory>
-#include <mutex>
-#include <ostream>
-#include <sstream>
-#include <stdexcept>
-#include <string>
-#include <type_traits>
-#include <utility>
-#include <vector>
-
-#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 date
-{
-
-enum class choose {earliest, latest};
-
-namespace detail
-{
- struct undocumented;
-
- template<typename T>
- struct nodeduct
- {
- using type = T;
- };
-
- template<typename T>
- using nodeduct_t = typename nodeduct<T>::type;
-}
-
-struct sys_info
-{
- sys_seconds begin;
- sys_seconds end;
- std::chrono::seconds offset;
- std::chrono::minutes save;
- std::string abbrev;
-};
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const sys_info& r)
-{
- os << r.begin << '\n';
- os << r.end << '\n';
- os << make_time(r.offset) << "\n";
- os << make_time(r.save) << "\n";
- os << r.abbrev << '\n';
- return os;
-}
-
-struct local_info
-{
- enum {unique, nonexistent, ambiguous} result;
- sys_info first;
- sys_info second;
-};
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const local_info& r)
-{
- if (r.result == local_info::nonexistent)
- os << "nonexistent between\n";
- else if (r.result == local_info::ambiguous)
- os << "ambiguous between\n";
- os << r.first;
- if (r.result != local_info::unique)
- {
- os << "and\n";
- os << r.second;
- }
- return os;
-}
-
-class nonexistent_local_time
- : public std::runtime_error
-{
-public:
- template <class Duration>
- nonexistent_local_time(local_time<Duration> tp, const local_info& i);
-
-private:
- template <class Duration>
- static
- std::string
- make_msg(local_time<Duration> tp, const local_info& i);
-};
-
-template <class Duration>
-inline
-nonexistent_local_time::nonexistent_local_time(local_time<Duration> tp,
- const local_info& i)
- : std::runtime_error(make_msg(tp, i))
-{
-}
-
-template <class Duration>
-std::string
-nonexistent_local_time::make_msg(local_time<Duration> 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 <class Duration>
- ambiguous_local_time(local_time<Duration> tp, const local_info& i);
-
-private:
- template <class Duration>
- static
- std::string
- make_msg(local_time<Duration> tp, const local_info& i);
-};
-
-template <class Duration>
-inline
-ambiguous_local_time::ambiguous_local_time(local_time<Duration> tp, const local_info& i)
- : std::runtime_error(make_msg(tp, i))
-{
-}
-
-template <class Duration>
-std::string
-ambiguous_local_time::make_msg(local_time<Duration> 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 <class T>
-struct zoned_traits
-{
-};
-
-template <>
-struct zoned_traits<const time_zone*>
-{
- 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 Duration, class TimeZonePtr>
-class zoned_time;
-
-template <class Duration1, class Duration2, class TimeZonePtr>
-bool
-operator==(const zoned_time<Duration1, TimeZonePtr>& x,
- const zoned_time<Duration2, TimeZonePtr>& y);
-
-template <class Duration, class TimeZonePtr = const time_zone*>
-class zoned_time
-{
-public:
- using duration = typename std::common_type<Duration, std::chrono::seconds>::type;
-
-private:
- TimeZonePtr zone_;
- sys_time<duration> tp_;
-
-public:
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
- template <class T = TimeZonePtr,
- class = decltype(zoned_traits<T>::default_zone())>
-#endif
- zoned_time();
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
- template <class T = TimeZonePtr,
- class = decltype(zoned_traits<T>::default_zone())>
-#endif
- zoned_time(const sys_time<Duration>& st);
- explicit zoned_time(TimeZonePtr z);
-
-#if HAS_STRING_VIEW
- template <class T = TimeZonePtr,
- class = typename std::enable_if
- <
- std::is_constructible
- <
- zoned_time,
- decltype(zoned_traits<T>::locate_zone(std::string_view()))
- >::value
- >::type>
- explicit zoned_time(std::string_view name);
-#else
-# if !defined(_MSC_VER) || (_MSC_VER > 1916)
- template <class T = TimeZonePtr,
- class = typename std::enable_if
- <
- std::is_constructible
- <
- zoned_time,
- decltype(zoned_traits<T>::locate_zone(std::string()))
- >::value
- >::type>
-# endif
- explicit zoned_time(const std::string& name);
-#endif
-
- template <class Duration2,
- class = typename std::enable_if
- <
- std::is_convertible<sys_time<Duration2>,
- sys_time<Duration>>::value
- >::type>
- zoned_time(const zoned_time<Duration2, TimeZonePtr>& zt) NOEXCEPT;
-
- zoned_time(TimeZonePtr z, const sys_time<Duration>& st);
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
- template <class T = TimeZonePtr,
- class = typename std::enable_if
- <
- std::is_convertible
- <
- decltype(std::declval<T&>()->to_sys(local_time<Duration>{})),
- sys_time<duration>
- >::value
- >::type>
-#endif
- zoned_time(TimeZonePtr z, const local_time<Duration>& tp);
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
- template <class T = TimeZonePtr,
- class = typename std::enable_if
- <
- std::is_convertible
- <
- decltype(std::declval<T&>()->to_sys(local_time<Duration>{},
- choose::earliest)),
- sys_time<duration>
- >::value
- >::type>
-#endif
- zoned_time(TimeZonePtr z, const local_time<Duration>& tp, choose c);
-
- template <class Duration2, class TimeZonePtr2,
- class = typename std::enable_if
- <
- std::is_convertible<sys_time<Duration2>,
- sys_time<Duration>>::value
- >::type>
- zoned_time(TimeZonePtr z, const zoned_time<Duration2, TimeZonePtr2>& zt);
-
- template <class Duration2, class TimeZonePtr2,
- class = typename std::enable_if
- <
- std::is_convertible<sys_time<Duration2>,
- sys_time<Duration>>::value
- >::type>
- zoned_time(TimeZonePtr z, const zoned_time<Duration2, TimeZonePtr2>& zt, choose);
-
-#if HAS_STRING_VIEW
-
- template <class T = TimeZonePtr,
- class = typename std::enable_if
- <
- std::is_constructible
- <
- zoned_time,
- decltype(zoned_traits<T>::locate_zone(std::string_view())),
- sys_time<Duration>
- >::value
- >::type>
- zoned_time(std::string_view name, detail::nodeduct_t<const sys_time<Duration>&> st);
-
- template <class T = TimeZonePtr,
- class = typename std::enable_if
- <
- std::is_constructible
- <
- zoned_time,
- decltype(zoned_traits<T>::locate_zone(std::string_view())),
- local_time<Duration>
- >::value
- >::type>
- zoned_time(std::string_view name, detail::nodeduct_t<const local_time<Duration>&> tp);
-
- template <class T = TimeZonePtr,
- class = typename std::enable_if
- <
- std::is_constructible
- <
- zoned_time,
- decltype(zoned_traits<T>::locate_zone(std::string_view())),
- local_time<Duration>,
- choose
- >::value
- >::type>
- zoned_time(std::string_view name, detail::nodeduct_t<const local_time<Duration>&> tp, choose c);
-
- template <class Duration2, class TimeZonePtr2, class T = TimeZonePtr,
- class = typename std::enable_if
- <
- std::is_convertible<sys_time<Duration2>,
- sys_time<Duration>>::value &&
- std::is_constructible
- <
- zoned_time,
- decltype(zoned_traits<T>::locate_zone(std::string_view())),
- zoned_time
- >::value
- >::type>
- zoned_time(std::string_view name, const zoned_time<Duration2, TimeZonePtr2>& zt);
-
- template <class Duration2, class TimeZonePtr2, class T = TimeZonePtr,
- class = typename std::enable_if
- <
- std::is_convertible<sys_time<Duration2>,
- sys_time<Duration>>::value &&
- std::is_constructible
- <
- zoned_time,
- decltype(zoned_traits<T>::locate_zone(std::string_view())),
- zoned_time,
- choose
- >::value
- >::type>
- zoned_time(std::string_view name, const zoned_time<Duration2, TimeZonePtr2>& zt, choose);
-
-#else // !HAS_STRING_VIEW
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
- template <class T = TimeZonePtr,
- class = typename std::enable_if
- <
- std::is_constructible
- <
- zoned_time,
- decltype(zoned_traits<T>::locate_zone(std::string())),
- sys_time<Duration>
- >::value
- >::type>
-#endif
- zoned_time(const std::string& name, const sys_time<Duration>& st);
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
- template <class T = TimeZonePtr,
- class = typename std::enable_if
- <
- std::is_constructible
- <
- zoned_time,
- decltype(zoned_traits<T>::locate_zone(std::string())),
- sys_time<Duration>
- >::value
- >::type>
-#endif
- zoned_time(const char* name, const sys_time<Duration>& st);
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
- template <class T = TimeZonePtr,
- class = typename std::enable_if
- <
- std::is_constructible
- <
- zoned_time,
- decltype(zoned_traits<T>::locate_zone(std::string())),
- local_time<Duration>
- >::value
- >::type>
-#endif
- zoned_time(const std::string& name, const local_time<Duration>& tp);
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
- template <class T = TimeZonePtr,
- class = typename std::enable_if
- <
- std::is_constructible
- <
- zoned_time,
- decltype(zoned_traits<T>::locate_zone(std::string())),
- local_time<Duration>
- >::value
- >::type>
-#endif
- zoned_time(const char* name, const local_time<Duration>& tp);
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
- template <class T = TimeZonePtr,
- class = typename std::enable_if
- <
- std::is_constructible
- <
- zoned_time,
- decltype(zoned_traits<T>::locate_zone(std::string())),
- local_time<Duration>,
- choose
- >::value
- >::type>
-#endif
- zoned_time(const std::string& name, const local_time<Duration>& tp, choose c);
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
- template <class T = TimeZonePtr,
- class = typename std::enable_if
- <
- std::is_constructible
- <
- zoned_time,
- decltype(zoned_traits<T>::locate_zone(std::string())),
- local_time<Duration>,
- choose
- >::value
- >::type>
-#endif
- zoned_time(const char* name, const local_time<Duration>& tp, choose c);
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
- template <class Duration2, class TimeZonePtr2, class T = TimeZonePtr,
- class = typename std::enable_if
- <
- std::is_convertible<sys_time<Duration2>,
- sys_time<Duration>>::value &&
- std::is_constructible
- <
- zoned_time,
- decltype(zoned_traits<T>::locate_zone(std::string())),
- zoned_time
- >::value
- >::type>
-#else
- template <class Duration2, class TimeZonePtr2>
-#endif
- zoned_time(const std::string& name, const zoned_time<Duration2, TimeZonePtr2>& zt);
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
- template <class Duration2, class TimeZonePtr2, class T = TimeZonePtr,
- class = typename std::enable_if
- <
- std::is_convertible<sys_time<Duration2>,
- sys_time<Duration>>::value &&
- std::is_constructible
- <
- zoned_time,
- decltype(zoned_traits<T>::locate_zone(std::string())),
- zoned_time
- >::value
- >::type>
-#else
- template <class Duration2, class TimeZonePtr2>
-#endif
- zoned_time(const char* name, const zoned_time<Duration2, TimeZonePtr2>& zt);
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
- template <class Duration2, class TimeZonePtr2, class T = TimeZonePtr,
- class = typename std::enable_if
- <
- std::is_convertible<sys_time<Duration2>,
- sys_time<Duration>>::value &&
- std::is_constructible
- <
- zoned_time,
- decltype(zoned_traits<T>::locate_zone(std::string())),
- zoned_time,
- choose
- >::value
- >::type>
-#else
- template <class Duration2, class TimeZonePtr2>
-#endif
- zoned_time(const std::string& name, const zoned_time<Duration2, TimeZonePtr2>& zt,
- choose);
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
- template <class Duration2, class TimeZonePtr2, class T = TimeZonePtr,
- class = typename std::enable_if
- <
- std::is_convertible<sys_time<Duration2>,
- sys_time<Duration>>::value &&
- std::is_constructible
- <
- zoned_time,
- decltype(zoned_traits<T>::locate_zone(std::string())),
- zoned_time,
- choose
- >::value
- >::type>
-#else
- template <class Duration2, class TimeZonePtr2>
-#endif
- zoned_time(const char* name, const zoned_time<Duration2, TimeZonePtr2>& zt,
- choose);
-
-#endif // !HAS_STRING_VIEW
-
- zoned_time& operator=(const sys_time<Duration>& st);
- zoned_time& operator=(const local_time<Duration>& ut);
-
- explicit operator sys_time<duration>() const;
- explicit operator local_time<duration>() const;
-
- TimeZonePtr get_time_zone() const;
- local_time<duration> get_local_time() const;
- sys_time<duration> get_sys_time() const;
- sys_info get_info() const;
-
- template <class Duration1, class Duration2, class TimeZonePtr1>
- friend
- bool
- operator==(const zoned_time<Duration1, TimeZonePtr1>& x,
- const zoned_time<Duration2, TimeZonePtr1>& y);
-
- template <class CharT, class Traits, class Duration1, class TimeZonePtr1>
- friend
- std::basic_ostream<CharT, Traits>&
- operator<<(std::basic_ostream<CharT, Traits>& os,
- const zoned_time<Duration1, TimeZonePtr1>& t);
-
-private:
- template <class D, class T> friend class zoned_time;
-};
-
-using zoned_seconds = zoned_time<std::chrono::seconds>;
-
-#if HAS_DEDUCTION_GUIDES
-
-namespace detail
-{
- template<typename TimeZonePtrOrName>
- using time_zone_representation =
- std::conditional_t
- <
- std::is_convertible<TimeZonePtrOrName, std::string_view>::value,
- time_zone const*,
- std::remove_cv_t<std::remove_reference_t<TimeZonePtrOrName>>
- >;
-}
-
-zoned_time()
- -> zoned_time<std::chrono::seconds>;
-
-template <class Duration>
-zoned_time(sys_time<Duration>)
- -> zoned_time<std::common_type_t<Duration, std::chrono::seconds>>;
-
-template <class TimeZonePtrOrName>
-zoned_time(TimeZonePtrOrName&&)
- -> zoned_time<std::chrono::seconds, detail::time_zone_representation<TimeZonePtrOrName>>;
-
-template <class TimeZonePtrOrName, class Duration>
-zoned_time(TimeZonePtrOrName&&, sys_time<Duration>)
- -> zoned_time<std::common_type_t<Duration, std::chrono::seconds>, detail::time_zone_representation<TimeZonePtrOrName>>;
-
-template <class TimeZonePtrOrName, class Duration>
-zoned_time(TimeZonePtrOrName&&, local_time<Duration>, choose = choose::earliest)
- -> zoned_time<std::common_type_t<Duration, std::chrono::seconds>, detail::time_zone_representation<TimeZonePtrOrName>>;
-
-template <class Duration, class TimeZonePtrOrName, class TimeZonePtr2>
-zoned_time(TimeZonePtrOrName&&, zoned_time<Duration, TimeZonePtr2>, choose = choose::earliest)
- -> zoned_time<std::common_type_t<Duration, std::chrono::seconds>, detail::time_zone_representation<TimeZonePtrOrName>>;
-
-#endif // HAS_DEDUCTION_GUIDES
-
-template <class Duration1, class Duration2, class TimeZonePtr>
-inline
-bool
-operator==(const zoned_time<Duration1, TimeZonePtr>& x,
- const zoned_time<Duration2, TimeZonePtr>& y)
-{
- return x.zone_ == y.zone_ && x.tp_ == y.tp_;
-}
-
-template <class Duration1, class Duration2, class TimeZonePtr>
-inline
-bool
-operator!=(const zoned_time<Duration1, TimeZonePtr>& x,
- const zoned_time<Duration2, TimeZonePtr>& 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<detail::transition> transitions_;
- std::vector<detail::expanded_ttinfo> ttinfos_;
-#else // !USE_OS_TZDB
- std::vector<detail::zonelet> zonelets_;
-#endif // !USE_OS_TZDB
- std::unique_ptr<std::once_flag> 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 <class Duration> sys_info get_info(sys_time<Duration> st) const;
- template <class Duration> local_info get_info(local_time<Duration> tp) const;
-
- template <class Duration>
- sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
- to_sys(local_time<Duration> tp) const;
-
- template <class Duration>
- sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
- to_sys(local_time<Duration> tp, choose z) const;
-
- template <class Duration>
- local_time<typename std::common_type<Duration, std::chrono::seconds>::type>
- to_local(sys_time<Duration> 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 <class Duration>
- sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
- to_sys_impl(local_time<Duration> tp, choose z, std::false_type) const;
- template <class Duration>
- sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
- to_sys_impl(local_time<Duration> 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<detail::transition>::const_iterator i) const;
-
- template <class TimeType>
- 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<detail::Rule>& 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 <class Duration>
-inline
-sys_info
-time_zone::get_info(sys_time<Duration> st) const
-{
- return get_info_impl(date::floor<std::chrono::seconds>(st));
-}
-
-template <class Duration>
-inline
-local_info
-time_zone::get_info(local_time<Duration> tp) const
-{
- return get_info_impl(date::floor<std::chrono::seconds>(tp));
-}
-
-template <class Duration>
-inline
-sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-time_zone::to_sys(local_time<Duration> tp) const
-{
- return to_sys_impl(tp, choose{}, std::true_type{});
-}
-
-template <class Duration>
-inline
-sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-time_zone::to_sys(local_time<Duration> tp, choose z) const
-{
- return to_sys_impl(tp, z, std::false_type{});
-}
-
-template <class Duration>
-inline
-local_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-time_zone::to_local(sys_time<Duration> tp) const
-{
- using LT = local_time<typename std::common_type<Duration, std::chrono::seconds>::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 <class Duration>
-sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-time_zone::to_sys_impl(local_time<Duration> 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<Duration>{tp.time_since_epoch()} - i.second.offset;
- }
- return sys_time<Duration>{tp.time_since_epoch()} - i.first.offset;
-}
-
-template <class Duration>
-sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-time_zone::to_sys_impl(local_time<Duration> 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<Duration>{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
-
-#if !MISSING_LEAP_SECONDS
-
-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 <class Duration>
- friend
- bool
- operator==(const leap_second& x, const sys_time<Duration>& y)
- {
- return x.date_ == y;
- }
-
- template <class Duration>
- friend
- bool
- operator< (const leap_second& x, const sys_time<Duration>& y)
- {
- return x.date_ < y;
- }
-
- template <class Duration>
- friend
- bool
- operator< (const sys_time<Duration>& 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 <class Duration>
-inline
-bool
-operator==(const sys_time<Duration>& x, const leap_second& y)
-{
- return y == x;
-}
-
-template <class Duration>
-inline
-bool
-operator!=(const leap_second& x, const sys_time<Duration>& y)
-{
- return !(x == y);
-}
-
-template <class Duration>
-inline
-bool
-operator!=(const sys_time<Duration>& x, const leap_second& y)
-{
- return !(x == y);
-}
-
-template <class Duration>
-inline
-bool
-operator> (const leap_second& x, const sys_time<Duration>& y)
-{
- return y < x;
-}
-
-template <class Duration>
-inline
-bool
-operator> (const sys_time<Duration>& x, const leap_second& y)
-{
- return y < x;
-}
-
-template <class Duration>
-inline
-bool
-operator<=(const leap_second& x, const sys_time<Duration>& y)
-{
- return !(y < x);
-}
-
-template <class Duration>
-inline
-bool
-operator<=(const sys_time<Duration>& x, const leap_second& y)
-{
- return !(y < x);
-}
-
-template <class Duration>
-inline
-bool
-operator>=(const leap_second& x, const sys_time<Duration>& y)
-{
- return !(x < y);
-}
-
-template <class Duration>
-inline
-bool
-operator>=(const sys_time<Duration>& x, const leap_second& y)
-{
- return !(x < y);
-}
-
-using leap = leap_second;
-
-#endif // !MISSING_LEAP_SECONDS
-
-#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<time_zone> zones;
-#if !USE_OS_TZDB
- std::vector<time_zone_link> links;
-#endif
-#if !MISSING_LEAP_SECONDS
- std::vector<leap_second> leap_seconds;
-#endif
-#if !USE_OS_TZDB
- std::vector<detail::Rule> rules;
-#endif
-#ifdef _WIN32
- std::vector<detail::timezone_mapping> 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<tzdb*> 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 <class T>
-inline
-T*
-to_raw_pointer(T* p) noexcept
-{
- return p;
-}
-
-template <class Pointer>
-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 <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class T, class>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time()
- : zone_(zoned_traits<TimeZonePtr>::default_zone())
- {}
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class T, class>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const sys_time<Duration>& st)
- : zone_(zoned_traits<TimeZonePtr>::default_zone())
- , tp_(st)
- {}
-
-template <class Duration, class TimeZonePtr>
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(TimeZonePtr z)
- : zone_(std::move(z))
- {assert(detail::to_raw_pointer(zone_) != nullptr);}
-
-#if HAS_STRING_VIEW
-
-template <class Duration, class TimeZonePtr>
-template <class T, class>
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(std::string_view name)
- : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name))
- {}
-
-#else // !HAS_STRING_VIEW
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class T, class>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const std::string& name)
- : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name))
- {}
-
-#endif // !HAS_STRING_VIEW
-
-template <class Duration, class TimeZonePtr>
-template <class Duration2, class>
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const zoned_time<Duration2, TimeZonePtr>& zt) NOEXCEPT
- : zone_(zt.zone_)
- , tp_(zt.tp_)
- {}
-
-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)
- {}
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class T, class>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(TimeZonePtr z, const local_time<Duration>& t)
- : zone_(std::move(z))
- , tp_(zone_->to_sys(t))
- {}
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class T, class>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(TimeZonePtr z, const local_time<Duration>& t,
- choose c)
- : zone_(std::move(z))
- , tp_(zone_->to_sys(t, c))
- {}
-
-template <class Duration, class TimeZonePtr>
-template <class Duration2, class TimeZonePtr2, class>
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(TimeZonePtr z,
- const zoned_time<Duration2, TimeZonePtr2>& zt)
- : zone_(std::move(z))
- , tp_(zt.tp_)
- {}
-
-template <class Duration, class TimeZonePtr>
-template <class Duration2, class TimeZonePtr2, class>
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(TimeZonePtr z,
- const zoned_time<Duration2, TimeZonePtr2>& zt, choose)
- : zoned_time(std::move(z), zt)
- {}
-
-#if HAS_STRING_VIEW
-
-template <class Duration, class TimeZonePtr>
-template <class T, class>
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(std::string_view name,
- detail::nodeduct_t<const sys_time<Duration>&> st)
- : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), st)
- {}
-
-template <class Duration, class TimeZonePtr>
-template <class T, class>
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(std::string_view name,
- detail::nodeduct_t<const local_time<Duration>&> t)
- : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), t)
- {}
-
-template <class Duration, class TimeZonePtr>
-template <class T, class>
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(std::string_view name,
- detail::nodeduct_t<const local_time<Duration>&> t, choose c)
- : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), t, c)
- {}
-
-template <class Duration, class TimeZonePtr>
-template <class Duration2, class TimeZonePtr2, class, class>
-inline
-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)
- {}
-
-template <class Duration, class TimeZonePtr>
-template <class Duration2, class TimeZonePtr2, class, class>
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(std::string_view name,
- const zoned_time<Duration2, TimeZonePtr2>& zt,
- choose c)
- : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), zt, c)
- {}
-
-#else // !HAS_STRING_VIEW
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class T, class>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const std::string& name,
- const sys_time<Duration>& st)
- : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), st)
- {}
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class T, class>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const char* name,
- const sys_time<Duration>& st)
- : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), st)
- {}
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class T, class>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const std::string& name,
- const local_time<Duration>& t)
- : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), t)
- {}
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class T, class>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const char* name,
- const local_time<Duration>& t)
- : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), t)
- {}
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class T, class>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const std::string& name,
- const local_time<Duration>& t, choose c)
- : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), t, c)
- {}
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class T, class>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const char* name,
- const local_time<Duration>& t, choose c)
- : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), t, c)
- {}
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class Duration2, class TimeZonePtr2, class, class>
-#else
-template <class Duration2, class TimeZonePtr2>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const std::string& name,
- const zoned_time<Duration2, TimeZonePtr2>& zt)
- : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), zt)
- {}
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class Duration2, class TimeZonePtr2, class, class>
-#else
-template <class Duration2, class TimeZonePtr2>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const char* name,
- const zoned_time<Duration2, TimeZonePtr2>& zt)
- : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), zt)
- {}
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class Duration2, class TimeZonePtr2, class, class>
-#else
-template <class Duration2, class TimeZonePtr2>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const std::string& name,
- const zoned_time<Duration2, TimeZonePtr2>& zt,
- choose c)
- : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), zt, c)
- {}
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class Duration2, class TimeZonePtr2, class, class>
-#else
-template <class Duration2, class TimeZonePtr2>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const char* name,
- const zoned_time<Duration2, TimeZonePtr2>& zt,
- choose c)
- : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), zt, c)
- {}
-
-#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;
- return *this;
-}
-
-template <class Duration, class TimeZonePtr>
-inline
-zoned_time<Duration, TimeZonePtr>&
-zoned_time<Duration, TimeZonePtr>::operator=(const local_time<Duration>& ut)
-{
- tp_ = zone_->to_sys(ut);
- return *this;
-}
-
-template <class Duration, class TimeZonePtr>
-inline
-zoned_time<Duration, TimeZonePtr>::operator local_time<typename zoned_time<Duration, TimeZonePtr>::duration>() const
-{
- return get_local_time();
-}
-
-template <class Duration, class TimeZonePtr>
-inline
-zoned_time<Duration, TimeZonePtr>::operator sys_time<typename zoned_time<Duration, TimeZonePtr>::duration>() const
-{
- return get_sys_time();
-}
-
-template <class Duration, class TimeZonePtr>
-inline
-TimeZonePtr
-zoned_time<Duration, TimeZonePtr>::get_time_zone() const
-{
- return zone_;
-}
-
-template <class Duration, class TimeZonePtr>
-inline
-local_time<typename zoned_time<Duration, TimeZonePtr>::duration>
-zoned_time<Duration, TimeZonePtr>::get_local_time() const
-{
- return zone_->to_local(tp_);
-}
-
-template <class Duration, class TimeZonePtr>
-inline
-sys_time<typename zoned_time<Duration, TimeZonePtr>::duration>
-zoned_time<Duration, TimeZonePtr>::get_sys_time() const
-{
- return tp_;
-}
-
-template <class Duration, class TimeZonePtr>
-inline
-sys_info
-zoned_time<Duration, TimeZonePtr>::get_info() const
-{
- return zone_->get_info(tp_);
-}
-
-// make_zoned_time
-
-inline
-zoned_time<std::chrono::seconds>
-make_zoned()
-{
- return zoned_time<std::chrono::seconds>();
-}
-
-template <class Duration>
-inline
-zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-make_zoned(const sys_time<Duration>& tp)
-{
- return zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type>(tp);
-}
-
-template <class TimeZonePtr
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-#if !defined(__INTEL_COMPILER) || (__INTEL_COMPILER > 1600)
- , class = typename std::enable_if
- <
- std::is_class
- <
- typename std::decay
- <
- decltype(*detail::to_raw_pointer(std::declval<TimeZonePtr&>()))
- >::type
- >{}
- >::type
-#endif
-#endif
- >
-inline
-zoned_time<std::chrono::seconds, TimeZonePtr>
-make_zoned(TimeZonePtr z)
-{
- 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
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-#if !defined(__INTEL_COMPILER) || (__INTEL_COMPILER > 1600)
- , class = typename std::enable_if
- <
- std::is_class<typename std::decay<decltype(*std::declval<TimeZonePtr&>())>::type>{}
- >::type
-#endif
-#endif
- >
-inline
-zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type, TimeZonePtr>
-make_zoned(TimeZonePtr zone, const local_time<Duration>& tp)
-{
- return zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type,
- TimeZonePtr>(std::move(zone), tp);
-}
-
-template <class Duration, class TimeZonePtr
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-#if !defined(__INTEL_COMPILER) || (__INTEL_COMPILER > 1600)
- , class = typename std::enable_if
- <
- std::is_class<typename std::decay<decltype(*std::declval<TimeZonePtr&>())>::type>{}
- >::type
-#endif
-#endif
- >
-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 zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type,
- TimeZonePtr>(std::move(zone), tp, c);
-}
-
-template <class Duration>
-inline
-zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-make_zoned(const std::string& name, const local_time<Duration>& tp)
-{
- return zoned_time<typename std::common_type<Duration,
- std::chrono::seconds>::type>(name, tp);
-}
-
-template <class Duration>
-inline
-zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-make_zoned(const std::string& name, const local_time<Duration>& tp, choose c)
-{
- return zoned_time<typename std::common_type<Duration,
- std::chrono::seconds>::type>(name, tp, c);
-}
-
-template <class Duration, class TimeZonePtr>
-inline
-zoned_time<Duration, TimeZonePtr>
-make_zoned(TimeZonePtr zone, const zoned_time<Duration, TimeZonePtr>& zt)
-{
- return zoned_time<Duration, TimeZonePtr>(std::move(zone), zt);
-}
-
-template <class Duration, class TimeZonePtr>
-inline
-zoned_time<Duration, TimeZonePtr>
-make_zoned(const std::string& name, const zoned_time<Duration, TimeZonePtr>& zt)
-{
- return zoned_time<Duration, TimeZonePtr>(name, zt);
-}
-
-template <class Duration, class TimeZonePtr>
-inline
-zoned_time<Duration, TimeZonePtr>
-make_zoned(TimeZonePtr zone, const zoned_time<Duration, TimeZonePtr>& zt, choose c)
-{
- return zoned_time<Duration, TimeZonePtr>(std::move(zone), zt, c);
-}
-
-template <class Duration, class TimeZonePtr>
-inline
-zoned_time<Duration, TimeZonePtr>
-make_zoned(const std::string& name, const zoned_time<Duration, TimeZonePtr>& zt, choose c)
-{
- return zoned_time<Duration, TimeZonePtr>(name, zt, c);
-}
-
-template <class Duration, class TimeZonePtr
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-#if !defined(__INTEL_COMPILER) || (__INTEL_COMPILER > 1600)
- , class = typename std::enable_if
- <
- std::is_class<typename std::decay<decltype(*std::declval<TimeZonePtr&>())>::type>{}
- >::type
-#endif
-#endif
- >
-inline
-zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type, TimeZonePtr>
-make_zoned(TimeZonePtr zone, const sys_time<Duration>& st)
-{
- return zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type,
- TimeZonePtr>(std::move(zone), st);
-}
-
-template <class Duration>
-inline
-zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-make_zoned(const std::string& name, const sys_time<Duration>& st)
-{
- return zoned_time<typename std::common_type<Duration,
- std::chrono::seconds>::type>(name, st);
-}
-
-template <class CharT, class Traits, class Duration, class TimeZonePtr>
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt,
- const zoned_time<Duration, TimeZonePtr>& tp)
-{
- using duration = typename zoned_time<Duration, TimeZonePtr>::duration;
- using LT = local_time<duration>;
- auto const st = tp.get_sys_time();
- auto const info = tp.get_time_zone()->get_info(st);
- return to_stream(os, fmt, LT{(st+info.offset).time_since_epoch()},
- &info.abbrev, &info.offset);
-}
-
-template <class CharT, class Traits, class Duration, class TimeZonePtr>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const zoned_time<Duration, TimeZonePtr>& t)
-{
- const CharT fmt[] = {'%', 'F', ' ', '%', 'T', ' ', '%', 'Z', CharT{}};
- return to_stream(os, fmt, t);
-}
-
-#if !MISSING_LEAP_SECONDS
-
-class utc_clock
-{
-public:
- using duration = std::chrono::system_clock::duration;
- using rep = duration::rep;
- using period = duration::period;
- using time_point = std::chrono::time_point<utc_clock>;
- static CONSTDATA bool is_steady = false;
-
- static time_point now();
-
- template<typename Duration>
- static
- std::chrono::time_point<std::chrono::system_clock, typename std::common_type<Duration, std::chrono::seconds>::type>
- to_sys(const std::chrono::time_point<utc_clock, Duration>&);
-
- template<typename Duration>
- static
- std::chrono::time_point<utc_clock, typename std::common_type<Duration, std::chrono::seconds>::type>
- from_sys(const std::chrono::time_point<std::chrono::system_clock, Duration>&);
-
- template<typename Duration>
- static
- std::chrono::time_point<local_t, typename std::common_type<Duration, std::chrono::seconds>::type>
- to_local(const std::chrono::time_point<utc_clock, Duration>&);
-
- template<typename Duration>
- static
- std::chrono::time_point<utc_clock, typename std::common_type<Duration, std::chrono::seconds>::type>
- from_local(const std::chrono::time_point<local_t, Duration>&);
-};
-
-template <class Duration>
- using utc_time = std::chrono::time_point<utc_clock, Duration>;
-
-using utc_seconds = utc_time<std::chrono::seconds>;
-
-template <class Duration>
-utc_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-utc_clock::from_sys(const sys_time<Duration>& st)
-{
- using std::chrono::seconds;
- using CD = typename std::common_type<Duration, seconds>::type;
- auto const& leaps = get_tzdb().leap_seconds;
- auto const lt = std::upper_bound(leaps.begin(), leaps.end(), st);
- return utc_time<CD>{st.time_since_epoch() + seconds{lt-leaps.begin()}};
-}
-
-// Return pair<is_leap_second, seconds{number_of_leap_seconds_since_1970}>
-// first is true if ut is during a leap second insertion, otherwise false.
-// If ut is during a leap second insertion, that leap second is included in the count
-template <class Duration>
-std::pair<bool, std::chrono::seconds>
-is_leap_second(date::utc_time<Duration> const& ut)
-{
- using std::chrono::seconds;
- using duration = typename std::common_type<Duration, seconds>::type;
- auto const& leaps = get_tzdb().leap_seconds;
- auto tp = sys_time<duration>{ut.time_since_epoch()};
- auto const lt = std::upper_bound(leaps.begin(), leaps.end(), tp);
- auto ds = seconds{lt-leaps.begin()};
- tp -= ds;
- auto ls = false;
- if (lt > leaps.begin())
- {
- if (tp < lt[-1])
- {
- if (tp >= lt[-1].date() - seconds{1})
- ls = true;
- else
- --ds;
- }
- }
- return {ls, ds};
-}
-
-struct leap_second_info
-{
- bool is_leap_second;
- std::chrono::seconds elapsed;
-};
-
-template <class Duration>
-leap_second_info
-get_leap_second_info(date::utc_time<Duration> const& ut)
-{
- auto p = is_leap_second(ut);
- return {p.first, p.second};
-}
-
-template <class Duration>
-sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-utc_clock::to_sys(const utc_time<Duration>& ut)
-{
- using std::chrono::seconds;
- using CD = typename std::common_type<Duration, seconds>::type;
- auto ls = is_leap_second(ut);
- auto tp = sys_time<CD>{ut.time_since_epoch() - ls.second};
- if (ls.first)
- tp = floor<seconds>(tp) + seconds{1} - CD{1};
- return tp;
-}
-
-inline
-utc_clock::time_point
-utc_clock::now()
-{
- return from_sys(std::chrono::system_clock::now());
-}
-
-template <class Duration>
-utc_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-utc_clock::from_local(const local_time<Duration>& st)
-{
- return from_sys(sys_time<Duration>{st.time_since_epoch()});
-}
-
-template <class Duration>
-local_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-utc_clock::to_local(const utc_time<Duration>& ut)
-{
- using CD = typename std::common_type<Duration, std::chrono::seconds>::type;
- return local_time<CD>{to_sys(ut).time_since_epoch()};
-}
-
-template <class CharT, class Traits, class Duration>
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt,
- const utc_time<Duration>& t)
-{
- using std::chrono::seconds;
- using CT = typename std::common_type<Duration, seconds>::type;
- const std::string abbrev("UTC");
- CONSTDATA seconds offset{0};
- auto ls = is_leap_second(t);
- auto tp = sys_time<CT>{t.time_since_epoch() - ls.second};
- auto const sd = floor<days>(tp);
- year_month_day ymd = sd;
- auto time = make_time(tp - sys_seconds{sd});
- time.seconds(detail::undocumented{}) += seconds{ls.first};
- fields<CT> fds{ymd, time};
- return to_stream(os, fmt, fds, &abbrev, &offset);
-}
-
-template <class CharT, class Traits, class Duration>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const utc_time<Duration>& t)
-{
- const CharT fmt[] = {'%', 'F', ' ', '%', 'T', CharT{}};
- return to_stream(os, fmt, t);
-}
-
-template <class Duration, class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt,
- utc_time<Duration>& tp, std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
- std::chrono::minutes* offset = nullptr)
-{
- using std::chrono::seconds;
- using std::chrono::minutes;
- using CT = typename std::common_type<Duration, seconds>::type;
- minutes offset_local{};
- auto offptr = offset ? offset : &offset_local;
- fields<CT> fds{};
- fds.has_tod = true;
- from_stream(is, fmt, fds, abbrev, offptr);
- if (!fds.ymd.ok())
- is.setstate(std::ios::failbit);
- if (!is.fail())
- {
- bool is_60_sec = fds.tod.seconds() == seconds{60};
- if (is_60_sec)
- fds.tod.seconds(detail::undocumented{}) -= seconds{1};
- auto tmp = utc_clock::from_sys(sys_days(fds.ymd) - *offptr + fds.tod.to_duration());
- if (is_60_sec)
- tmp += seconds{1};
- if (is_60_sec != is_leap_second(tmp).first || !fds.tod.in_conventional_range())
- {
- is.setstate(std::ios::failbit);
- return is;
- }
- tp = std::chrono::time_point_cast<Duration>(tmp);
- }
- return is;
-}
-
-// tai_clock
-
-class tai_clock
-{
-public:
- using duration = std::chrono::system_clock::duration;
- using rep = duration::rep;
- using period = duration::period;
- using time_point = std::chrono::time_point<tai_clock>;
- static const bool is_steady = false;
-
- static time_point now();
-
- template<typename Duration>
- static
- std::chrono::time_point<utc_clock, typename std::common_type<Duration, std::chrono::seconds>::type>
- to_utc(const std::chrono::time_point<tai_clock, Duration>&) NOEXCEPT;
-
- template<typename Duration>
- static
- std::chrono::time_point<tai_clock, typename std::common_type<Duration, std::chrono::seconds>::type>
- from_utc(const std::chrono::time_point<utc_clock, Duration>&) NOEXCEPT;
-
- template<typename Duration>
- static
- std::chrono::time_point<local_t, typename std::common_type<Duration, date::days>::type>
- to_local(const std::chrono::time_point<tai_clock, Duration>&) NOEXCEPT;
-
- template<typename Duration>
- static
- std::chrono::time_point<tai_clock, typename std::common_type<Duration, date::days>::type>
- from_local(const std::chrono::time_point<local_t, Duration>&) NOEXCEPT;
-};
-
-template <class Duration>
- using tai_time = std::chrono::time_point<tai_clock, Duration>;
-
-using tai_seconds = tai_time<std::chrono::seconds>;
-
-template <class Duration>
-inline
-utc_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-tai_clock::to_utc(const tai_time<Duration>& t) NOEXCEPT
-{
- using std::chrono::seconds;
- using CD = typename std::common_type<Duration, seconds>::type;
- return utc_time<CD>{t.time_since_epoch()} -
- (sys_days(year{1970}/January/1) - sys_days(year{1958}/January/1) + seconds{10});
-}
-
-template <class Duration>
-inline
-tai_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-tai_clock::from_utc(const utc_time<Duration>& t) NOEXCEPT
-{
- using std::chrono::seconds;
- using CD = typename std::common_type<Duration, seconds>::type;
- return tai_time<CD>{t.time_since_epoch()} +
- (sys_days(year{1970}/January/1) - sys_days(year{1958}/January/1) + seconds{10});
-}
-
-inline
-tai_clock::time_point
-tai_clock::now()
-{
- return from_utc(utc_clock::now());
-}
-
-template <class Duration>
-inline
-local_time<typename std::common_type<Duration, date::days>::type>
-tai_clock::to_local(const tai_time<Duration>& t) NOEXCEPT
-{
- using CD = typename std::common_type<Duration, date::days>::type;
- return local_time<CD>{t.time_since_epoch()} -
- (local_days(year{1970}/January/1) - local_days(year{1958}/January/1));
-}
-
-template <class Duration>
-inline
-tai_time<typename std::common_type<Duration, date::days>::type>
-tai_clock::from_local(const local_time<Duration>& t) NOEXCEPT
-{
- using CD = typename std::common_type<Duration, date::days>::type;
- return tai_time<CD>{t.time_since_epoch()} +
- (local_days(year{1970}/January/1) - local_days(year{1958}/January/1));
-}
-
-template <class CharT, class Traits, class Duration>
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt,
- const tai_time<Duration>& t)
-{
- const std::string abbrev("TAI");
- CONSTDATA std::chrono::seconds offset{0};
- return to_stream(os, fmt, tai_clock::to_local(t), &abbrev, &offset);
-}
-
-template <class CharT, class Traits, class Duration>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const tai_time<Duration>& t)
-{
- const CharT fmt[] = {'%', 'F', ' ', '%', 'T', CharT{}};
- return to_stream(os, fmt, t);
-}
-
-template <class Duration, class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt,
- tai_time<Duration>& tp,
- std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
- std::chrono::minutes* offset = nullptr)
-{
- local_time<Duration> lp;
- from_stream(is, fmt, lp, abbrev, offset);
- if (!is.fail())
- tp = tai_clock::from_local(lp);
- return is;
-}
-
-// gps_clock
-
-class gps_clock
-{
-public:
- using duration = std::chrono::system_clock::duration;
- using rep = duration::rep;
- using period = duration::period;
- using time_point = std::chrono::time_point<gps_clock>;
- static const bool is_steady = false;
-
- static time_point now();
-
- template<typename Duration>
- static
- std::chrono::time_point<utc_clock, typename std::common_type<Duration, std::chrono::seconds>::type>
- to_utc(const std::chrono::time_point<gps_clock, Duration>&) NOEXCEPT;
-
- template<typename Duration>
- static
- std::chrono::time_point<gps_clock, typename std::common_type<Duration, std::chrono::seconds>::type>
- from_utc(const std::chrono::time_point<utc_clock, Duration>&) NOEXCEPT;
-
- template<typename Duration>
- static
- std::chrono::time_point<local_t, typename std::common_type<Duration, date::days>::type>
- to_local(const std::chrono::time_point<gps_clock, Duration>&) NOEXCEPT;
-
- template<typename Duration>
- static
- std::chrono::time_point<gps_clock, typename std::common_type<Duration, date::days>::type>
- from_local(const std::chrono::time_point<local_t, Duration>&) NOEXCEPT;
-};
-
-template <class Duration>
- using gps_time = std::chrono::time_point<gps_clock, Duration>;
-
-using gps_seconds = gps_time<std::chrono::seconds>;
-
-template <class Duration>
-inline
-utc_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-gps_clock::to_utc(const gps_time<Duration>& t) NOEXCEPT
-{
- using std::chrono::seconds;
- using CD = typename std::common_type<Duration, seconds>::type;
- return utc_time<CD>{t.time_since_epoch()} +
- (sys_days(year{1980}/January/Sunday[1]) - sys_days(year{1970}/January/1) +
- seconds{9});
-}
-
-template <class Duration>
-inline
-gps_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-gps_clock::from_utc(const utc_time<Duration>& t) NOEXCEPT
-{
- using std::chrono::seconds;
- using CD = typename std::common_type<Duration, seconds>::type;
- return gps_time<CD>{t.time_since_epoch()} -
- (sys_days(year{1980}/January/Sunday[1]) - sys_days(year{1970}/January/1) +
- seconds{9});
-}
-
-inline
-gps_clock::time_point
-gps_clock::now()
-{
- return from_utc(utc_clock::now());
-}
-
-template <class Duration>
-inline
-local_time<typename std::common_type<Duration, date::days>::type>
-gps_clock::to_local(const gps_time<Duration>& t) NOEXCEPT
-{
- using CD = typename std::common_type<Duration, date::days>::type;
- return local_time<CD>{t.time_since_epoch()} +
- (local_days(year{1980}/January/Sunday[1]) - local_days(year{1970}/January/1));
-}
-
-template <class Duration>
-inline
-gps_time<typename std::common_type<Duration, date::days>::type>
-gps_clock::from_local(const local_time<Duration>& t) NOEXCEPT
-{
- using CD = typename std::common_type<Duration, date::days>::type;
- return gps_time<CD>{t.time_since_epoch()} -
- (local_days(year{1980}/January/Sunday[1]) - local_days(year{1970}/January/1));
-}
-
-
-template <class CharT, class Traits, class Duration>
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt,
- const gps_time<Duration>& t)
-{
- const std::string abbrev("GPS");
- CONSTDATA std::chrono::seconds offset{0};
- return to_stream(os, fmt, gps_clock::to_local(t), &abbrev, &offset);
-}
-
-template <class CharT, class Traits, class Duration>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const gps_time<Duration>& t)
-{
- const CharT fmt[] = {'%', 'F', ' ', '%', 'T', CharT{}};
- return to_stream(os, fmt, t);
-}
-
-template <class Duration, class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt,
- gps_time<Duration>& tp,
- std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
- std::chrono::minutes* offset = nullptr)
-{
- local_time<Duration> lp;
- from_stream(is, fmt, lp, abbrev, offset);
- if (!is.fail())
- tp = gps_clock::from_local(lp);
- return is;
-}
-
-// clock_time_conversion
-
-template <class DstClock, class SrcClock>
-struct clock_time_conversion
-{};
-
-template <>
-struct clock_time_conversion<std::chrono::system_clock, std::chrono::system_clock>
-{
- template <class Duration>
- sys_time<Duration>
- operator()(const sys_time<Duration>& st) const
- {
- return st;
- }
-};
-
-template <>
-struct clock_time_conversion<utc_clock, utc_clock>
-{
- template <class Duration>
- utc_time<Duration>
- operator()(const utc_time<Duration>& ut) const
- {
- return ut;
- }
-};
-
-template<>
-struct clock_time_conversion<local_t, local_t>
-{
- template <class Duration>
- local_time<Duration>
- operator()(const local_time<Duration>& lt) const
- {
- return lt;
- }
-};
-
-template <>
-struct clock_time_conversion<utc_clock, std::chrono::system_clock>
-{
- template <class Duration>
- utc_time<typename std::common_type<Duration, std::chrono::seconds>::type>
- operator()(const sys_time<Duration>& st) const
- {
- return utc_clock::from_sys(st);
- }
-};
-
-template <>
-struct clock_time_conversion<std::chrono::system_clock, utc_clock>
-{
- template <class Duration>
- sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
- operator()(const utc_time<Duration>& ut) const
- {
- return utc_clock::to_sys(ut);
- }
-};
-
-template<>
-struct clock_time_conversion<local_t, std::chrono::system_clock>
-{
- template <class Duration>
- local_time<Duration>
- operator()(const sys_time<Duration>& st) const
- {
- return local_time<Duration>{st.time_since_epoch()};
- }
-};
-
-template<>
-struct clock_time_conversion<std::chrono::system_clock, local_t>
-{
- template <class Duration>
- sys_time<Duration>
- operator()(const local_time<Duration>& lt) const
- {
- return sys_time<Duration>{lt.time_since_epoch()};
- }
-};
-
-template<>
-struct clock_time_conversion<utc_clock, local_t>
-{
- template <class Duration>
- utc_time<typename std::common_type<Duration, std::chrono::seconds>::type>
- operator()(const local_time<Duration>& lt) const
- {
- return utc_clock::from_local(lt);
- }
-};
-
-template<>
-struct clock_time_conversion<local_t, utc_clock>
-{
- template <class Duration>
- local_time<typename std::common_type<Duration, std::chrono::seconds>::type>
- operator()(const utc_time<Duration>& ut) const
- {
- return utc_clock::to_local(ut);
- }
-};
-
-template<typename Clock>
-struct clock_time_conversion<Clock, Clock>
-{
- template <class Duration>
- std::chrono::time_point<Clock, Duration>
- operator()(const std::chrono::time_point<Clock, Duration>& tp) const
- {
- return tp;
- }
-};
-
-namespace ctc_detail
-{
-
-template <class Clock, class Duration>
- using time_point = std::chrono::time_point<Clock, Duration>;
-
-using std::declval;
-using std::chrono::system_clock;
-
-//Check if TimePoint is time for given clock,
-//if not emits hard error
-template <class Clock, class TimePoint>
-struct return_clock_time
-{
- using clock_time_point = time_point<Clock, typename TimePoint::duration>;
- using type = TimePoint;
-
- static_assert(std::is_same<TimePoint, clock_time_point>::value,
- "time point with appropariate clock shall be returned");
-};
-
-// Check if Clock has to_sys method accepting TimePoint with given duration const& and
-// returning sys_time. If so has nested type member equal to return type to_sys.
-template <class Clock, class Duration, class = void>
-struct return_to_sys
-{};
-
-template <class Clock, class Duration>
-struct return_to_sys
- <
- Clock, Duration,
- decltype(Clock::to_sys(declval<time_point<Clock, Duration> const&>()), void())
- >
- : return_clock_time
- <
- system_clock,
- decltype(Clock::to_sys(declval<time_point<Clock, Duration> const&>()))
- >
-{};
-
-// Similiar to above
-template <class Clock, class Duration, class = void>
-struct return_from_sys
-{};
-
-template <class Clock, class Duration>
-struct return_from_sys
- <
- Clock, Duration,
- decltype(Clock::from_sys(declval<time_point<system_clock, Duration> const&>()),
- void())
- >
- : return_clock_time
- <
- Clock,
- decltype(Clock::from_sys(declval<time_point<system_clock, Duration> const&>()))
- >
-{};
-
-// Similiar to above
-template <class Clock, class Duration, class = void>
-struct return_to_utc
-{};
-
-template <class Clock, class Duration>
-struct return_to_utc
- <
- Clock, Duration,
- decltype(Clock::to_utc(declval<time_point<Clock, Duration> const&>()), void())
- >
- : return_clock_time
- <
- utc_clock,
- decltype(Clock::to_utc(declval<time_point<Clock, Duration> const&>()))>
-{};
-
-// Similiar to above
-template <class Clock, class Duration, class = void>
-struct return_from_utc
-{};
-
-template <class Clock, class Duration>
-struct return_from_utc
- <
- Clock, Duration,
- decltype(Clock::from_utc(declval<time_point<utc_clock, Duration> const&>()),
- void())
- >
- : return_clock_time
- <
- Clock,
- decltype(Clock::from_utc(declval<time_point<utc_clock, Duration> const&>()))
- >
-{};
-
-// Similiar to above
-template<typename Clock, typename Duration, typename = void>
-struct return_to_local
-{};
-
-template<typename Clock, typename Duration>
-struct return_to_local
- <
- Clock, Duration,
- decltype(Clock::to_local(declval<time_point<Clock, Duration> const&>()),
- void())
- >
- : return_clock_time
- <
- local_t,
- decltype(Clock::to_local(declval<time_point<Clock, Duration> const&>()))
- >
-{};
-
-// Similiar to above
-template<typename Clock, typename Duration, typename = void>
-struct return_from_local
-{};
-
-template<typename Clock, typename Duration>
-struct return_from_local
- <
- Clock, Duration,
- decltype(Clock::from_local(declval<time_point<local_t, Duration> const&>()),
- void())
- >
- : return_clock_time
- <
- Clock,
- decltype(Clock::from_local(declval<time_point<local_t, Duration> const&>()))
- >
-{};
-
-} // namespace ctc_detail
-
-template <class SrcClock>
-struct clock_time_conversion<std::chrono::system_clock, SrcClock>
-{
- template <class Duration>
- typename ctc_detail::return_to_sys<SrcClock, Duration>::type
- operator()(const std::chrono::time_point<SrcClock, Duration>& tp) const
- {
- return SrcClock::to_sys(tp);
- }
-};
-
-template <class DstClock>
-struct clock_time_conversion<DstClock, std::chrono::system_clock>
-{
- template <class Duration>
- typename ctc_detail::return_from_sys<DstClock, Duration>::type
- operator()(const sys_time<Duration>& st) const
- {
- return DstClock::from_sys(st);
- }
-};
-
-template <class SrcClock>
-struct clock_time_conversion<utc_clock, SrcClock>
-{
- template <class Duration>
- typename ctc_detail::return_to_utc<SrcClock, Duration>::type
- operator()(const std::chrono::time_point<SrcClock, Duration>& tp) const
- {
- return SrcClock::to_utc(tp);
- }
-};
-
-template <class DstClock>
-struct clock_time_conversion<DstClock, utc_clock>
-{
- template <class Duration>
- typename ctc_detail::return_from_utc<DstClock, Duration>::type
- operator()(const utc_time<Duration>& ut) const
- {
- return DstClock::from_utc(ut);
- }
-};
-
-template<typename SrcClock>
-struct clock_time_conversion<local_t, SrcClock>
-{
- template <class Duration>
- typename ctc_detail::return_to_local<SrcClock, Duration>::type
- operator()(const std::chrono::time_point<SrcClock, Duration>& tp) const
- {
- return SrcClock::to_local(tp);
- }
-};
-
-template<typename DstClock>
-struct clock_time_conversion<DstClock, local_t>
-{
- template <class Duration>
- typename ctc_detail::return_from_local<DstClock, Duration>::type
- operator()(const local_time<Duration>& lt) const
- {
- return DstClock::from_local(lt);
- }
-};
-
-namespace clock_cast_detail
-{
-
-template <class Clock, class Duration>
- using time_point = std::chrono::time_point<Clock, Duration>;
-using std::chrono::system_clock;
-
-template <class DstClock, class SrcClock, class Duration>
-auto
-conv_clock(const time_point<SrcClock, Duration>& t)
- -> decltype(std::declval<clock_time_conversion<DstClock, SrcClock>>()(t))
-{
- return clock_time_conversion<DstClock, SrcClock>{}(t);
-}
-
-//direct trait conversion, 1st candidate
-template <class DstClock, class SrcClock, class Duration>
-auto
-cc_impl(const time_point<SrcClock, Duration>& t, const time_point<SrcClock, Duration>*)
- -> decltype(conv_clock<DstClock>(t))
-{
- return conv_clock<DstClock>(t);
-}
-
-//conversion through sys, 2nd candidate
-template <class DstClock, class SrcClock, class Duration>
-auto
-cc_impl(const time_point<SrcClock, Duration>& t, const void*)
- -> decltype(conv_clock<DstClock>(conv_clock<system_clock>(t)))
-{
- return conv_clock<DstClock>(conv_clock<system_clock>(t));
-}
-
-//conversion through utc, 2nd candidate
-template <class DstClock, class SrcClock, class Duration>
-auto
-cc_impl(const time_point<SrcClock, Duration>& t, const void*)
- -> decltype(0, // MSVC_WORKAROUND
- conv_clock<DstClock>(conv_clock<utc_clock>(t)))
-{
- return conv_clock<DstClock>(conv_clock<utc_clock>(t));
-}
-
-//conversion through sys and utc, 3rd candidate
-template <class DstClock, class SrcClock, class Duration>
-auto
-cc_impl(const time_point<SrcClock, Duration>& t, ...)
- -> decltype(conv_clock<DstClock>(conv_clock<utc_clock>(conv_clock<system_clock>(t))))
-{
- return conv_clock<DstClock>(conv_clock<utc_clock>(conv_clock<system_clock>(t)));
-}
-
-//conversion through utc and sys, 3rd candidate
-template <class DstClock, class SrcClock, class Duration>
-auto
-cc_impl(const time_point<SrcClock, Duration>& t, ...)
- -> decltype(0, // MSVC_WORKAROUND
- conv_clock<DstClock>(conv_clock<system_clock>(conv_clock<utc_clock>(t))))
-{
- return conv_clock<DstClock>(conv_clock<system_clock>(conv_clock<utc_clock>(t)));
-}
-
-} // namespace clock_cast_detail
-
-template <class DstClock, class SrcClock, class Duration>
-auto
-clock_cast(const std::chrono::time_point<SrcClock, Duration>& tp)
- -> decltype(clock_cast_detail::cc_impl<DstClock>(tp, &tp))
-{
- return clock_cast_detail::cc_impl<DstClock>(tp, &tp);
-}
-
-// Deprecated API
-
-template <class Duration>
-inline
-sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-to_sys_time(const utc_time<Duration>& t)
-{
- return utc_clock::to_sys(t);
-}
-
-template <class Duration>
-inline
-sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-to_sys_time(const tai_time<Duration>& t)
-{
- return utc_clock::to_sys(tai_clock::to_utc(t));
-}
-
-template <class Duration>
-inline
-sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-to_sys_time(const gps_time<Duration>& t)
-{
- return utc_clock::to_sys(gps_clock::to_utc(t));
-}
-
-
-template <class Duration>
-inline
-utc_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-to_utc_time(const sys_time<Duration>& t)
-{
- return utc_clock::from_sys(t);
-}
-
-template <class Duration>
-inline
-utc_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-to_utc_time(const tai_time<Duration>& t)
-{
- return tai_clock::to_utc(t);
-}
-
-template <class Duration>
-inline
-utc_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-to_utc_time(const gps_time<Duration>& t)
-{
- return gps_clock::to_utc(t);
-}
-
-
-template <class Duration>
-inline
-tai_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-to_tai_time(const sys_time<Duration>& t)
-{
- return tai_clock::from_utc(utc_clock::from_sys(t));
-}
-
-template <class Duration>
-inline
-tai_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-to_tai_time(const utc_time<Duration>& t)
-{
- return tai_clock::from_utc(t);
-}
-
-template <class Duration>
-inline
-tai_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-to_tai_time(const gps_time<Duration>& t)
-{
- return tai_clock::from_utc(gps_clock::to_utc(t));
-}
-
-
-template <class Duration>
-inline
-gps_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-to_gps_time(const sys_time<Duration>& t)
-{
- return gps_clock::from_utc(utc_clock::from_sys(t));
-}
-
-template <class Duration>
-inline
-gps_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-to_gps_time(const utc_time<Duration>& t)
-{
- return gps_clock::from_utc(t);
-}
-
-template <class Duration>
-inline
-gps_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-to_gps_time(const tai_time<Duration>& t)
-{
- return gps_clock::from_utc(tai_clock::to_utc(t));
-}
-
-#endif // !MISSING_LEAP_SECONDS
-
-} // namespace date
-
-#endif // TZ_H
diff --git a/src/libs/date/includes/date/tz_private.h b/src/libs/date/includes/date/tz_private.h
deleted file mode 100644
index 798fcf5a..00000000
--- a/src/libs/date/includes/date/tz_private.h
+++ /dev/null
@@ -1,316 +0,0 @@
-#ifndef TZ_PRIVATE_H
-#define TZ_PRIVATE_H
-
-// The MIT License (MIT)
-//
-// Copyright (c) 2015, 2016 Howard Hinnant
-//
-// 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.
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-#include "tz.h"
-#else
-#include "date.h"
-#include <vector>
-#endif
-
-namespace date
-{
-
-namespace detail
-{
-
-#if !USE_OS_TZDB
-
-enum class tz {utc, local, standard};
-
-//forward declare to avoid warnings in gcc 6.2
-class MonthDayTime;
-std::istream& operator>>(std::istream& is, MonthDayTime& x);
-std::ostream& operator<<(std::ostream& os, const MonthDayTime& x);
-
-
-class MonthDayTime
-{
-private:
- struct pair
- {
-#if defined(_MSC_VER) && (_MSC_VER < 1900)
- pair() : month_day_(date::jan / 1), weekday_(0U) {}
-
- pair(const date::month_day& month_day, const date::weekday& weekday)
- : month_day_(month_day), weekday_(weekday) {}
-#endif
-
- date::month_day month_day_;
- date::weekday weekday_;
- };
-
- enum Type {month_day, month_last_dow, lteq, gteq};
-
- Type type_{month_day};
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
- union U
-#else
- struct U
-#endif
- {
- date::month_day month_day_;
- date::month_weekday_last month_weekday_last_;
- pair month_day_weekday_;
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
- U() : month_day_{date::jan/1} {}
-#else
- U() :
- month_day_(date::jan/1),
- month_weekday_last_(date::month(0U), date::weekday_last(date::weekday(0U)))
- {}
-
-#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900)
-
- U& operator=(const date::month_day& x);
- U& operator=(const date::month_weekday_last& x);
- U& operator=(const pair& x);
- } u;
-
- std::chrono::hours h_{};
- std::chrono::minutes m_{};
- std::chrono::seconds s_{};
- tz zone_{tz::local};
-
-public:
- MonthDayTime() = default;
- MonthDayTime(local_seconds tp, tz timezone);
- MonthDayTime(const date::month_day& md, tz timezone);
-
- date::day day() const;
- date::month month() const;
- tz zone() const {return zone_;}
-
- void canonicalize(date::year y);
-
- sys_seconds
- to_sys(date::year y, std::chrono::seconds offset, std::chrono::seconds save) const;
- sys_days to_sys_days(date::year y) const;
-
- sys_seconds to_time_point(date::year y) const;
- int compare(date::year y, const MonthDayTime& x, date::year yx,
- std::chrono::seconds offset, std::chrono::minutes prev_save) const;
-
- friend std::istream& operator>>(std::istream& is, MonthDayTime& x);
- friend std::ostream& operator<<(std::ostream& os, const MonthDayTime& x);
-};
-
-// A Rule specifies one or more set of datetimes without using an offset.
-// Multiple dates are specified with multiple years. The years in effect
-// go from starting_year_ to ending_year_, inclusive. starting_year_ <=
-// ending_year_. save_ is in effect for times from the specified time
-// onward, including the specified time. When the specified time is
-// local, it uses the save_ from the chronologically previous Rule, or if
-// there is none, 0.
-
-//forward declare to avoid warnings in gcc 6.2
-class Rule;
-bool operator==(const Rule& x, const Rule& y);
-bool operator<(const Rule& x, const Rule& y);
-bool operator==(const Rule& x, const date::year& y);
-bool operator<(const Rule& x, const date::year& y);
-bool operator==(const date::year& x, const Rule& y);
-bool operator<(const date::year& x, const Rule& y);
-bool operator==(const Rule& x, const std::string& y);
-bool operator<(const Rule& x, const std::string& y);
-bool operator==(const std::string& x, const Rule& y);
-bool operator<(const std::string& x, const Rule& y);
-std::ostream& operator<<(std::ostream& os, const Rule& r);
-
-class Rule
-{
-private:
- std::string name_;
- date::year starting_year_{0};
- date::year ending_year_{0};
- MonthDayTime starting_at_;
- std::chrono::minutes save_{0};
- std::string abbrev_;
-
-public:
- Rule() = default;
- explicit Rule(const std::string& s);
- Rule(const Rule& r, date::year starting_year, date::year ending_year);
-
- const std::string& name() const {return name_;}
- const std::string& abbrev() const {return abbrev_;}
-
- const MonthDayTime& mdt() const {return starting_at_;}
- const date::year& starting_year() const {return starting_year_;}
- const date::year& ending_year() const {return ending_year_;}
- const std::chrono::minutes& save() const {return save_;}
-
- static void split_overlaps(std::vector<Rule>& rules);
-
- friend bool operator==(const Rule& x, const Rule& y);
- friend bool operator<(const Rule& x, const Rule& y);
- friend bool operator==(const Rule& x, const date::year& y);
- friend bool operator<(const Rule& x, const date::year& y);
- friend bool operator==(const date::year& x, const Rule& y);
- friend bool operator<(const date::year& x, const Rule& y);
- friend bool operator==(const Rule& x, const std::string& y);
- friend bool operator<(const Rule& x, const std::string& y);
- friend bool operator==(const std::string& x, const Rule& y);
- friend bool operator<(const std::string& x, const Rule& y);
-
- friend std::ostream& operator<<(std::ostream& os, const Rule& r);
-
-private:
- date::day day() const;
- date::month month() const;
- static void split_overlaps(std::vector<Rule>& rules, std::size_t i, std::size_t& e);
- static bool overlaps(const Rule& x, const Rule& y);
- static void split(std::vector<Rule>& rules, std::size_t i, std::size_t k,
- std::size_t& e);
-};
-
-inline bool operator!=(const Rule& x, const Rule& y) {return !(x == y);}
-inline bool operator> (const Rule& x, const Rule& y) {return y < x;}
-inline bool operator<=(const Rule& x, const Rule& y) {return !(y < x);}
-inline bool operator>=(const Rule& x, const Rule& y) {return !(x < y);}
-
-inline bool operator!=(const Rule& x, const date::year& y) {return !(x == y);}
-inline bool operator> (const Rule& x, const date::year& y) {return y < x;}
-inline bool operator<=(const Rule& x, const date::year& y) {return !(y < x);}
-inline bool operator>=(const Rule& x, const date::year& y) {return !(x < y);}
-
-inline bool operator!=(const date::year& x, const Rule& y) {return !(x == y);}
-inline bool operator> (const date::year& x, const Rule& y) {return y < x;}
-inline bool operator<=(const date::year& x, const Rule& y) {return !(y < x);}
-inline bool operator>=(const date::year& x, const Rule& y) {return !(x < y);}
-
-inline bool operator!=(const Rule& x, const std::string& y) {return !(x == y);}
-inline bool operator> (const Rule& x, const std::string& y) {return y < x;}
-inline bool operator<=(const Rule& x, const std::string& y) {return !(y < x);}
-inline bool operator>=(const Rule& x, const std::string& y) {return !(x < y);}
-
-inline bool operator!=(const std::string& x, const Rule& y) {return !(x == y);}
-inline bool operator> (const std::string& x, const Rule& y) {return y < x;}
-inline bool operator<=(const std::string& x, const Rule& y) {return !(y < x);}
-inline bool operator>=(const std::string& x, const Rule& y) {return !(x < y);}
-
-struct zonelet
-{
- enum tag {has_rule, has_save, is_empty};
-
- std::chrono::seconds gmtoff_;
- tag tag_ = has_rule;
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
- union U
-#else
- struct U
-#endif
- {
- std::string rule_;
- std::chrono::minutes save_;
-
- ~U() {}
- U() {}
- U(const U&) {}
- U& operator=(const U&) = delete;
- } u;
-
- std::string format_;
- date::year until_year_{0};
- MonthDayTime until_date_;
- sys_seconds until_utc_;
- local_seconds until_std_;
- local_seconds until_loc_;
- std::chrono::minutes initial_save_{};
- std::string initial_abbrev_;
- std::pair<const Rule*, date::year> first_rule_{nullptr, date::year::min()};
- std::pair<const Rule*, date::year> last_rule_{nullptr, date::year::max()};
-
- ~zonelet();
- zonelet();
- zonelet(const zonelet& i);
- zonelet& operator=(const zonelet&) = delete;
-};
-
-#else // USE_OS_TZDB
-
-struct ttinfo
-{
- std::int32_t tt_gmtoff;
- unsigned char tt_isdst;
- unsigned char tt_abbrind;
- unsigned char pad[2];
-};
-
-static_assert(sizeof(ttinfo) == 8, "");
-
-struct expanded_ttinfo
-{
- std::chrono::seconds offset;
- std::string abbrev;
- bool is_dst;
-};
-
-struct transition
-{
- sys_seconds timepoint;
- const expanded_ttinfo* info;
-
- transition(sys_seconds tp, const expanded_ttinfo* i = nullptr)
- : timepoint(tp)
- , info(i)
- {}
-
- friend
- std::ostream&
- operator<<(std::ostream& os, const transition& t)
- {
- using date::operator<<;
- os << t.timepoint << "Z ";
- if (t.info->offset >= std::chrono::seconds{0})
- os << '+';
- os << make_time(t.info->offset);
- if (t.info->is_dst > 0)
- os << " daylight ";
- else
- os << " standard ";
- os << t.info->abbrev;
- return os;
- }
-};
-
-#endif // USE_OS_TZDB
-
-} // namespace detail
-
-} // namespace date
-
-#if defined(_MSC_VER) && (_MSC_VER < 1900)
-#include "tz.h"
-#endif
-
-#endif // TZ_PRIVATE_H
diff --git a/src/libs/date/src/tz.cpp b/src/libs/date/src/tz.cpp
deleted file mode 100644
index ad4e90e7..00000000
--- a/src/libs/date/src/tz.cpp
+++ /dev/null
@@ -1,3825 +0,0 @@
-// The MIT License (MIT)
-//
-// Copyright (c) 2015, 2016, 2017 Howard Hinnant
-// Copyright (c) 2015 Ville Voutilainen
-// Copyright (c) 2016 Alexander Kormanovsky
-// Copyright (c) 2016, 2017 Jiangang Zhuang
-// Copyright (c) 2017 Nicolas Veloz Savino
-// Copyright (c) 2017 Florian Dang
-// Copyright (c) 2017 Aaron Bishop
-//
-// 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.
-
-#ifdef _WIN32
- // windows.h will be included directly and indirectly (e.g. by curl).
- // We need to define these macros to prevent windows.h bringing in
- // more than we need and do it early so windows.h doesn't get included
- // without these macros having been defined.
- // min/max macros interfere with the C++ versions.
-# ifndef NOMINMAX
-# define NOMINMAX
-# endif
- // We don't need all that Windows has to offer.
-# ifndef WIN32_LEAN_AND_MEAN
-# define WIN32_LEAN_AND_MEAN
-# endif
-
- // for wcstombs
-# ifndef _CRT_SECURE_NO_WARNINGS
-# define _CRT_SECURE_NO_WARNINGS
-# endif
-
- // None of this happens with the MS SDK (at least VS14 which I tested), but:
- // Compiling with mingw, we get "error: 'KF_FLAG_DEFAULT' was not declared in this scope."
- // and error: 'SHGetKnownFolderPath' was not declared in this scope.".
- // It seems when using mingw NTDDI_VERSION is undefined and that
- // causes KNOWN_FOLDER_FLAG and the KF_ flags to not get defined.
- // So we must define NTDDI_VERSION to get those flags on mingw.
- // The docs say though here:
- // https://msdn.microsoft.com/en-nz/library/windows/desktop/aa383745(v=vs.85).aspx
- // that "If you define NTDDI_VERSION, you must also define _WIN32_WINNT."
- // So we declare we require Vista or greater.
-# ifdef __MINGW32__
-
-# ifndef NTDDI_VERSION
-# define NTDDI_VERSION 0x06000000
-# define _WIN32_WINNT _WIN32_WINNT_VISTA
-# elif NTDDI_VERSION < 0x06000000
-# warning "If this fails to compile NTDDI_VERSION may be to low. See comments above."
-# endif
- // But once we define the values above we then get this linker error:
- // "tz.cpp:(.rdata$.refptr.FOLDERID_Downloads[.refptr.FOLDERID_Downloads]+0x0): "
- // "undefined reference to `FOLDERID_Downloads'"
- // which #include <initguid.h> cures see:
- // https://support.microsoft.com/en-us/kb/130869
-# include <initguid.h>
- // But with <initguid.h> included, the error moves on to:
- // error: 'FOLDERID_Downloads' was not declared in this scope
- // Which #include <knownfolders.h> cures.
-# include <knownfolders.h>
-
-# endif // __MINGW32__
-
-# include <windows.h>
-#endif // _WIN32
-
-#include "date/tz_private.h"
-
-#ifdef __APPLE__
-# include "date/ios.h"
-#else
-# define TARGET_OS_IPHONE 0
-#endif
-
-#if USE_OS_TZDB
-# include <dirent.h>
-#endif
-#include <algorithm>
-#include <cctype>
-#include <cstdlib>
-#include <cstring>
-#include <cwchar>
-#include <exception>
-#include <fstream>
-#include <iostream>
-#include <iterator>
-#include <memory>
-#if USE_OS_TZDB
-# include <queue>
-#endif
-#include <sstream>
-#include <string>
-#include <tuple>
-#include <vector>
-#include <sys/stat.h>
-
-// unistd.h is used on some platforms as part of the the means to get
-// the current time zone. On Win32 windows.h provides a means to do it.
-// gcc/mingw supports unistd.h on Win32 but MSVC does not.
-
-#ifdef _WIN32
-# ifdef WINAPI_FAMILY
-# include <winapifamily.h>
-# if WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP
-# define WINRT
-# define INSTALL .
-# endif
-# endif
-
-# include <io.h> // _unlink etc.
-
-# if defined(__clang__)
- struct IUnknown; // fix for issue with static_cast<> in objbase.h
- // (see https://github.com/philsquared/Catch/issues/690)
-# endif
-
-# include <shlobj.h> // CoTaskFree, ShGetKnownFolderPath etc.
-# if HAS_REMOTE_API
-# include <direct.h> // _mkdir
-# include <shellapi.h> // ShFileOperation etc.
-# endif // HAS_REMOTE_API
-#else // !_WIN32
-# include <unistd.h>
-# if !USE_OS_TZDB
-# include <wordexp.h>
-# endif
-# include <limits.h>
-# include <string.h>
-# if !USE_SHELL_API
-# include <sys/stat.h>
-# include <sys/fcntl.h>
-# include <dirent.h>
-# include <cstring>
-# include <sys/wait.h>
-# include <sys/types.h>
-# endif //!USE_SHELL_API
-#endif // !_WIN32
-
-
-#if HAS_REMOTE_API
- // Note curl includes windows.h so we must include curl AFTER definitions of things
- // that affect windows.h such as NOMINMAX.
-#if defined(_MSC_VER) && defined(SHORTENED_CURL_INCLUDE)
- // For rmt_curl nuget package
-# include <curl.h>
-#else
-# include <curl/curl.h>
-#endif
-#endif
-
-#ifdef _WIN32
-static CONSTDATA char folder_delimiter = '\\';
-#else // !_WIN32
-static CONSTDATA char folder_delimiter = '/';
-#endif // !_WIN32
-
-#if defined(__GNUC__) && __GNUC__ < 5
- // GCC 4.9 Bug 61489 Wrong warning with -Wmissing-field-initializers
-# pragma GCC diagnostic push
-# pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-#endif // defined(__GNUC__) && __GNUC__ < 5
-
-#if !USE_OS_TZDB
-
-# ifdef _WIN32
-# ifndef WINRT
-
-namespace
-{
- struct task_mem_deleter
- {
- void operator()(wchar_t buf[])
- {
- if (buf != nullptr)
- CoTaskMemFree(buf);
- }
- };
- using co_task_mem_ptr = std::unique_ptr<wchar_t[], task_mem_deleter>;
-}
-
-// We might need to know certain locations even if not using the remote API,
-// so keep these routines out of that block for now.
-static
-std::string
-get_known_folder(const GUID& folderid)
-{
- std::string folder;
- PWSTR pfolder = nullptr;
- HRESULT hr = SHGetKnownFolderPath(folderid, KF_FLAG_DEFAULT, nullptr, &pfolder);
- if (SUCCEEDED(hr))
- {
- co_task_mem_ptr folder_ptr(pfolder);
- const wchar_t* fptr = folder_ptr.get();
- auto state = std::mbstate_t();
- const auto required = std::wcsrtombs(nullptr, &fptr, 0, &state);
- if (required != 0 && required != std::size_t(-1))
- {
- folder.resize(required);
- std::wcsrtombs(&folder[0], &fptr, folder.size(), &state);
- }
- }
- return folder;
-}
-
-# ifndef INSTALL
-
-// Usually something like "c:\Users\username\Downloads".
-static
-std::string
-get_download_folder()
-{
- return get_known_folder(FOLDERID_Downloads);
-}
-
-# endif // !INSTALL
-
-# endif // WINRT
-# else // !_WIN32
-
-# if !defined(INSTALL)
-
-static
-std::string
-expand_path(std::string path)
-{
-# if TARGET_OS_IPHONE
- return date::iOSUtils::get_tzdata_path();
-# else // !TARGET_OS_IPHONE
- ::wordexp_t w{};
- std::unique_ptr<::wordexp_t, void(*)(::wordexp_t*)> hold{&w, ::wordfree};
- ::wordexp(path.c_str(), &w, 0);
- if (w.we_wordc != 1)
- throw std::runtime_error("Cannot expand path: " + path);
- path = w.we_wordv[0];
- return path;
-# endif // !TARGET_OS_IPHONE
-}
-
-static
-std::string
-get_download_folder()
-{
- return expand_path("~/Downloads");
-}
-
-# endif // !defined(INSTALL)
-
-# endif // !_WIN32
-
-#endif // !USE_OS_TZDB
-
-namespace date
-{
-// +---------------------+
-// | Begin Configuration |
-// +---------------------+
-
-using namespace detail;
-
-#if !USE_OS_TZDB
-
-static
-std::string&
-access_install()
-{
- static std::string install
-#ifndef INSTALL
-
- = get_download_folder() + folder_delimiter + "tzdata";
-
-#else // !INSTALL
-
-# define STRINGIZEIMP(x) #x
-# define STRINGIZE(x) STRINGIZEIMP(x)
-
- = STRINGIZE(INSTALL) + std::string(1, folder_delimiter) + "tzdata";
-
- #undef STRINGIZEIMP
- #undef STRINGIZE
-#endif // !INSTALL
-
- return install;
-}
-
-void
-set_install(const std::string& s)
-{
- access_install() = s;
-}
-
-static
-const std::string&
-get_install()
-{
- static const std::string& ref = access_install();
- return ref;
-}
-
-#if HAS_REMOTE_API
-static
-std::string
-get_download_gz_file(const std::string& version)
-{
- auto file = get_install() + version + ".tar.gz";
- return file;
-}
-#endif // HAS_REMOTE_API
-
-#endif // !USE_OS_TZDB
-
-// These can be used to reduce the range of the database to save memory
-CONSTDATA auto min_year = date::year::min();
-CONSTDATA auto max_year = date::year::max();
-
-CONSTDATA auto min_day = date::January/1;
-CONSTDATA auto max_day = date::December/31;
-
-#if USE_OS_TZDB
-
-CONSTCD14 const sys_seconds min_seconds = sys_days(min_year/min_day);
-
-#endif // USE_OS_TZDB
-
-#ifndef _WIN32
-
-static
-std::string
-discover_tz_dir()
-{
- struct stat sb;
- using namespace std;
-# ifndef __APPLE__
- CONSTDATA auto tz_dir_default = "/usr/share/zoneinfo";
- CONSTDATA auto tz_dir_buildroot = "/usr/share/zoneinfo/uclibc";
-
- // Check special path which is valid for buildroot with uclibc builds
- if(stat(tz_dir_buildroot, &sb) == 0 && S_ISDIR(sb.st_mode))
- return tz_dir_buildroot;
- else if(stat(tz_dir_default, &sb) == 0 && S_ISDIR(sb.st_mode))
- return tz_dir_default;
- else
- throw runtime_error("discover_tz_dir failed to find zoneinfo\n");
-# else // __APPLE__
-# if TARGET_OS_IPHONE
- return "/var/db/timezone/zoneinfo";
-# else
- CONSTDATA auto timezone = "/etc/localtime";
- if (!(lstat(timezone, &sb) == 0 && S_ISLNK(sb.st_mode) && sb.st_size > 0))
- throw runtime_error("discover_tz_dir failed\n");
- string result;
- char rp[PATH_MAX+1] = {};
- if (readlink(timezone, rp, sizeof(rp)-1) > 0)
- result = string(rp);
- else
- throw system_error(errno, system_category(), "readlink() failed");
- auto i = result.find("zoneinfo");
- if (i == string::npos)
- throw runtime_error("discover_tz_dir failed to find zoneinfo\n");
- i = result.find('/', i);
- if (i == string::npos)
- throw runtime_error("discover_tz_dir failed to find '/'\n");
- return result.substr(0, i);
-# endif
-# endif // __APPLE__
-}
-
-static
-const std::string&
-get_tz_dir()
-{
- static const std::string tz_dir = discover_tz_dir();
- return tz_dir;
-}
-
-#endif
-
-// +-------------------+
-// | End Configuration |
-// +-------------------+
-
-#ifndef _MSC_VER
-static_assert(min_year <= max_year, "Configuration error");
-#endif
-
-static std::unique_ptr<tzdb> init_tzdb();
-
-tzdb_list::~tzdb_list()
-{
- const tzdb* ptr = head_;
- head_ = nullptr;
- while (ptr != nullptr)
- {
- auto next = ptr->next;
- delete ptr;
- ptr = next;
- }
-}
-
-tzdb_list::tzdb_list(tzdb_list&& x) noexcept
- : head_{x.head_.exchange(nullptr)}
-{
-}
-
-void
-tzdb_list::push_front(tzdb* tzdb) noexcept
-{
- tzdb->next = head_;
- head_ = tzdb;
-}
-
-tzdb_list::const_iterator
-tzdb_list::erase_after(const_iterator p) noexcept
-{
- auto t = p.p_->next;
- p.p_->next = p.p_->next->next;
- delete t;
- return ++p;
-}
-
-struct tzdb_list::undocumented_helper
-{
- static void push_front(tzdb_list& db_list, tzdb* tzdb) noexcept
- {
- db_list.push_front(tzdb);
- }
-};
-
-static
-tzdb_list
-create_tzdb()
-{
- tzdb_list tz_db;
- tzdb_list::undocumented_helper::push_front(tz_db, init_tzdb().release());
- return tz_db;
-}
-
-tzdb_list&
-get_tzdb_list()
-{
- static tzdb_list tz_db = create_tzdb();
- return tz_db;
-}
-
-#if !USE_OS_TZDB
-
-#ifdef _WIN32
-
-static
-void
-sort_zone_mappings(std::vector<date::detail::timezone_mapping>& mappings)
-{
- std::sort(mappings.begin(), mappings.end(),
- [](const date::detail::timezone_mapping& lhs,
- const date::detail::timezone_mapping& rhs)->bool
- {
- auto other_result = lhs.other.compare(rhs.other);
- if (other_result < 0)
- return true;
- else if (other_result == 0)
- {
- auto territory_result = lhs.territory.compare(rhs.territory);
- if (territory_result < 0)
- return true;
- else if (territory_result == 0)
- {
- if (lhs.type < rhs.type)
- return true;
- }
- }
- return false;
- });
-}
-
-static
-bool
-native_to_standard_timezone_name(const std::string& native_tz_name,
- std::string& standard_tz_name)
-{
- // TOOD! Need be a case insensitive compare?
- if (native_tz_name == "UTC")
- {
- standard_tz_name = "Etc/UTC";
- return true;
- }
- standard_tz_name.clear();
- // TODO! we can improve on linear search.
- const auto& mappings = date::get_tzdb().mappings;
- for (const auto& tzm : mappings)
- {
- if (tzm.other == native_tz_name)
- {
- standard_tz_name = tzm.type;
- return true;
- }
- }
- return false;
-}
-
-// Parse this XML file:
-// https://raw.githubusercontent.com/unicode-org/cldr/master/common/supplemental/windowsZones.xml
-// The parsing method is designed to be simple and quick. It is not overly
-// forgiving of change but it should diagnose basic format issues.
-// See timezone_mapping structure for more info.
-static
-std::vector<detail::timezone_mapping>
-load_timezone_mappings_from_xml_file(const std::string& input_path)
-{
- std::size_t line_num = 0;
- std::vector<detail::timezone_mapping> mappings;
- std::string line;
-
- std::ifstream is(input_path);
- if (!is.is_open())
- {
- // We don't emit file exceptions because that's an implementation detail.
- std::string msg = "Error opening time zone mapping file \"";
- msg += input_path;
- msg += "\".";
- throw std::runtime_error(msg);
- }
-
- auto error = [&input_path, &line_num](const char* info)
- {
- std::string msg = "Error loading time zone mapping file \"";
- msg += input_path;
- msg += "\" at line ";
- msg += std::to_string(line_num);
- msg += ": ";
- msg += info;
- throw std::runtime_error(msg);
- };
- // [optional space]a="b"
- auto read_attribute = [&line, &error]
- (const char* name, std::string& value, std::size_t startPos)
- ->std::size_t
- {
- value.clear();
- // Skip leading space before attribute name.
- std::size_t spos = line.find_first_not_of(' ', startPos);
- if (spos == std::string::npos)
- spos = startPos;
- // Assume everything up to next = is the attribute name
- // and that an = will always delimit that.
- std::size_t epos = line.find('=', spos);
- if (epos == std::string::npos)
- error("Expected \'=\' right after attribute name.");
- std::size_t name_len = epos - spos;
- // Expect the name we find matches the name we expect.
- if (line.compare(spos, name_len, name) != 0)
- {
- std::string msg;
- msg = "Expected attribute name \'";
- msg += name;
- msg += "\' around position ";
- msg += std::to_string(spos);
- msg += " but found something else.";
- error(msg.c_str());
- }
- ++epos; // Skip the '=' that is after the attribute name.
- spos = epos;
- if (spos < line.length() && line[spos] == '\"')
- ++spos; // Skip the quote that is before the attribute value.
- else
- {
- std::string msg = "Expected '\"' to begin value of attribute \'";
- msg += name;
- msg += "\'.";
- error(msg.c_str());
- }
- epos = line.find('\"', spos);
- if (epos == std::string::npos)
- {
- std::string msg = "Expected '\"' to end value of attribute \'";
- msg += name;
- msg += "\'.";
- error(msg.c_str());
- }
- // Extract everything in between the quotes. Note no escaping is done.
- std::size_t value_len = epos - spos;
- value.assign(line, spos, value_len);
- ++epos; // Skip the quote that is after the attribute value;
- return epos;
- };
-
- // Quick but not overly forgiving XML mapping file processing.
- bool mapTimezonesOpenTagFound = false;
- bool mapTimezonesCloseTagFound = false;
- std::size_t mapZonePos = std::string::npos;
- std::size_t mapTimezonesPos = std::string::npos;
- CONSTDATA char mapTimeZonesOpeningTag[] = { "<mapTimezones " };
- CONSTDATA char mapZoneOpeningTag[] = { "<mapZone " };
- CONSTDATA std::size_t mapZoneOpeningTagLen = sizeof(mapZoneOpeningTag) /
- sizeof(mapZoneOpeningTag[0]) - 1;
- while (!mapTimezonesOpenTagFound)
- {
- std::getline(is, line);
- ++line_num;
- if (is.eof())
- {
- // If there is no mapTimezones tag is it an error?
- // Perhaps if there are no mapZone mappings it might be ok for
- // its parent mapTimezones element to be missing?
- // We treat this as an error though on the assumption that if there
- // really are no mappings we should still get a mapTimezones parent
- // element but no mapZone elements inside. Assuming we must
- // find something will hopefully at least catch more drastic formatting
- // changes or errors than if we don't do this and assume nothing found.
- error("Expected a mapTimezones opening tag.");
- }
- mapTimezonesPos = line.find(mapTimeZonesOpeningTag);
- mapTimezonesOpenTagFound = (mapTimezonesPos != std::string::npos);
- }
-
- // NOTE: We could extract the version info that follows the opening
- // mapTimezones tag and compare that to the version of other data we have.
- // I would have expected them to be kept in synch but testing has shown
- // it typically does not match anyway. So what's the point?
- while (!mapTimezonesCloseTagFound)
- {
- std::ws(is);
- std::getline(is, line);
- ++line_num;
- if (is.eof())
- error("Expected a mapTimezones closing tag.");
- if (line.empty())
- continue;
- mapZonePos = line.find(mapZoneOpeningTag);
- if (mapZonePos != std::string::npos)
- {
- mapZonePos += mapZoneOpeningTagLen;
- detail::timezone_mapping zm{};
- std::size_t pos = read_attribute("other", zm.other, mapZonePos);
- pos = read_attribute("territory", zm.territory, pos);
- read_attribute("type", zm.type, pos);
- mappings.push_back(std::move(zm));
-
- continue;
- }
- mapTimezonesPos = line.find("</mapTimezones>");
- mapTimezonesCloseTagFound = (mapTimezonesPos != std::string::npos);
- if (!mapTimezonesCloseTagFound)
- {
- std::size_t commentPos = line.find("<!--");
- if (commentPos == std::string::npos)
- error("Unexpected mapping record found. A xml mapZone or comment "
- "attribute or mapTimezones closing tag was expected.");
- }
- }
-
- is.close();
- return mappings;
-}
-
-#endif // _WIN32
-
-// Parsing helpers
-
-static
-std::string
-parse3(std::istream& in)
-{
- std::string r(3, ' ');
- ws(in);
- r[0] = static_cast<char>(in.get());
- r[1] = static_cast<char>(in.get());
- r[2] = static_cast<char>(in.get());
- return r;
-}
-
-static
-unsigned
-parse_dow(std::istream& in)
-{
- CONSTDATA char*const dow_names[] =
- {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
- auto s = parse3(in);
- auto dow = std::find(std::begin(dow_names), std::end(dow_names), s) - dow_names;
- if (dow >= std::end(dow_names) - std::begin(dow_names))
- throw std::runtime_error("oops: bad dow name: " + s);
- return static_cast<unsigned>(dow);
-}
-
-static
-unsigned
-parse_month(std::istream& in)
-{
- CONSTDATA char*const month_names[] =
- {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
- auto s = parse3(in);
- auto m = std::find(std::begin(month_names), std::end(month_names), s) - month_names;
- if (m >= std::end(month_names) - std::begin(month_names))
- throw std::runtime_error("oops: bad month name: " + s);
- return static_cast<unsigned>(++m);
-}
-
-static
-std::chrono::seconds
-parse_unsigned_time(std::istream& in)
-{
- using namespace std::chrono;
- int x;
- in >> x;
- auto r = seconds{hours{x}};
- if (!in.eof() && in.peek() == ':')
- {
- in.get();
- in >> x;
- r += minutes{x};
- if (!in.eof() && in.peek() == ':')
- {
- in.get();
- in >> x;
- r += seconds{x};
- }
- }
- return r;
-}
-
-static
-std::chrono::seconds
-parse_signed_time(std::istream& in)
-{
- ws(in);
- auto sign = 1;
- if (in.peek() == '-')
- {
- sign = -1;
- in.get();
- }
- else if (in.peek() == '+')
- in.get();
- return sign * parse_unsigned_time(in);
-}
-
-// MonthDayTime
-
-detail::MonthDayTime::MonthDayTime(local_seconds tp, tz timezone)
- : zone_(timezone)
-{
- using namespace date;
- const auto dp = date::floor<days>(tp);
- const auto hms = make_time(tp - dp);
- const auto ymd = year_month_day(dp);
- u = ymd.month() / ymd.day();
- h_ = hms.hours();
- m_ = hms.minutes();
- s_ = hms.seconds();
-}
-
-detail::MonthDayTime::MonthDayTime(const date::month_day& md, tz timezone)
- : zone_(timezone)
-{
- u = md;
-}
-
-date::day
-detail::MonthDayTime::day() const
-{
- switch (type_)
- {
- case month_day:
- return u.month_day_.day();
- case month_last_dow:
- return date::day{31};
- case lteq:
- case gteq:
- break;
- }
- return u.month_day_weekday_.month_day_.day();
-}
-
-date::month
-detail::MonthDayTime::month() const
-{
- switch (type_)
- {
- case month_day:
- return u.month_day_.month();
- case month_last_dow:
- return u.month_weekday_last_.month();
- case lteq:
- case gteq:
- break;
- }
- return u.month_day_weekday_.month_day_.month();
-}
-
-int
-detail::MonthDayTime::compare(date::year y, const MonthDayTime& x, date::year yx,
- std::chrono::seconds offset, std::chrono::minutes prev_save) const
-{
- if (zone_ != x.zone_)
- {
- auto dp0 = to_sys_days(y);
- auto dp1 = x.to_sys_days(yx);
- if (std::abs((dp0-dp1).count()) > 1)
- return dp0 < dp1 ? -1 : 1;
- if (zone_ == tz::local)
- {
- auto tp0 = to_time_point(y) - prev_save;
- if (x.zone_ == tz::utc)
- tp0 -= offset;
- auto tp1 = x.to_time_point(yx);
- return tp0 < tp1 ? -1 : tp0 == tp1 ? 0 : 1;
- }
- else if (zone_ == tz::standard)
- {
- auto tp0 = to_time_point(y);
- auto tp1 = x.to_time_point(yx);
- if (x.zone_ == tz::local)
- tp1 -= prev_save;
- else
- tp0 -= offset;
- return tp0 < tp1 ? -1 : tp0 == tp1 ? 0 : 1;
- }
- // zone_ == tz::utc
- auto tp0 = to_time_point(y);
- auto tp1 = x.to_time_point(yx);
- if (x.zone_ == tz::local)
- tp1 -= offset + prev_save;
- else
- tp1 -= offset;
- return tp0 < tp1 ? -1 : tp0 == tp1 ? 0 : 1;
- }
- auto const t0 = to_time_point(y);
- auto const t1 = x.to_time_point(yx);
- return t0 < t1 ? -1 : t0 == t1 ? 0 : 1;
-}
-
-sys_seconds
-detail::MonthDayTime::to_sys(date::year y, std::chrono::seconds offset,
- std::chrono::seconds save) const
-{
- using namespace date;
- using namespace std::chrono;
- auto until_utc = to_time_point(y);
- if (zone_ == tz::standard)
- until_utc -= offset;
- else if (zone_ == tz::local)
- until_utc -= offset + save;
- return until_utc;
-}
-
-detail::MonthDayTime::U&
-detail::MonthDayTime::U::operator=(const date::month_day& x)
-{
- month_day_ = x;
- return *this;
-}
-
-detail::MonthDayTime::U&
-detail::MonthDayTime::U::operator=(const date::month_weekday_last& x)
-{
- month_weekday_last_ = x;
- return *this;
-}
-
-detail::MonthDayTime::U&
-detail::MonthDayTime::U::operator=(const pair& x)
-{
- month_day_weekday_ = x;
- return *this;
-}
-
-date::sys_days
-detail::MonthDayTime::to_sys_days(date::year y) const
-{
- using namespace std::chrono;
- using namespace date;
- switch (type_)
- {
- case month_day:
- return sys_days(y/u.month_day_);
- case month_last_dow:
- return sys_days(y/u.month_weekday_last_);
- case lteq:
- {
- auto const x = y/u.month_day_weekday_.month_day_;
- auto const wd1 = weekday(static_cast<sys_days>(x));
- auto const wd0 = u.month_day_weekday_.weekday_;
- return sys_days(x) - (wd1-wd0);
- }
- case gteq:
- break;
- }
- auto const x = y/u.month_day_weekday_.month_day_;
- auto const wd1 = u.month_day_weekday_.weekday_;
- auto const wd0 = weekday(static_cast<sys_days>(x));
- return sys_days(x) + (wd1-wd0);
-}
-
-sys_seconds
-detail::MonthDayTime::to_time_point(date::year y) const
-{
- // Add seconds first to promote to largest rep early to prevent overflow
- return to_sys_days(y) + s_ + h_ + m_;
-}
-
-void
-detail::MonthDayTime::canonicalize(date::year y)
-{
- using namespace std::chrono;
- using namespace date;
- switch (type_)
- {
- case month_day:
- return;
- case month_last_dow:
- {
- auto const ymd = year_month_day(sys_days(y/u.month_weekday_last_));
- u.month_day_ = ymd.month()/ymd.day();
- type_ = month_day;
- return;
- }
- case lteq:
- {
- auto const x = y/u.month_day_weekday_.month_day_;
- auto const wd1 = weekday(static_cast<sys_days>(x));
- auto const wd0 = u.month_day_weekday_.weekday_;
- auto const ymd = year_month_day(sys_days(x) - (wd1-wd0));
- u.month_day_ = ymd.month()/ymd.day();
- type_ = month_day;
- return;
- }
- case gteq:
- {
- auto const x = y/u.month_day_weekday_.month_day_;
- auto const wd1 = u.month_day_weekday_.weekday_;
- auto const wd0 = weekday(static_cast<sys_days>(x));
- auto const ymd = year_month_day(sys_days(x) + (wd1-wd0));
- u.month_day_ = ymd.month()/ymd.day();
- type_ = month_day;
- return;
- }
- }
-}
-
-std::istream&
-detail::operator>>(std::istream& is, MonthDayTime& x)
-{
- using namespace date;
- using namespace std::chrono;
- assert(((std::ios::failbit | std::ios::badbit) & is.exceptions()) ==
- (std::ios::failbit | std::ios::badbit));
- x = MonthDayTime{};
- if (!is.eof() && ws(is) && !is.eof() && is.peek() != '#')
- {
- auto m = parse_month(is);
- if (!is.eof() && ws(is) && !is.eof() && is.peek() != '#')
- {
- if (is.peek() == 'l')
- {
- for (int i = 0; i < 4; ++i)
- is.get();
- auto dow = parse_dow(is);
- x.type_ = MonthDayTime::month_last_dow;
- x.u = date::month(m)/weekday(dow)[last];
- }
- else if (std::isalpha(is.peek()))
- {
- auto dow = parse_dow(is);
- char c{};
- is >> c;
- if (c == '<' || c == '>')
- {
- char c2{};
- is >> c2;
- if (c2 != '=')
- throw std::runtime_error(std::string("bad operator: ") + c + c2);
- int d;
- is >> d;
- if (d < 1 || d > 31)
- throw std::runtime_error(std::string("bad operator: ") + c + c2
- + std::to_string(d));
- x.type_ = c == '<' ? MonthDayTime::lteq : MonthDayTime::gteq;
- x.u = MonthDayTime::pair{ date::month(m) / d, date::weekday(dow) };
- }
- else
- throw std::runtime_error(std::string("bad operator: ") + c);
- }
- else // if (std::isdigit(is.peek())
- {
- int d;
- is >> d;
- if (d < 1 || d > 31)
- throw std::runtime_error(std::string("day of month: ")
- + std::to_string(d));
- x.type_ = MonthDayTime::month_day;
- x.u = date::month(m)/d;
- }
- if (!is.eof() && ws(is) && !is.eof() && is.peek() != '#')
- {
- int t;
- is >> t;
- x.h_ = hours{t};
- if (!is.eof() && is.peek() == ':')
- {
- is.get();
- is >> t;
- x.m_ = minutes{t};
- if (!is.eof() && is.peek() == ':')
- {
- is.get();
- is >> t;
- x.s_ = seconds{t};
- }
- }
- if (!is.eof() && std::isalpha(is.peek()))
- {
- char c;
- is >> c;
- switch (c)
- {
- case 's':
- x.zone_ = tz::standard;
- break;
- case 'u':
- x.zone_ = tz::utc;
- break;
- }
- }
- }
- }
- else
- {
- x.u = month{m}/1;
- }
- }
- return is;
-}
-
-std::ostream&
-detail::operator<<(std::ostream& os, const MonthDayTime& x)
-{
- switch (x.type_)
- {
- case MonthDayTime::month_day:
- os << x.u.month_day_ << " ";
- break;
- case MonthDayTime::month_last_dow:
- os << x.u.month_weekday_last_ << " ";
- break;
- case MonthDayTime::lteq:
- os << x.u.month_day_weekday_.weekday_ << " on or before "
- << x.u.month_day_weekday_.month_day_ << " ";
- break;
- case MonthDayTime::gteq:
- if ((static_cast<unsigned>(x.day()) - 1) % 7 == 0)
- {
- os << (x.u.month_day_weekday_.month_day_.month() /
- x.u.month_day_weekday_.weekday_[
- (static_cast<unsigned>(x.day()) - 1)/7+1]) << " ";
- }
- else
- {
- os << x.u.month_day_weekday_.weekday_ << " on or after "
- << x.u.month_day_weekday_.month_day_ << " ";
- }
- break;
- }
- os << date::make_time(x.s_ + x.h_ + x.m_);
- if (x.zone_ == tz::utc)
- os << "UTC ";
- else if (x.zone_ == tz::standard)
- os << "STD ";
- else
- os << " ";
- return os;
-}
-
-// Rule
-
-detail::Rule::Rule(const std::string& s)
-{
- try
- {
- using namespace date;
- using namespace std::chrono;
- std::istringstream in(s);
- in.exceptions(std::ios::failbit | std::ios::badbit);
- std::string word;
- in >> word >> name_;
- int x;
- ws(in);
- if (std::isalpha(in.peek()))
- {
- in >> word;
- if (word == "min")
- {
- starting_year_ = year::min();
- }
- else
- throw std::runtime_error("Didn't find expected word: " + word);
- }
- else
- {
- in >> x;
- starting_year_ = year{x};
- }
- std::ws(in);
- if (std::isalpha(in.peek()))
- {
- in >> word;
- if (word == "only")
- {
- ending_year_ = starting_year_;
- }
- else if (word == "max")
- {
- ending_year_ = year::max();
- }
- else
- throw std::runtime_error("Didn't find expected word: " + word);
- }
- else
- {
- in >> x;
- ending_year_ = year{x};
- }
- in >> word; // TYPE (always "-")
- assert(word == "-");
- in >> starting_at_;
- save_ = duration_cast<minutes>(parse_signed_time(in));
- in >> abbrev_;
- if (abbrev_ == "-")
- abbrev_.clear();
- assert(hours{-1} <= save_ && save_ <= hours{2});
- }
- catch (...)
- {
- std::cerr << s << '\n';
- std::cerr << *this << '\n';
- throw;
- }
-}
-
-detail::Rule::Rule(const Rule& r, date::year starting_year, date::year ending_year)
- : name_(r.name_)
- , starting_year_(starting_year)
- , ending_year_(ending_year)
- , starting_at_(r.starting_at_)
- , save_(r.save_)
- , abbrev_(r.abbrev_)
-{
-}
-
-bool
-detail::operator==(const Rule& x, const Rule& y)
-{
- if (std::tie(x.name_, x.save_, x.starting_year_, x.ending_year_) ==
- std::tie(y.name_, y.save_, y.starting_year_, y.ending_year_))
- return x.month() == y.month() && x.day() == y.day();
- return false;
-}
-
-bool
-detail::operator<(const Rule& x, const Rule& y)
-{
- using namespace std::chrono;
- auto const xm = x.month();
- auto const ym = y.month();
- if (std::tie(x.name_, x.starting_year_, xm, x.ending_year_) <
- std::tie(y.name_, y.starting_year_, ym, y.ending_year_))
- return true;
- if (std::tie(x.name_, x.starting_year_, xm, x.ending_year_) >
- std::tie(y.name_, y.starting_year_, ym, y.ending_year_))
- return false;
- return x.day() < y.day();
-}
-
-bool
-detail::operator==(const Rule& x, const date::year& y)
-{
- return x.starting_year_ <= y && y <= x.ending_year_;
-}
-
-bool
-detail::operator<(const Rule& x, const date::year& y)
-{
- return x.ending_year_ < y;
-}
-
-bool
-detail::operator==(const date::year& x, const Rule& y)
-{
- return y.starting_year_ <= x && x <= y.ending_year_;
-}
-
-bool
-detail::operator<(const date::year& x, const Rule& y)
-{
- return x < y.starting_year_;
-}
-
-bool
-detail::operator==(const Rule& x, const std::string& y)
-{
- return x.name() == y;
-}
-
-bool
-detail::operator<(const Rule& x, const std::string& y)
-{
- return x.name() < y;
-}
-
-bool
-detail::operator==(const std::string& x, const Rule& y)
-{
- return y.name() == x;
-}
-
-bool
-detail::operator<(const std::string& x, const Rule& y)
-{
- return x < y.name();
-}
-
-std::ostream&
-detail::operator<<(std::ostream& os, const Rule& r)
-{
- using namespace date;
- using namespace std::chrono;
- detail::save_ostream<char> _(os);
- os.fill(' ');
- os.flags(std::ios::dec | std::ios::left);
- os.width(15);
- os << r.name_;
- os << r.starting_year_ << " " << r.ending_year_ << " ";
- os << r.starting_at_;
- if (r.save_ >= minutes{0})
- os << ' ';
- os << date::make_time(r.save_) << " ";
- os << r.abbrev_;
- return os;
-}
-
-date::day
-detail::Rule::day() const
-{
- return starting_at_.day();
-}
-
-date::month
-detail::Rule::month() const
-{
- return starting_at_.month();
-}
-
-struct find_rule_by_name
-{
- bool operator()(const Rule& x, const std::string& nm) const
- {
- return x.name() < nm;
- }
-
- bool operator()(const std::string& nm, const Rule& x) const
- {
- return nm < x.name();
- }
-};
-
-bool
-detail::Rule::overlaps(const Rule& x, const Rule& y)
-{
- // assume x.starting_year_ <= y.starting_year_;
- if (!(x.starting_year_ <= y.starting_year_))
- {
- std::cerr << x << '\n';
- std::cerr << y << '\n';
- assert(x.starting_year_ <= y.starting_year_);
- }
- if (y.starting_year_ > x.ending_year_)
- return false;
- return !(x.starting_year_ == y.starting_year_ && x.ending_year_ == y.ending_year_);
-}
-
-void
-detail::Rule::split(std::vector<Rule>& rules, std::size_t i, std::size_t k, std::size_t& e)
-{
- using namespace date;
- using difference_type = std::vector<Rule>::iterator::difference_type;
- // rules[i].starting_year_ <= rules[k].starting_year_ &&
- // rules[i].ending_year_ >= rules[k].starting_year_ &&
- // (rules[i].starting_year_ != rules[k].starting_year_ ||
- // rules[i].ending_year_ != rules[k].ending_year_)
- assert(rules[i].starting_year_ <= rules[k].starting_year_ &&
- rules[i].ending_year_ >= rules[k].starting_year_ &&
- (rules[i].starting_year_ != rules[k].starting_year_ ||
- rules[i].ending_year_ != rules[k].ending_year_));
- if (rules[i].starting_year_ == rules[k].starting_year_)
- {
- if (rules[k].ending_year_ < rules[i].ending_year_)
- {
- rules.insert(rules.begin() + static_cast<difference_type>(k+1),
- Rule(rules[i], rules[k].ending_year_ + years{1},
- std::move(rules[i].ending_year_)));
- ++e;
- rules[i].ending_year_ = rules[k].ending_year_;
- }
- else // rules[k].ending_year_ > rules[i].ending_year_
- {
- rules.insert(rules.begin() + static_cast<difference_type>(k+1),
- Rule(rules[k], rules[i].ending_year_ + years{1},
- std::move(rules[k].ending_year_)));
- ++e;
- rules[k].ending_year_ = rules[i].ending_year_;
- }
- }
- else // rules[i].starting_year_ < rules[k].starting_year_
- {
- if (rules[k].ending_year_ < rules[i].ending_year_)
- {
- rules.insert(rules.begin() + static_cast<difference_type>(k),
- Rule(rules[i], rules[k].starting_year_, rules[k].ending_year_));
- ++k;
- rules.insert(rules.begin() + static_cast<difference_type>(k+1),
- Rule(rules[i], rules[k].ending_year_ + years{1},
- std::move(rules[i].ending_year_)));
- rules[i].ending_year_ = rules[k].starting_year_ - years{1};
- e += 2;
- }
- else if (rules[k].ending_year_ > rules[i].ending_year_)
- {
- rules.insert(rules.begin() + static_cast<difference_type>(k),
- Rule(rules[i], rules[k].starting_year_, rules[i].ending_year_));
- ++k;
- rules.insert(rules.begin() + static_cast<difference_type>(k+1),
- Rule(rules[k], rules[i].ending_year_ + years{1},
- std::move(rules[k].ending_year_)));
- e += 2;
- rules[k].ending_year_ = std::move(rules[i].ending_year_);
- rules[i].ending_year_ = rules[k].starting_year_ - years{1};
- }
- else // rules[k].ending_year_ == rules[i].ending_year_
- {
- rules.insert(rules.begin() + static_cast<difference_type>(k),
- Rule(rules[i], rules[k].starting_year_,
- std::move(rules[i].ending_year_)));
- ++k;
- ++e;
- rules[i].ending_year_ = rules[k].starting_year_ - years{1};
- }
- }
-}
-
-void
-detail::Rule::split_overlaps(std::vector<Rule>& rules, std::size_t i, std::size_t& e)
-{
- using difference_type = std::vector<Rule>::iterator::difference_type;
- auto j = i;
- for (; i + 1 < e; ++i)
- {
- for (auto k = i + 1; k < e; ++k)
- {
- if (overlaps(rules[i], rules[k]))
- {
- split(rules, i, k, e);
- std::sort(rules.begin() + static_cast<difference_type>(i),
- rules.begin() + static_cast<difference_type>(e));
- }
- }
- }
- for (; j < e; ++j)
- {
- if (rules[j].starting_year() == rules[j].ending_year())
- rules[j].starting_at_.canonicalize(rules[j].starting_year());
- }
-}
-
-void
-detail::Rule::split_overlaps(std::vector<Rule>& rules)
-{
- using difference_type = std::vector<Rule>::iterator::difference_type;
- for (std::size_t i = 0; i < rules.size();)
- {
- auto e = static_cast<std::size_t>(std::upper_bound(
- rules.cbegin()+static_cast<difference_type>(i), rules.cend(), rules[i].name(),
- [](const std::string& nm, const Rule& x)
- {
- return nm < x.name();
- }) - rules.cbegin());
- split_overlaps(rules, i, e);
- auto first_rule = rules.begin() + static_cast<difference_type>(i);
- auto last_rule = rules.begin() + static_cast<difference_type>(e);
- auto t = std::lower_bound(first_rule, last_rule, min_year);
- if (t > first_rule+1)
- {
- if (t == last_rule || t->starting_year() >= min_year)
- --t;
- auto d = static_cast<std::size_t>(t - first_rule);
- rules.erase(first_rule, t);
- e -= d;
- }
- first_rule = rules.begin() + static_cast<difference_type>(i);
- last_rule = rules.begin() + static_cast<difference_type>(e);
- t = std::upper_bound(first_rule, last_rule, max_year);
- if (t != last_rule)
- {
- auto d = static_cast<std::size_t>(last_rule - t);
- rules.erase(t, last_rule);
- e -= d;
- }
- i = e;
- }
- rules.shrink_to_fit();
-}
-
-// Find the rule that comes chronologically before Rule r. For multi-year rules,
-// y specifies which rules in r. For single year rules, y is assumed to be equal
-// to the year specified by r.
-// Returns a pointer to the chronologically previous rule, and the year within
-// that rule. If there is no previous rule, returns nullptr and year::min().
-// Preconditions:
-// r->starting_year() <= y && y <= r->ending_year()
-static
-std::pair<const Rule*, date::year>
-find_previous_rule(const Rule* r, date::year y)
-{
- using namespace date;
- auto const& rules = get_tzdb().rules;
- if (y == r->starting_year())
- {
- if (r == &rules.front() || r->name() != r[-1].name())
- std::terminate(); // never called with first rule
- --r;
- if (y == r->starting_year())
- return {r, y};
- return {r, r->ending_year()};
- }
- if (r == &rules.front() || r->name() != r[-1].name() ||
- r[-1].starting_year() < r->starting_year())
- {
- while (r < &rules.back() && r->name() == r[1].name() &&
- r->starting_year() == r[1].starting_year())
- ++r;
- return {r, --y};
- }
- --r;
- return {r, y};
-}
-
-// Find the rule that comes chronologically after Rule r. For multi-year rules,
-// y specifies which rules in r. For single year rules, y is assumed to be equal
-// to the year specified by r.
-// Returns a pointer to the chronologically next rule, and the year within
-// that rule. If there is no next rule, return a pointer to a defaulted rule
-// and y+1.
-// Preconditions:
-// first <= r && r < last && r->starting_year() <= y && y <= r->ending_year()
-// [first, last) all have the same name
-static
-std::pair<const Rule*, date::year>
-find_next_rule(const Rule* first_rule, const Rule* last_rule, const Rule* r, date::year y)
-{
- using namespace date;
- if (y == r->ending_year())
- {
- if (r == last_rule-1)
- return {nullptr, year::max()};
- ++r;
- if (y == r->ending_year())
- return {r, y};
- return {r, r->starting_year()};
- }
- if (r == last_rule-1 || r->ending_year() < r[1].ending_year())
- {
- while (r > first_rule && r->starting_year() == r[-1].starting_year())
- --r;
- return {r, ++y};
- }
- ++r;
- return {r, y};
-}
-
-// Find the rule that comes chronologically after Rule r. For multi-year rules,
-// y specifies which rules in r. For single year rules, y is assumed to be equal
-// to the year specified by r.
-// Returns a pointer to the chronologically next rule, and the year within
-// that rule. If there is no next rule, return nullptr and year::max().
-// Preconditions:
-// r->starting_year() <= y && y <= r->ending_year()
-static
-std::pair<const Rule*, date::year>
-find_next_rule(const Rule* r, date::year y)
-{
- using namespace date;
- auto const& rules = get_tzdb().rules;
- if (y == r->ending_year())
- {
- if (r == &rules.back() || r->name() != r[1].name())
- return {nullptr, year::max()};
- ++r;
- if (y == r->ending_year())
- return {r, y};
- return {r, r->starting_year()};
- }
- if (r == &rules.back() || r->name() != r[1].name() ||
- r->ending_year() < r[1].ending_year())
- {
- while (r > &rules.front() && r->name() == r[-1].name() &&
- r->starting_year() == r[-1].starting_year())
- --r;
- return {r, ++y};
- }
- ++r;
- return {r, y};
-}
-
-static
-const Rule*
-find_first_std_rule(const std::pair<const Rule*, const Rule*>& eqr)
-{
- auto r = eqr.first;
- auto ry = r->starting_year();
- while (r->save() != std::chrono::minutes{0})
- {
- std::tie(r, ry) = find_next_rule(eqr.first, eqr.second, r, ry);
- if (r == nullptr)
- throw std::runtime_error("Could not find standard offset in rule "
- + eqr.first->name());
- }
- return r;
-}
-
-static
-std::pair<const Rule*, date::year>
-find_rule_for_zone(const std::pair<const Rule*, const Rule*>& eqr,
- const date::year& y, const std::chrono::seconds& offset,
- const MonthDayTime& mdt)
-{
- assert(eqr.first != nullptr);
- assert(eqr.second != nullptr);
-
- using namespace std::chrono;
- using namespace date;
- auto r = eqr.first;
- auto ry = r->starting_year();
- auto prev_save = minutes{0};
- auto prev_year = year::min();
- const Rule* prev_rule = nullptr;
- while (r != nullptr)
- {
- if (mdt.compare(y, r->mdt(), ry, offset, prev_save) <= 0)
- break;
- prev_rule = r;
- prev_year = ry;
- prev_save = prev_rule->save();
- std::tie(r, ry) = find_next_rule(eqr.first, eqr.second, r, ry);
- }
- return {prev_rule, prev_year};
-}
-
-static
-std::pair<const Rule*, date::year>
-find_rule_for_zone(const std::pair<const Rule*, const Rule*>& eqr,
- const sys_seconds& tp_utc,
- const local_seconds& tp_std,
- const local_seconds& tp_loc)
-{
- using namespace std::chrono;
- using namespace date;
- auto r = eqr.first;
- auto ry = r->starting_year();
- auto prev_save = minutes{0};
- auto prev_year = year::min();
- const Rule* prev_rule = nullptr;
- while (r != nullptr)
- {
- bool found = false;
- switch (r->mdt().zone())
- {
- case tz::utc:
- found = tp_utc < r->mdt().to_time_point(ry);
- break;
- case tz::standard:
- found = sys_seconds{tp_std.time_since_epoch()} < r->mdt().to_time_point(ry);
- break;
- case tz::local:
- found = sys_seconds{tp_loc.time_since_epoch()} < r->mdt().to_time_point(ry);
- break;
- }
- if (found)
- break;
- prev_rule = r;
- prev_year = ry;
- prev_save = prev_rule->save();
- std::tie(r, ry) = find_next_rule(eqr.first, eqr.second, r, ry);
- }
- return {prev_rule, prev_year};
-}
-
-static
-sys_info
-find_rule(const std::pair<const Rule*, date::year>& first_rule,
- const std::pair<const Rule*, date::year>& last_rule,
- const date::year& y, const std::chrono::seconds& offset,
- const MonthDayTime& mdt, const std::chrono::minutes& initial_save,
- const std::string& initial_abbrev)
-{
- using namespace std::chrono;
- using namespace date;
- auto r = first_rule.first;
- auto ry = first_rule.second;
- sys_info x{sys_days(year::min()/min_day), sys_days(year::max()/max_day),
- seconds{0}, initial_save, initial_abbrev};
- while (r != nullptr)
- {
- auto tr = r->mdt().to_sys(ry, offset, x.save);
- auto tx = mdt.to_sys(y, offset, x.save);
- // Find last rule where tx >= tr
- if (tx <= tr || (r == last_rule.first && ry == last_rule.second))
- {
- if (tx < tr && r == first_rule.first && ry == first_rule.second)
- {
- x.end = r->mdt().to_sys(ry, offset, x.save);
- break;
- }
- if (tx < tr)
- {
- std::tie(r, ry) = find_previous_rule(r, ry); // can't return nullptr for r
- assert(r != nullptr);
- }
- // r != nullptr && tx >= tr (if tr were to be recomputed)
- auto prev_save = initial_save;
- if (!(r == first_rule.first && ry == first_rule.second))
- prev_save = find_previous_rule(r, ry).first->save();
- x.begin = r->mdt().to_sys(ry, offset, prev_save);
- x.save = r->save();
- x.abbrev = r->abbrev();
- if (!(r == last_rule.first && ry == last_rule.second))
- {
- std::tie(r, ry) = find_next_rule(r, ry); // can't return nullptr for r
- assert(r != nullptr);
- x.end = r->mdt().to_sys(ry, offset, x.save);
- }
- else
- x.end = sys_days(year::max()/max_day);
- break;
- }
- x.save = r->save();
- std::tie(r, ry) = find_next_rule(r, ry); // Can't return nullptr for r
- assert(r != nullptr);
- }
- return x;
-}
-
-// zonelet
-
-detail::zonelet::~zonelet()
-{
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
- using minutes = std::chrono::minutes;
- using string = std::string;
- if (tag_ == has_save)
- u.save_.~minutes();
- else
- u.rule_.~string();
-#endif
-}
-
-detail::zonelet::zonelet()
-{
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
- ::new(&u.rule_) std::string();
-#endif
-}
-
-detail::zonelet::zonelet(const zonelet& i)
- : gmtoff_(i.gmtoff_)
- , tag_(i.tag_)
- , format_(i.format_)
- , until_year_(i.until_year_)
- , until_date_(i.until_date_)
- , until_utc_(i.until_utc_)
- , until_std_(i.until_std_)
- , until_loc_(i.until_loc_)
- , initial_save_(i.initial_save_)
- , initial_abbrev_(i.initial_abbrev_)
- , first_rule_(i.first_rule_)
- , last_rule_(i.last_rule_)
-{
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
- if (tag_ == has_save)
- ::new(&u.save_) std::chrono::minutes(i.u.save_);
- else
- ::new(&u.rule_) std::string(i.u.rule_);
-#else
- if (tag_ == has_save)
- u.save_ = i.u.save_;
- else
- u.rule_ = i.u.rule_;
-#endif
-}
-
-#endif // !USE_OS_TZDB
-
-// time_zone
-
-#if USE_OS_TZDB
-
-time_zone::time_zone(const std::string& s, detail::undocumented)
- : name_(s)
- , adjusted_(new std::once_flag{})
-{
-}
-
-enum class endian
-{
- native = __BYTE_ORDER__,
- little = __ORDER_LITTLE_ENDIAN__,
- big = __ORDER_BIG_ENDIAN__
-};
-
-static
-inline
-std::uint32_t
-reverse_bytes(std::uint32_t i)
-{
- return
- (i & 0xff000000u) >> 24 |
- (i & 0x00ff0000u) >> 8 |
- (i & 0x0000ff00u) << 8 |
- (i & 0x000000ffu) << 24;
-}
-
-static
-inline
-std::uint64_t
-reverse_bytes(std::uint64_t i)
-{
- return
- (i & 0xff00000000000000ull) >> 56 |
- (i & 0x00ff000000000000ull) >> 40 |
- (i & 0x0000ff0000000000ull) >> 24 |
- (i & 0x000000ff00000000ull) >> 8 |
- (i & 0x00000000ff000000ull) << 8 |
- (i & 0x0000000000ff0000ull) << 24 |
- (i & 0x000000000000ff00ull) << 40 |
- (i & 0x00000000000000ffull) << 56;
-}
-
-template <class T>
-static
-inline
-void
-maybe_reverse_bytes(T&, std::false_type)
-{
-}
-
-static
-inline
-void
-maybe_reverse_bytes(std::int32_t& t, std::true_type)
-{
- t = static_cast<std::int32_t>(reverse_bytes(static_cast<std::uint32_t>(t)));
-}
-
-static
-inline
-void
-maybe_reverse_bytes(std::int64_t& t, std::true_type)
-{
- t = static_cast<std::int64_t>(reverse_bytes(static_cast<std::uint64_t>(t)));
-}
-
-template <class T>
-static
-inline
-void
-maybe_reverse_bytes(T& t)
-{
- maybe_reverse_bytes(t, std::integral_constant<bool,
- endian::native == endian::little>{});
-}
-
-static
-void
-load_header(std::istream& inf)
-{
- // Read TZif
- auto t = inf.get();
- auto z = inf.get();
- auto i = inf.get();
- auto f = inf.get();
-#ifndef NDEBUG
- assert(t == 'T');
- assert(z == 'Z');
- assert(i == 'i');
- assert(f == 'f');
-#else
- (void)t;
- (void)z;
- (void)i;
- (void)f;
-#endif
-}
-
-static
-unsigned char
-load_version(std::istream& inf)
-{
- // Read version
- auto v = inf.get();
- assert(v != EOF);
- return static_cast<unsigned char>(v);
-}
-
-static
-void
-skip_reserve(std::istream& inf)
-{
- inf.ignore(15);
-}
-
-static
-void
-load_counts(std::istream& inf,
- std::int32_t& tzh_ttisgmtcnt, std::int32_t& tzh_ttisstdcnt,
- std::int32_t& tzh_leapcnt, std::int32_t& tzh_timecnt,
- std::int32_t& tzh_typecnt, std::int32_t& tzh_charcnt)
-{
- // Read counts;
- inf.read(reinterpret_cast<char*>(&tzh_ttisgmtcnt), 4);
- maybe_reverse_bytes(tzh_ttisgmtcnt);
- inf.read(reinterpret_cast<char*>(&tzh_ttisstdcnt), 4);
- maybe_reverse_bytes(tzh_ttisstdcnt);
- inf.read(reinterpret_cast<char*>(&tzh_leapcnt), 4);
- maybe_reverse_bytes(tzh_leapcnt);
- inf.read(reinterpret_cast<char*>(&tzh_timecnt), 4);
- maybe_reverse_bytes(tzh_timecnt);
- inf.read(reinterpret_cast<char*>(&tzh_typecnt), 4);
- maybe_reverse_bytes(tzh_typecnt);
- inf.read(reinterpret_cast<char*>(&tzh_charcnt), 4);
- maybe_reverse_bytes(tzh_charcnt);
-}
-
-template <class TimeType>
-static
-std::vector<detail::transition>
-load_transitions(std::istream& inf, std::int32_t tzh_timecnt)
-{
- // Read transitions
- using namespace std::chrono;
- std::vector<detail::transition> transitions;
- transitions.reserve(static_cast<unsigned>(tzh_timecnt));
- for (std::int32_t i = 0; i < tzh_timecnt; ++i)
- {
- TimeType t;
- inf.read(reinterpret_cast<char*>(&t), sizeof(t));
- maybe_reverse_bytes(t);
- transitions.emplace_back(sys_seconds{seconds{t}});
- if (transitions.back().timepoint < min_seconds)
- transitions.back().timepoint = min_seconds;
- }
- return transitions;
-}
-
-static
-std::vector<std::uint8_t>
-load_indices(std::istream& inf, std::int32_t tzh_timecnt)
-{
- // Read indices
- std::vector<std::uint8_t> indices;
- indices.reserve(static_cast<unsigned>(tzh_timecnt));
- for (std::int32_t i = 0; i < tzh_timecnt; ++i)
- {
- std::uint8_t t;
- inf.read(reinterpret_cast<char*>(&t), sizeof(t));
- indices.emplace_back(t);
- }
- return indices;
-}
-
-static
-std::vector<ttinfo>
-load_ttinfo(std::istream& inf, std::int32_t tzh_typecnt)
-{
- // Read ttinfo
- std::vector<ttinfo> ttinfos;
- ttinfos.reserve(static_cast<unsigned>(tzh_typecnt));
- for (std::int32_t i = 0; i < tzh_typecnt; ++i)
- {
- ttinfo t;
- inf.read(reinterpret_cast<char*>(&t), 6);
- maybe_reverse_bytes(t.tt_gmtoff);
- ttinfos.emplace_back(t);
- }
- return ttinfos;
-}
-
-static
-std::string
-load_abbreviations(std::istream& inf, std::int32_t tzh_charcnt)
-{
- // Read abbreviations
- std::string abbrev;
- abbrev.resize(static_cast<unsigned>(tzh_charcnt), '\0');
- inf.read(&abbrev[0], tzh_charcnt);
- return abbrev;
-}
-
-#if !MISSING_LEAP_SECONDS
-
-template <class TimeType>
-static
-std::vector<leap_second>
-load_leaps(std::istream& inf, std::int32_t tzh_leapcnt)
-{
- // Read tzh_leapcnt pairs
- using namespace std::chrono;
- std::vector<leap_second> leap_seconds;
- leap_seconds.reserve(static_cast<std::size_t>(tzh_leapcnt));
- for (std::int32_t i = 0; i < tzh_leapcnt; ++i)
- {
- TimeType t0;
- std::int32_t t1;
- inf.read(reinterpret_cast<char*>(&t0), sizeof(t0));
- inf.read(reinterpret_cast<char*>(&t1), sizeof(t1));
- maybe_reverse_bytes(t0);
- maybe_reverse_bytes(t1);
- leap_seconds.emplace_back(sys_seconds{seconds{t0 - (t1-1)}},
- detail::undocumented{});
- }
- return leap_seconds;
-}
-
-template <class TimeType>
-static
-std::vector<leap_second>
-load_leap_data(std::istream& inf,
- std::int32_t tzh_leapcnt, std::int32_t tzh_timecnt,
- std::int32_t tzh_typecnt, std::int32_t tzh_charcnt)
-{
- inf.ignore(tzh_timecnt*static_cast<std::int32_t>(sizeof(TimeType)) + tzh_timecnt +
- tzh_typecnt*6 + tzh_charcnt);
- return load_leaps<TimeType>(inf, tzh_leapcnt);
-}
-
-static
-std::vector<leap_second>
-load_just_leaps(std::istream& inf)
-{
- // Read tzh_leapcnt pairs
- using namespace std::chrono;
- load_header(inf);
- auto v = load_version(inf);
- std::int32_t tzh_ttisgmtcnt, tzh_ttisstdcnt, tzh_leapcnt,
- tzh_timecnt, tzh_typecnt, tzh_charcnt;
- skip_reserve(inf);
- load_counts(inf, tzh_ttisgmtcnt, tzh_ttisstdcnt, tzh_leapcnt,
- tzh_timecnt, tzh_typecnt, tzh_charcnt);
- if (v == 0)
- return load_leap_data<int32_t>(inf, tzh_leapcnt, tzh_timecnt, tzh_typecnt,
- tzh_charcnt);
-#if !defined(NDEBUG)
- inf.ignore((4+1)*tzh_timecnt + 6*tzh_typecnt + tzh_charcnt + 8*tzh_leapcnt +
- tzh_ttisstdcnt + tzh_ttisgmtcnt);
- load_header(inf);
- auto v2 = load_version(inf);
- assert(v == v2);
- skip_reserve(inf);
-#else // defined(NDEBUG)
- inf.ignore((4+1)*tzh_timecnt + 6*tzh_typecnt + tzh_charcnt + 8*tzh_leapcnt +
- tzh_ttisstdcnt + tzh_ttisgmtcnt + (4+1+15));
-#endif // defined(NDEBUG)
- load_counts(inf, tzh_ttisgmtcnt, tzh_ttisstdcnt, tzh_leapcnt,
- tzh_timecnt, tzh_typecnt, tzh_charcnt);
- return load_leap_data<int64_t>(inf, tzh_leapcnt, tzh_timecnt, tzh_typecnt,
- tzh_charcnt);
-}
-
-#endif // !MISSING_LEAP_SECONDS
-
-template <class TimeType>
-void
-time_zone::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)
-{
- using namespace std::chrono;
- transitions_ = load_transitions<TimeType>(inf, tzh_timecnt);
- auto indices = load_indices(inf, tzh_timecnt);
- auto infos = load_ttinfo(inf, tzh_typecnt);
- auto abbrev = load_abbreviations(inf, tzh_charcnt);
-#if !MISSING_LEAP_SECONDS
- auto& leap_seconds = get_tzdb_list().front().leap_seconds;
- if (leap_seconds.empty() && tzh_leapcnt > 0)
- leap_seconds = load_leaps<TimeType>(inf, tzh_leapcnt);
-#endif
- ttinfos_.reserve(infos.size());
- for (auto& info : infos)
- {
- ttinfos_.push_back({seconds{info.tt_gmtoff},
- abbrev.c_str() + info.tt_abbrind,
- info.tt_isdst != 0});
- }
- auto i = 0u;
- if (transitions_.empty() || transitions_.front().timepoint != min_seconds)
- {
- transitions_.emplace(transitions_.begin(), min_seconds);
- auto tf = std::find_if(ttinfos_.begin(), ttinfos_.end(),
- [](const expanded_ttinfo& ti)
- {return ti.is_dst == 0;});
- if (tf == ttinfos_.end())
- tf = ttinfos_.begin();
- transitions_[i].info = &*tf;
- ++i;
- }
- for (auto j = 0u; i < transitions_.size(); ++i, ++j)
- transitions_[i].info = ttinfos_.data() + indices[j];
-}
-
-void
-time_zone::init_impl()
-{
- using namespace std;
- using namespace std::chrono;
- auto name = get_tz_dir() + ('/' + name_);
- std::ifstream inf(name);
- if (!inf.is_open())
- throw std::runtime_error{"Unable to open " + name};
- inf.exceptions(std::ios::failbit | std::ios::badbit);
- load_header(inf);
- auto v = load_version(inf);
- std::int32_t tzh_ttisgmtcnt, tzh_ttisstdcnt, tzh_leapcnt,
- tzh_timecnt, tzh_typecnt, tzh_charcnt;
- skip_reserve(inf);
- load_counts(inf, tzh_ttisgmtcnt, tzh_ttisstdcnt, tzh_leapcnt,
- tzh_timecnt, tzh_typecnt, tzh_charcnt);
- if (v == 0)
- {
- load_data<int32_t>(inf, tzh_leapcnt, tzh_timecnt, tzh_typecnt, tzh_charcnt);
- }
- else
- {
-#if !defined(NDEBUG)
- inf.ignore((4+1)*tzh_timecnt + 6*tzh_typecnt + tzh_charcnt + 8*tzh_leapcnt +
- tzh_ttisstdcnt + tzh_ttisgmtcnt);
- load_header(inf);
- auto v2 = load_version(inf);
- assert(v == v2);
- skip_reserve(inf);
-#else // defined(NDEBUG)
- inf.ignore((4+1)*tzh_timecnt + 6*tzh_typecnt + tzh_charcnt + 8*tzh_leapcnt +
- tzh_ttisstdcnt + tzh_ttisgmtcnt + (4+1+15));
-#endif // defined(NDEBUG)
- load_counts(inf, tzh_ttisgmtcnt, tzh_ttisstdcnt, tzh_leapcnt,
- tzh_timecnt, tzh_typecnt, tzh_charcnt);
- load_data<int64_t>(inf, tzh_leapcnt, tzh_timecnt, tzh_typecnt, tzh_charcnt);
- }
-#if !MISSING_LEAP_SECONDS
- if (tzh_leapcnt > 0)
- {
- auto& leap_seconds = get_tzdb_list().front().leap_seconds;
- auto itr = leap_seconds.begin();
- auto l = itr->date();
- seconds leap_count{0};
- for (auto t = std::upper_bound(transitions_.begin(), transitions_.end(), l,
- [](const sys_seconds& x, const transition& ct)
- {
- return x < ct.timepoint;
- });
- t != transitions_.end(); ++t)
- {
- while (t->timepoint >= l)
- {
- ++leap_count;
- if (++itr == leap_seconds.end())
- l = sys_days(max_year/max_day);
- else
- l = itr->date() + leap_count;
- }
- t->timepoint -= leap_count;
- }
- }
-#endif // !MISSING_LEAP_SECONDS
- auto b = transitions_.begin();
- auto i = transitions_.end();
- if (i != b)
- {
- for (--i; i != b; --i)
- {
- if (i->info->offset == i[-1].info->offset &&
- i->info->abbrev == i[-1].info->abbrev &&
- i->info->is_dst == i[-1].info->is_dst)
- i = transitions_.erase(i);
- }
- }
-}
-
-void
-time_zone::init() const
-{
- std::call_once(*adjusted_, [this]() {const_cast<time_zone*>(this)->init_impl();});
-}
-
-sys_info
-time_zone::load_sys_info(std::vector<detail::transition>::const_iterator i) const
-{
- using namespace std::chrono;
- assert(!transitions_.empty());
- assert(i != transitions_.begin());
- sys_info r;
- r.begin = i[-1].timepoint;
- r.end = i != transitions_.end() ? i->timepoint :
- sys_seconds(sys_days(year::max()/max_day));
- r.offset = i[-1].info->offset;
- r.save = i[-1].info->is_dst ? minutes{1} : minutes{0};
- r.abbrev = i[-1].info->abbrev;
- return r;
-}
-
-sys_info
-time_zone::get_info_impl(sys_seconds tp) const
-{
- using namespace std;
- init();
- return load_sys_info(upper_bound(transitions_.begin(), transitions_.end(), tp,
- [](const sys_seconds& x, const transition& t)
- {
- return x < t.timepoint;
- }));
-}
-
-local_info
-time_zone::get_info_impl(local_seconds tp) const
-{
- using namespace std::chrono;
- init();
- local_info i;
- i.result = local_info::unique;
- auto tr = upper_bound(transitions_.begin(), transitions_.end(), tp,
- [](const local_seconds& x, const transition& t)
- {
- return sys_seconds{x.time_since_epoch()} -
- t.info->offset < t.timepoint;
- });
- i.first = load_sys_info(tr);
- auto tps = sys_seconds{(tp - i.first.offset).time_since_epoch()};
- if (tps < i.first.begin + days{1} && tr != transitions_.begin())
- {
- i.second = load_sys_info(--tr);
- tps = sys_seconds{(tp - i.second.offset).time_since_epoch()};
- if (tps < i.second.end)
- {
- i.result = local_info::ambiguous;
- std::swap(i.first, i.second);
- }
- else
- {
- i.second = {};
- }
- }
- else if (tps >= i.first.end && tr != transitions_.end())
- {
- i.second = load_sys_info(++tr);
- tps = sys_seconds{(tp - i.second.offset).time_since_epoch()};
- if (tps < i.second.begin)
- i.result = local_info::nonexistent;
- else
- i.second = {};
- }
- return i;
-}
-
-std::ostream&
-operator<<(std::ostream& os, const time_zone& z)
-{
- using namespace std::chrono;
- z.init();
- os << z.name_ << '\n';
- os << "Initially: ";
- auto const& t = z.transitions_.front();
- if (t.info->offset >= seconds{0})
- os << '+';
- os << make_time(t.info->offset);
- if (t.info->is_dst > 0)
- os << " daylight ";
- else
- os << " standard ";
- os << t.info->abbrev << '\n';
- for (auto i = std::next(z.transitions_.cbegin()); i < z.transitions_.cend(); ++i)
- os << *i << '\n';
- return os;
-}
-
-#if !MISSING_LEAP_SECONDS
-
-leap_second::leap_second(const sys_seconds& s, detail::undocumented)
- : date_(s)
-{
-}
-
-#endif // !MISSING_LEAP_SECONDS
-
-#else // !USE_OS_TZDB
-
-time_zone::time_zone(const std::string& s, detail::undocumented)
- : adjusted_(new std::once_flag{})
-{
- try
- {
- using namespace date;
- std::istringstream in(s);
- in.exceptions(std::ios::failbit | std::ios::badbit);
- std::string word;
- in >> word >> name_;
- parse_info(in);
- }
- catch (...)
- {
- std::cerr << s << '\n';
- std::cerr << *this << '\n';
- zonelets_.pop_back();
- throw;
- }
-}
-
-sys_info
-time_zone::get_info_impl(sys_seconds tp) const
-{
- return get_info_impl(tp, static_cast<int>(tz::utc));
-}
-
-local_info
-time_zone::get_info_impl(local_seconds tp) const
-{
- using namespace std::chrono;
- local_info i{};
- i.first = get_info_impl(sys_seconds{tp.time_since_epoch()}, static_cast<int>(tz::local));
- auto tps = sys_seconds{(tp - i.first.offset).time_since_epoch()};
- if (tps < i.first.begin)
- {
- i.second = std::move(i.first);
- i.first = get_info_impl(i.second.begin - seconds{1}, static_cast<int>(tz::utc));
- i.result = local_info::nonexistent;
- }
- else if (i.first.end - tps <= days{1})
- {
- i.second = get_info_impl(i.first.end, static_cast<int>(tz::utc));
- tps = sys_seconds{(tp - i.second.offset).time_since_epoch()};
- if (tps >= i.second.begin)
- i.result = local_info::ambiguous;
- else
- i.second = {};
- }
- return i;
-}
-
-void
-time_zone::add(const std::string& s)
-{
- try
- {
- std::istringstream in(s);
- in.exceptions(std::ios::failbit | std::ios::badbit);
- ws(in);
- if (!in.eof() && in.peek() != '#')
- parse_info(in);
- }
- catch (...)
- {
- std::cerr << s << '\n';
- std::cerr << *this << '\n';
- zonelets_.pop_back();
- throw;
- }
-}
-
-void
-time_zone::parse_info(std::istream& in)
-{
- using namespace date;
- using namespace std::chrono;
- zonelets_.emplace_back();
- auto& zonelet = zonelets_.back();
- zonelet.gmtoff_ = parse_signed_time(in);
- in >> zonelet.u.rule_;
- if (zonelet.u.rule_ == "-")
- zonelet.u.rule_.clear();
- in >> zonelet.format_;
- if (!in.eof())
- ws(in);
- if (in.eof() || in.peek() == '#')
- {
- zonelet.until_year_ = year::max();
- zonelet.until_date_ = MonthDayTime(max_day, tz::utc);
- }
- else
- {
- int y;
- in >> y;
- zonelet.until_year_ = year{y};
- in >> zonelet.until_date_;
- zonelet.until_date_.canonicalize(zonelet.until_year_);
- }
- if ((zonelet.until_year_ < min_year) ||
- (zonelets_.size() > 1 && zonelets_.end()[-2].until_year_ > max_year))
- zonelets_.pop_back();
-}
-
-void
-time_zone::adjust_infos(const std::vector<Rule>& rules)
-{
- using namespace std::chrono;
- using namespace date;
- const zonelet* prev_zonelet = nullptr;
- for (auto& z : zonelets_)
- {
- std::pair<const Rule*, const Rule*> eqr{};
- std::istringstream in;
- in.exceptions(std::ios::failbit | std::ios::badbit);
- // Classify info as rule-based, has save, or neither
- if (!z.u.rule_.empty())
- {
- // Find out if this zonelet has a rule or a save
- eqr = std::equal_range(rules.data(), rules.data() + rules.size(), z.u.rule_);
- if (eqr.first == eqr.second)
- {
- // The rule doesn't exist. Assume this is a save
- try
- {
- using namespace std::chrono;
- using string = std::string;
- in.str(z.u.rule_);
- auto tmp = duration_cast<minutes>(parse_signed_time(in));
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
- z.u.rule_.~string();
- z.tag_ = zonelet::has_save;
- ::new(&z.u.save_) minutes(tmp);
-#else
- z.u.rule_.clear();
- z.tag_ = zonelet::has_save;
- z.u.save_ = tmp;
-#endif
- }
- catch (...)
- {
- std::cerr << name_ << " : " << z.u.rule_ << '\n';
- throw;
- }
- }
- }
- else
- {
- // This zone::zonelet has no rule and no save
- z.tag_ = zonelet::is_empty;
- }
-
- minutes final_save{0};
- if (z.tag_ == zonelet::has_save)
- {
- final_save = z.u.save_;
- }
- else if (z.tag_ == zonelet::has_rule)
- {
- z.last_rule_ = find_rule_for_zone(eqr, z.until_year_, z.gmtoff_,
- z.until_date_);
- if (z.last_rule_.first != nullptr)
- final_save = z.last_rule_.first->save();
- }
- z.until_utc_ = z.until_date_.to_sys(z.until_year_, z.gmtoff_, final_save);
- z.until_std_ = local_seconds{z.until_utc_.time_since_epoch()} + z.gmtoff_;
- z.until_loc_ = z.until_std_ + final_save;
-
- if (z.tag_ == zonelet::has_rule)
- {
- if (prev_zonelet != nullptr)
- {
- z.first_rule_ = find_rule_for_zone(eqr, prev_zonelet->until_utc_,
- prev_zonelet->until_std_,
- prev_zonelet->until_loc_);
- if (z.first_rule_.first != nullptr)
- {
- z.initial_save_ = z.first_rule_.first->save();
- z.initial_abbrev_ = z.first_rule_.first->abbrev();
- if (z.first_rule_ != z.last_rule_)
- {
- z.first_rule_ = find_next_rule(eqr.first, eqr.second,
- z.first_rule_.first,
- z.first_rule_.second);
- }
- else
- {
- z.first_rule_ = std::make_pair(nullptr, year::min());
- z.last_rule_ = std::make_pair(nullptr, year::max());
- }
- }
- }
- if (z.first_rule_.first == nullptr && z.last_rule_.first != nullptr)
- {
- z.first_rule_ = std::make_pair(eqr.first, eqr.first->starting_year());
- z.initial_abbrev_ = find_first_std_rule(eqr)->abbrev();
- }
- }
-
-#ifndef NDEBUG
- if (z.first_rule_.first == nullptr)
- {
- assert(z.first_rule_.second == year::min());
- assert(z.last_rule_.first == nullptr);
- assert(z.last_rule_.second == year::max());
- }
- else
- {
- assert(z.last_rule_.first != nullptr);
- }
-#endif
- prev_zonelet = &z;
- }
-}
-
-static
-std::string
-format_abbrev(std::string format, const std::string& variable, std::chrono::seconds off,
- std::chrono::minutes save)
-{
- using namespace std::chrono;
- auto k = format.find("%s");
- if (k != std::string::npos)
- {
- format.replace(k, 2, variable);
- }
- else
- {
- k = format.find('/');
- if (k != std::string::npos)
- {
- if (save == minutes{0})
- format.erase(k);
- else
- format.erase(0, k+1);
- }
- else
- {
- k = format.find("%z");
- if (k != std::string::npos)
- {
- std::string temp;
- if (off < seconds{0})
- {
- temp = '-';
- off = -off;
- }
- else
- temp = '+';
- auto h = date::floor<hours>(off);
- off -= h;
- if (h < hours{10})
- temp += '0';
- temp += std::to_string(h.count());
- if (off > seconds{0})
- {
- auto m = date::floor<minutes>(off);
- off -= m;
- if (m < minutes{10})
- temp += '0';
- temp += std::to_string(m.count());
- if (off > seconds{0})
- {
- if (off < seconds{10})
- temp += '0';
- temp += std::to_string(off.count());
- }
- }
- format.replace(k, 2, temp);
- }
- }
- }
- return format;
-}
-
-sys_info
-time_zone::get_info_impl(sys_seconds tp, int tz_int) const
-{
- using namespace std::chrono;
- using namespace date;
- tz timezone = static_cast<tz>(tz_int);
- assert(timezone != tz::standard);
- auto y = year_month_day(floor<days>(tp)).year();
- if (y < min_year || y > max_year)
- throw std::runtime_error("The year " + std::to_string(static_cast<int>(y)) +
- " is out of range:[" + std::to_string(static_cast<int>(min_year)) + ", "
- + std::to_string(static_cast<int>(max_year)) + "]");
- std::call_once(*adjusted_,
- [this]()
- {
- const_cast<time_zone*>(this)->adjust_infos(get_tzdb().rules);
- });
- auto i = std::upper_bound(zonelets_.begin(), zonelets_.end(), tp,
- [timezone](sys_seconds t, const zonelet& zl)
- {
- return timezone == tz::utc ? t < zl.until_utc_ :
- t < sys_seconds{zl.until_loc_.time_since_epoch()};
- });
-
- sys_info r{};
- if (i != zonelets_.end())
- {
- if (i->tag_ == zonelet::has_save)
- {
- if (i != zonelets_.begin())
- r.begin = i[-1].until_utc_;
- else
- r.begin = sys_days(year::min()/min_day);
- r.end = i->until_utc_;
- r.offset = i->gmtoff_ + i->u.save_;
- r.save = i->u.save_;
- }
- else if (i->u.rule_.empty())
- {
- if (i != zonelets_.begin())
- r.begin = i[-1].until_utc_;
- else
- r.begin = sys_days(year::min()/min_day);
- r.end = i->until_utc_;
- r.offset = i->gmtoff_;
- }
- else
- {
- r = find_rule(i->first_rule_, i->last_rule_, y, i->gmtoff_,
- MonthDayTime(local_seconds{tp.time_since_epoch()}, timezone),
- i->initial_save_, i->initial_abbrev_);
- r.offset = i->gmtoff_ + r.save;
- if (i != zonelets_.begin() && r.begin < i[-1].until_utc_)
- r.begin = i[-1].until_utc_;
- if (r.end > i->until_utc_)
- r.end = i->until_utc_;
- }
- r.abbrev = format_abbrev(i->format_, r.abbrev, r.offset, r.save);
- assert(r.begin < r.end);
- }
- return r;
-}
-
-std::ostream&
-operator<<(std::ostream& os, const time_zone& z)
-{
- using namespace date;
- using namespace std::chrono;
- detail::save_ostream<char> _(os);
- os.fill(' ');
- os.flags(std::ios::dec | std::ios::left);
- std::call_once(*z.adjusted_,
- [&z]()
- {
- const_cast<time_zone&>(z).adjust_infos(get_tzdb().rules);
- });
- os.width(35);
- os << z.name_;
- std::string indent;
- for (auto const& s : z.zonelets_)
- {
- os << indent;
- if (s.gmtoff_ >= seconds{0})
- os << ' ';
- os << make_time(s.gmtoff_) << " ";
- os.width(15);
- if (s.tag_ != zonelet::has_save)
- os << s.u.rule_;
- else
- {
- std::ostringstream tmp;
- tmp << make_time(s.u.save_);
- os << tmp.str();
- }
- os.width(8);
- os << s.format_ << " ";
- os << s.until_year_ << ' ' << s.until_date_;
- os << " " << s.until_utc_ << " UTC";
- os << " " << s.until_std_ << " STD";
- os << " " << s.until_loc_;
- os << " " << make_time(s.initial_save_);
- os << " " << s.initial_abbrev_;
- if (s.first_rule_.first != nullptr)
- os << " {" << *s.first_rule_.first << ", " << s.first_rule_.second << '}';
- else
- os << " {" << "nullptr" << ", " << s.first_rule_.second << '}';
- if (s.last_rule_.first != nullptr)
- os << " {" << *s.last_rule_.first << ", " << s.last_rule_.second << '}';
- else
- os << " {" << "nullptr" << ", " << s.last_rule_.second << '}';
- os << '\n';
- if (indent.empty())
- indent = std::string(35, ' ');
- }
- return os;
-}
-
-#endif // !USE_OS_TZDB
-
-#if !MISSING_LEAP_SECONDS
-
-std::ostream&
-operator<<(std::ostream& os, const leap_second& x)
-{
- using namespace date;
- return os << x.date_ << " +";
-}
-
-#endif // !MISSING_LEAP_SECONDS
-
-#if USE_OS_TZDB
-
-# ifdef __APPLE__
-static
-std::string
-get_version()
-{
- using namespace std;
- auto path = get_tz_dir() + string("/+VERSION");
- ifstream in{path};
- string version;
- in >> version;
- if (in.fail())
- throw std::runtime_error("Unable to get Timezone database version from " + path);
- return version;
-}
-# endif
-
-static
-std::unique_ptr<tzdb>
-init_tzdb()
-{
- std::unique_ptr<tzdb> db(new tzdb);
-
- //Iterate through folders
- std::queue<std::string> subfolders;
- subfolders.emplace(get_tz_dir());
- struct dirent* d;
- struct stat s;
- while (!subfolders.empty())
- {
- auto dirname = std::move(subfolders.front());
- subfolders.pop();
- auto dir = opendir(dirname.c_str());
- if (!dir)
- continue;
- while ((d = readdir(dir)) != nullptr)
- {
- // Ignore these files:
- if (d->d_name[0] == '.' || // curdir, prevdir, hidden
- memcmp(d->d_name, "posix", 5) == 0 || // starts with posix
- strcmp(d->d_name, "Factory") == 0 ||
- strcmp(d->d_name, "iso3166.tab") == 0 ||
- strcmp(d->d_name, "right") == 0 ||
- strcmp(d->d_name, "+VERSION") == 0 ||
- strcmp(d->d_name, "zone.tab") == 0 ||
- strcmp(d->d_name, "zone1970.tab") == 0 ||
- strcmp(d->d_name, "tzdata.zi") == 0 ||
- strcmp(d->d_name, "leapseconds") == 0 ||
- strcmp(d->d_name, "leap-seconds.list") == 0 )
- continue;
- auto subname = dirname + folder_delimiter + d->d_name;
- if(stat(subname.c_str(), &s) == 0)
- {
- if(S_ISDIR(s.st_mode))
- {
- if(!S_ISLNK(s.st_mode))
- {
- subfolders.push(subname);
- }
- }
- else
- {
- db->zones.emplace_back(subname.substr(get_tz_dir().size()+1),
- detail::undocumented{});
- }
- }
- }
- closedir(dir);
- }
- db->zones.shrink_to_fit();
- std::sort(db->zones.begin(), db->zones.end());
-# if !MISSING_LEAP_SECONDS
- std::ifstream in(get_tz_dir() + std::string(1, folder_delimiter) + "right/UTC",
- std::ios_base::binary);
- if (in)
- {
- in.exceptions(std::ios::failbit | std::ios::badbit);
- db->leap_seconds = load_just_leaps(in);
- }
- else
- {
- in.clear();
- in.open(get_tz_dir() + std::string(1, folder_delimiter) +
- "UTC", std::ios_base::binary);
- if (!in)
- throw std::runtime_error("Unable to extract leap second information");
- in.exceptions(std::ios::failbit | std::ios::badbit);
- db->leap_seconds = load_just_leaps(in);
- }
-# endif // !MISSING_LEAP_SECONDS
-# ifdef __APPLE__
- db->version = get_version();
-# endif
- return db;
-}
-
-#else // !USE_OS_TZDB
-
-// time_zone_link
-
-time_zone_link::time_zone_link(const std::string& s)
-{
- using namespace date;
- std::istringstream in(s);
- in.exceptions(std::ios::failbit | std::ios::badbit);
- std::string word;
- in >> word >> target_ >> name_;
-}
-
-std::ostream&
-operator<<(std::ostream& os, const time_zone_link& x)
-{
- using namespace date;
- detail::save_ostream<char> _(os);
- os.fill(' ');
- os.flags(std::ios::dec | std::ios::left);
- os.width(35);
- return os << x.name_ << " --> " << x.target_;
-}
-
-// leap_second
-
-leap_second::leap_second(const std::string& s, detail::undocumented)
-{
- using namespace date;
- std::istringstream in(s);
- in.exceptions(std::ios::failbit | std::ios::badbit);
- std::string word;
- int y;
- MonthDayTime date;
- in >> word >> y >> date;
- date_ = date.to_time_point(year(y));
-}
-
-static
-bool
-file_exists(const std::string& filename)
-{
-#ifdef _WIN32
- return ::_access(filename.c_str(), 0) == 0;
-#else
- return ::access(filename.c_str(), F_OK) == 0;
-#endif
-}
-
-#if HAS_REMOTE_API
-
-// CURL tools
-
-static
-int
-curl_global()
-{
- if (::curl_global_init(CURL_GLOBAL_DEFAULT) != 0)
- throw std::runtime_error("CURL global initialization failed");
- return 0;
-}
-
-namespace
-{
-
-struct curl_deleter
-{
- void operator()(CURL* p) const
- {
- ::curl_easy_cleanup(p);
- }
-};
-
-} // unnamed namespace
-
-static
-std::unique_ptr<CURL, curl_deleter>
-curl_init()
-{
- static const auto curl_is_now_initiailized = curl_global();
- (void)curl_is_now_initiailized;
- return std::unique_ptr<CURL, curl_deleter>{::curl_easy_init()};
-}
-
-static
-bool
-download_to_string(const std::string& url, std::string& str)
-{
- str.clear();
- auto curl = curl_init();
- if (!curl)
- return false;
- std::string version;
- curl_easy_setopt(curl.get(), CURLOPT_USERAGENT, "curl");
- curl_easy_setopt(curl.get(), CURLOPT_URL, url.c_str());
- curl_write_callback write_cb = [](char* contents, std::size_t size, std::size_t nmemb,
- void* userp) -> std::size_t
- {
- auto& userstr = *static_cast<std::string*>(userp);
- auto realsize = size * nmemb;
- userstr.append(contents, realsize);
- return realsize;
- };
- curl_easy_setopt(curl.get(), CURLOPT_WRITEFUNCTION, write_cb);
- curl_easy_setopt(curl.get(), CURLOPT_WRITEDATA, &str);
- curl_easy_setopt(curl.get(), CURLOPT_SSL_VERIFYPEER, false);
- auto res = curl_easy_perform(curl.get());
- return (res == CURLE_OK);
-}
-
-namespace
-{
- enum class download_file_options { binary, text };
-}
-
-static
-bool
-download_to_file(const std::string& url, const std::string& local_filename,
- download_file_options opts, char* error_buffer)
-{
- auto curl = curl_init();
- if (!curl)
- return false;
- curl_easy_setopt(curl.get(), CURLOPT_URL, url.c_str());
- curl_easy_setopt(curl.get(), CURLOPT_SSL_VERIFYPEER, false);
- if (error_buffer)
- curl_easy_setopt(curl.get(), CURLOPT_ERRORBUFFER, error_buffer);
- curl_write_callback write_cb = [](char* contents, std::size_t size, std::size_t nmemb,
- void* userp) -> std::size_t
- {
- auto& of = *static_cast<std::ofstream*>(userp);
- auto realsize = size * nmemb;
- of.write(contents, static_cast<std::streamsize>(realsize));
- return realsize;
- };
- curl_easy_setopt(curl.get(), CURLOPT_WRITEFUNCTION, write_cb);
- decltype(curl_easy_perform(curl.get())) res;
- {
- std::ofstream of(local_filename,
- opts == download_file_options::binary ?
- std::ofstream::out | std::ofstream::binary :
- std::ofstream::out);
- of.exceptions(std::ios::badbit);
- curl_easy_setopt(curl.get(), CURLOPT_WRITEDATA, &of);
- res = curl_easy_perform(curl.get());
- }
- return res == CURLE_OK;
-}
-
-std::string
-remote_version()
-{
- std::string version;
- std::string str;
- if (download_to_string("https://www.iana.org/time-zones", str))
- {
- CONSTDATA char db[] = "/time-zones/releases/tzdata";
- CONSTDATA auto db_size = sizeof(db) - 1;
- auto p = str.find(db, 0, db_size);
- const int ver_str_len = 5;
- if (p != std::string::npos && p + (db_size + ver_str_len) <= str.size())
- version = str.substr(p + db_size, ver_str_len);
- }
- return version;
-}
-
-
-// TODO! Using system() create a process and a console window.
-// This is useful to see what errors may occur but is slow and distracting.
-// Consider implementing this functionality more directly, such as
-// using _mkdir and CreateProcess etc.
-// But use the current means now as matches Unix implementations and while
-// in proof of concept / testing phase.
-// TODO! Use <filesystem> eventually.
-static
-bool
-remove_folder_and_subfolders(const std::string& folder)
-{
-# ifdef _WIN32
-# if USE_SHELL_API
- // Delete the folder contents by deleting the folder.
- std::string cmd = "rd /s /q \"";
- cmd += folder;
- cmd += '\"';
- return std::system(cmd.c_str()) == EXIT_SUCCESS;
-# else // !USE_SHELL_API
- // Create a buffer containing the path to delete. It must be terminated
- // by two nuls. Who designs these API's...
- std::vector<char> from;
- from.assign(folder.begin(), folder.end());
- from.push_back('\0');
- from.push_back('\0');
- SHFILEOPSTRUCT fo{}; // Zero initialize.
- fo.wFunc = FO_DELETE;
- fo.pFrom = from.data();
- fo.fFlags = FOF_NO_UI;
- int ret = SHFileOperation(&fo);
- if (ret == 0 && !fo.fAnyOperationsAborted)
- return true;
- return false;
-# endif // !USE_SHELL_API
-# else // !_WIN32
-# if USE_SHELL_API
- return std::system(("rm -R " + folder).c_str()) == EXIT_SUCCESS;
-# else // !USE_SHELL_API
- struct dir_deleter {
- dir_deleter() {}
- void operator()(DIR* d) const
- {
- if (d != nullptr)
- {
- int result = closedir(d);
- assert(result == 0);
- }
- }
- };
- using closedir_ptr = std::unique_ptr<DIR, dir_deleter>;
-
- std::string filename;
- struct stat statbuf;
- std::size_t folder_len = folder.length();
- struct dirent* p = nullptr;
-
- closedir_ptr d(opendir(folder.c_str()));
- bool r = d.get() != nullptr;
- while (r && (p=readdir(d.get())) != nullptr)
- {
- if (strcmp(p->d_name, ".") == 0 || strcmp(p->d_name, "..") == 0)
- continue;
-
- // + 2 for path delimiter and nul terminator.
- std::size_t buf_len = folder_len + strlen(p->d_name) + 2;
- filename.resize(buf_len);
- std::size_t path_len = static_cast<std::size_t>(
- snprintf(&filename[0], buf_len, "%s/%s", folder.c_str(), p->d_name));
- assert(path_len == buf_len - 1);
- filename.resize(path_len);
-
- if (stat(filename.c_str(), &statbuf) == 0)
- r = S_ISDIR(statbuf.st_mode)
- ? remove_folder_and_subfolders(filename)
- : unlink(filename.c_str()) == 0;
- }
- d.reset();
-
- if (r)
- r = rmdir(folder.c_str()) == 0;
-
- return r;
-# endif // !USE_SHELL_API
-# endif // !_WIN32
-}
-
-static
-bool
-make_directory(const std::string& folder)
-{
-# ifdef _WIN32
-# if USE_SHELL_API
- // Re-create the folder.
- std::string cmd = "mkdir \"";
- cmd += folder;
- cmd += '\"';
- return std::system(cmd.c_str()) == EXIT_SUCCESS;
-# else // !USE_SHELL_API
- return _mkdir(folder.c_str()) == 0;
-# endif // !USE_SHELL_API
-# else // !_WIN32
-# if USE_SHELL_API
- return std::system(("mkdir -p " + folder).c_str()) == EXIT_SUCCESS;
-# else // !USE_SHELL_API
- return mkdir(folder.c_str(), 0777) == 0;
-# endif // !USE_SHELL_API
-# endif // !_WIN32
-}
-
-static
-bool
-delete_file(const std::string& file)
-{
-# ifdef _WIN32
-# if USE_SHELL_API
- std::string cmd = "del \"";
- cmd += file;
- cmd += '\"';
- return std::system(cmd.c_str()) == 0;
-# else // !USE_SHELL_API
- return _unlink(file.c_str()) == 0;
-# endif // !USE_SHELL_API
-# else // !_WIN32
-# if USE_SHELL_API
- return std::system(("rm " + file).c_str()) == EXIT_SUCCESS;
-# else // !USE_SHELL_API
- return unlink(file.c_str()) == 0;
-# endif // !USE_SHELL_API
-# endif // !_WIN32
-}
-
-# ifdef _WIN32
-
-static
-bool
-move_file(const std::string& from, const std::string& to)
-{
-# if USE_SHELL_API
- std::string cmd = "move \"";
- cmd += from;
- cmd += "\" \"";
- cmd += to;
- cmd += '\"';
- return std::system(cmd.c_str()) == EXIT_SUCCESS;
-# else // !USE_SHELL_API
- return !!::MoveFile(from.c_str(), to.c_str());
-# endif // !USE_SHELL_API
-}
-
-// Usually something like "c:\Program Files".
-static
-std::string
-get_program_folder()
-{
- return get_known_folder(FOLDERID_ProgramFiles);
-}
-
-// Note folder can and usually does contain spaces.
-static
-std::string
-get_unzip_program()
-{
- std::string path;
-
- // 7-Zip appears to note its location in the registry.
- // If that doesn't work, fall through and take a guess, but it will likely be wrong.
- HKEY hKey = nullptr;
- if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\7-Zip", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
- {
- char value_buffer[MAX_PATH + 1]; // fyi 260 at time of writing.
- // in/out parameter. Documentation say that size is a count of bytes not chars.
- DWORD size = sizeof(value_buffer) - sizeof(value_buffer[0]);
- DWORD tzi_type = REG_SZ;
- // Testing shows Path key value is "C:\Program Files\7-Zip\" i.e. always with trailing \.
- bool got_value = (RegQueryValueExA(hKey, "Path", nullptr, &tzi_type,
- reinterpret_cast<LPBYTE>(value_buffer), &size) == ERROR_SUCCESS);
- RegCloseKey(hKey); // Close now incase of throw later.
- if (got_value)
- {
- // Function does not guarantee to null terminate.
- value_buffer[size / sizeof(value_buffer[0])] = '\0';
- path = value_buffer;
- if (!path.empty())
- {
- path += "7z.exe";
- return path;
- }
- }
- }
- path += get_program_folder();
- path += folder_delimiter;
- path += "7-Zip\\7z.exe";
- return path;
-}
-
-# if !USE_SHELL_API
-static
-int
-run_program(const std::string& command)
-{
- STARTUPINFO si{};
- si.cb = sizeof(si);
- PROCESS_INFORMATION pi{};
-
- // Allegedly CreateProcess overwrites the command line. Ugh.
- std::string mutable_command(command);
- if (CreateProcess(nullptr, &mutable_command[0],
- nullptr, nullptr, FALSE, CREATE_NO_WINDOW, nullptr, nullptr, &si, &pi))
- {
- WaitForSingleObject(pi.hProcess, INFINITE);
- DWORD exit_code;
- bool got_exit_code = !!GetExitCodeProcess(pi.hProcess, &exit_code);
- CloseHandle(pi.hProcess);
- CloseHandle(pi.hThread);
- // Not 100% sure about this still active thing is correct,
- // but I'm going with it because I *think* WaitForSingleObject might
- // return in some cases without INFINITE-ly waiting.
- // But why/wouldn't GetExitCodeProcess return false in that case?
- if (got_exit_code && exit_code != STILL_ACTIVE)
- return static_cast<int>(exit_code);
- }
- return EXIT_FAILURE;
-}
-# endif // !USE_SHELL_API
-
-static
-std::string
-get_download_tar_file(const std::string& version)
-{
- auto file = get_install();
- file += folder_delimiter;
- file += "tzdata";
- file += version;
- file += ".tar";
- return file;
-}
-
-static
-bool
-extract_gz_file(const std::string& version, const std::string& gz_file,
- const std::string& dest_folder)
-{
- auto unzip_prog = get_unzip_program();
- bool unzip_result = false;
- // Use the unzip program to extract the tar file from the archive.
-
- // Aim to create a string like:
- // "C:\Program Files\7-Zip\7z.exe" x "C:\Users\SomeUser\Downloads\tzdata2016d.tar.gz"
- // -o"C:\Users\SomeUser\Downloads\tzdata"
- std::string cmd;
- cmd = '\"';
- cmd += unzip_prog;
- cmd += "\" x \"";
- cmd += gz_file;
- cmd += "\" -o\"";
- cmd += dest_folder;
- cmd += '\"';
-
-# if USE_SHELL_API
- // When using shelling out with std::system() extra quotes are required around the
- // whole command. It's weird but necessary it seems, see:
- // http://stackoverflow.com/q/27975969/576911
-
- cmd = "\"" + cmd + "\"";
- if (std::system(cmd.c_str()) == EXIT_SUCCESS)
- unzip_result = true;
-# else // !USE_SHELL_API
- if (run_program(cmd) == EXIT_SUCCESS)
- unzip_result = true;
-# endif // !USE_SHELL_API
- if (unzip_result)
- delete_file(gz_file);
-
- // Use the unzip program extract the data from the tar file that was
- // just extracted from the archive.
- auto tar_file = get_download_tar_file(version);
- cmd = '\"';
- cmd += unzip_prog;
- cmd += "\" x \"";
- cmd += tar_file;
- cmd += "\" -o\"";
- cmd += get_install();
- cmd += '\"';
-# if USE_SHELL_API
- cmd = "\"" + cmd + "\"";
- if (std::system(cmd.c_str()) == EXIT_SUCCESS)
- unzip_result = true;
-# else // !USE_SHELL_API
- if (run_program(cmd) == EXIT_SUCCESS)
- unzip_result = true;
-# endif // !USE_SHELL_API
-
- if (unzip_result)
- delete_file(tar_file);
-
- return unzip_result;
-}
-
-static
-std::string
-get_download_mapping_file(const std::string& version)
-{
- auto file = get_install() + version + "windowsZones.xml";
- return file;
-}
-
-# else // !_WIN32
-
-# if !USE_SHELL_API
-static
-int
-run_program(const char* prog, const char*const args[])
-{
- pid_t pid = fork();
- if (pid == -1) // Child failed to start.
- return EXIT_FAILURE;
-
- if (pid != 0)
- {
- // We are in the parent. Child started. Wait for it.
- pid_t ret;
- int status;
- while ((ret = waitpid(pid, &status, 0)) == -1)
- {
- if (errno != EINTR)
- break;
- }
- if (ret != -1)
- {
- if (WIFEXITED(status))
- return WEXITSTATUS(status);
- }
- printf("Child issues!\n");
-
- return EXIT_FAILURE; // Not sure what status of child is.
- }
- else // We are in the child process. Start the program the parent wants to run.
- {
-
- if (execv(prog, const_cast<char**>(args)) == -1) // Does not return.
- {
- perror("unreachable 0\n");
- _Exit(127);
- }
- printf("unreachable 2\n");
- }
- printf("unreachable 2\n");
- // Unreachable.
- assert(false);
- exit(EXIT_FAILURE);
- return EXIT_FAILURE;
-}
-# endif // !USE_SHELL_API
-
-static
-bool
-extract_gz_file(const std::string&, const std::string& gz_file, const std::string&)
-{
-# if USE_SHELL_API
- bool unzipped = std::system(("tar -xzf " + gz_file + " -C " + get_install()).c_str()) == EXIT_SUCCESS;
-# else // !USE_SHELL_API
- const char prog[] = {"/usr/bin/tar"};
- const char*const args[] =
- {
- prog, "-xzf", gz_file.c_str(), "-C", get_install().c_str(), nullptr
- };
- bool unzipped = (run_program(prog, args) == EXIT_SUCCESS);
-# endif // !USE_SHELL_API
- if (unzipped)
- {
- delete_file(gz_file);
- return true;
- }
- return false;
-}
-
-# endif // !_WIN32
-
-bool
-remote_download(const std::string& version, char* error_buffer)
-{
- assert(!version.empty());
-
-# ifdef _WIN32
- // Download folder should be always available for Windows
-# else // !_WIN32
- // Create download folder if it does not exist on UNIX system
- auto download_folder = get_install();
- if (!file_exists(download_folder))
- {
- if (!make_directory(download_folder))
- return false;
- }
-# endif // _WIN32
-
- auto url = "https://data.iana.org/time-zones/releases/tzdata" + version +
- ".tar.gz";
- bool result = download_to_file(url, get_download_gz_file(version),
- download_file_options::binary, error_buffer);
-# ifdef _WIN32
- if (result)
- {
- auto mapping_file = get_download_mapping_file(version);
- result = download_to_file(
- "https://raw.githubusercontent.com/unicode-org/cldr/master/"
- "common/supplemental/windowsZones.xml",
- mapping_file, download_file_options::text, error_buffer);
- }
-# endif // _WIN32
- return result;
-}
-
-bool
-remote_install(const std::string& version)
-{
- auto success = false;
- assert(!version.empty());
-
- std::string install = get_install();
- auto gz_file = get_download_gz_file(version);
- if (file_exists(gz_file))
- {
- if (file_exists(install))
- remove_folder_and_subfolders(install);
- if (make_directory(install))
- {
- if (extract_gz_file(version, gz_file, install))
- success = true;
-# ifdef _WIN32
- auto mapping_file_source = get_download_mapping_file(version);
- auto mapping_file_dest = get_install();
- mapping_file_dest += folder_delimiter;
- mapping_file_dest += "windowsZones.xml";
- if (!move_file(mapping_file_source, mapping_file_dest))
- success = false;
-# endif // _WIN32
- }
- }
- return success;
-}
-
-#endif // HAS_REMOTE_API
-
-static
-std::string
-get_version(const std::string& path)
-{
- std::string version;
- std::ifstream infile(path + "version");
- if (infile.is_open())
- {
- infile >> version;
- if (!infile.fail())
- return version;
- }
- else
- {
- infile.open(path + "NEWS");
- while (infile)
- {
- infile >> version;
- if (version == "Release")
- {
- infile >> version;
- return version;
- }
- }
- }
- throw std::runtime_error("Unable to get Timezone database version from " + path);
-}
-
-static
-std::unique_ptr<tzdb>
-init_tzdb()
-{
- using namespace date;
- const std::string install = get_install();
- const std::string path = install + folder_delimiter;
- std::string line;
- bool continue_zone = false;
- std::unique_ptr<tzdb> db(new tzdb);
-
-#if AUTO_DOWNLOAD
- if (!file_exists(install))
- {
- auto rv = remote_version();
- if (!rv.empty() && remote_download(rv))
- {
- if (!remote_install(rv))
- {
- std::string msg = "Timezone database version \"";
- msg += rv;
- msg += "\" did not install correctly to \"";
- msg += install;
- msg += "\"";
- throw std::runtime_error(msg);
- }
- }
- if (!file_exists(install))
- {
- std::string msg = "Timezone database not found at \"";
- msg += install;
- msg += "\"";
- throw std::runtime_error(msg);
- }
- db->version = get_version(path);
- }
- else
- {
- db->version = get_version(path);
- auto rv = remote_version();
- if (!rv.empty() && db->version != rv)
- {
- if (remote_download(rv))
- {
- remote_install(rv);
- db->version = get_version(path);
- }
- }
- }
-#else // !AUTO_DOWNLOAD
- if (!file_exists(install))
- {
- std::string msg = "Timezone database not found at \"";
- msg += install;
- msg += "\"";
- throw std::runtime_error(msg);
- }
- db->version = get_version(path);
-#endif // !AUTO_DOWNLOAD
-
- CONSTDATA char*const files[] =
- {
- "africa", "antarctica", "asia", "australasia", "backward", "etcetera", "europe",
- "pacificnew", "northamerica", "southamerica", "systemv", "leapseconds"
- };
-
- for (const auto& filename : files)
- {
- std::ifstream infile(path + filename);
- while (infile)
- {
- std::getline(infile, line);
- if (!line.empty() && line[0] != '#')
- {
- std::istringstream in(line);
- std::string word;
- in >> word;
- if (word == "Rule")
- {
- db->rules.push_back(Rule(line));
- continue_zone = false;
- }
- else if (word == "Link")
- {
- db->links.push_back(time_zone_link(line));
- continue_zone = false;
- }
- else if (word == "Leap")
- {
- db->leap_seconds.push_back(leap_second(line, detail::undocumented{}));
- continue_zone = false;
- }
- else if (word == "Zone")
- {
- db->zones.push_back(time_zone(line, detail::undocumented{}));
- continue_zone = true;
- }
- else if (line[0] == '\t' && continue_zone)
- {
- db->zones.back().add(line);
- }
- else
- {
- std::cerr << line << '\n';
- }
- }
- }
- }
- std::sort(db->rules.begin(), db->rules.end());
- Rule::split_overlaps(db->rules);
- std::sort(db->zones.begin(), db->zones.end());
- db->zones.shrink_to_fit();
- std::sort(db->links.begin(), db->links.end());
- db->links.shrink_to_fit();
- std::sort(db->leap_seconds.begin(), db->leap_seconds.end());
- db->leap_seconds.shrink_to_fit();
-
-#ifdef _WIN32
- std::string mapping_file = get_install() + folder_delimiter + "windowsZones.xml";
- db->mappings = load_timezone_mappings_from_xml_file(mapping_file);
- sort_zone_mappings(db->mappings);
-#endif // _WIN32
-
- return db;
-}
-
-const tzdb&
-reload_tzdb()
-{
-#if AUTO_DOWNLOAD
- auto const& v = get_tzdb_list().front().version;
- if (!v.empty() && v == remote_version())
- return get_tzdb_list().front();
-#endif // AUTO_DOWNLOAD
- tzdb_list::undocumented_helper::push_front(get_tzdb_list(), init_tzdb().release());
- return get_tzdb_list().front();
-}
-
-#endif // !USE_OS_TZDB
-
-const tzdb&
-get_tzdb()
-{
- return get_tzdb_list().front();
-}
-
-const time_zone*
-#if HAS_STRING_VIEW
-tzdb::locate_zone(std::string_view tz_name) const
-#else
-tzdb::locate_zone(const std::string& tz_name) const
-#endif
-{
- 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)
-#endif
- {
- return z.name() < nm;
- });
- if (zi == zones.end() || zi->name() != tz_name)
- {
-#if !USE_OS_TZDB
- auto li = std::lower_bound(links.begin(), links.end(), tz_name,
-#if HAS_STRING_VIEW
- [](const time_zone_link& z, const std::string_view& nm)
-#else
- [](const time_zone_link& z, const std::string& nm)
-#endif
- {
- return z.name() < nm;
- });
- if (li != links.end() && li->name() == tz_name)
- {
- zi = std::lower_bound(zones.begin(), zones.end(), li->target(),
- [](const time_zone& z, const std::string& nm)
- {
- return z.name() < nm;
- });
- if (zi != zones.end() && zi->name() == li->target())
- return &*zi;
- }
-#endif // !USE_OS_TZDB
- throw std::runtime_error(std::string(tz_name) + " not found in timezone database");
- }
- return &*zi;
-}
-
-const time_zone*
-#if HAS_STRING_VIEW
-locate_zone(std::string_view tz_name)
-#else
-locate_zone(const std::string& tz_name)
-#endif
-{
- return get_tzdb().locate_zone(tz_name);
-}
-
-#if USE_OS_TZDB
-
-std::ostream&
-operator<<(std::ostream& os, const tzdb& db)
-{
- os << "Version: " << db.version << "\n\n";
- for (const auto& x : db.zones)
- os << x << '\n';
-#if !MISSING_LEAP_SECONDS
- os << '\n';
- for (const auto& x : db.leap_seconds)
- os << x << '\n';
-#endif // !MISSING_LEAP_SECONDS
- return os;
-}
-
-#else // !USE_OS_TZDB
-
-std::ostream&
-operator<<(std::ostream& os, const tzdb& db)
-{
- os << "Version: " << db.version << '\n';
- std::string title("--------------------------------------------"
- "--------------------------------------------\n"
- "Name ""Start Y ""End Y "
- "Beginning ""Offset "
- "Designator\n"
- "--------------------------------------------"
- "--------------------------------------------\n");
- int count = 0;
- for (const auto& x : db.rules)
- {
- if (count++ % 50 == 0)
- os << title;
- os << x << '\n';
- }
- os << '\n';
- title = std::string("---------------------------------------------------------"
- "--------------------------------------------------------\n"
- "Name ""Offset "
- "Rule ""Abrev ""Until\n"
- "---------------------------------------------------------"
- "--------------------------------------------------------\n");
- count = 0;
- for (const auto& x : db.zones)
- {
- if (count++ % 10 == 0)
- os << title;
- os << x << '\n';
- }
- os << '\n';
- title = std::string("---------------------------------------------------------"
- "--------------------------------------------------------\n"
- "Alias ""To\n"
- "---------------------------------------------------------"
- "--------------------------------------------------------\n");
- count = 0;
- for (const auto& x : db.links)
- {
- if (count++ % 45 == 0)
- os << title;
- os << x << '\n';
- }
- os << '\n';
- title = std::string("---------------------------------------------------------"
- "--------------------------------------------------------\n"
- "Leap second on\n"
- "---------------------------------------------------------"
- "--------------------------------------------------------\n");
- os << title;
- for (const auto& x : db.leap_seconds)
- os << x << '\n';
- return os;
-}
-
-#endif // !USE_OS_TZDB
-
-// -----------------------
-
-#ifdef _WIN32
-
-static
-std::string
-getTimeZoneKeyName()
-{
- DYNAMIC_TIME_ZONE_INFORMATION dtzi{};
- auto result = GetDynamicTimeZoneInformation(&dtzi);
- if (result == TIME_ZONE_ID_INVALID)
- throw std::runtime_error("current_zone(): GetDynamicTimeZoneInformation()"
- " reported TIME_ZONE_ID_INVALID.");
- auto wlen = wcslen(dtzi.TimeZoneKeyName);
- char buf[128] = {};
- assert(sizeof(buf) >= wlen+1);
- wcstombs(buf, dtzi.TimeZoneKeyName, wlen);
- if (strcmp(buf, "Coordinated Universal Time") == 0)
- return "UTC";
- return buf;
-}
-
-const time_zone*
-tzdb::current_zone() const
-{
- std::string win_tzid = getTimeZoneKeyName();
- std::string standard_tzid;
- if (!native_to_standard_timezone_name(win_tzid, standard_tzid))
- {
- std::string msg;
- msg = "current_zone() failed: A mapping from the Windows Time Zone id \"";
- msg += win_tzid;
- msg += "\" was not found in the time zone mapping database.";
- throw std::runtime_error(msg);
- }
- return locate_zone(standard_tzid);
-}
-
-#else // !_WIN32
-
-const time_zone*
-tzdb::current_zone() const
-{
- // On some OS's a file called /etc/localtime may
- // exist and it may be either a real file
- // containing time zone details or a symlink to such a file.
- // On MacOS and BSD Unix if this file is a symlink it
- // might resolve to a path like this:
- // "/usr/share/zoneinfo/America/Los_Angeles"
- // If it does, we try to determine the current
- // timezone from the remainder of the path by removing the prefix
- // and hoping the rest resolves to a valid timezone.
- // It may not always work though. If it doesn't then an
- // exception will be thrown by local_timezone.
- // The path may also take a relative form:
- // "../usr/share/zoneinfo/America/Los_Angeles".
- {
- struct stat sb;
- CONSTDATA auto timezone = "/etc/localtime";
- if (lstat(timezone, &sb) == 0 && S_ISLNK(sb.st_mode) && sb.st_size > 0) {
- using namespace std;
- char rp[PATH_MAX+1] = {};
- if (realpath(timezone, rp) == nullptr)
- throw system_error(errno, system_category(), "realpath() failed");
-#if HAS_STRING_VIEW
- string_view result = rp;
- CONSTDATA string_view zoneinfo = "zoneinfo";
- size_t pos = result.rfind(zoneinfo);
- if (pos == result.npos)
- throw runtime_error(
- "current_zone() failed to find \"zoneinfo\" in " + string(result));
- pos = result.find('/', pos);
- result.remove_prefix(pos + 1);
-#else
- string result = rp;
- CONSTDATA char zoneinfo[] = "zoneinfo";
- size_t pos = result.rfind(zoneinfo);
- if (pos == result.npos)
- throw runtime_error(
- "current_zone() failed to find \"zoneinfo\" in " + result);
- pos = result.find('/', pos);
- result.erase(0, pos + 1);
-#endif
- return locate_zone(result);
- }
- }
- // On embedded systems e.g. buildroot with uclibc the timezone is linked
- // into /etc/TZ which is a symlink to path like this:
- // "/usr/share/zoneinfo/uclibc/America/Los_Angeles"
- // If it does, we try to determine the current
- // timezone from the remainder of the path by removing the prefix
- // and hoping the rest resolves to valid timezone.
- // It may not always work though. If it doesn't then an
- // exception will be thrown by local_timezone.
- // The path may also take a relative form:
- // "../usr/share/zoneinfo/uclibc/America/Los_Angeles".
- {
- struct stat sb;
- CONSTDATA auto timezone = "/etc/TZ";
- if (lstat(timezone, &sb) == 0 && S_ISLNK(sb.st_mode) && sb.st_size > 0) {
- using namespace std;
- string result;
- char rp[PATH_MAX+1] = {};
- if (readlink(timezone, rp, sizeof(rp)-1) > 0)
- result = string(rp);
- else
- throw system_error(errno, system_category(), "readlink() failed");
-
- const size_t pos = result.find(get_tz_dir());
- if (pos != result.npos)
- result.erase(0, get_tz_dir().size() + 1 + pos);
- return locate_zone(result);
- }
- }
- {
- // On some versions of some linux distro's (e.g. Ubuntu),
- // the current timezone might be in the first line of
- // the /etc/timezone file.
- std::ifstream timezone_file("/etc/timezone");
- if (timezone_file.is_open())
- {
- std::string result;
- std::getline(timezone_file, result);
- if (!result.empty())
- return locate_zone(result);
- }
- // Fall through to try other means.
- }
- {
- // On some versions of some bsd distro's (e.g. FreeBSD),
- // the current timezone might be in the first line of
- // the /var/db/zoneinfo file.
- std::ifstream timezone_file("/var/db/zoneinfo");
- if (timezone_file.is_open())
- {
- std::string result;
- std::getline(timezone_file, result);
- if (!result.empty())
- return locate_zone(result);
- }
- // Fall through to try other means.
- }
- {
- // On some versions of some bsd distro's (e.g. iOS),
- // it is not possible to use file based approach,
- // we switch to system API, calling functions in
- // CoreFoundation framework.
-#if TARGET_OS_IPHONE
- std::string result = date::iOSUtils::get_current_timezone();
- if (!result.empty())
- return locate_zone(result);
-#endif
- // Fall through to try other means.
- }
- {
- // On some versions of some linux distro's (e.g. Red Hat),
- // the current timezone might be in the first line of
- // the /etc/sysconfig/clock file as:
- // ZONE="US/Eastern"
- std::ifstream timezone_file("/etc/sysconfig/clock");
- std::string result;
- while (timezone_file)
- {
- std::getline(timezone_file, result);
- auto p = result.find("ZONE=\"");
- if (p != std::string::npos)
- {
- result.erase(p, p+6);
- result.erase(result.rfind('"'));
- return locate_zone(result);
- }
- }
- // Fall through to try other means.
- }
- throw std::runtime_error("Could not get current timezone");
-}
-
-#endif // !_WIN32
-
-const time_zone*
-current_zone()
-{
- return get_tzdb().current_zone();
-}
-
-} // namespace date
-
-#if defined(__GNUC__) && __GNUC__ < 5
-# pragma GCC diagnostic pop
-#endif