Index: net/base/priority_queue.h |
diff --git a/net/base/priority_queue.h b/net/base/priority_queue.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..763b5e50837e0c3691c12fe2728dc20e93a9056e |
--- /dev/null |
+++ b/net/base/priority_queue.h |
@@ -0,0 +1,133 @@ |
+// Copyright (c) 2011 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. |
+ |
+#ifndef NET_BASE_PRIORITY_QUEUE_H_ |
+#define NET_BASE_PRIORITY_QUEUE_H_ |
+#pragma once |
+ |
+#include <list> |
+ |
+#include "base/basictypes.h" |
+#include "net/base/net_export.h" |
+#include "net/base/request_priority.h" |
+ |
+namespace net { |
+ |
+// A simple priority queue. The order of values is by RequestPriority and then |
+// FIFO. The queue supports changing the priority of its elements. |
+// All operations are O(1) time (assuming constant NUM_PRIORITIES). |
+template<typename T> |
+class PriorityQueue { |
+ public: |
+ typedef std::list<T> List; |
+ typedef typename std::list<T>::iterator ListIterator; |
+ |
+ // A pointer to a value stored in the queue. The pointer becomes invalid |
+ // when the queue is destroyed, the value is erased, or moved. |
+ class Pointer { |
+ public: |
+ // Constructs a null pointer. |
+ Pointer() : priority_(NUM_PRIORITIES) {} |
+ |
+ bool is_null() const { return priority_ == NUM_PRIORITIES; } |
+ RequestPriority priority() const { return priority_; } |
+ |
+ T& value() { return *iterator_; } |
+ const T& value() const { return *iterator_; } |
+ |
+ // Comparing to Pointer from a different PriorityQueue is undefined. |
+ bool equals(const Pointer& other) const { |
+ return (priority_ == other.priority_) && (iterator_ == other.iterator_); |
+ } |
+ |
+ protected: |
+ friend class PriorityQueue; |
+ Pointer(RequestPriority priority, const ListIterator& iterator) |
+ : priority_(priority), iterator_(iterator) {} |
+ |
+ RequestPriority priority_; |
+ ListIterator iterator_; |
+ }; |
+ |
+ PriorityQueue() : size_(0) {} |
+ |
+ // Adds |value| with |priority| to the queue. Returns a pointer to the |
+ // created element. |
+ Pointer Insert(const T& value, RequestPriority priority) { |
+ ++size_; |
+ List& list = lists_[priority]; |
+ return Pointer(priority, list.insert(list.end(), value)); |
+ } |
+ |
+ // Removes the value pointed by |pointer| from the queue. All pointers to this |
+ // value including |pointer| become invalid. |
+ void Erase(const Pointer& pointer) { |
+ --size_; |
+ lists_[pointer.priority_].erase(pointer.iterator_); |
+ } |
+ |
+ // Moves the value pointed by |pointer| to the end of all values with priority |
+ // |priority| and returns a pointer to the moved value. All pointers to this |
+ // value become invalid. No-op if priority is not changed. |
+ Pointer Move(const Pointer& pointer, RequestPriority priority) { |
+ if (pointer.priority_ == priority) |
+ return pointer; |
+ List& list = lists_[priority]; |
+ list.splice(list.end(), lists_[pointer.priority_], pointer.iterator_); |
+ return Pointer(priority, --list.end()); |
+ } |
+ |
+ // Returns a pointer to the first value in order or a null-pointer if empty. |
+ Pointer First() { |
+ for (size_t priority = 0; priority < NUM_PRIORITIES; ++priority) { |
+ List& list = lists_[priority]; |
+ if (!list.empty()) |
+ return Pointer(static_cast<RequestPriority>(priority), list.begin()); |
+ } |
+ return Pointer(); |
+ } |
+ |
+ // Returns a pointer to the last value in order or a null-pointer if empty. |
+ Pointer Last() { |
+ for (size_t i = 0; i < NUM_PRIORITIES; ++i) { |
+ size_t priority = NUM_PRIORITIES - i - 1; |
+ List& list = lists_[priority]; |
+ if (!list.empty()) |
+ return Pointer(static_cast<RequestPriority>(priority), --list.end()); |
+ } |
+ return Pointer(); |
+ } |
+ |
+ // Returns a pointer to the oldest, lowest value or a null-pointer if empty. |
+ Pointer OldestLowest() { |
+ for (size_t i = 0; i < NUM_PRIORITIES; ++i) { |
+ size_t priority = NUM_PRIORITIES - i - 1; |
+ List& list = lists_[priority]; |
+ if (!list.empty()) |
+ return Pointer(static_cast<RequestPriority>(priority), list.begin()); |
+ } |
+ return Pointer(); |
+ } |
+ |
+ // Empties the queue. All pointers become invalid. |
+ void Clear() { |
+ for (size_t priority = 0; priority < NUM_PRIORITIES; ++priority) |
+ lists_[priority].clear(); |
+ size_ = 0u; |
+ } |
+ |
+ // Returns number of queued values. |
+ size_t size() const { |
+ return size_; |
+ } |
+ |
+ private: |
+ List lists_[NUM_PRIORITIES]; |
+ size_t size_; |
+}; |
+ |
+} // namespace net |
+ |
+#endif // NET_BASE_PRIORITY_QUEUE_H_ |
+ |