Ponca  a6685bea814e743eaa6c9284aa218d7d97a6527c
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 typename LimitedPriorityQueue<T, N, Cmp>::iterator LimitedPriorityQueue<T, N, Cmp>::begin()
15 {
16 return m_data.begin();
17 }
18
19 template <class T, int N, class Cmp>
20 typename LimitedPriorityQueue<T, N, Cmp>::const_iterator LimitedPriorityQueue<T, N, Cmp>::begin() const
21 {
22 return m_data.begin();
23 }
24
25 template <class T, int N, class Cmp>
26 typename LimitedPriorityQueue<T, N, Cmp>::const_iterator LimitedPriorityQueue<T, N, Cmp>::cbegin() const
27 {
28 return m_data.cbegin();
29 }
30
31 template <class T, int N, class Cmp>
32 typename LimitedPriorityQueue<T, N, Cmp>::iterator LimitedPriorityQueue<T, N, Cmp>::end()
33 {
34 return m_data.begin() + m_size;
35 }
36
37 template <class T, int N, class Cmp>
38 typename LimitedPriorityQueue<T, N, Cmp>::const_iterator LimitedPriorityQueue<T, N, Cmp>::end() const
39 {
40 return m_data.begin() + m_size;
41 }
42
43 template <class T, int N, class Cmp>
44 typename LimitedPriorityQueue<T, N, Cmp>::const_iterator LimitedPriorityQueue<T, N, Cmp>::cend() const
45 {
46 return m_data.cbegin() + m_size;
47 }
48
49 // Element access --------------------------------------------------------------
50
51 template <class T, int N, class Cmp>
52 const T& LimitedPriorityQueue<T, N, Cmp>::top() const
53 {
54 return m_data[0];
55 }
56
57 template <class T, int N, class Cmp>
58 const T& LimitedPriorityQueue<T, N, Cmp>::bottom() const
59 {
60 return m_data[m_size - 1];
61 }
62
63 template <class T, int N, class Cmp>
64 T& LimitedPriorityQueue<T, N, Cmp>::top()
65 {
66 return m_data[0];
67 }
68
69 template <class T, int N, class Cmp>
70 T& LimitedPriorityQueue<T, N, Cmp>::bottom()
71 {
72 return m_data[m_size - 1];
73 }
74
75 // Capacity --------------------------------------------------------------------
76
77 template <class T, int N, class Cmp>
78 bool LimitedPriorityQueue<T, N, Cmp>::empty() const
79 {
80 return m_size == 0;
81 }
82
83 template <class T, int N, class Cmp>
84 bool LimitedPriorityQueue<T, N, Cmp>::full() const
85 {
86 return m_size == capacity();
87 }
88
89 template <class T, int N, class Cmp>
90 size_t LimitedPriorityQueue<T, N, Cmp>::size() const
91 {
92 return m_size;
93 }
94
95 template <class T, int N, class Cmp>
96 size_t LimitedPriorityQueue<T, N, Cmp>::capacity() const
97 {
98 return m_capacity;
99 }
100
101 // Modifiers -------------------------------------------------------------------
102 template <class T, int N, class Cmp>
103 bool LimitedPriorityQueue<T, N, Cmp>::pushImpl(const T& _value, T** _addr)
104 {
105 if (empty())
106 {
107 if (capacity() > 0)
108 {
109 *_addr = &m_data.front();
110 ++m_size;
111 return true;
112 }
113 return false; // No capacity to insert
114 }
115 iterator it = internal::upperBound(begin(), end(), _value, m_comp);
116 if (it == end())
117 {
118 if (!full())
119 {
120 *_addr = &(*it);
121 ++m_size;
122 return true;
123 }
124 return false;
125 }
126 if (full())
127 {
128 internal::copyBackward(it, end() - 1, end());
129 *_addr = &(*it);
130 }
131 else
132 {
133 internal::copyBackward(it, end(), end() + 1);
134 *_addr = &(*it);
135 ++m_size;
136 }
137 return true;
138 }
139
140 template <class T, int N, class Cmp>
141 bool LimitedPriorityQueue<T, N, Cmp>::push(T&& _value)
142 {
143 T* addr;
144 if (pushImpl(_value, &addr)) // Needs to insert
145 {
146 *addr = std::forward<T>(_value);
147 return true;
148 }
149 return false;
150 }
151
152 template <class T, int N, class Cmp>
153 bool LimitedPriorityQueue<T, N, Cmp>::push(const T& _value)
154 {
155 T* addr;
156 if (pushImpl(_value, &addr)) // Needs to insert
157 {
158 *addr = _value;
159 return true;
160 }
161 return false;
162 }
163
164 template <class T, int N, class Cmp>
165 void LimitedPriorityQueue<T, N, Cmp>::pop()
166 {
167 --m_size;
168 }
169
170 template <class T, int N, class Cmp>
171 void LimitedPriorityQueue<T, N, Cmp>::reserve(const int _capacity)
172 {
173 PONCA_ASSERT(_capacity >= 0);
174 PONCA_ASSERT(_capacity <= N);
175 m_capacity = _capacity;
176 if (m_size > _capacity)
177 m_size = _capacity;
178 }
179
180 template <class T, int N, class Cmp>
181 void LimitedPriorityQueue<T, N, Cmp>::clear()
182 {
183 m_size = 0;
184 }
185
186 // Data ------------------------------------------------------------------------
187
188 template <class T, int N, class Cmp>
189 const typename LimitedPriorityQueue<T, N, Cmp>::container_type& LimitedPriorityQueue<T, N, Cmp>::container() const
190 {
191 return m_data;
192 }
193} // 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