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