/* * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #ifndef API_UNITS_TIMESTAMP_H_ #define API_UNITS_TIMESTAMP_H_ #include #include #include #include "api/units/time_delta.h" #include "rtc_base/checks.h" namespace webrtc { namespace timestamp_impl { constexpr int64_t kPlusInfinityVal = std::numeric_limits::max(); constexpr int64_t kMinusInfinityVal = std::numeric_limits::min(); } // namespace timestamp_impl // Timestamp represents the time that has passed since some unspecified epoch. // The epoch is assumed to be before any represented timestamps, this means that // negative values are not valid. The most notable feature is that the // difference of two Timestamps results in a TimeDelta. class Timestamp { public: Timestamp() = delete; static Timestamp Infinity() { return Timestamp(timestamp_impl::kPlusInfinityVal); } static Timestamp seconds(int64_t seconds) { return Timestamp::us(seconds * 1000000); } static Timestamp ms(int64_t millis) { return Timestamp::us(millis * 1000); } static Timestamp us(int64_t micros) { RTC_DCHECK_GE(micros, 0); return Timestamp(micros); } int64_t seconds() const { return (us() + 500000) / 1000000; } int64_t ms() const { return (us() + 500) / 1000; } int64_t us() const { RTC_DCHECK(IsFinite()); return microseconds_; } double SecondsAsDouble() const; bool IsInfinite() const { return microseconds_ == timestamp_impl::kPlusInfinityVal; } bool IsFinite() const { return !IsInfinite(); } TimeDelta operator-(const Timestamp& other) const { return TimeDelta::us(us() - other.us()); } Timestamp operator-(const TimeDelta& delta) const { return Timestamp::us(us() - delta.us()); } Timestamp operator+(const TimeDelta& delta) const { return Timestamp::us(us() + delta.us()); } Timestamp& operator-=(const TimeDelta& other) { microseconds_ -= other.us(); return *this; } Timestamp& operator+=(const TimeDelta& other) { microseconds_ += other.us(); return *this; } bool operator==(const Timestamp& other) const { return microseconds_ == other.microseconds_; } bool operator!=(const Timestamp& other) const { return microseconds_ != other.microseconds_; } bool operator<=(const Timestamp& other) const { return us() <= other.us(); } bool operator>=(const Timestamp& other) const { return us() >= other.us(); } bool operator>(const Timestamp& other) const { return us() > other.us(); } bool operator<(const Timestamp& other) const { return us() < other.us(); } private: explicit Timestamp(int64_t us) : microseconds_(us) {} int64_t microseconds_; }; std::string ToString(const Timestamp& value); } // namespace webrtc #endif // API_UNITS_TIMESTAMP_H_