1 /*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #ifndef CHRE_UTIL_TIME_IMPL_H_
18 #define CHRE_UTIL_TIME_IMPL_H_
19
20 #include "chre/util/time.h"
21
22 namespace chre {
23
Seconds(uint64_t seconds)24 constexpr Seconds::Seconds(uint64_t seconds)
25 : mSeconds(seconds) {}
26
toRawNanoseconds()27 constexpr uint64_t Seconds::toRawNanoseconds() const {
28 // Perform the simple unit conversion. Warning: overflow is caught and
29 // handled by returning UINT64_MAX. A ternary expression is used because
30 // constexpr requires it.
31 return (mSeconds > (UINT64_MAX / kOneSecondInNanoseconds)) ? UINT64_MAX
32 : mSeconds * kOneSecondInNanoseconds;
33 }
34
getMilliseconds()35 constexpr uint64_t Seconds::getMilliseconds() const {
36 // Perform the simple unit conversion. Warning: overflow is caught and
37 // handled by returning UINT64_MAX. A ternary expression is used because
38 // constexpr requires it.
39 return (mSeconds > (UINT64_MAX / kOneSecondInMilliseconds)) ? UINT64_MAX
40 : mSeconds * kOneSecondInMilliseconds;
41 }
42
Milliseconds()43 constexpr Milliseconds::Milliseconds()
44 : mMilliseconds(0) {}
45
Milliseconds(uint64_t milliseconds)46 constexpr Milliseconds::Milliseconds(uint64_t milliseconds)
47 : mMilliseconds(milliseconds) {}
48
Milliseconds(Nanoseconds nanoseconds)49 constexpr Milliseconds::Milliseconds(Nanoseconds nanoseconds)
50 : mMilliseconds(
51 nanoseconds.toRawNanoseconds() / kOneMillisecondInNanoseconds) {}
52
toRawNanoseconds()53 constexpr uint64_t Milliseconds::toRawNanoseconds() const {
54 // Perform the simple unit conversion. Warning: overflow is caught and
55 // handled by returning UINT64_MAX. A ternary expression is used because
56 // constexpr requires it.
57 return (mMilliseconds > (UINT64_MAX / kOneMillisecondInNanoseconds))
58 ? UINT64_MAX : mMilliseconds * kOneMillisecondInNanoseconds;
59 }
60
getMicroseconds()61 constexpr uint64_t Milliseconds::getMicroseconds() const {
62 // Perform the simple unit conversion. Warning: overflow is caught and
63 // handled by returning UINT64_MAX. A ternary expression is used because
64 // constexpr requires it.
65 return (mMilliseconds > (UINT64_MAX / kOneMillisecondInMicroseconds))
66 ? UINT64_MAX : mMilliseconds * kOneMillisecondInMicroseconds ;
67 }
68
getMilliseconds()69 constexpr uint64_t Milliseconds::getMilliseconds() const {
70 return mMilliseconds;
71 }
72
73 constexpr bool Milliseconds::operator==(const Milliseconds& millis) const {
74 return (mMilliseconds == millis.mMilliseconds);
75 }
76
Microseconds(uint64_t microseconds)77 constexpr Microseconds::Microseconds(uint64_t microseconds)
78 : mMicroseconds(microseconds) {}
79
Microseconds(Nanoseconds nanoseconds)80 constexpr Microseconds::Microseconds(Nanoseconds nanoseconds)
81 : mMicroseconds(
82 nanoseconds.toRawNanoseconds() / kOneMicrosecondInNanoseconds) {}
83
toRawNanoseconds()84 constexpr uint64_t Microseconds::toRawNanoseconds() const {
85 // Perform the simple unit conversion. Warning: overflow is caught and
86 // handled by returning UINT64_MAX. A ternary expression is used because
87 // constexpr requires it.
88 return (mMicroseconds > (UINT64_MAX / kOneMicrosecondInNanoseconds))
89 ? UINT64_MAX : mMicroseconds * kOneMicrosecondInNanoseconds;
90 }
91
getMicroseconds()92 constexpr uint64_t Microseconds::getMicroseconds() const {
93 return mMicroseconds;
94 }
95
getMilliseconds()96 constexpr uint64_t Microseconds::getMilliseconds() const {
97 return (mMicroseconds / kOneMillisecondInMicroseconds);
98 }
99
Nanoseconds()100 constexpr Nanoseconds::Nanoseconds()
101 : mNanoseconds(0) {}
102
Nanoseconds(uint64_t nanoseconds)103 constexpr Nanoseconds::Nanoseconds(uint64_t nanoseconds)
104 : mNanoseconds(nanoseconds) {}
105
Nanoseconds(Seconds seconds)106 constexpr Nanoseconds::Nanoseconds(Seconds seconds)
107 : mNanoseconds(seconds.toRawNanoseconds()) {}
108
Nanoseconds(Milliseconds milliseconds)109 constexpr Nanoseconds::Nanoseconds(Milliseconds milliseconds)
110 : mNanoseconds(milliseconds.toRawNanoseconds()) {}
111
Nanoseconds(Microseconds microseconds)112 constexpr Nanoseconds::Nanoseconds(Microseconds microseconds)
113 : mNanoseconds(microseconds.toRawNanoseconds()) {}
114
toRawNanoseconds()115 constexpr uint64_t Nanoseconds::toRawNanoseconds() const {
116 return mNanoseconds;
117 }
118
119 constexpr bool Nanoseconds::operator==(const Nanoseconds& nanos) const {
120 return (mNanoseconds == nanos.mNanoseconds);
121 }
122
123 constexpr bool Nanoseconds::operator!=(const Nanoseconds& nanos) const {
124 return !(mNanoseconds == nanos.mNanoseconds);
125 }
126
127 constexpr Nanoseconds operator+(const Seconds& secs, const Nanoseconds& nanos) {
128 return Nanoseconds(secs.toRawNanoseconds() + nanos.toRawNanoseconds());
129 }
130
131 constexpr Nanoseconds operator+(const Nanoseconds& nanos_a,
132 const Nanoseconds& nanos_b) {
133 return Nanoseconds(nanos_a.toRawNanoseconds() + nanos_b.toRawNanoseconds());
134 }
135
136 constexpr Nanoseconds operator-(const Nanoseconds& nanos_a,
137 const Nanoseconds& nanos_b) {
138 return Nanoseconds(nanos_a.toRawNanoseconds() - nanos_b.toRawNanoseconds());
139 }
140
141 constexpr bool operator>=(const Nanoseconds& nanos_a,
142 const Nanoseconds& nanos_b) {
143 return nanos_a.toRawNanoseconds() >= nanos_b.toRawNanoseconds();
144 }
145
146 constexpr bool operator<=(const Nanoseconds& nanos_a,
147 const Nanoseconds& nanos_b) {
148 return nanos_a.toRawNanoseconds() <= nanos_b.toRawNanoseconds();
149 }
150
151 constexpr bool operator<(const Nanoseconds& nanos_a,
152 const Nanoseconds& nanos_b) {
153 return nanos_a.toRawNanoseconds() < nanos_b.toRawNanoseconds();
154 }
155
156 constexpr bool operator>(const Nanoseconds& nanos_a,
157 const Nanoseconds& nanos_b) {
158 return nanos_a.toRawNanoseconds() > nanos_b.toRawNanoseconds();
159 }
160
161 } // namespace chre
162
163 #endif // CHRE_UTIL_TIME_IMPL_H_
164