blob: 6e6804b2a29547ec73bafb4aeb1d2e25219a999d [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// 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
rchf1c9d562019-03-21 07:49:38 -07005#include <algorithm>
6
QUICHE teama6ef0a62019-03-07 20:34:33 -05007#include "net/third_party/quiche/src/quic/core/quic_packet_number.h"
8
9namespace quic {
10
QUICHE teama6ef0a62019-03-07 20:34:33 -050011void QuicPacketNumber::Clear() {
12 packet_number_ = UninitializedPacketNumber();
13}
14
QUICHE teamc264e362019-03-19 14:21:06 -070015void QuicPacketNumber::UpdateMax(QuicPacketNumber new_value) {
16 if (!new_value.IsInitialized()) {
17 return;
18 }
19 if (!IsInitialized()) {
20 packet_number_ = new_value.ToUint64();
21 } else {
22 packet_number_ = std::max(packet_number_, new_value.ToUint64());
23 }
24}
25
QUICHE teama6ef0a62019-03-07 20:34:33 -050026uint64_t QuicPacketNumber::Hash() const {
27 DCHECK(IsInitialized());
28 return packet_number_;
29}
30
31uint64_t QuicPacketNumber::ToUint64() const {
32 DCHECK(IsInitialized());
33 return packet_number_;
34}
35
36bool QuicPacketNumber::IsInitialized() const {
37 return packet_number_ != UninitializedPacketNumber();
38}
39
40QuicPacketNumber& QuicPacketNumber::operator++() {
41#ifndef NDEBUG
42 DCHECK(IsInitialized());
QUICHE team577718a2019-03-20 09:00:59 -070043 DCHECK_LT(ToUint64(), std::numeric_limits<uint64_t>::max() - 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -050044#endif
45 packet_number_++;
46 return *this;
47}
48
49QuicPacketNumber QuicPacketNumber::operator++(int) {
50#ifndef NDEBUG
51 DCHECK(IsInitialized());
QUICHE team577718a2019-03-20 09:00:59 -070052 DCHECK_LT(ToUint64(), std::numeric_limits<uint64_t>::max() - 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -050053#endif
54 QuicPacketNumber previous(*this);
55 packet_number_++;
56 return previous;
57}
58
59QuicPacketNumber& QuicPacketNumber::operator--() {
60#ifndef NDEBUG
61 DCHECK(IsInitialized());
QUICHE team577718a2019-03-20 09:00:59 -070062 DCHECK_GE(ToUint64(), 1UL);
QUICHE teama6ef0a62019-03-07 20:34:33 -050063#endif
64 packet_number_--;
65 return *this;
66}
67
68QuicPacketNumber QuicPacketNumber::operator--(int) {
69#ifndef NDEBUG
70 DCHECK(IsInitialized());
QUICHE team577718a2019-03-20 09:00:59 -070071 DCHECK_GE(ToUint64(), 1UL);
QUICHE teama6ef0a62019-03-07 20:34:33 -050072#endif
73 QuicPacketNumber previous(*this);
74 packet_number_--;
75 return previous;
76}
77
78QuicPacketNumber& QuicPacketNumber::operator+=(uint64_t delta) {
79#ifndef NDEBUG
80 DCHECK(IsInitialized());
QUICHE team577718a2019-03-20 09:00:59 -070081 DCHECK_GT(std::numeric_limits<uint64_t>::max() - ToUint64(), delta);
QUICHE teama6ef0a62019-03-07 20:34:33 -050082#endif
83 packet_number_ += delta;
84 return *this;
85}
86
87QuicPacketNumber& QuicPacketNumber::operator-=(uint64_t delta) {
88#ifndef NDEBUG
89 DCHECK(IsInitialized());
QUICHE team577718a2019-03-20 09:00:59 -070090 DCHECK_GE(ToUint64(), delta);
QUICHE teama6ef0a62019-03-07 20:34:33 -050091#endif
92 packet_number_ -= delta;
93 return *this;
94}
95
96std::ostream& operator<<(std::ostream& os, const QuicPacketNumber& p) {
97 if (p.IsInitialized()) {
98 os << p.packet_number_;
99 } else {
100 os << "uninitialized";
101 }
102 return os;
103}
104
QUICHE teama6ef0a62019-03-07 20:34:33 -0500105} // namespace quic