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