time_impl.h revision aab84350d333c03bc6d6e52841e291f66f8e0aae
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 Nanoseconds operator+(const Seconds& secs,
72                                const Nanoseconds& nanos) {
73  return Nanoseconds(secs.toRawNanoseconds() + nanos.toRawNanoseconds());
74}
75
76constexpr Nanoseconds operator+(const Nanoseconds& nanos_a,
77                                const Nanoseconds& nanos_b) {
78  return Nanoseconds(nanos_a.toRawNanoseconds() + nanos_b.toRawNanoseconds());
79}
80
81constexpr Nanoseconds operator-(const Nanoseconds& nanos_a,
82                                const Nanoseconds& nanos_b) {
83  return Nanoseconds(nanos_a.toRawNanoseconds() - nanos_b.toRawNanoseconds());
84}
85
86constexpr bool operator>=(const Nanoseconds& nanos_a,
87                          const Nanoseconds& nanos_b) {
88  return nanos_a.toRawNanoseconds() >= nanos_b.toRawNanoseconds();
89}
90
91constexpr bool operator<(const Nanoseconds& nanos_a,
92                         const Nanoseconds& nanos_b) {
93  return nanos_a.toRawNanoseconds() < nanos_b.toRawNanoseconds();
94}
95
96constexpr bool operator>(const Nanoseconds& nanos_a,
97                         const Nanoseconds& nanos_b) {
98  return nanos_a.toRawNanoseconds() > nanos_b.toRawNanoseconds();
99}
100
101}  // namespace chre
102