webrtc/api/units/timestamp.h
Sebastian Jansson 6fae6ec2ee Moves network unit types to API.
This prepares for being able to inject network congestion controllers.
And makes it easier to use the units in other parts of the code.

Bug: webrtc:9155
Change-Id: Ib8f9c1c97b06d791a01c3376046933d576ae46f9
Reviewed-on: https://webrtc-review.googlesource.com/70201
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Commit-Queue: Sebastian Jansson <srte@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#23168}
2018-05-08 11:46:22 +00:00

95 lines
3.1 KiB
C++

/*
* 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 <stdint.h>
#include <limits>
#include <string>
#include "api/units/time_delta.h"
#include "rtc_base/checks.h"
namespace webrtc {
namespace timestamp_impl {
constexpr int64_t kPlusInfinityVal = std::numeric_limits<int64_t>::max();
constexpr int64_t kMinusInfinityVal = std::numeric_limits<int64_t>::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_