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