quic/common/TimeUtil.h (47 lines of code) (raw):
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include <folly/Traits.h>
#include <quic/QuicConstants.h>
#include <chrono>
#include <utility>
namespace quic {
// Base cases for time min and max.
template <class T>
T timeMin(T&& arg) {
return arg;
}
template <class T>
T timeMax(T&& arg) {
return arg;
}
/**
* Returns the min of all the types that are passed in
*/
template <class T1, class... Args>
folly::remove_cvref_t<T1> timeMin(T1&& arg1, Args&&... args) {
auto min = timeMin(std::forward<Args>(args)...);
if (arg1 < min) {
return arg1;
}
return min;
}
/**
* Returns the max of all the types that are passed in
*/
template <class T1, class... Args>
folly::remove_cvref_t<T1> timeMax(T1&& arg1, Args&&... args) {
auto max = timeMax(std::forward<Args>(args)...);
if (arg1 > max) {
return arg1;
}
return max;
}
template <typename T>
bool timePointInitialized(const T& time) {
static T epoch;
return time > epoch;
}
template <typename ClockType = std::chrono::steady_clock>
inline std::chrono::milliseconds millisecondsBetween(
std::chrono::time_point<ClockType> finish,
std::chrono::time_point<ClockType> start) {
return std::chrono::duration_cast<std::chrono::milliseconds>(finish - start);
}
template <typename ClockType = std::chrono::steady_clock>
inline std::chrono::milliseconds millisecondsSince(
std::chrono::time_point<ClockType> t) {
return millisecondsBetween(ClockType::now(), t);
}
} // namespace quic