|  | // Copyright (c) 2019 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 "quic/core/quic_packet_number.h" | 
|  |  | 
|  | #include <algorithm> | 
|  | #include <limits> | 
|  |  | 
|  | #include "absl/strings/str_cat.h" | 
|  |  | 
|  | namespace quic { | 
|  |  | 
|  | void QuicPacketNumber::Clear() { | 
|  | packet_number_ = UninitializedPacketNumber(); | 
|  | } | 
|  |  | 
|  | void QuicPacketNumber::UpdateMax(QuicPacketNumber new_value) { | 
|  | if (!new_value.IsInitialized()) { | 
|  | return; | 
|  | } | 
|  | if (!IsInitialized()) { | 
|  | packet_number_ = new_value.ToUint64(); | 
|  | } else { | 
|  | packet_number_ = std::max(packet_number_, new_value.ToUint64()); | 
|  | } | 
|  | } | 
|  |  | 
|  | uint64_t QuicPacketNumber::Hash() const { | 
|  | QUICHE_DCHECK(IsInitialized()); | 
|  | return packet_number_; | 
|  | } | 
|  |  | 
|  | uint64_t QuicPacketNumber::ToUint64() const { | 
|  | QUICHE_DCHECK(IsInitialized()); | 
|  | return packet_number_; | 
|  | } | 
|  |  | 
|  | bool QuicPacketNumber::IsInitialized() const { | 
|  | return packet_number_ != UninitializedPacketNumber(); | 
|  | } | 
|  |  | 
|  | QuicPacketNumber& QuicPacketNumber::operator++() { | 
|  | #ifndef NDEBUG | 
|  | QUICHE_DCHECK(IsInitialized()); | 
|  | QUICHE_DCHECK_LT(ToUint64(), std::numeric_limits<uint64_t>::max() - 1); | 
|  | #endif | 
|  | packet_number_++; | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | QuicPacketNumber QuicPacketNumber::operator++(int) { | 
|  | #ifndef NDEBUG | 
|  | QUICHE_DCHECK(IsInitialized()); | 
|  | QUICHE_DCHECK_LT(ToUint64(), std::numeric_limits<uint64_t>::max() - 1); | 
|  | #endif | 
|  | QuicPacketNumber previous(*this); | 
|  | packet_number_++; | 
|  | return previous; | 
|  | } | 
|  |  | 
|  | QuicPacketNumber& QuicPacketNumber::operator--() { | 
|  | #ifndef NDEBUG | 
|  | QUICHE_DCHECK(IsInitialized()); | 
|  | QUICHE_DCHECK_GE(ToUint64(), 1UL); | 
|  | #endif | 
|  | packet_number_--; | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | QuicPacketNumber QuicPacketNumber::operator--(int) { | 
|  | #ifndef NDEBUG | 
|  | QUICHE_DCHECK(IsInitialized()); | 
|  | QUICHE_DCHECK_GE(ToUint64(), 1UL); | 
|  | #endif | 
|  | QuicPacketNumber previous(*this); | 
|  | packet_number_--; | 
|  | return previous; | 
|  | } | 
|  |  | 
|  | QuicPacketNumber& QuicPacketNumber::operator+=(uint64_t delta) { | 
|  | #ifndef NDEBUG | 
|  | QUICHE_DCHECK(IsInitialized()); | 
|  | QUICHE_DCHECK_GT(std::numeric_limits<uint64_t>::max() - ToUint64(), delta); | 
|  | #endif | 
|  | packet_number_ += delta; | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | QuicPacketNumber& QuicPacketNumber::operator-=(uint64_t delta) { | 
|  | #ifndef NDEBUG | 
|  | QUICHE_DCHECK(IsInitialized()); | 
|  | QUICHE_DCHECK_GE(ToUint64(), delta); | 
|  | #endif | 
|  | packet_number_ -= delta; | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | std::string QuicPacketNumber::ToString() const { | 
|  | if (!IsInitialized()) { | 
|  | return "uninitialized"; | 
|  | } | 
|  | return absl::StrCat(ToUint64()); | 
|  | } | 
|  |  | 
|  | std::ostream& operator<<(std::ostream& os, const QuicPacketNumber& p) { | 
|  | os << p.ToString(); | 
|  | return os; | 
|  | } | 
|  |  | 
|  | }  // namespace quic |