| OLD | NEW |
| 1 // Copyright (c) 2017 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef NET_QUIC_CORE_PACKET_NUMBER_INDEXED_QUEUE_H_ | 5 #ifndef NET_QUIC_CORE_PACKET_NUMBER_INDEXED_QUEUE_H_ |
| 6 #define NET_QUIC_CORE_PACKET_NUMBER_INDEXED_QUEUE_H_ | 6 #define NET_QUIC_CORE_PACKET_NUMBER_INDEXED_QUEUE_H_ |
| 7 | 7 |
| 8 #include <deque> | 8 #include <deque> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 // as one. | 35 // as one. |
| 36 template <typename T> | 36 template <typename T> |
| 37 class PacketNumberIndexedQueue { | 37 class PacketNumberIndexedQueue { |
| 38 public: | 38 public: |
| 39 PacketNumberIndexedQueue() | 39 PacketNumberIndexedQueue() |
| 40 : number_of_present_entries_(0), first_packet_(0) {} | 40 : number_of_present_entries_(0), first_packet_(0) {} |
| 41 | 41 |
| 42 // Retrieve the entry associated with the packet number. Returns the pointer | 42 // Retrieve the entry associated with the packet number. Returns the pointer |
| 43 // to the entry in case of success, or nullptr if the entry does not exist. | 43 // to the entry in case of success, or nullptr if the entry does not exist. |
| 44 T* GetEntry(QuicPacketNumber packet_number); | 44 T* GetEntry(QuicPacketNumber packet_number); |
| 45 const T* GetEntry(QuicPacketNumber packet_number) const; |
| 45 | 46 |
| 46 // Inserts data associated |packet_number| into (or past) the end of the | 47 // Inserts data associated |packet_number| into (or past) the end of the |
| 47 // queue, filling up the missing intermediate entries as necessary. Returns | 48 // queue, filling up the missing intermediate entries as necessary. Returns |
| 48 // true if the element has been inserted successfully, false if it was already | 49 // true if the element has been inserted successfully, false if it was already |
| 49 // in the queue or inserted out of order. | 50 // in the queue or inserted out of order. |
| 50 template <typename... Args> | 51 template <typename... Args> |
| 51 bool Emplace(QuicPacketNumber packet_number, Args&&... args); | 52 bool Emplace(QuicPacketNumber packet_number, Args&&... args); |
| 52 | 53 |
| 53 // Removes data associated with |packet_number| and frees the slots in the | 54 // Removes data associated with |packet_number| and frees the slots in the |
| 54 // queue as necessary. | 55 // queue as necessary. |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 EntryWrapper() : data(), present(false) {} | 88 EntryWrapper() : data(), present(false) {} |
| 88 | 89 |
| 89 template <typename... Args> | 90 template <typename... Args> |
| 90 explicit EntryWrapper(Args&&... args) | 91 explicit EntryWrapper(Args&&... args) |
| 91 : data(std::forward<Args>(args)...), present(true) {} | 92 : data(std::forward<Args>(args)...), present(true) {} |
| 92 }; | 93 }; |
| 93 | 94 |
| 94 // Cleans up unused slots in the front after removing an element. | 95 // Cleans up unused slots in the front after removing an element. |
| 95 void Cleanup(); | 96 void Cleanup(); |
| 96 | 97 |
| 97 EntryWrapper* GetEntryWrapper(QuicPacketNumber offset); | 98 const EntryWrapper* GetEntryWrapper(QuicPacketNumber offset) const; |
| 99 EntryWrapper* GetEntryWrapper(QuicPacketNumber offset) { |
| 100 const auto* const_this = this; |
| 101 return const_cast<EntryWrapper*>(const_this->GetEntryWrapper(offset)); |
| 102 } |
| 98 | 103 |
| 99 std::deque<EntryWrapper> entries_; | 104 std::deque<EntryWrapper> entries_; |
| 100 size_t number_of_present_entries_; | 105 size_t number_of_present_entries_; |
| 101 QuicPacketNumber first_packet_; | 106 QuicPacketNumber first_packet_; |
| 102 }; | 107 }; |
| 103 | 108 |
| 104 template <typename T> | 109 template <typename T> |
| 105 T* PacketNumberIndexedQueue<T>::GetEntry(QuicPacketNumber packet_number) { | 110 T* PacketNumberIndexedQueue<T>::GetEntry(QuicPacketNumber packet_number) { |
| 106 EntryWrapper* entry = GetEntryWrapper(packet_number); | 111 EntryWrapper* entry = GetEntryWrapper(packet_number); |
| 107 if (entry == nullptr) { | 112 if (entry == nullptr) { |
| 108 return nullptr; | 113 return nullptr; |
| 109 } | 114 } |
| 110 return &entry->data; | 115 return &entry->data; |
| 111 } | 116 } |
| 112 | 117 |
| 113 template <typename T> | 118 template <typename T> |
| 119 const T* PacketNumberIndexedQueue<T>::GetEntry( |
| 120 QuicPacketNumber packet_number) const { |
| 121 const EntryWrapper* entry = GetEntryWrapper(packet_number); |
| 122 if (entry == nullptr) { |
| 123 return nullptr; |
| 124 } |
| 125 return &entry->data; |
| 126 } |
| 127 |
| 128 template <typename T> |
| 114 template <typename... Args> | 129 template <typename... Args> |
| 115 bool PacketNumberIndexedQueue<T>::Emplace(QuicPacketNumber packet_number, | 130 bool PacketNumberIndexedQueue<T>::Emplace(QuicPacketNumber packet_number, |
| 116 Args&&... args) { | 131 Args&&... args) { |
| 117 if (IsEmpty()) { | 132 if (IsEmpty()) { |
| 118 DCHECK(entries_.empty()); | 133 DCHECK(entries_.empty()); |
| 119 DCHECK_EQ(0u, first_packet_); | 134 DCHECK_EQ(0u, first_packet_); |
| 120 | 135 |
| 121 entries_.emplace_back(std::forward<Args>(args)...); | 136 entries_.emplace_back(std::forward<Args>(args)...); |
| 122 number_of_present_entries_ = 1; | 137 number_of_present_entries_ = 1; |
| 123 first_packet_ = packet_number; | 138 first_packet_ = packet_number; |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 161 while (!entries_.empty() && !entries_.front().present) { | 176 while (!entries_.empty() && !entries_.front().present) { |
| 162 entries_.pop_front(); | 177 entries_.pop_front(); |
| 163 first_packet_++; | 178 first_packet_++; |
| 164 } | 179 } |
| 165 if (entries_.empty()) { | 180 if (entries_.empty()) { |
| 166 first_packet_ = 0; | 181 first_packet_ = 0; |
| 167 } | 182 } |
| 168 } | 183 } |
| 169 | 184 |
| 170 template <typename T> | 185 template <typename T> |
| 171 auto PacketNumberIndexedQueue<T>::GetEntryWrapper(QuicPacketNumber offset) | 186 auto PacketNumberIndexedQueue<T>::GetEntryWrapper(QuicPacketNumber offset) const |
| 172 -> EntryWrapper* { | 187 -> const EntryWrapper* { |
| 173 if (offset < first_packet_) { | 188 if (offset < first_packet_) { |
| 174 return nullptr; | 189 return nullptr; |
| 175 } | 190 } |
| 176 | 191 |
| 177 offset -= first_packet_; | 192 offset -= first_packet_; |
| 178 if (offset >= entries_.size()) { | 193 if (offset >= entries_.size()) { |
| 179 return nullptr; | 194 return nullptr; |
| 180 } | 195 } |
| 181 | 196 |
| 182 EntryWrapper* entry = &entries_[offset]; | 197 const EntryWrapper* entry = &entries_[offset]; |
| 183 if (!entry->present) { | 198 if (!entry->present) { |
| 184 return nullptr; | 199 return nullptr; |
| 185 } | 200 } |
| 186 | 201 |
| 187 return entry; | 202 return entry; |
| 188 } | 203 } |
| 189 | 204 |
| 190 } // namespace net | 205 } // namespace net |
| 191 | 206 |
| 192 #endif // NET_QUIC_CORE_PACKET_NUMBER_INDEXED_QUEUE_H_ | 207 #endif // NET_QUIC_CORE_PACKET_NUMBER_INDEXED_QUEUE_H_ |
| OLD | NEW |