| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #pragma once |
| |
| #include <stdint.h> |
| #include <ostream> |
| #include "timer.h" |
| |
| namespace overnet { |
| |
| class Bandwidth { |
| public: |
| constexpr static Bandwidth Zero() { return Bandwidth(0); } |
| |
| constexpr static Bandwidth FromBitsPerSecond(uint64_t bits_per_second) { |
| return Bandwidth(bits_per_second); |
| } |
| |
| constexpr static Bandwidth BytesPerTime(uint64_t bytes, TimeDelta delta) { |
| return FromBitsPerSecond(8000000 * bytes / delta.as_us()); |
| } |
| |
| constexpr static Bandwidth FromKilobitsPerSecond( |
| uint64_t kilobits_per_second) { |
| return FromBitsPerSecond(kilobits_per_second * 1000); |
| } |
| |
| constexpr TimeDelta SendTimeForBytes(uint64_t bytes) const { |
| return TimeDelta::FromMicroseconds(8000000 * bytes / bits_per_second_); |
| } |
| |
| constexpr uint64_t BytesSentForTime(TimeDelta time) const { |
| return bits_per_second_ * time.as_us() / 8000000; |
| } |
| |
| constexpr uint64_t bits_per_second() const { return bits_per_second_; } |
| |
| private: |
| constexpr Bandwidth(uint64_t bits_per_second) |
| : bits_per_second_(bits_per_second) {} |
| |
| uint64_t bits_per_second_; |
| }; |
| |
| inline bool operator>(Bandwidth a, Bandwidth b) { |
| return a.bits_per_second() > b.bits_per_second(); |
| } |
| |
| inline bool operator>=(Bandwidth a, Bandwidth b) { |
| return a.bits_per_second() >= b.bits_per_second(); |
| } |
| |
| inline bool operator<(Bandwidth a, Bandwidth b) { |
| return a.bits_per_second() < b.bits_per_second(); |
| } |
| |
| inline bool operator<=(Bandwidth a, Bandwidth b) { |
| return a.bits_per_second() <= b.bits_per_second(); |
| } |
| |
| inline bool operator==(Bandwidth a, Bandwidth b) { |
| return a.bits_per_second() == b.bits_per_second(); |
| } |
| |
| inline std::ostream& operator<<(std::ostream& out, Bandwidth b) { |
| uint64_t bits_per_second = b.bits_per_second(); |
| if (bits_per_second < 1000) { |
| out << bits_per_second << "bps"; |
| } else if (bits_per_second < 1000000) { |
| out << (bits_per_second / 1000.0) << "Kbps"; |
| } else { |
| out << (bits_per_second / 1000000.0) << "Mbps"; |
| } |
| return out; |
| } |
| |
| } // namespace overnet |