time_impl.h revision 725bef45ca127971b3ea798cd1f4e4b2c0d8fe9d
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
9namespace chre {
10
11constexpr Seconds::Seconds(uint64_t seconds)
12    : mSeconds(seconds) {}
13
14constexpr uint64_t Seconds::toRawNanoseconds() const {
15  // Perform the simple unit conversion. Warning: overflow is caught and
16  // handled by returning UINT64_MAX. A ternary expression is used because
17  // constexpr requires it.
18  return mSeconds > (UINT64_MAX / kOneSecondInNanoseconds) ? UINT64_MAX
19      : mSeconds * kOneSecondInNanoseconds;
20}
21
22constexpr Milliseconds::Milliseconds(uint64_t milliseconds)
23    : mMilliseconds(milliseconds) {}
24
25constexpr uint64_t Milliseconds::toRawNanoseconds() const {
26  // Perform the simple unit conversion. Warning: overflow is caught and
27  // handled by returning UINT64_MAX. A ternary expression is used because
28  // constexpr requires it.
29  return mMilliseconds > (UINT64_MAX / kOneMillisecondInNanoseconds) ? UINT64_MAX
30      : mMilliseconds * kOneMillisecondInNanoseconds;
31}
32
33constexpr Nanoseconds::Nanoseconds()
34    : mNanoseconds(0) {}
35
36constexpr Nanoseconds::Nanoseconds(uint64_t nanoseconds)
37    : mNanoseconds(nanoseconds) {}
38
39constexpr Nanoseconds::Nanoseconds(Milliseconds milliseconds)
40    : mNanoseconds(milliseconds.toRawNanoseconds()) {}
41
42constexpr uint64_t Nanoseconds::toRawNanoseconds() const {
43  return mNanoseconds;
44}
45
46constexpr Nanoseconds operator+(const Seconds& secs,
47                                const Nanoseconds& nanos) {
48  return Nanoseconds(secs.toRawNanoseconds() + nanos.toRawNanoseconds());
49}
50
51constexpr Nanoseconds operator+(const Nanoseconds& nanos_a,
52                                const Nanoseconds& nanos_b) {
53  return Nanoseconds(nanos_a.toRawNanoseconds() + nanos_b.toRawNanoseconds());
54}
55
56constexpr Nanoseconds operator-(const Nanoseconds& nanos_a,
57                                const Nanoseconds& nanos_b) {
58  return Nanoseconds(nanos_a.toRawNanoseconds() - nanos_b.toRawNanoseconds());
59}
60
61constexpr bool operator>=(const Nanoseconds& nanos_a,
62                          const Nanoseconds& nanos_b) {
63  return nanos_a.toRawNanoseconds() >= nanos_b.toRawNanoseconds();
64}
65
66constexpr bool operator<(const Nanoseconds& nanos_a,
67                         const Nanoseconds& nanos_b) {
68  return nanos_a.toRawNanoseconds() < nanos_b.toRawNanoseconds();
69}
70
71constexpr bool operator>(const Nanoseconds& nanos_a,
72                         const Nanoseconds& nanos_b) {
73  return nanos_a.toRawNanoseconds() > nanos_b.toRawNanoseconds();
74}
75
76}  // namespace chre
77