Home | History | Annotate | Download | only in util
      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