Grok  10.0.3
MinHeap.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <mutex>
4 #include <queue>
5 
6 namespace grk
7 {
9 {
10  public:
11  MinHeapLocker(std::mutex& mut) : lock(mut) {}
12 
13  private:
14  std::lock_guard<std::mutex> lock;
15 };
16 
18 {
19  public:
20  MinHeapFakeLocker([[maybe_unused]] std::mutex& mut) {}
21 };
22 
23 template<typename T>
25 {
26  bool operator()(const T a, const T b) const
27  {
28  return a.getIndex() > b.getIndex();
29  }
30 };
31 
32 template<typename T, typename IT, typename L>
33 class MinHeap
34 {
35  public:
36  MinHeap() : nextIndex(0) {}
37  void push(T val)
38  {
39  L locker(queue_mutex);
40  queue.push(val);
41  }
42  T pop(void)
43  {
44  L locker(queue_mutex);
45  if(queue.empty())
46  return T();
47  auto val = queue.top();
48  if(val.getIndex() == nextIndex)
49  {
50  queue.pop();
51  nextIndex++;
52  return val;
53  }
54  return T();
55  }
56  size_t size(void)
57  {
58  return queue.size();
59  }
60 
61  private:
62  std::priority_queue<T, std::vector<T>, MinHeapComparator<T>> queue;
63  std::mutex queue_mutex;
65 };
66 
67 template<typename T>
69 {
70  bool operator()(const T* a, const T* b) const
71  {
72  return a->getIndex() > b->getIndex();
73  }
74 };
75 
76 template<typename T, typename IT, typename L>
78 {
79  public:
81  void push(T* val)
82  {
83  L locker(queue_mutex);
84  queue.push(val);
85  }
86  T* pop(void)
87  {
88  L locker(queue_mutex);
89  if(queue.empty())
90  return nullptr;
91  auto val = queue.top();
92  if(val->getIndex() == nextIndex)
93  {
94  queue.pop();
95  nextIndex++;
96  return val;
97  }
98  return nullptr;
99  }
100  size_t size(void)
101  {
102  return queue.size();
103  }
104 
105  private:
106  std::priority_queue<T*, std::vector<T*>, MinHeapPtrComparator<T>> queue;
107  std::mutex queue_mutex;
109 };
110 
111 } // namespace grk
Definition: MinHeap.h:18
MinHeapFakeLocker([[maybe_unused]] std::mutex &mut)
Definition: MinHeap.h:20
Definition: MinHeap.h:34
std::mutex queue_mutex
Definition: MinHeap.h:63
std::priority_queue< T, std::vector< T >, MinHeapComparator< T > > queue
Definition: MinHeap.h:62
IT nextIndex
Definition: MinHeap.h:64
T pop(void)
Definition: MinHeap.h:42
size_t size(void)
Definition: MinHeap.h:56
MinHeap()
Definition: MinHeap.h:36
void push(T val)
Definition: MinHeap.h:37
Definition: MinHeap.h:9
MinHeapLocker(std::mutex &mut)
Definition: MinHeap.h:11
std::lock_guard< std::mutex > lock
Definition: MinHeap.h:14
Definition: MinHeap.h:78
MinHeapPtr()
Definition: MinHeap.h:80
std::priority_queue< T *, std::vector< T * >, MinHeapPtrComparator< T > > queue
Definition: MinHeap.h:106
void push(T *val)
Definition: MinHeap.h:81
std::mutex queue_mutex
Definition: MinHeap.h:107
IT nextIndex
Definition: MinHeap.h:108
T * pop(void)
Definition: MinHeap.h:86
size_t size(void)
Definition: MinHeap.h:100
Copyright (C) 2016-2022 Grok Image Compression Inc.
Definition: ICacheable.h:20
Definition: MinHeap.h:25
bool operator()(const T a, const T b) const
Definition: MinHeap.h:26
Definition: MinHeap.h:69
bool operator()(const T *a, const T *b) const
Definition: MinHeap.h:70