time_impl.h revision f546f4c27e66dc4ea868e660cebac9ba0c31fad9
1#include "chre/util/time.h"
2
3//! The number of nanoseconds in one second.
4constexpr uint64_t kOneSecondInNanoseconds(1000000000);
5
6//! The number of nanoseconds in one millisecond.
7constexpr uint64_t kOneMillisecondInNanoseconds(1000000);
8
9//! The number of nanoseconds in one millisecond.
10constexpr uint64_t kOneMicrosecondInNanoseconds(1000);
11
12namespace chre {
13
14constexpr Seconds::Seconds(uint64_t seconds)
15    : mSeconds(seconds) {}
16
17constexpr uint64_t Seconds::toRawNanoseconds() const {
18  // Perform the simple unit conversion. Warning: overflow is caught and
19  // handled by returning UINT64_MAX. A ternary expression is used because
20  // constexpr requires it.
21  return mSeconds > (UINT64_MAX / kOneSecondInNanoseconds) ? UINT64_MAX
22      : mSeconds * kOneSecondInNanoseconds;
23}
24
25constexpr Milliseconds::Milliseconds(uint64_t milliseconds)
26    : mMilliseconds(milliseconds) {}
27
28constexpr uint64_t Milliseconds::toRawNanoseconds() const {
29  // Perform the simple unit conversion. Warning: overflow is caught and
30  // handled by returning UINT64_MAX. A ternary expression is used because
31  // constexpr requires it.
32  return mMilliseconds > (UINT64_MAX / kOneMillisecondInNanoseconds) ? UINT64_MAX
33      : mMilliseconds * kOneMillisecondInNanoseconds;
34}
35
36constexpr Microseconds::Microseconds(uint64_t microseconds)
37    : mMicroseconds(microseconds) {}
38
39constexpr Microseconds::Microseconds(Nanoseconds nanoseconds)
40    : mMicroseconds(
41        nanoseconds.toRawNanoseconds() / kOneMicrosecondInNanoseconds) {}
42
43constexpr uint64_t Microseconds::toRawNanoseconds() const {
44  // Perform the simple unit conversion. Warning: overflow is caught and
45  // handled by returning UINT64_MAX. A ternary expression is used because
46  // constexpr requires it.
47  return mMicroseconds > (UINT64_MAX / kOneMicrosecondInNanoseconds) ? UINT64_MAX
48      : mMicroseconds * kOneMicrosecondInNanoseconds;
49}
50
51constexpr uint64_t Microseconds::getMicroseconds() const {
52  return mMicroseconds;
53}
54
55constexpr Nanoseconds::Nanoseconds()
56    : mNanoseconds(0) {}
57
58constexpr Nanoseconds::Nanoseconds(uint64_t nanoseconds)
59    : mNanoseconds(nanoseconds) {}
60
61constexpr Nanoseconds::Nanoseconds(Milliseconds milliseconds)
62    : mNanoseconds(milliseconds.toRawNanoseconds()) {}
63
64constexpr Nanoseconds::Nanoseconds(Microseconds microseconds)
65    : mNanoseconds(microseconds.toRawNanoseconds()) {}
66
67constexpr uint64_t Nanoseconds::toRawNanoseconds() const {
68  return mNanoseconds;
69}
70
71constexpr bool Nanoseconds::operator==(const Nanoseconds& nanos) const {
72  return (mNanoseconds == nanos.mNanoseconds);
73}
74
75constexpr Nanoseconds operator+(const Seconds& secs,
76                                const Nanoseconds& nanos) {
77  return Nanoseconds(secs.toRawNanoseconds() + nanos.toRawNanoseconds());
78}
79
80constexpr Nanoseconds operator+(const Nanoseconds& nanos_a,
81                                const Nanoseconds& nanos_b) {
82  return Nanoseconds(nanos_a.toRawNanoseconds() + nanos_b.toRawNanoseconds());
83}
84
85constexpr Nanoseconds operator-(const Nanoseconds& nanos_a,
86                                const Nanoseconds& nanos_b) {
87  return Nanoseconds(nanos_a.toRawNanoseconds() - nanos_b.toRawNanoseconds());
88}
89
90constexpr bool operator>=(const Nanoseconds& nanos_a,
91                          const Nanoseconds& nanos_b) {
92  return nanos_a.toRawNanoseconds() >= nanos_b.toRawNanoseconds();
93}
94
95constexpr bool operator<(const Nanoseconds& nanos_a,
96                         const Nanoseconds& nanos_b) {
97  return nanos_a.toRawNanoseconds() < nanos_b.toRawNanoseconds();
98}
99
100constexpr bool operator>(const Nanoseconds& nanos_a,
101                         const Nanoseconds& nanos_b) {
102  return nanos_a.toRawNanoseconds() > nanos_b.toRawNanoseconds();
103}
104
105}  // namespace chre
106