|
9 | 9 | #include <ctime>
|
10 | 10 | #include <iomanip>
|
11 | 11 | #include <limits>
|
| 12 | +#include <ratio> |
12 | 13 | #include <sstream>
|
13 | 14 | #include <stdexcept>
|
14 | 15 | #include <type_traits>
|
@@ -43,16 +44,65 @@ DateTime GetSystemClockEpoch()
|
43 | 44 |
|
44 | 45 | DateTime GetMaxDateTime()
|
45 | 46 | {
|
46 |
| - auto const systemClockMax = std::chrono::duration_cast<DateTime::clock::duration>( |
47 |
| - (std::chrono::system_clock::time_point::max)().time_since_epoch()) |
48 |
| - .count(); |
| 47 | +#ifdef _MSC_VER |
| 48 | +#pragma warning(push) |
| 49 | +// warning C6326: Potential comparison of a constant with another constant. |
| 50 | +#pragma warning(disable : 6326) |
| 51 | +#endif |
| 52 | + static_assert( |
| 53 | + std::is_same<DateTime::clock::duration::rep, std::chrono::system_clock::duration::rep>::value, |
| 54 | + "DateTime::clock::duration::rep must be the same as " |
| 55 | + "std::chrono::system_clock::duration::rep"); |
| 56 | + |
| 57 | + using Rep = DateTime::clock::duration::rep; |
| 58 | + |
| 59 | + using CommonDuration = std::chrono::duration< |
| 60 | + Rep, |
| 61 | + std::conditional< |
| 62 | + std::ratio_greater< |
| 63 | + DateTime::clock::duration::period, |
| 64 | + std::chrono::system_clock::duration::period>::value, |
| 65 | + DateTime::clock::duration::period, |
| 66 | + std::chrono::system_clock::duration::period>::type>; |
| 67 | + |
| 68 | + std::chrono::system_clock::time_point const scEpochTimePoint |
| 69 | + = std::chrono::system_clock::time_point(); |
| 70 | + |
| 71 | + std::chrono::system_clock::duration const scSystemClockMaxDuration |
| 72 | + = (scEpochTimePoint + ((std::chrono::system_clock::time_point::max)() - scEpochTimePoint)) |
| 73 | + .time_since_epoch(); |
| 74 | + |
| 75 | + Rep const commonSystemClockMax |
| 76 | + = std::chrono::duration_cast<CommonDuration>(scSystemClockMaxDuration).count(); |
49 | 77 |
|
50 |
| - auto const systemClockEpoch = GetSystemClockEpoch().time_since_epoch().count(); |
| 78 | + Rep const commonDtClockMax |
| 79 | + = std::chrono::duration_cast<CommonDuration>((DateTime::clock::duration::max)()).count(); |
51 | 80 |
|
52 |
| - constexpr auto repMax = (std::numeric_limits<DateTime::clock::duration::rep>::max)(); |
| 81 | + Rep const dtSystemClockMax = (commonSystemClockMax < commonDtClockMax) |
| 82 | + ? std::chrono::duration_cast<DateTime::clock::duration>(scSystemClockMaxDuration).count() |
| 83 | + : ((DateTime::clock::duration::max)()).count(); |
| 84 | + |
| 85 | + Azure::DateTime::duration const dtSystemClockEpochDuration |
| 86 | + = GetSystemClockEpoch().time_since_epoch(); |
| 87 | + |
| 88 | + Rep const commonSystemClockEpoch |
| 89 | + = std::chrono::duration_cast<CommonDuration>(dtSystemClockEpochDuration).count(); |
| 90 | + |
| 91 | + Rep const dtSystemClockEpoch |
| 92 | + = std::chrono::duration_cast<DateTime::clock::duration>(dtSystemClockEpochDuration).count(); |
| 93 | + |
| 94 | + constexpr Rep commonRepMax = std::chrono::duration_cast<CommonDuration>( |
| 95 | + DateTime::duration((std::numeric_limits<Rep>::max)())) |
| 96 | + .count(); |
53 | 97 |
|
54 | 98 | return DateTime(DateTime::time_point(DateTime::duration(
|
55 |
| - systemClockMax + (std::min)(systemClockEpoch, (repMax - systemClockMax))))); |
| 99 | + (commonSystemClockMax < commonRepMax |
| 100 | + && commonSystemClockEpoch < (commonRepMax - commonSystemClockMax)) |
| 101 | + ? (dtSystemClockEpoch + dtSystemClockMax) |
| 102 | + : dtSystemClockMax))); |
| 103 | +#ifdef _MSC_VER |
| 104 | +#pragma warning(pop) |
| 105 | +#endif |
56 | 106 | }
|
57 | 107 |
|
58 | 108 | template <typename T>
|
@@ -422,8 +472,8 @@ DateTime::DateTime(
|
422 | 472 |
|
423 | 473 | DateTime::operator std::chrono::system_clock::time_point() const
|
424 | 474 | {
|
425 |
| - static DateTime SystemClockMin((std::chrono::system_clock::time_point::min)()); |
426 |
| - static DateTime SystemClockMax(GetMaxDateTime()); |
| 475 | + static DateTime const SystemClockMin((std::chrono::system_clock::time_point::min)()); |
| 476 | + static DateTime const SystemClockMax(GetMaxDateTime()); |
427 | 477 |
|
428 | 478 | auto outOfRange = 0;
|
429 | 479 | if (*this < SystemClockMin)
|
|
0 commit comments