summaryrefslogtreecommitdiff
path: root/absl/time
diff options
context:
space:
mode:
authorGravatar Gennadiy Civil <gennadiycivil@users.noreply.github.com>2017-10-30 10:56:35 -0400
committerGravatar GitHub <noreply@github.com>2017-10-30 10:56:35 -0400
commit200b5a7cb0fb256ab47c933b3150aed91d9d3470 (patch)
tree300713d880c593eb36cc6cea4bc8d1073bb03112 /absl/time
parentd5134a7f11e32d11caa67e75ae2ae2e506fb54ba (diff)
parent0fece732a21c5ae8fef5fa8b3f0b8487bca68d83 (diff)
Merge branch 'master' into master
Diffstat (limited to 'absl/time')
-rw-r--r--absl/time/BUILD.bazel3
-rw-r--r--absl/time/internal/test_util.cc2
-rw-r--r--absl/time/time.h37
3 files changed, 21 insertions, 21 deletions
diff --git a/absl/time/BUILD.bazel b/absl/time/BUILD.bazel
index c34f5248..3d1d2df5 100644
--- a/absl/time/BUILD.bazel
+++ b/absl/time/BUILD.bazel
@@ -57,6 +57,9 @@ cc_library(
],
hdrs = ["internal/test_util.h"],
copts = ABSL_DEFAULT_COPTS,
+ visibility = [
+ "//absl/time:__pkg__",
+ ],
deps = [
":time",
"//absl/base",
diff --git a/absl/time/internal/test_util.cc b/absl/time/internal/test_util.cc
index 1a415f89..8bb27a8f 100644
--- a/absl/time/internal/test_util.cc
+++ b/absl/time/internal/test_util.cc
@@ -63,7 +63,7 @@ const struct ZoneInfo {
{"US/Pacific", //
reinterpret_cast<char*>(America_Los_Angeles), America_Los_Angeles_len},
- // Allows use of the local time zone from a common system-specific location.
+ // Allows use of the local time zone from a system-specific location.
#ifdef _MSC_VER
{"localtime", //
reinterpret_cast<char*>(America_Los_Angeles), America_Los_Angeles_len},
diff --git a/absl/time/time.h b/absl/time/time.h
index 093f168d..c01977b0 100644
--- a/absl/time/time.h
+++ b/absl/time/time.h
@@ -1126,8 +1126,10 @@ constexpr Duration OppositeInfinity(Duration d) {
: MakeDuration(std::numeric_limits<int64_t>::min(), ~0U);
}
-// Returns (-n)-1 (equivalently -(n+1)) without overflowing on any input value.
+// Returns (-n)-1 (equivalently -(n+1)) without avoidable overflow.
constexpr int64_t NegateAndSubtractOne(int64_t n) {
+ // Note: Good compilers will optimize this expression to ~n when using
+ // a two's-complement representation (which is required for int64_t).
return (n < 0) ? -(n + 1) : (-n) - 1;
}
@@ -1232,31 +1234,26 @@ constexpr bool operator==(Duration lhs, Duration rhs) {
constexpr Duration operator-(Duration d) {
// This is a little interesting because of the special cases.
//
- // Infinities stay infinite, and just change direction.
+ // If rep_lo_ is zero, we have it easy; it's safe to negate rep_hi_, we're
+ // dealing with an integral number of seconds, and the only special case is
+ // the maximum negative finite duration, which can't be negated.
//
- // The maximum negative finite duration can't be negated (at least, not
- // on a two's complement machine), so we return infinity for that case.
- // Next we dispatch the case where rep_lo_ is zero, observing that it's
- // safe to negate rep_hi_ in this case because it's not int64_t-min (or
- // else we'd have handled it above, returning InfiniteDuration()).
+ // Infinities stay infinite, and just change direction.
//
// Finally we're in the case where rep_lo_ is non-zero, and we can borrow
// a second's worth of ticks and avoid overflow (as negating int64_t-min + 1
// is safe).
- return time_internal::IsInfiniteDuration(d)
- ? time_internal::OppositeInfinity(d)
- : (time_internal::GetRepHi(d) ==
- std::numeric_limits<int64_t>::min() &&
- time_internal::GetRepLo(d) == 0)
+ return time_internal::GetRepLo(d) == 0
+ ? time_internal::GetRepHi(d) == std::numeric_limits<int64_t>::min()
? InfiniteDuration()
- : (time_internal::GetRepLo(d) == 0)
- ? time_internal::MakeDuration(
- -time_internal::GetRepHi(d))
- : time_internal::MakeDuration(
- time_internal::NegateAndSubtractOne(
- time_internal::GetRepHi(d)),
- time_internal::kTicksPerSecond -
- time_internal::GetRepLo(d));
+ : time_internal::MakeDuration(-time_internal::GetRepHi(d))
+ : time_internal::IsInfiniteDuration(d)
+ ? time_internal::OppositeInfinity(d)
+ : time_internal::MakeDuration(
+ time_internal::NegateAndSubtractOne(
+ time_internal::GetRepHi(d)),
+ time_internal::kTicksPerSecond -
+ time_internal::GetRepLo(d));
}
constexpr Duration Nanoseconds(int64_t n) {