- abacaab4b11a69dd4db627bd183571d7cabb8def Refinement to previous time.h edit (in this same github p... by Greg Falcon <gfalcon@google.com>
- 64db19b773134c6c8004e3b23c9ca892efbf8bae Move SpinLock's adaptive spin count computation from a st... by Derek Mauro <dmauro@google.com>
- 6f9533fb44a52485a7c2bbb9b4efc7bf8d6c359a Import of CCTZ from GitHub. by Abseil Team <absl-team@google.com>
- a211d7255c986e8dd4ceada362c0d054a6a1969a Cleanup exception flags by Abseil Team <absl-team@google.com>
- babdb29c590126fe9bba5229fe91034b5b5c358a Release time benchmarks. by Alex Strelnikov <strel@google.com>
- 5803b32a3ff123d1fb57a0c471d199c818357c9f Release memutil microbenchmarks. by Alex Strelnikov <strel@google.com>
- 5357d4890d30e80c53beb05af32500fb20e9402b Add parens around expansion of ABSL_PREDICT_{FALSE,TRUE} ... by Abseil Team <absl-team@google.com>
- 32023f61a239a5f6b1c59e577bfe81b179bbcd2d Reformat build rule tag. by Alex Strelnikov <strel@google.com>
- 833758ecf2b0cf7a42bbd50b5b127e416425c168 Release uint128 microbenchmarks. by Alex Strelnikov <strel@google.com>
- c115a9bca1f944b90fdc78a56b2de176466b124f Disambiguate bitwise-not of size_type by Abseil Team <absl-team@google.com>
- f6905f5b5f6e425792de646edafde440548d9346 Updates ConstructorTracker and TrackedObjects with 1) a m... by Abseil Team <absl-team@google.com>
- 147c553bdd5d2db20a38f75c4d1ef973d6c709c5 Changes the absl::Duration factory functions to disallow ... by Greg Miller <jgm@google.com>
- dba2b96d11b5264546b283ba452f2de1303b0f07 White space fix by Alex Strelnikov <strel@google.com>
GitOrigin-RevId: abacaab4b11a69dd4db627bd183571d7cabb8def
Change-Id: I6fa34f20d0b2f898e7b5475a603111413bb80a67
This commit is contained in:
parent
7aacab8ae0
commit
92020a042c
22 changed files with 1808 additions and 282 deletions
|
|
@ -82,8 +82,15 @@ constexpr Duration MakeDuration(int64_t hi, uint32_t lo);
|
|||
constexpr Duration MakeDuration(int64_t hi, int64_t lo);
|
||||
constexpr int64_t kTicksPerNanosecond = 4;
|
||||
constexpr int64_t kTicksPerSecond = 1000 * 1000 * 1000 * kTicksPerNanosecond;
|
||||
template <std::intmax_t N>
|
||||
constexpr Duration FromInt64(int64_t v, std::ratio<1, N>);
|
||||
constexpr Duration FromInt64(int64_t v, std::ratio<60>);
|
||||
constexpr Duration FromInt64(int64_t v, std::ratio<3600>);
|
||||
template <typename T>
|
||||
using IsFloatingPoint =
|
||||
using EnableIfIntegral = typename std::enable_if<
|
||||
std::is_integral<T>::value || std::is_enum<T>::value, int>::type;
|
||||
template <typename T>
|
||||
using EnableIfFloat =
|
||||
typename std::enable_if<std::is_floating_point<T>::value, int>::type;
|
||||
} // namespace time_internal
|
||||
|
||||
|
|
@ -178,15 +185,15 @@ inline Duration operator-(Duration lhs, Duration rhs) { return lhs -= rhs; }
|
|||
|
||||
// Multiplicative Operators
|
||||
template <typename T>
|
||||
inline Duration operator*(Duration lhs, T rhs) {
|
||||
Duration operator*(Duration lhs, T rhs) {
|
||||
return lhs *= rhs;
|
||||
}
|
||||
template <typename T>
|
||||
inline Duration operator*(T lhs, Duration rhs) {
|
||||
Duration operator*(T lhs, Duration rhs) {
|
||||
return rhs *= lhs;
|
||||
}
|
||||
template <typename T>
|
||||
inline Duration operator/(Duration lhs, T rhs) {
|
||||
Duration operator/(Duration lhs, T rhs) {
|
||||
return lhs /= rhs;
|
||||
}
|
||||
inline int64_t operator/(Duration lhs, Duration rhs) {
|
||||
|
|
@ -322,27 +329,27 @@ constexpr Duration Hours(int64_t n);
|
|||
// Example:
|
||||
// auto a = absl::Seconds(1.5); // OK
|
||||
// auto b = absl::Milliseconds(1500); // BETTER
|
||||
template <typename T, time_internal::IsFloatingPoint<T> = 0>
|
||||
template <typename T, time_internal::EnableIfFloat<T> = 0>
|
||||
Duration Nanoseconds(T n) {
|
||||
return n * Nanoseconds(1);
|
||||
}
|
||||
template <typename T, time_internal::IsFloatingPoint<T> = 0>
|
||||
template <typename T, time_internal::EnableIfFloat<T> = 0>
|
||||
Duration Microseconds(T n) {
|
||||
return n * Microseconds(1);
|
||||
}
|
||||
template <typename T, time_internal::IsFloatingPoint<T> = 0>
|
||||
template <typename T, time_internal::EnableIfFloat<T> = 0>
|
||||
Duration Milliseconds(T n) {
|
||||
return n * Milliseconds(1);
|
||||
}
|
||||
template <typename T, time_internal::IsFloatingPoint<T> = 0>
|
||||
template <typename T, time_internal::EnableIfFloat<T> = 0>
|
||||
Duration Seconds(T n) {
|
||||
return n * Seconds(1);
|
||||
}
|
||||
template <typename T, time_internal::IsFloatingPoint<T> = 0>
|
||||
template <typename T, time_internal::EnableIfFloat<T> = 0>
|
||||
Duration Minutes(T n) {
|
||||
return n * Minutes(1);
|
||||
}
|
||||
template <typename T, time_internal::IsFloatingPoint<T> = 0>
|
||||
template <typename T, time_internal::EnableIfFloat<T> = 0>
|
||||
Duration Hours(T n) {
|
||||
return n * Hours(1);
|
||||
}
|
||||
|
|
@ -1154,10 +1161,16 @@ constexpr Duration FromInt64(int64_t v, std::ratio<1, N>) {
|
|||
v / N, v % N * kTicksPerNanosecond * 1000 * 1000 * 1000 / N);
|
||||
}
|
||||
constexpr Duration FromInt64(int64_t v, std::ratio<60>) {
|
||||
return Minutes(v);
|
||||
return (v <= std::numeric_limits<int64_t>::max() / 60 &&
|
||||
v >= std::numeric_limits<int64_t>::min() / 60)
|
||||
? MakeDuration(v * 60)
|
||||
: v > 0 ? InfiniteDuration() : -InfiniteDuration();
|
||||
}
|
||||
constexpr Duration FromInt64(int64_t v, std::ratio<3600>) {
|
||||
return Hours(v);
|
||||
return (v <= std::numeric_limits<int64_t>::max() / 3600 &&
|
||||
v >= std::numeric_limits<int64_t>::min() / 3600)
|
||||
? MakeDuration(v * 3600)
|
||||
: v > 0 ? InfiniteDuration() : -InfiniteDuration();
|
||||
}
|
||||
|
||||
// IsValidRep64<T>(0) is true if the expression `int64_t{std::declval<T>()}` is
|
||||
|
|
@ -1220,6 +1233,24 @@ T ToChronoDuration(Duration d) {
|
|||
}
|
||||
|
||||
} // namespace time_internal
|
||||
constexpr Duration Nanoseconds(int64_t n) {
|
||||
return time_internal::FromInt64(n, std::nano{});
|
||||
}
|
||||
constexpr Duration Microseconds(int64_t n) {
|
||||
return time_internal::FromInt64(n, std::micro{});
|
||||
}
|
||||
constexpr Duration Milliseconds(int64_t n) {
|
||||
return time_internal::FromInt64(n, std::milli{});
|
||||
}
|
||||
constexpr Duration Seconds(int64_t n) {
|
||||
return time_internal::FromInt64(n, std::ratio<1>{});
|
||||
}
|
||||
constexpr Duration Minutes(int64_t n) {
|
||||
return time_internal::FromInt64(n, std::ratio<60>{});
|
||||
}
|
||||
constexpr Duration Hours(int64_t n) {
|
||||
return time_internal::FromInt64(n, std::ratio<3600>{});
|
||||
}
|
||||
|
||||
constexpr bool operator<(Duration lhs, Duration rhs) {
|
||||
return time_internal::GetRepHi(lhs) != time_internal::GetRepHi(rhs)
|
||||
|
|
@ -1261,39 +1292,6 @@ constexpr Duration operator-(Duration d) {
|
|||
time_internal::GetRepLo(d));
|
||||
}
|
||||
|
||||
constexpr Duration Nanoseconds(int64_t n) {
|
||||
return time_internal::MakeNormalizedDuration(
|
||||
n / (1000 * 1000 * 1000),
|
||||
n % (1000 * 1000 * 1000) * time_internal::kTicksPerNanosecond);
|
||||
}
|
||||
|
||||
constexpr Duration Microseconds(int64_t n) {
|
||||
return time_internal::MakeNormalizedDuration(
|
||||
n / (1000 * 1000),
|
||||
n % (1000 * 1000) * (1000 * time_internal::kTicksPerNanosecond));
|
||||
}
|
||||
|
||||
constexpr Duration Milliseconds(int64_t n) {
|
||||
return time_internal::MakeNormalizedDuration(
|
||||
n / 1000, n % 1000 * (1000 * 1000 * time_internal::kTicksPerNanosecond));
|
||||
}
|
||||
|
||||
constexpr Duration Seconds(int64_t n) { return time_internal::MakeDuration(n); }
|
||||
|
||||
constexpr Duration Minutes(int64_t n) {
|
||||
return (n <= std::numeric_limits<int64_t>::max() / 60 &&
|
||||
n >= std::numeric_limits<int64_t>::min() / 60)
|
||||
? time_internal::MakeDuration(n * 60)
|
||||
: n > 0 ? InfiniteDuration() : -InfiniteDuration();
|
||||
}
|
||||
|
||||
constexpr Duration Hours(int64_t n) {
|
||||
return (n <= std::numeric_limits<int64_t>::max() / 3600 &&
|
||||
n >= std::numeric_limits<int64_t>::min() / 3600)
|
||||
? time_internal::MakeDuration(n * 3600)
|
||||
: n > 0 ? InfiniteDuration() : -InfiniteDuration();
|
||||
}
|
||||
|
||||
constexpr Duration InfiniteDuration() {
|
||||
return time_internal::MakeDuration(std::numeric_limits<int64_t>::max(), ~0U);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue