Dequeues an element from the queue's head. Returns nullptr if the queue is empty. This is O(1).
| 130 | /// Dequeues an element from the queue's head. Returns nullptr if the queue |
| 131 | /// is empty. This is O(1). |
| 132 | T* Dequeue() { |
| 133 | Node* result = nullptr; |
| 134 | { |
| 135 | std::lock_guard<LockType> lock(lock_); |
| 136 | if (IsEmptyLocked()) return nullptr; |
| 137 | --size_; |
| 138 | result = head_; |
| 139 | head_ = head_->next; |
| 140 | if (head_ == nullptr) { |
| 141 | tail_ = nullptr; |
| 142 | } else { |
| 143 | head_->prev = nullptr; |
| 144 | } |
| 145 | } |
| 146 | DCHECK(result != nullptr); |
| 147 | result->next = result->prev = nullptr; |
| 148 | result->parent_queue = nullptr; |
| 149 | return reinterpret_cast<T*>(result); |
| 150 | } |
| 151 | |
| 152 | /// Dequeues an element from the queue's tail. Returns nullptr if the queue |
| 153 | /// is empty. This is O(1). |
no outgoing calls