aboutsummaryrefslogtreecommitdiff
path: root/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h
diff options
context:
space:
mode:
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.h60
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_);