diff options
Diffstat (limited to 'third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h')
-rw-r--r-- | third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h | 60 |
1 files changed, 27 insertions, 33 deletions
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h b/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h index 8aadde57ca..4cde96f1aa 100644 --- a/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +++ b/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h @@ -106,64 +106,54 @@ CONSTEXPR_F int days_per_month(year_t y, month_t m) noexcept { CONSTEXPR_F fields n_day(year_t y, month_t m, diff_t d, diff_t cd, hour_t hh, minute_t mm, second_t ss) noexcept { - year_t ey = y % 400; - const year_t oey = ey; - ey += (cd / 146097) * 400; + y += (cd / 146097) * 400; cd %= 146097; if (cd < 0) { - ey -= 400; + y -= 400; cd += 146097; } - ey += (d / 146097) * 400; + y += (d / 146097) * 400; d = d % 146097 + cd; if (d > 0) { if (d > 146097) { - ey += 400; + y += 400; d -= 146097; } } else { if (d > -365) { // We often hit the previous year when stepping a civil time backwards, // so special case it to avoid counting up by 100/4/1-year chunks. - ey -= 1; - d += days_per_year(ey, m); + y -= 1; + d += days_per_year(y, m); } else { - ey -= 400; + y -= 400; d += 146097; } } if (d > 365) { - for (;;) { - int n = days_per_century(ey, m); - if (d <= n) break; + for (int n = days_per_century(y, m); d > n; n = days_per_century(y, m)) { d -= n; - ey += 100; + y += 100; } - for (;;) { - int n = days_per_4years(ey, m); - if (d <= n) break; + for (int n = days_per_4years(y, m); d > n; n = days_per_4years(y, m)) { d -= n; - ey += 4; + y += 4; } - for (;;) { - int n = days_per_year(ey, m); - if (d <= n) break; + for (int n = days_per_year(y, m); d > n; n = days_per_year(y, m)) { d -= n; - ++ey; + ++y; } } if (d > 28) { - for (;;) { - int n = days_per_month(ey, m); - if (d <= n) break; + for (int n = days_per_month(y, m); d > n; n = days_per_month(y, m)) { d -= n; if (++m > 12) { - ++ey; + ++y; m = 1; } } } - return fields(y + (ey - oey), m, static_cast<day_t>(d), hh, mm, ss); + return fields(y, m, static_cast<day_t>(d), hh, mm, ss); } CONSTEXPR_F fields n_mon(year_t y, diff_t m, diff_t d, diff_t cd, hour_t hh, minute_t mm, second_t ss) noexcept { @@ -416,10 +406,16 @@ class civil_time { // Assigning arithmetic. CONSTEXPR_M civil_time& operator+=(diff_t n) noexcept { - return *this = *this + n; + f_ = step(T{}, f_, n); + return *this; } CONSTEXPR_M civil_time& operator-=(diff_t n) noexcept { - return *this = *this - n; + if (n != (std::numeric_limits<diff_t>::min)()) { + f_ = step(T{}, f_, -n); + } else { + f_ = step(T{}, step(T{}, f_, -(n + 1)), 1); + } + return *this; } CONSTEXPR_M civil_time& operator++() noexcept { return *this += 1; } CONSTEXPR_M civil_time operator++(int) noexcept { @@ -436,15 +432,13 @@ class civil_time { // Binary arithmetic operators. friend CONSTEXPR_F civil_time operator+(civil_time a, diff_t n) noexcept { - return civil_time(step(T{}, a.f_, n)); + return a += n; } friend CONSTEXPR_F civil_time operator+(diff_t n, civil_time a) noexcept { - return a + n; + return a += n; } friend CONSTEXPR_F civil_time operator-(civil_time a, diff_t n) noexcept { - return n != (std::numeric_limits<diff_t>::min)() - ? civil_time(step(T{}, a.f_, -n)) - : civil_time(step(T{}, step(T{}, a.f_, -(n + 1)), 1)); + return a -= n; } friend CONSTEXPR_F diff_t operator-(civil_time lhs, civil_time rhs) noexcept { return difference(T{}, lhs.f_, rhs.f_); |