xref: /aosp_15_r20/system/libbase/include/android-base/chrono_utils.h (revision 8f0ba417480079999ba552f1087ae592091b9d02)
1*8f0ba417SAndroid Build Coastguard Worker /*
2*8f0ba417SAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*8f0ba417SAndroid Build Coastguard Worker  *
4*8f0ba417SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*8f0ba417SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*8f0ba417SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*8f0ba417SAndroid Build Coastguard Worker  *
8*8f0ba417SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*8f0ba417SAndroid Build Coastguard Worker  *
10*8f0ba417SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*8f0ba417SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*8f0ba417SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*8f0ba417SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*8f0ba417SAndroid Build Coastguard Worker  * limitations under the License.
15*8f0ba417SAndroid Build Coastguard Worker  */
16*8f0ba417SAndroid Build Coastguard Worker 
17*8f0ba417SAndroid Build Coastguard Worker #pragma once
18*8f0ba417SAndroid Build Coastguard Worker 
19*8f0ba417SAndroid Build Coastguard Worker #include <chrono>
20*8f0ba417SAndroid Build Coastguard Worker #include <sstream>
21*8f0ba417SAndroid Build Coastguard Worker 
22*8f0ba417SAndroid Build Coastguard Worker #if __cplusplus > 201103L && !defined(__WIN32)  // C++14
23*8f0ba417SAndroid Build Coastguard Worker using namespace std::chrono_literals;
24*8f0ba417SAndroid Build Coastguard Worker #endif
25*8f0ba417SAndroid Build Coastguard Worker 
26*8f0ba417SAndroid Build Coastguard Worker namespace android {
27*8f0ba417SAndroid Build Coastguard Worker namespace base {
28*8f0ba417SAndroid Build Coastguard Worker 
29*8f0ba417SAndroid Build Coastguard Worker // A std::chrono clock based on CLOCK_BOOTTIME.
30*8f0ba417SAndroid Build Coastguard Worker class boot_clock {
31*8f0ba417SAndroid Build Coastguard Worker  public:
32*8f0ba417SAndroid Build Coastguard Worker   typedef std::chrono::nanoseconds duration;
33*8f0ba417SAndroid Build Coastguard Worker   typedef std::chrono::time_point<boot_clock, duration> time_point;
34*8f0ba417SAndroid Build Coastguard Worker 
35*8f0ba417SAndroid Build Coastguard Worker   static time_point now();
36*8f0ba417SAndroid Build Coastguard Worker };
37*8f0ba417SAndroid Build Coastguard Worker 
38*8f0ba417SAndroid Build Coastguard Worker class Timer {
39*8f0ba417SAndroid Build Coastguard Worker  public:
Timer()40*8f0ba417SAndroid Build Coastguard Worker   Timer() : start_(boot_clock::now()) {}
41*8f0ba417SAndroid Build Coastguard Worker 
duration()42*8f0ba417SAndroid Build Coastguard Worker   std::chrono::milliseconds duration() const {
43*8f0ba417SAndroid Build Coastguard Worker     return std::chrono::duration_cast<std::chrono::milliseconds>(boot_clock::now() - start_);
44*8f0ba417SAndroid Build Coastguard Worker   }
45*8f0ba417SAndroid Build Coastguard Worker 
46*8f0ba417SAndroid Build Coastguard Worker  private:
47*8f0ba417SAndroid Build Coastguard Worker   boot_clock::time_point start_;
48*8f0ba417SAndroid Build Coastguard Worker };
49*8f0ba417SAndroid Build Coastguard Worker 
50*8f0ba417SAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& os, const Timer& t);
51*8f0ba417SAndroid Build Coastguard Worker 
52*8f0ba417SAndroid Build Coastguard Worker }  // namespace base
53*8f0ba417SAndroid Build Coastguard Worker }  // namespace android
54