// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "net/quic/quic_bandwidth.h"
#include "base/logging.h"
#include "base/time/time.h"
namespace net {
// Highest number that QuicBandwidth can hold.
const int64 kQuicInfiniteBandwidth = GG_INT64_C(0x7fffffffffffffff);
// static
QuicBandwidth QuicBandwidth::Zero() {
return QuicBandwidth(0);
}
// static
QuicBandwidth QuicBandwidth::FromBitsPerSecond(int64 bits_per_second) {
return QuicBandwidth(bits_per_second);
}
// static
QuicBandwidth QuicBandwidth::FromKBitsPerSecond(int64 k_bits_per_second) {
DCHECK(k_bits_per_second < kQuicInfiniteBandwidth / 1000);
return QuicBandwidth(k_bits_per_second * 1000);
}
// static
QuicBandwidth QuicBandwidth::FromBytesPerSecond(int64 bytes_per_second) {
DCHECK(bytes_per_second < kQuicInfiniteBandwidth / 8);
return QuicBandwidth(bytes_per_second * 8);
}
// static
QuicBandwidth QuicBandwidth::FromKBytesPerSecond(int64 k_bytes_per_second) {
DCHECK(k_bytes_per_second < kQuicInfiniteBandwidth / 8000);
return QuicBandwidth(k_bytes_per_second * 8000);
}
// static
QuicBandwidth QuicBandwidth::FromBytesAndTimeDelta(QuicByteCount bytes,
QuicTime::Delta delta) {
DCHECK_LT(bytes,
static_cast<uint64>(kQuicInfiniteBandwidth /
(8 * base::Time::kMicrosecondsPerSecond)));
int64 bytes_per_second = (bytes * base::Time::kMicrosecondsPerSecond) /
delta.ToMicroseconds();
return QuicBandwidth(bytes_per_second * 8);
}
QuicBandwidth::QuicBandwidth(int64 bits_per_second)
: bits_per_second_(bits_per_second) {
DCHECK_GE(bits_per_second, 0);
}
int64 QuicBandwidth::ToBitsPerSecond() const {
return bits_per_second_;
}
int64 QuicBandwidth::ToKBitsPerSecond() const {
return bits_per_second_ / 1000;
}
int64 QuicBandwidth::ToBytesPerSecond() const {
return bits_per_second_ / 8;
}
int64 QuicBandwidth::ToKBytesPerSecond() const {
return bits_per_second_ / 8000;
}
QuicByteCount QuicBandwidth::ToBytesPerPeriod(
QuicTime::Delta time_period) const {
return ToBytesPerSecond() * time_period.ToMicroseconds() /
base::Time::kMicrosecondsPerSecond;
}
int64 QuicBandwidth::ToKBytesPerPeriod(QuicTime::Delta time_period) const {
return ToKBytesPerSecond() * time_period.ToMicroseconds() /
base::Time::kMicrosecondsPerSecond;
}
bool QuicBandwidth::IsZero() const {
return (bits_per_second_ == 0);
}
QuicBandwidth QuicBandwidth::Add(const QuicBandwidth& delta) const {
return QuicBandwidth(bits_per_second_ + delta.bits_per_second_);
}
QuicBandwidth QuicBandwidth::Subtract(const QuicBandwidth& delta) const {
return QuicBandwidth(bits_per_second_ - delta.bits_per_second_);
}
QuicBandwidth QuicBandwidth::Scale(float scale_factor) const {
return QuicBandwidth(bits_per_second_ * scale_factor);
}
QuicTime::Delta QuicBandwidth::TransferTime(QuicByteCount bytes) const {
return QuicTime::Delta::FromMicroseconds(
bytes * 8 * base::Time::kMicrosecondsPerSecond / bits_per_second_);
}
} // namespace net