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 24 constexpr Seconds::Seconds(uint64_t seconds) 25 : mSeconds(seconds) {} 26 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 35 constexpr Milliseconds::Milliseconds() 36 : mMilliseconds(0) {} 37 38 constexpr Milliseconds::Milliseconds(uint64_t milliseconds) 39 : mMilliseconds(milliseconds) {} 40 41 constexpr Milliseconds::Milliseconds(Nanoseconds nanoseconds) 42 : mMilliseconds( 43 nanoseconds.toRawNanoseconds() / kOneMillisecondInNanoseconds) {} 44 45 constexpr 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 53 constexpr uint64_t Milliseconds::getMicroseconds() const { 54 return mMilliseconds * kOneMillisecondInMicroseconds; 55 } 56 57 constexpr uint64_t Milliseconds::getMilliseconds() const { 58 return mMilliseconds; 59 } 60 61 constexpr bool Milliseconds::operator==(const Milliseconds& millis) const { 62 return (mMilliseconds == millis.mMilliseconds); 63 } 64 65 constexpr Microseconds::Microseconds(uint64_t microseconds) 66 : mMicroseconds(microseconds) {} 67 68 constexpr Microseconds::Microseconds(Nanoseconds nanoseconds) 69 : mMicroseconds( 70 nanoseconds.toRawNanoseconds() / kOneMicrosecondInNanoseconds) {} 71 72 constexpr 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 80 constexpr uint64_t Microseconds::getMicroseconds() const { 81 return mMicroseconds; 82 } 83 84 constexpr uint64_t Microseconds::getMilliseconds() const { 85 return (mMicroseconds / kOneMillisecondInMicroseconds); 86 } 87 88 constexpr Nanoseconds::Nanoseconds() 89 : mNanoseconds(0) {} 90 91 constexpr Nanoseconds::Nanoseconds(uint64_t nanoseconds) 92 : mNanoseconds(nanoseconds) {} 93 94 constexpr Nanoseconds::Nanoseconds(Seconds seconds) 95 : mNanoseconds(seconds.toRawNanoseconds()) {} 96 97 constexpr Nanoseconds::Nanoseconds(Milliseconds milliseconds) 98 : mNanoseconds(milliseconds.toRawNanoseconds()) {} 99 100 constexpr Nanoseconds::Nanoseconds(Microseconds microseconds) 101 : mNanoseconds(microseconds.toRawNanoseconds()) {} 102 103 constexpr uint64_t Nanoseconds::toRawNanoseconds() const { 104 return mNanoseconds; 105 } 106 107 constexpr bool Nanoseconds::operator==(const Nanoseconds& nanos) const { 108 return (mNanoseconds == nanos.mNanoseconds); 109 } 110 111 constexpr bool Nanoseconds::operator!=(const Nanoseconds& nanos) const { 112 return !(mNanoseconds == nanos.mNanoseconds); 113 } 114 115 constexpr Nanoseconds operator+(const Seconds& secs, const Nanoseconds& nanos) { 116 return Nanoseconds(secs.toRawNanoseconds() + nanos.toRawNanoseconds()); 117 } 118 119 constexpr Nanoseconds operator+(const Nanoseconds& nanos_a, 120 const Nanoseconds& nanos_b) { 121 return Nanoseconds(nanos_a.toRawNanoseconds() + nanos_b.toRawNanoseconds()); 122 } 123 124 constexpr Nanoseconds operator-(const Nanoseconds& nanos_a, 125 const Nanoseconds& nanos_b) { 126 return Nanoseconds(nanos_a.toRawNanoseconds() - nanos_b.toRawNanoseconds()); 127 } 128 129 constexpr bool operator>=(const Nanoseconds& nanos_a, 130 const Nanoseconds& nanos_b) { 131 return nanos_a.toRawNanoseconds() >= nanos_b.toRawNanoseconds(); 132 } 133 134 constexpr bool operator<=(const Nanoseconds& nanos_a, 135 const Nanoseconds& nanos_b) { 136 return nanos_a.toRawNanoseconds() <= nanos_b.toRawNanoseconds(); 137 } 138 139 constexpr bool operator<(const Nanoseconds& nanos_a, 140 const Nanoseconds& nanos_b) { 141 return nanos_a.toRawNanoseconds() < nanos_b.toRawNanoseconds(); 142 } 143 144 constexpr 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