time_impl.h revision 47f3b5ab767b77f42f66ae7be3a9d5f6a82340a9
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
22namespace chre {
23
24constexpr Seconds::Seconds(uint64_t seconds)
25    : mSeconds(seconds) {}
26
27constexpr 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
35constexpr Milliseconds::Milliseconds()
36    : mMilliseconds(0) {}
37
38constexpr Milliseconds::Milliseconds(uint64_t milliseconds)
39    : mMilliseconds(milliseconds) {}
40
41constexpr Milliseconds::Milliseconds(Nanoseconds nanoseconds)
42    : mMilliseconds(
43        nanoseconds.toRawNanoseconds() / kOneMillisecondInNanoseconds) {}
44
45constexpr uint64_t Milliseconds::toRawNanoseconds() const {
46  // Perform the simple unit conversion. Warning: overflow is caught and
47  // handled by returning UINT64_MAX. A ternary expression is used because
48  // constexpr requires it.
49  return (mMilliseconds > (UINT64_MAX / kOneMillisecondInNanoseconds))
50      ? UINT64_MAX : mMilliseconds * kOneMillisecondInNanoseconds;
51}
52
53constexpr uint64_t Milliseconds::getMicroseconds() const {
54  return mMilliseconds * kOneMillisecondInMicroseconds;
55}
56
57constexpr uint64_t Milliseconds::getMilliseconds() const {
58  return mMilliseconds;
59}
60
61constexpr bool Milliseconds::operator==(const Milliseconds& millis) const {
62  return (mMilliseconds == millis.mMilliseconds);
63}
64
65constexpr Microseconds::Microseconds(uint64_t microseconds)
66    : mMicroseconds(microseconds) {}
67
68constexpr Microseconds::Microseconds(Nanoseconds nanoseconds)
69    : mMicroseconds(
70        nanoseconds.toRawNanoseconds() / kOneMicrosecondInNanoseconds) {}
71
72constexpr uint64_t Microseconds::toRawNanoseconds() const {
73  // Perform the simple unit conversion. Warning: overflow is caught and
74  // handled by returning UINT64_MAX. A ternary expression is used because
75  // constexpr requires it.
76  return (mMicroseconds > (UINT64_MAX / kOneMicrosecondInNanoseconds))
77      ? UINT64_MAX : mMicroseconds * kOneMicrosecondInNanoseconds;
78}
79
80constexpr uint64_t Microseconds::getMicroseconds() const {
81  return mMicroseconds;
82}
83
84constexpr uint64_t Microseconds::getMilliseconds() const {
85  return (mMicroseconds / kOneMillisecondInMicroseconds);
86}
87
88constexpr Nanoseconds::Nanoseconds()
89    : mNanoseconds(0) {}
90
91constexpr Nanoseconds::Nanoseconds(uint64_t nanoseconds)
92    : mNanoseconds(nanoseconds) {}
93
94constexpr Nanoseconds::Nanoseconds(Seconds seconds)
95    : mNanoseconds(seconds.toRawNanoseconds()) {}
96
97constexpr Nanoseconds::Nanoseconds(Milliseconds milliseconds)
98    : mNanoseconds(milliseconds.toRawNanoseconds()) {}
99
100constexpr Nanoseconds::Nanoseconds(Microseconds microseconds)
101    : mNanoseconds(microseconds.toRawNanoseconds()) {}
102
103constexpr uint64_t Nanoseconds::toRawNanoseconds() const {
104  return mNanoseconds;
105}
106
107constexpr bool Nanoseconds::operator==(const Nanoseconds& nanos) const {
108  return (mNanoseconds == nanos.mNanoseconds);
109}
110
111constexpr bool Nanoseconds::operator!=(const Nanoseconds& nanos) const {
112  return !(mNanoseconds == nanos.mNanoseconds);
113}
114
115constexpr Nanoseconds operator+(const Seconds& secs, const Nanoseconds& nanos) {
116  return Nanoseconds(secs.toRawNanoseconds() + nanos.toRawNanoseconds());
117}
118
119constexpr Nanoseconds operator+(const Nanoseconds& nanos_a,
120                                const Nanoseconds& nanos_b) {
121  return Nanoseconds(nanos_a.toRawNanoseconds() + nanos_b.toRawNanoseconds());
122}
123
124constexpr Nanoseconds operator-(const Nanoseconds& nanos_a,
125                                const Nanoseconds& nanos_b) {
126  return Nanoseconds(nanos_a.toRawNanoseconds() - nanos_b.toRawNanoseconds());
127}
128
129constexpr bool operator>=(const Nanoseconds& nanos_a,
130                          const Nanoseconds& nanos_b) {
131  return nanos_a.toRawNanoseconds() >= nanos_b.toRawNanoseconds();
132}
133
134constexpr bool operator<=(const Nanoseconds& nanos_a,
135                          const Nanoseconds& nanos_b) {
136  return nanos_a.toRawNanoseconds() <= nanos_b.toRawNanoseconds();
137}
138
139constexpr bool operator<(const Nanoseconds& nanos_a,
140                         const Nanoseconds& nanos_b) {
141  return nanos_a.toRawNanoseconds() < nanos_b.toRawNanoseconds();
142}
143
144constexpr bool operator>(const Nanoseconds& nanos_a,
145                         const Nanoseconds& nanos_b) {
146  return nanos_a.toRawNanoseconds() > nanos_b.toRawNanoseconds();
147}
148
149}  // namespace chre
150
151#endif  // CHRE_UTIL_TIME_IMPL_H_
152