Ponca  82fc77e8c6294111c6f00670e92ec58a24e2ecf2
Point Cloud Analysis library
Loading...
Searching...
No Matches
limitedPriorityQueue.hpp
1
8namespace Ponca
9{
10
11 // Iterator --------------------------------------------------------------------
12
13 template <class T, int N, class Cmp>
14 requires ValidCapacity<N>
15 typename LimitedPriorityQueue<T, N, Cmp>::iterator LimitedPriorityQueue<T, N, Cmp>::begin()
16 {
17 return m_data.begin();
18 }
19
20 template <class T, int N, class Cmp>
21 requires ValidCapacity<N>
22 typename LimitedPriorityQueue<T, N, Cmp>::const_iterator LimitedPriorityQueue<T, N, Cmp>::begin() const
23 {
24 return m_data.begin();
25 }
26
27 template <class T, int N, class Cmp>
28 requires ValidCapacity<N>
29 typename LimitedPriorityQueue<T, N, Cmp>::const_iterator LimitedPriorityQueue<T, N, Cmp>::cbegin() const
30 {
31 return m_data.cbegin();
32 }
33
34 template <class T, int N, class Cmp>
35 requires ValidCapacity<N>
36 typename LimitedPriorityQueue<T, N, Cmp>::iterator LimitedPriorityQueue<T, N, Cmp>::end()
37 {
38 return m_data.begin() + m_size;
39 }
40
41 template <class T, int N, class Cmp>
42 requires ValidCapacity<N>
43 typename LimitedPriorityQueue<T, N, Cmp>::const_iterator LimitedPriorityQueue<T, N, Cmp>::end() const
44 {
45 return m_data.begin() + m_size;
46 }
47
48 template <class T, int N, class Cmp>
49 requires ValidCapacity<N>
50 typename LimitedPriorityQueue<T, N, Cmp>::const_iterator LimitedPriorityQueue<T, N, Cmp>::cend() const
51 {
52 return m_data.cbegin() + m_size;
53 }
54
55 // Element access --------------------------------------------------------------
56
57 template <class T, int N, class Cmp>
58 requires ValidCapacity<N>
59 const T& LimitedPriorityQueue<T, N, Cmp>::top() const
60 {
61 return m_data[0];
62 }
63
64 template <class T, int N, class Cmp>
65 requires ValidCapacity<N>
66 const T& LimitedPriorityQueue<T, N, Cmp>::bottom() const
67 {
68 return m_data[m_size - 1];
69 }
70
71 template <class T, int N, class Cmp>
72 requires ValidCapacity<N>
73 T& LimitedPriorityQueue<T, N, Cmp>::top()
74 {
75 return m_data[0];
76 }
77
78 template <class T, int N, class Cmp>
79 requires ValidCapacity<N>
80 T& LimitedPriorityQueue<T, N, Cmp>::bottom()
81 {
82 return m_data[m_size - 1];
83 }
84
85 // Capacity --------------------------------------------------------------------
86
87 template <class T, int N, class Cmp>
88 requires ValidCapacity<N>
89 bool LimitedPriorityQueue<T, N, Cmp>::empty() const
90 {
91 return m_size == 0;
92 }
93
94 template <class T, int N, class Cmp>
95 requires ValidCapacity<N>
96 bool LimitedPriorityQueue<T, N, Cmp>::full() const
97 {
98 return m_size == capacity();
99 }
100
101 template <class T, int N, class Cmp>
102 requires ValidCapacity<N>
103 size_t LimitedPriorityQueue<T, N, Cmp>::size() const
104 {
105 return m_size;
106 }
107
108 template <class T, int N, class Cmp>
109 requires ValidCapacity<N>
110 size_t LimitedPriorityQueue<T, N, Cmp>::capacity() const
111 {
112 return m_capacity;
113 }
114
115 // Modifiers -------------------------------------------------------------------
116 template <class T, int N, class Cmp>
117 requires ValidCapacity<N>
118 bool LimitedPriorityQueue<T, N, Cmp>::pushImpl(const T& _value, T** _addr)
119 {
120 if (empty())
121 {
122 if (capacity() > 0)
123 {
124 *_addr = &m_data.front();
125 ++m_size;
126 return true;
127 }
128 return false; // No capacity to insert
129 }
130 iterator it = internal::upperBound(begin(), end(), _value, m_comp);
131 if (it == end())
132 {
133 if (!full())
134 {
135 *_addr = &(*it);
136 ++m_size;
137 return true;
138 }
139 return false;
140 }
141 if (full())
142 {
143 internal::copyBackward(it, end() - 1, end());
144 *_addr = &(*it);
145 }
146 else
147 {
148 internal::copyBackward(it, end(), end() + 1);
149 *_addr = &(*it);
150 ++m_size;
151 }
152 return true;
153 }
154
155 template <class T, int N, class Cmp>
156 requires ValidCapacity<N>
157 bool LimitedPriorityQueue<T, N, Cmp>::push(T&& _value)
158 {
159 T* addr;
160 if (pushImpl(_value, &addr)) // Needs to insert
161 {
162 *addr = std::forward<T>(_value);
163 return true;
164 }
165 return false;
166 }
167
168 template <class T, int N, class Cmp>
169 requires ValidCapacity<N>
170 bool LimitedPriorityQueue<T, N, Cmp>::push(const T& _value)
171 {
172 T* addr;
173 if (pushImpl(_value, &addr)) // Needs to insert
174 {
175 *addr = _value;
176 return true;
177 }
178 return false;
179 }
180
181 template <class T, int N, class Cmp>
182 requires ValidCapacity<N>
183 void LimitedPriorityQueue<T, N, Cmp>::pop()
184 {
185 --m_size;
186 }
187
188 template <class T, int N, class Cmp>
189 requires ValidCapacity<N>
190 void LimitedPriorityQueue<T, N, Cmp>::reserve(const int _capacity)
191 {
192 PONCA_ASSERT(_capacity >= 0);
193 PONCA_ASSERT(_capacity <= N);
194 m_capacity = _capacity;
195 if (m_size > _capacity)
196 m_size = _capacity;
197 }
198
199 template <class T, int N, class Cmp>
200 requires ValidCapacity<N>
201 void LimitedPriorityQueue<T, N, Cmp>::clear()
202 {
203 m_size = 0;
204 }
205
206 // Data ------------------------------------------------------------------------
207
208 template <class T, int N, class Cmp>
209 requires ValidCapacity<N>
210 const typename LimitedPriorityQueue<T, N, Cmp>::container_type& LimitedPriorityQueue<T, N, Cmp>::container() const
211 {
212 return m_data;
213 }
214} // namespace Ponca
BidirIt2 copyBackward(BidirIt1 first, BidirIt1 last, BidirIt2 d_last)
Copies the elements from the range [first, last) to another range ending at d_last.
ForwardIt upperBound(ForwardIt first, ForwardIt last, const T &value, Compare comp)
Searches for the first element in the partitioned range [first, last) which is ordered after value.
This Source Code Form is subject to the terms of the Mozilla Public License, v.
Definition concepts.h:11