diff options
Diffstat (limited to 'vendor/toml++/impl/date_time.hpp')
| -rw-r--r-- | vendor/toml++/impl/date_time.hpp | 868 |
1 files changed, 409 insertions, 459 deletions
diff --git a/vendor/toml++/impl/date_time.hpp b/vendor/toml++/impl/date_time.hpp index 8957ad3..92acfbf 100644 --- a/vendor/toml++/impl/date_time.hpp +++ b/vendor/toml++/impl/date_time.hpp @@ -1,467 +1,417 @@ -//# This file is a part of toml++ and is subject to the the terms of the MIT license. -//# Copyright (c) Mark Gillard <mark.gillard@outlook.com.au> -//# See https://github.com/marzer/tomlplusplus/blob/master/LICENSE for the full license text. -// SPDX-License-Identifier: MIT +// # This file is a part of toml++ and is subject to the the terms of the MIT license. +// # Copyright (c) Mark Gillard <mark.gillard@outlook.com.au> +// # See https://github.com/marzer/tomlplusplus/blob/master/LICENSE for the full license text. +// SPDX-License-Identifier: MIT #pragma once #include "forward_declarations.hpp" -#include "print_to_stream.hpp" #include "header_start.hpp" +#include "print_to_stream.hpp" -TOML_NAMESPACE_START -{ - /// \brief A local date. - struct TOML_TRIVIAL_ABI date - { - /// \brief The year component. - uint16_t year; - - /// \brief The month component, from 1 - 12. - uint8_t month; - - /// \brief The day component, from 1 - 31. - uint8_t day; - - /// \brief Default constructor. Does not initialize the members. - TOML_NODISCARD_CTOR - date() noexcept = default; - - /// \brief Constructs a date from individual date component values. - TOML_CONSTRAINED_TEMPLATE((impl::all_integral<Y, M, D>), typename Y, typename M, typename D) - TOML_NODISCARD_CTOR - constexpr date(Y y, M m, D d) noexcept // - : year{ static_cast<uint16_t>(y) }, - month{ static_cast<uint8_t>(m) }, - day{ static_cast<uint8_t>(d) } - {} - - /// \brief Equality operator. - TOML_PURE_GETTER - friend constexpr bool operator==(const date& lhs, const date& rhs) noexcept - { - return lhs.year == rhs.year // - && lhs.month == rhs.month // - && lhs.day == rhs.day; - } - - /// \brief Inequality operator. - TOML_PURE_INLINE_GETTER - friend constexpr bool operator!=(const date& lhs, const date& rhs) noexcept - { - return !(lhs == rhs); - } - - private: - /// \cond - - TOML_PURE_GETTER - static constexpr uint32_t pack(const date& d) noexcept - { - return (static_cast<uint32_t>(d.year) << 16) | (static_cast<uint32_t>(d.month) << 8) - | static_cast<uint32_t>(d.day); - } - - /// \endcond - - public: - /// \brief Less-than operator. - TOML_PURE_GETTER - friend constexpr bool operator<(const date& lhs, const date& rhs) noexcept - { - return pack(lhs) < pack(rhs); - } - - /// \brief Less-than-or-equal-to operator. - TOML_PURE_GETTER - friend constexpr bool operator<=(const date& lhs, const date& rhs) noexcept - { - return pack(lhs) <= pack(rhs); - } - - /// \brief Greater-than operator. - TOML_PURE_GETTER - friend constexpr bool operator>(const date& lhs, const date& rhs) noexcept - { - return pack(lhs) > pack(rhs); - } - - /// \brief Greater-than-or-equal-to operator. - TOML_PURE_GETTER - friend constexpr bool operator>=(const date& lhs, const date& rhs) noexcept - { - return pack(lhs) >= pack(rhs); - } - - /// \brief Prints a date out to a stream as `YYYY-MM-DD` (per RFC 3339). - /// - /// \detail \cpp - /// std::cout << toml::date{ 1987, 3, 16 } << "\n"; - /// \ecpp - /// - /// \out - /// 1987-03-16 - /// \eout - friend std::ostream& operator<<(std::ostream& lhs, const date& rhs) - { - impl::print_to_stream(lhs, rhs); - return lhs; - } - }; - - /// \brief A local time-of-day. - struct TOML_TRIVIAL_ABI time - { - /// \brief The hour component, from 0 - 23. - uint8_t hour; - - /// \brief The minute component, from 0 - 59. - uint8_t minute; - - /// \brief The second component, from 0 - 59. - uint8_t second; - - /// \brief The fractional nanoseconds component, from 0 - 999999999. - uint32_t nanosecond; - - /// \brief Default constructor. Does not initialize the members. - TOML_NODISCARD_CTOR - time() noexcept = default; - - /// \brief Constructs a time from individual time component values. - TOML_CONSTRAINED_TEMPLATE((impl::all_integral<H, M, S, NS>), - typename H, - typename M, - typename S = uint8_t, - typename NS = uint32_t) - TOML_NODISCARD_CTOR - constexpr time(H h, M m, S s = S{}, NS ns = NS{}) noexcept // - : hour{ static_cast<uint8_t>(h) }, - minute{ static_cast<uint8_t>(m) }, - second{ static_cast<uint8_t>(s) }, - nanosecond{ static_cast<uint32_t>(ns) } - {} - - /// \brief Equality operator. - TOML_PURE_GETTER - friend constexpr bool operator==(const time& lhs, const time& rhs) noexcept - { - return lhs.hour == rhs.hour // - && lhs.minute == rhs.minute // - && lhs.second == rhs.second // - && lhs.nanosecond == rhs.nanosecond; - } - - /// \brief Inequality operator. - TOML_PURE_INLINE_GETTER - friend constexpr bool operator!=(const time& lhs, const time& rhs) noexcept - { - return !(lhs == rhs); - } - - private: - /// \cond - - TOML_PURE_GETTER - static constexpr uint64_t pack(const time& t) noexcept - { - return static_cast<uint64_t>(t.hour) << 48 | static_cast<uint64_t>(t.minute) << 40 - | static_cast<uint64_t>(t.second) << 32 | static_cast<uint64_t>(t.nanosecond); - } - - /// \endcond - - public: - /// \brief Less-than operator. - TOML_PURE_GETTER - friend constexpr bool operator<(const time& lhs, const time& rhs) noexcept - { - return pack(lhs) < pack(rhs); - } - - /// \brief Less-than-or-equal-to operator. - TOML_PURE_GETTER - friend constexpr bool operator<=(const time& lhs, const time& rhs) noexcept - { - return pack(lhs) <= pack(rhs); - } - - /// \brief Greater-than operator. - TOML_PURE_GETTER - friend constexpr bool operator>(const time& lhs, const time& rhs) noexcept - { - return pack(lhs) > pack(rhs); - } - - /// \brief Greater-than-or-equal-to operator. - TOML_PURE_GETTER - friend constexpr bool operator>=(const time& lhs, const time& rhs) noexcept - { - return pack(lhs) >= pack(rhs); - } - - /// \brief Prints a time out to a stream as `HH:MM:SS.FFFFFF` (per RFC 3339). - /// \detail \cpp - /// std::cout << toml::time{ 10, 20, 34 } << "\n"; - /// std::cout << toml::time{ 10, 20, 34, 500000000 } << "\n"; - /// \ecpp - /// - /// \out - /// 10:20:34 - /// 10:20:34.5 - /// \eout - friend std::ostream& operator<<(std::ostream& lhs, const time& rhs) - { - impl::print_to_stream(lhs, rhs); - return lhs; - } - }; - - /// \brief A timezone offset. - struct TOML_TRIVIAL_ABI time_offset - { - /// \brief Offset from UTC+0, in minutes. - int16_t minutes; - - /// \brief Default constructor. Does not initialize the members. - TOML_NODISCARD_CTOR - time_offset() noexcept = default; - - /// \brief Constructs a timezone offset from individual hour and minute totals. - /// - /// \detail \cpp - /// std::cout << toml::time_offset{ 2, 30 } << "\n"; - /// std::cout << toml::time_offset{ -2, 30 } << "\n"; - /// std::cout << toml::time_offset{ -2, -30 } << "\n"; - /// std::cout << toml::time_offset{ 0, 0 } << "\n"; - /// \ecpp - /// - /// \out - /// +02:30 - /// -01:30 - /// -02:30 - /// Z - /// \eout - /// - /// \tparam H An integral type. - /// \tparam M An integral type. - /// - /// \param h The total hours. - /// \param m The total minutes. - TOML_CONSTRAINED_TEMPLATE((impl::all_integral<H, M>), typename H, typename M) - TOML_NODISCARD_CTOR - constexpr time_offset(H h, M m) noexcept // - : minutes{ static_cast<int16_t>(static_cast<impl::common_signed_type<H, M>>(h) - * impl::common_signed_type<H, M>{ 60 } - + static_cast<impl::common_signed_type<H, M>>(m)) } - {} - - /// \brief Equality operator. - TOML_PURE_INLINE_GETTER - friend constexpr bool operator==(time_offset lhs, time_offset rhs) noexcept - { - return lhs.minutes == rhs.minutes; - } - - /// \brief Inequality operator. - TOML_PURE_INLINE_GETTER - friend constexpr bool operator!=(time_offset lhs, time_offset rhs) noexcept - { - return lhs.minutes != rhs.minutes; - } - - /// \brief Less-than operator. - TOML_PURE_INLINE_GETTER - friend constexpr bool operator<(time_offset lhs, time_offset rhs) noexcept - { - return lhs.minutes < rhs.minutes; - } - - /// \brief Less-than-or-equal-to operator. - TOML_PURE_INLINE_GETTER - friend constexpr bool operator<=(time_offset lhs, time_offset rhs) noexcept - { - return lhs.minutes <= rhs.minutes; - } - - /// \brief Greater-than operator. - TOML_PURE_INLINE_GETTER - friend constexpr bool operator>(time_offset lhs, time_offset rhs) noexcept - { - return lhs.minutes > rhs.minutes; - } - - /// \brief Greater-than-or-equal-to operator. - TOML_PURE_INLINE_GETTER - friend constexpr bool operator>=(time_offset lhs, time_offset rhs) noexcept - { - return lhs.minutes >= rhs.minutes; - } - - /// \brief Prints a time_offset out to a stream as `+-HH:MM or Z` (per RFC 3339). - /// \detail \cpp - /// std::cout << toml::time_offset{ 2, 30 } << "\n"; - /// std::cout << toml::time_offset{ 2, -30 } << "\n"; - /// std::cout << toml::time_offset{} << "\n"; - /// std::cout << toml::time_offset{ -2, 30 } << "\n"; - /// std::cout << toml::time_offset{ -2, -30 } << "\n"; - /// \ecpp - /// - /// \out - /// +02:30 - /// +01:30 - /// Z - /// -01:30 - /// -02:30 - /// \eout - friend std::ostream& operator<<(std::ostream& lhs, const time_offset& rhs) - { - impl::print_to_stream(lhs, rhs); - return lhs; - } - }; - - TOML_ABI_NAMESPACE_BOOL(TOML_HAS_CUSTOM_OPTIONAL_TYPE, custopt, stdopt); - - /// \brief A date-time. - struct date_time - { - /// \brief The date component. - toml::date date; - - /// \brief The time component. - toml::time time; - - /// \brief The timezone offset component. - /// - /// \remarks The date_time is said to be 'local' if the offset is empty. - optional<toml::time_offset> offset; - - /// \brief Default constructor. Does not initialize the members. - TOML_NODISCARD_CTOR - date_time() noexcept = default; - - /// \brief Constructs a local date-time. - /// - /// \param d The date component. - /// \param t The time component. - TOML_NODISCARD_CTOR - constexpr date_time(const toml::date& d, const toml::time& t) noexcept // - : date{ d }, - time{ t }, - offset{} // TINAE - icc bugfix - {} - - /// \brief Constructs a local date-time. - /// - /// \param d The date component. - TOML_NODISCARD_CTOR - explicit constexpr date_time(const toml::date& d) noexcept // - : date{ d }, - time{}, - offset{} // TINAE - icc bugfix - {} - - /// \brief Constructs a local date-time. - /// - /// \param t The time component. - TOML_NODISCARD_CTOR - explicit constexpr date_time(const toml::time& t) noexcept // - : date{}, - time{ t }, - offset{} // TINAE - icc bugfix - {} - - /// \brief Constructs an offset date-time. - /// - /// \param d The date component. - /// \param t The time component. - /// \param off The timezone offset. - TOML_NODISCARD_CTOR - constexpr date_time(const toml::date& d, const toml::time& t, const toml::time_offset& off) noexcept - : date{ d }, - time{ t }, - offset{ off } - {} - - /// \brief Returns true if this date_time does not contain timezone offset information. - TOML_PURE_INLINE_GETTER - constexpr bool is_local() const noexcept - { - return !offset.has_value(); - } - - /// \brief Equality operator. - TOML_PURE_GETTER - friend constexpr bool operator==(const date_time& lhs, const date_time& rhs) noexcept - { - return lhs.date == rhs.date // - && lhs.time == rhs.time // - && lhs.offset == rhs.offset; - } - - /// \brief Inequality operator. - TOML_PURE_INLINE_GETTER - friend constexpr bool operator!=(const date_time& lhs, const date_time& rhs) noexcept - { - return !(lhs == rhs); - } - - /// \brief Less-than operator. - TOML_PURE_GETTER - friend constexpr bool operator<(const date_time& lhs, const date_time& rhs) noexcept - { - if (lhs.date != rhs.date) - return lhs.date < rhs.date; - if (lhs.time != rhs.time) - return lhs.time < rhs.time; - return lhs.offset < rhs.offset; - } - - /// \brief Less-than-or-equal-to operator. - TOML_PURE_GETTER - friend constexpr bool operator<=(const date_time& lhs, const date_time& rhs) noexcept - { - if (lhs.date != rhs.date) - return lhs.date < rhs.date; - if (lhs.time != rhs.time) - return lhs.time < rhs.time; - return lhs.offset <= rhs.offset; - } - - /// \brief Greater-than operator. - TOML_PURE_INLINE_GETTER - friend constexpr bool operator>(const date_time& lhs, const date_time& rhs) noexcept - { - return !(lhs <= rhs); - } - - /// \brief Greater-than-or-equal-to operator. - TOML_PURE_INLINE_GETTER - friend constexpr bool operator>=(const date_time& lhs, const date_time& rhs) noexcept - { - return !(lhs < rhs); - } - - /// \brief Prints a date_time out to a stream in RFC 3339 format. - /// \detail \cpp - /// std::cout << toml::date_time{ { 1987, 3, 16 }, { 10, 20, 34 } } << "\n"; - /// std::cout << toml::date_time{ { 1987, 3, 16 }, { 10, 20, 34 }, { -2, -30 } } << "\n"; - /// std::cout << toml::date_time{ { 1987, 3, 16 }, { 10, 20, 34 }, {} } << "\n"; - /// \ecpp - /// - /// \out - /// 1987-03-16T10:20:34 - /// 1987-03-16T10:20:34-02:30 - /// 1987-03-16T10:20:34Z - /// \eout - friend std::ostream& operator<<(std::ostream& lhs, const date_time& rhs) - { - impl::print_to_stream(lhs, rhs); - return lhs; - } - }; - - TOML_ABI_NAMESPACE_END; // TOML_HAS_CUSTOM_OPTIONAL_TYPE +TOML_NAMESPACE_START { + /// \brief A local date. + struct TOML_TRIVIAL_ABI date { + /// \brief The year component. + uint16_t year; + + /// \brief The month component, from 1 - 12. + uint8_t month; + + /// \brief The day component, from 1 - 31. + uint8_t day; + + /// \brief Default constructor. Does not initialize the members. + TOML_NODISCARD_CTOR + date() noexcept = default; + + /// \brief Constructs a date from individual date component values. + TOML_CONSTRAINED_TEMPLATE((impl::all_integral<Y, M, D>), typename Y, typename M, typename D) + TOML_NODISCARD_CTOR + constexpr date(Y y, M m, D d) noexcept // + : year{static_cast<uint16_t>(y)}, + month{static_cast<uint8_t>(m)}, + day{static_cast<uint8_t>(d)} {} + + /// \brief Equality operator. + TOML_PURE_GETTER + friend constexpr bool operator==(const date& lhs, const date& rhs) noexcept { + return lhs.year == rhs.year // + && lhs.month == rhs.month // + && lhs.day == rhs.day; + } + + /// \brief Inequality operator. + TOML_PURE_INLINE_GETTER + friend constexpr bool operator!=(const date& lhs, const date& rhs) noexcept { + return !(lhs == rhs); + } + + private: + /// \cond + + TOML_PURE_GETTER + static constexpr uint32_t pack(const date& d) noexcept { + return (static_cast<uint32_t>(d.year) << 16) | (static_cast<uint32_t>(d.month) << 8) | + static_cast<uint32_t>(d.day); + } + + /// \endcond + + public: + /// \brief Less-than operator. + TOML_PURE_GETTER + friend constexpr bool operator<(const date& lhs, const date& rhs) noexcept { + return pack(lhs) < pack(rhs); + } + + /// \brief Less-than-or-equal-to operator. + TOML_PURE_GETTER + friend constexpr bool operator<=(const date& lhs, const date& rhs) noexcept { + return pack(lhs) <= pack(rhs); + } + + /// \brief Greater-than operator. + TOML_PURE_GETTER + friend constexpr bool operator>(const date& lhs, const date& rhs) noexcept { + return pack(lhs) > pack(rhs); + } + + /// \brief Greater-than-or-equal-to operator. + TOML_PURE_GETTER + friend constexpr bool operator>=(const date& lhs, const date& rhs) noexcept { + return pack(lhs) >= pack(rhs); + } + + /// \brief Prints a date out to a stream as `YYYY-MM-DD` (per RFC 3339). + /// + /// \detail \cpp + /// std::cout << toml::date{ 1987, 3, 16 } << "\n"; + /// \ecpp + /// + /// \out + /// 1987-03-16 + /// \eout + friend std::ostream& operator<<(std::ostream& lhs, const date& rhs) { + impl::print_to_stream(lhs, rhs); + return lhs; + } + }; + + /// \brief A local time-of-day. + struct TOML_TRIVIAL_ABI time { + /// \brief The hour component, from 0 - 23. + uint8_t hour; + + /// \brief The minute component, from 0 - 59. + uint8_t minute; + + /// \brief The second component, from 0 - 59. + uint8_t second; + + /// \brief The fractional nanoseconds component, from 0 - 999999999. + uint32_t nanosecond; + + /// \brief Default constructor. Does not initialize the members. + TOML_NODISCARD_CTOR + time() noexcept = default; + + /// \brief Constructs a time from individual time component values. + TOML_CONSTRAINED_TEMPLATE((impl::all_integral<H, M, S, NS>), typename H, typename M, + typename S = uint8_t, typename NS = uint32_t) + TOML_NODISCARD_CTOR + constexpr time(H h, M m, S s = S{}, NS ns = NS{}) noexcept // + : hour{static_cast<uint8_t>(h)}, + minute{static_cast<uint8_t>(m)}, + second{static_cast<uint8_t>(s)}, + nanosecond{static_cast<uint32_t>(ns)} {} + + /// \brief Equality operator. + TOML_PURE_GETTER + friend constexpr bool operator==(const time& lhs, const time& rhs) noexcept { + return lhs.hour == rhs.hour // + && lhs.minute == rhs.minute // + && lhs.second == rhs.second // + && lhs.nanosecond == rhs.nanosecond; + } + + /// \brief Inequality operator. + TOML_PURE_INLINE_GETTER + friend constexpr bool operator!=(const time& lhs, const time& rhs) noexcept { + return !(lhs == rhs); + } + + private: + /// \cond + + TOML_PURE_GETTER + static constexpr uint64_t pack(const time& t) noexcept { + return static_cast<uint64_t>(t.hour) << 48 | static_cast<uint64_t>(t.minute) << 40 | + static_cast<uint64_t>(t.second) << 32 | static_cast<uint64_t>(t.nanosecond); + } + + /// \endcond + + public: + /// \brief Less-than operator. + TOML_PURE_GETTER + friend constexpr bool operator<(const time& lhs, const time& rhs) noexcept { + return pack(lhs) < pack(rhs); + } + + /// \brief Less-than-or-equal-to operator. + TOML_PURE_GETTER + friend constexpr bool operator<=(const time& lhs, const time& rhs) noexcept { + return pack(lhs) <= pack(rhs); + } + + /// \brief Greater-than operator. + TOML_PURE_GETTER + friend constexpr bool operator>(const time& lhs, const time& rhs) noexcept { + return pack(lhs) > pack(rhs); + } + + /// \brief Greater-than-or-equal-to operator. + TOML_PURE_GETTER + friend constexpr bool operator>=(const time& lhs, const time& rhs) noexcept { + return pack(lhs) >= pack(rhs); + } + + /// \brief Prints a time out to a stream as `HH:MM:SS.FFFFFF` (per RFC 3339). + /// \detail \cpp + /// std::cout << toml::time{ 10, 20, 34 } << "\n"; + /// std::cout << toml::time{ 10, 20, 34, 500000000 } << "\n"; + /// \ecpp + /// + /// \out + /// 10:20:34 + /// 10:20:34.5 + /// \eout + friend std::ostream& operator<<(std::ostream& lhs, const time& rhs) { + impl::print_to_stream(lhs, rhs); + return lhs; + } + }; + + /// \brief A timezone offset. + struct TOML_TRIVIAL_ABI time_offset { + /// \brief Offset from UTC+0, in minutes. + int16_t minutes; + + /// \brief Default constructor. Does not initialize the members. + TOML_NODISCARD_CTOR + time_offset() noexcept = default; + + /// \brief Constructs a timezone offset from individual hour and minute totals. + /// + /// \detail \cpp + /// std::cout << toml::time_offset{ 2, 30 } << "\n"; + /// std::cout << toml::time_offset{ -2, 30 } << "\n"; + /// std::cout << toml::time_offset{ -2, -30 } << "\n"; + /// std::cout << toml::time_offset{ 0, 0 } << "\n"; + /// \ecpp + /// + /// \out + /// +02:30 + /// -01:30 + /// -02:30 + /// Z + /// \eout + /// + /// \tparam H An integral type. + /// \tparam M An integral type. + /// + /// \param h The total hours. + /// \param m The total minutes. + TOML_CONSTRAINED_TEMPLATE((impl::all_integral<H, M>), typename H, typename M) + TOML_NODISCARD_CTOR + constexpr time_offset(H h, M m) noexcept // + : minutes{static_cast<int16_t>(static_cast<impl::common_signed_type<H, M>>(h) * + impl::common_signed_type<H, M>{60} + + static_cast<impl::common_signed_type<H, M>>(m))} {} + + /// \brief Equality operator. + TOML_PURE_INLINE_GETTER + friend constexpr bool operator==(time_offset lhs, time_offset rhs) noexcept { + return lhs.minutes == rhs.minutes; + } + + /// \brief Inequality operator. + TOML_PURE_INLINE_GETTER + friend constexpr bool operator!=(time_offset lhs, time_offset rhs) noexcept { + return lhs.minutes != rhs.minutes; + } + + /// \brief Less-than operator. + TOML_PURE_INLINE_GETTER + friend constexpr bool operator<(time_offset lhs, time_offset rhs) noexcept { + return lhs.minutes < rhs.minutes; + } + + /// \brief Less-than-or-equal-to operator. + TOML_PURE_INLINE_GETTER + friend constexpr bool operator<=(time_offset lhs, time_offset rhs) noexcept { + return lhs.minutes <= rhs.minutes; + } + + /// \brief Greater-than operator. + TOML_PURE_INLINE_GETTER + friend constexpr bool operator>(time_offset lhs, time_offset rhs) noexcept { + return lhs.minutes > rhs.minutes; + } + + /// \brief Greater-than-or-equal-to operator. + TOML_PURE_INLINE_GETTER + friend constexpr bool operator>=(time_offset lhs, time_offset rhs) noexcept { + return lhs.minutes >= rhs.minutes; + } + + /// \brief Prints a time_offset out to a stream as `+-HH:MM or Z` (per RFC 3339). + /// \detail \cpp + /// std::cout << toml::time_offset{ 2, 30 } << "\n"; + /// std::cout << toml::time_offset{ 2, -30 } << "\n"; + /// std::cout << toml::time_offset{} << "\n"; + /// std::cout << toml::time_offset{ -2, 30 } << "\n"; + /// std::cout << toml::time_offset{ -2, -30 } << "\n"; + /// \ecpp + /// + /// \out + /// +02:30 + /// +01:30 + /// Z + /// -01:30 + /// -02:30 + /// \eout + friend std::ostream& operator<<(std::ostream& lhs, const time_offset& rhs) { + impl::print_to_stream(lhs, rhs); + return lhs; + } + }; + + TOML_ABI_NAMESPACE_BOOL(TOML_HAS_CUSTOM_OPTIONAL_TYPE, custopt, stdopt); + + /// \brief A date-time. + struct date_time { + /// \brief The date component. + toml::date date; + + /// \brief The time component. + toml::time time; + + /// \brief The timezone offset component. + /// + /// \remarks The date_time is said to be 'local' if the offset is empty. + optional<toml::time_offset> offset; + + /// \brief Default constructor. Does not initialize the members. + TOML_NODISCARD_CTOR + date_time() noexcept = default; + + /// \brief Constructs a local date-time. + /// + /// \param d The date component. + /// \param t The time component. + TOML_NODISCARD_CTOR + constexpr date_time(const toml::date& d, const toml::time& t) noexcept // + : date{d}, + time{t}, + offset{} // TINAE - icc bugfix + {} + + /// \brief Constructs a local date-time. + /// + /// \param d The date component. + TOML_NODISCARD_CTOR + explicit constexpr date_time(const toml::date& d) noexcept // + : date{d}, + time{}, + offset{} // TINAE - icc bugfix + {} + + /// \brief Constructs a local date-time. + /// + /// \param t The time component. + TOML_NODISCARD_CTOR + explicit constexpr date_time(const toml::time& t) noexcept // + : date{}, + time{t}, + offset{} // TINAE - icc bugfix + {} + + /// \brief Constructs an offset date-time. + /// + /// \param d The date component. + /// \param t The time component. + /// \param off The timezone offset. + TOML_NODISCARD_CTOR + constexpr date_time(const toml::date& d, const toml::time& t, + const toml::time_offset& off) noexcept + : date{d}, time{t}, offset{off} {} + + /// \brief Returns true if this date_time does not contain timezone offset information. + TOML_PURE_INLINE_GETTER + constexpr bool is_local() const noexcept { return !offset.has_value(); } + + /// \brief Equality operator. + TOML_PURE_GETTER + friend constexpr bool operator==(const date_time& lhs, const date_time& rhs) noexcept { + return lhs.date == rhs.date // + && lhs.time == rhs.time // + && lhs.offset == rhs.offset; + } + + /// \brief Inequality operator. + TOML_PURE_INLINE_GETTER + friend constexpr bool operator!=(const date_time& lhs, const date_time& rhs) noexcept { + return !(lhs == rhs); + } + + /// \brief Less-than operator. + TOML_PURE_GETTER + friend constexpr bool operator<(const date_time& lhs, const date_time& rhs) noexcept { + if (lhs.date != rhs.date) return lhs.date < rhs.date; + if (lhs.time != rhs.time) return lhs.time < rhs.time; + return lhs.offset < rhs.offset; + } + + /// \brief Less-than-or-equal-to operator. + TOML_PURE_GETTER + friend constexpr bool operator<=(const date_time& lhs, const date_time& rhs) noexcept { + if (lhs.date != rhs.date) return lhs.date < rhs.date; + if (lhs.time != rhs.time) return lhs.time < rhs.time; + return lhs.offset <= rhs.offset; + } + + /// \brief Greater-than operator. + TOML_PURE_INLINE_GETTER + friend constexpr bool operator>(const date_time& lhs, const date_time& rhs) noexcept { + return !(lhs <= rhs); + } + + /// \brief Greater-than-or-equal-to operator. + TOML_PURE_INLINE_GETTER + friend constexpr bool operator>=(const date_time& lhs, const date_time& rhs) noexcept { + return !(lhs < rhs); + } + + /// \brief Prints a date_time out to a stream in RFC 3339 format. + /// \detail \cpp + /// std::cout << toml::date_time{ { 1987, 3, 16 }, { 10, 20, 34 } } << "\n"; + /// std::cout << toml::date_time{ { 1987, 3, 16 }, { 10, 20, 34 }, { -2, -30 } } << "\n"; + /// std::cout << toml::date_time{ { 1987, 3, 16 }, { 10, 20, 34 }, {} } << "\n"; + /// \ecpp + /// + /// \out + /// 1987-03-16T10:20:34 + /// 1987-03-16T10:20:34-02:30 + /// 1987-03-16T10:20:34Z + /// \eout + friend std::ostream& operator<<(std::ostream& lhs, const date_time& rhs) { + impl::print_to_stream(lhs, rhs); + return lhs; + } + }; + + TOML_ABI_NAMESPACE_END; // TOML_HAS_CUSTOM_OPTIONAL_TYPE } TOML_NAMESPACE_END; |
