1f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung/* 2f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung * Copyright (C) 2016 The Android Open Source Project 3f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung * 4f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung * Licensed under the Apache License, Version 2.0 (the "License"); 5f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung * you may not use this file except in compliance with the License. 6f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung * You may obtain a copy of the License at 7f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung * 8f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung * http://www.apache.org/licenses/LICENSE-2.0 9f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung * 10f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung * Unless required by applicable law or agreed to in writing, software 11f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung * distributed under the License is distributed on an "AS IS" BASIS, 12f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung * See the License for the specific language governing permissions and 14f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung * limitations under the License. 15f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung */ 16f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung 17f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung#ifndef CHRE_UTIL_PRIORITY_QUEUE_IMPL_H_ 18f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung#define CHRE_UTIL_PRIORITY_QUEUE_IMPL_H_ 19f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung 20f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung#include <utility> 21f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung 22f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung#include "chre/platform/assert.h" 23f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung#include "chre/util/dynamic_vector.h" 24021aae0ed1c9ff80d9ffef6b1114f030138c25d2Meng-hsuan Chung#include "chre/util/heap.h" 25f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung 26f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chungnamespace chre { 27f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung 285ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungtemplate<typename ElementType, typename CompareFunction> 295ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan ChungPriorityQueue<ElementType, CompareFunction>::PriorityQueue() {} 30f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung 315ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungtemplate<typename ElementType, typename CompareFunction> 325ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan ChungPriorityQueue<ElementType, CompareFunction>::PriorityQueue( 335ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chung const CompareFunction& compare) 34f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung : mCompare(compare) {} 35f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung 365ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungtemplate<typename ElementType, typename CompareFunction> 375ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungsize_t PriorityQueue<ElementType, CompareFunction>::size() const { 38f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung return mData.size(); 39f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung} 40f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung 415ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungtemplate<typename ElementType, typename CompareFunction> 425ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungsize_t PriorityQueue<ElementType, CompareFunction>::capacity() const { 43f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung return mData.capacity(); 44f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung} 45f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung 465ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungtemplate<typename ElementType, typename CompareFunction> 475ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungbool PriorityQueue<ElementType, CompareFunction>::empty() const { 48f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung return mData.empty(); 49f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung} 50f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung 515ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungtemplate<typename ElementType, typename CompareFunction> 525ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungbool PriorityQueue<ElementType, CompareFunction>::push( 535ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chung const ElementType& element) { 54f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung bool success = mData.push_back(element); 55f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung if (success) { 56021aae0ed1c9ff80d9ffef6b1114f030138c25d2Meng-hsuan Chung push_heap(mData, mCompare); 57f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung } 58f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung return success; 59f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung} 60f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung 615ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungtemplate<typename ElementType, typename CompareFunction> 62f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chungtemplate<typename... Args> 635ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungbool PriorityQueue<ElementType, CompareFunction>::emplace(Args&&... args) { 64f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung bool success = mData.emplace_back(args...); 65f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung if (success) { 66021aae0ed1c9ff80d9ffef6b1114f030138c25d2Meng-hsuan Chung push_heap(mData, mCompare); 67f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung } 68f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung return success; 69f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung} 70f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung 715ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungtemplate<typename ElementType, typename CompareFunction> 725ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan ChungElementType& PriorityQueue<ElementType, CompareFunction>::operator[]( 735ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chung size_t index) { 74f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung return mData[index]; 75f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung} 76f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung 775ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungtemplate<typename ElementType, typename CompareFunction> 785ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungconst ElementType& PriorityQueue<ElementType, CompareFunction>::operator[]( 795ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chung size_t index) const { 80f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung return mData[index]; 81f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung} 82f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung 835ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungtemplate<typename ElementType, typename CompareFunction> 845ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan ChungElementType& PriorityQueue<ElementType, CompareFunction>::top() { 85f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung return mData[0]; 86f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung} 87f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung 885ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungtemplate<typename ElementType, typename CompareFunction> 895ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungconst ElementType& PriorityQueue<ElementType, CompareFunction>::top() const { 90f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung return mData[0]; 91f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung} 92f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung 935ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungtemplate<typename ElementType, typename CompareFunction> 945ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungvoid PriorityQueue<ElementType, CompareFunction>::pop() { 95f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung if (mData.size() > 0) { 96021aae0ed1c9ff80d9ffef6b1114f030138c25d2Meng-hsuan Chung pop_heap(mData, mCompare); 97021aae0ed1c9ff80d9ffef6b1114f030138c25d2Meng-hsuan Chung mData.erase(mData.size() - 1); 98f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung } 99f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung} 100f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung 1015ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungtemplate<typename ElementType, typename CompareFunction> 1025ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungvoid PriorityQueue<ElementType, CompareFunction>::remove(size_t index) { 103021aae0ed1c9ff80d9ffef6b1114f030138c25d2Meng-hsuan Chung CHRE_ASSERT(index < mData.size()); 104021aae0ed1c9ff80d9ffef6b1114f030138c25d2Meng-hsuan Chung if (index < mData.size()) { 105021aae0ed1c9ff80d9ffef6b1114f030138c25d2Meng-hsuan Chung remove_heap(mData, index, mCompare); 106021aae0ed1c9ff80d9ffef6b1114f030138c25d2Meng-hsuan Chung mData.erase(mData.size() - 1); 107021aae0ed1c9ff80d9ffef6b1114f030138c25d2Meng-hsuan Chung } 108f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung 109f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung // TODO: consider resizing the dynamic array to mData.capacity()/2 110f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung // when mData.size() <= mData.capacity()/4. 111f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung} 112f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung 1135ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungtemplate<typename ElementType, typename CompareFunction> 1145ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungtypename PriorityQueue<ElementType, CompareFunction>::iterator 1155ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chung PriorityQueue<ElementType, CompareFunction>::begin() { 11690c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chung return mData.begin(); 11790c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chung} 11890c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chung 1195ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungtemplate<typename ElementType, typename CompareFunction> 1205ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungtypename PriorityQueue<ElementType, CompareFunction>::iterator 1215ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chung PriorityQueue<ElementType, CompareFunction>::end() { 12290c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chung return mData.end(); 12390c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chung} 12490c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chung 1255ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungtemplate<typename ElementType, typename CompareFunction> 1265ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungtypename PriorityQueue<ElementType, CompareFunction>::const_iterator 12748080e341c2a12db12deb086adce1d487a759141Meng-hsuan Chung PriorityQueue<ElementType, CompareFunction>::begin() const { 12848080e341c2a12db12deb086adce1d487a759141Meng-hsuan Chung return cbegin(); 12948080e341c2a12db12deb086adce1d487a759141Meng-hsuan Chung} 13048080e341c2a12db12deb086adce1d487a759141Meng-hsuan Chung 13148080e341c2a12db12deb086adce1d487a759141Meng-hsuan Chungtemplate<typename ElementType, typename CompareFunction> 13248080e341c2a12db12deb086adce1d487a759141Meng-hsuan Chungtypename PriorityQueue<ElementType, CompareFunction>::const_iterator 13348080e341c2a12db12deb086adce1d487a759141Meng-hsuan Chung PriorityQueue<ElementType, CompareFunction>::end() const { 13448080e341c2a12db12deb086adce1d487a759141Meng-hsuan Chung return cend(); 13548080e341c2a12db12deb086adce1d487a759141Meng-hsuan Chung} 13648080e341c2a12db12deb086adce1d487a759141Meng-hsuan Chung 13748080e341c2a12db12deb086adce1d487a759141Meng-hsuan Chungtemplate<typename ElementType, typename CompareFunction> 13848080e341c2a12db12deb086adce1d487a759141Meng-hsuan Chungtypename PriorityQueue<ElementType, CompareFunction>::const_iterator 1395ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chung PriorityQueue<ElementType, CompareFunction>::cbegin() const { 140e1129bcc6fb320fd1752cd6c900ead2a0595c761Meng-hsuan Chung return mData.cbegin(); 14190c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chung} 14290c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chung 1435ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungtemplate<typename ElementType, typename CompareFunction> 1445ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chungtypename PriorityQueue<ElementType, CompareFunction>::const_iterator 1455ea6fa358541d4b9cc1d9856a0b9291785d7536dMeng-hsuan Chung PriorityQueue<ElementType, CompareFunction>::cend() const { 146e1129bcc6fb320fd1752cd6c900ead2a0595c761Meng-hsuan Chung return mData.cend(); 14790c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chung} 14890c04ef3564eb228eebb5da5b21bb80e5e46e299Meng-hsuan Chung 149f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung} // namespace chre 150f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung 151f9fe99d728ad476dc941be5a9dff1e20402c3754Meng-hsuan Chung#endif // CHRE_UTIL_PRIORITY_QUEUE_IMPL_H_ 152