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