1 // Copyright (c) 2019 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "quiche/quic/core/quic_packet_number.h" 6 7 #include <algorithm> 8 #include <limits> 9 10 #include "absl/strings/str_cat.h" 11 12 namespace quic { 13 Clear()14void QuicPacketNumber::Clear() { packet_number_ = UninitializedPacketNumber(); } 15 UpdateMax(QuicPacketNumber new_value)16void QuicPacketNumber::UpdateMax(QuicPacketNumber new_value) { 17 if (!new_value.IsInitialized()) { 18 return; 19 } 20 if (!IsInitialized()) { 21 packet_number_ = new_value.ToUint64(); 22 } else { 23 packet_number_ = std::max(packet_number_, new_value.ToUint64()); 24 } 25 } 26 Hash() const27uint64_t QuicPacketNumber::Hash() const { 28 QUICHE_DCHECK(IsInitialized()); 29 return packet_number_; 30 } 31 ToUint64() const32uint64_t QuicPacketNumber::ToUint64() const { 33 QUICHE_DCHECK(IsInitialized()); 34 return packet_number_; 35 } 36 IsInitialized() const37bool QuicPacketNumber::IsInitialized() const { 38 return packet_number_ != UninitializedPacketNumber(); 39 } 40 operator ++()41QuicPacketNumber& QuicPacketNumber::operator++() { 42 #ifndef NDEBUG 43 QUICHE_DCHECK(IsInitialized()); 44 QUICHE_DCHECK_LT(ToUint64(), std::numeric_limits<uint64_t>::max() - 1); 45 #endif 46 packet_number_++; 47 return *this; 48 } 49 operator ++(int)50QuicPacketNumber QuicPacketNumber::operator++(int) { 51 #ifndef NDEBUG 52 QUICHE_DCHECK(IsInitialized()); 53 QUICHE_DCHECK_LT(ToUint64(), std::numeric_limits<uint64_t>::max() - 1); 54 #endif 55 QuicPacketNumber previous(*this); 56 packet_number_++; 57 return previous; 58 } 59 operator --()60QuicPacketNumber& QuicPacketNumber::operator--() { 61 #ifndef NDEBUG 62 QUICHE_DCHECK(IsInitialized()); 63 QUICHE_DCHECK_GE(ToUint64(), 1UL); 64 #endif 65 packet_number_--; 66 return *this; 67 } 68 operator --(int)69QuicPacketNumber QuicPacketNumber::operator--(int) { 70 #ifndef NDEBUG 71 QUICHE_DCHECK(IsInitialized()); 72 QUICHE_DCHECK_GE(ToUint64(), 1UL); 73 #endif 74 QuicPacketNumber previous(*this); 75 packet_number_--; 76 return previous; 77 } 78 operator +=(uint64_t delta)79QuicPacketNumber& QuicPacketNumber::operator+=(uint64_t delta) { 80 #ifndef NDEBUG 81 QUICHE_DCHECK(IsInitialized()); 82 QUICHE_DCHECK_GT(std::numeric_limits<uint64_t>::max() - ToUint64(), delta); 83 #endif 84 packet_number_ += delta; 85 return *this; 86 } 87 operator -=(uint64_t delta)88QuicPacketNumber& QuicPacketNumber::operator-=(uint64_t delta) { 89 #ifndef NDEBUG 90 QUICHE_DCHECK(IsInitialized()); 91 QUICHE_DCHECK_GE(ToUint64(), delta); 92 #endif 93 packet_number_ -= delta; 94 return *this; 95 } 96 ToString() const97std::string QuicPacketNumber::ToString() const { 98 if (!IsInitialized()) { 99 return "uninitialized"; 100 } 101 return absl::StrCat(ToUint64()); 102 } 103 operator <<(std::ostream & os,const QuicPacketNumber & p)104std::ostream& operator<<(std::ostream& os, const QuicPacketNumber& p) { 105 os << p.ToString(); 106 return os; 107 } 108 109 } // namespace quic 110