blob: 3c067f3d2deba6e38ac358fa9e7b5095d8b002d6 [file] [log] [blame]
#include "chre/util/time.h"
//! The number of nanoseconds in one second.
constexpr uint64_t kOneSecondInNanoseconds(1000000000);
//! The number of nanoseconds in one millisecond.
constexpr uint64_t kOneMillisecondInNanoseconds(1000000);
//! The number of nanoseconds in one millisecond.
constexpr uint64_t kOneMicrosecondInNanoseconds(1000);
namespace chre {
constexpr Seconds::Seconds(uint64_t seconds)
: mSeconds(seconds) {}
constexpr uint64_t Seconds::toRawNanoseconds() const {
// Perform the simple unit conversion. Warning: overflow is caught and
// handled by returning UINT64_MAX. A ternary expression is used because
// constexpr requires it.
return mSeconds > (UINT64_MAX / kOneSecondInNanoseconds) ? UINT64_MAX
: mSeconds * kOneSecondInNanoseconds;
}
constexpr Milliseconds::Milliseconds(uint64_t milliseconds)
: mMilliseconds(milliseconds) {}
constexpr Milliseconds::Milliseconds(Nanoseconds nanoseconds)
: mMilliseconds(
nanoseconds.toRawNanoseconds() / kOneMillisecondInNanoseconds) {}
constexpr uint64_t Milliseconds::toRawNanoseconds() const {
// Perform the simple unit conversion. Warning: overflow is caught and
// handled by returning UINT64_MAX. A ternary expression is used because
// constexpr requires it.
return mMilliseconds > (UINT64_MAX / kOneMillisecondInNanoseconds) ? UINT64_MAX
: mMilliseconds * kOneMillisecondInNanoseconds;
}
constexpr uint64_t Milliseconds::getMilliseconds() const {
return mMilliseconds;
}
constexpr Microseconds::Microseconds(uint64_t microseconds)
: mMicroseconds(microseconds) {}
constexpr Microseconds::Microseconds(Nanoseconds nanoseconds)
: mMicroseconds(
nanoseconds.toRawNanoseconds() / kOneMicrosecondInNanoseconds) {}
constexpr uint64_t Microseconds::toRawNanoseconds() const {
// Perform the simple unit conversion. Warning: overflow is caught and
// handled by returning UINT64_MAX. A ternary expression is used because
// constexpr requires it.
return mMicroseconds > (UINT64_MAX / kOneMicrosecondInNanoseconds) ? UINT64_MAX
: mMicroseconds * kOneMicrosecondInNanoseconds;
}
constexpr uint64_t Microseconds::getMicroseconds() const {
return mMicroseconds;
}
constexpr Nanoseconds::Nanoseconds()
: mNanoseconds(0) {}
constexpr Nanoseconds::Nanoseconds(uint64_t nanoseconds)
: mNanoseconds(nanoseconds) {}
constexpr Nanoseconds::Nanoseconds(Seconds seconds)
: mNanoseconds(seconds.toRawNanoseconds()) {}
constexpr Nanoseconds::Nanoseconds(Milliseconds milliseconds)
: mNanoseconds(milliseconds.toRawNanoseconds()) {}
constexpr Nanoseconds::Nanoseconds(Microseconds microseconds)
: mNanoseconds(microseconds.toRawNanoseconds()) {}
constexpr uint64_t Nanoseconds::toRawNanoseconds() const {
return mNanoseconds;
}
constexpr bool Nanoseconds::operator==(const Nanoseconds& nanos) const {
return (mNanoseconds == nanos.mNanoseconds);
}
constexpr bool Nanoseconds::operator!=(const Nanoseconds& nanos) const {
return !(mNanoseconds == nanos.mNanoseconds);
}
constexpr Nanoseconds operator+(const Seconds& secs,
const Nanoseconds& nanos) {
return Nanoseconds(secs.toRawNanoseconds() + nanos.toRawNanoseconds());
}
constexpr Nanoseconds operator+(const Nanoseconds& nanos_a,
const Nanoseconds& nanos_b) {
return Nanoseconds(nanos_a.toRawNanoseconds() + nanos_b.toRawNanoseconds());
}
constexpr Nanoseconds operator-(const Nanoseconds& nanos_a,
const Nanoseconds& nanos_b) {
return Nanoseconds(nanos_a.toRawNanoseconds() - nanos_b.toRawNanoseconds());
}
constexpr bool operator>=(const Nanoseconds& nanos_a,
const Nanoseconds& nanos_b) {
return nanos_a.toRawNanoseconds() >= nanos_b.toRawNanoseconds();
}
constexpr bool operator<(const Nanoseconds& nanos_a,
const Nanoseconds& nanos_b) {
return nanos_a.toRawNanoseconds() < nanos_b.toRawNanoseconds();
}
constexpr bool operator>(const Nanoseconds& nanos_a,
const Nanoseconds& nanos_b) {
return nanos_a.toRawNanoseconds() > nanos_b.toRawNanoseconds();
}
} // namespace chre