xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/quic/core/quic_packet_number.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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()14 void QuicPacketNumber::Clear() { packet_number_ = UninitializedPacketNumber(); }
15 
UpdateMax(QuicPacketNumber new_value)16 void 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() const27 uint64_t QuicPacketNumber::Hash() const {
28   QUICHE_DCHECK(IsInitialized());
29   return packet_number_;
30 }
31 
ToUint64() const32 uint64_t QuicPacketNumber::ToUint64() const {
33   QUICHE_DCHECK(IsInitialized());
34   return packet_number_;
35 }
36 
IsInitialized() const37 bool QuicPacketNumber::IsInitialized() const {
38   return packet_number_ != UninitializedPacketNumber();
39 }
40 
operator ++()41 QuicPacketNumber& 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)50 QuicPacketNumber 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 --()60 QuicPacketNumber& 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)69 QuicPacketNumber 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)79 QuicPacketNumber& 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)88 QuicPacketNumber& 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() const97 std::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)104 std::ostream& operator<<(std::ostream& os, const QuicPacketNumber& p) {
105   os << p.ToString();
106   return os;
107 }
108 
109 }  // namespace quic
110