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 |