1 #ifndef __GfxTL_LIMITEDHEAP_HEADER__
2 #define __GfxTL_LIMITEDHEAP_HEADER__
12 template<
class T,
class PredicateT = std::less< T >,
13 template<
class >
class ContainerT = FlatCopyVector >
15 :
public ContainerT< T >
19 typedef typename ContainerT< T >::size_type
size_type;
32 BaseType::reserve(limit);
40 BaseType::reserve(_limit);
48 BaseType::reserve(limit);
54 BaseType::reserve(limit + 1);
81 for (
size_type i = BaseType::size() >> 1; i > 0; --i)
89 if (!BaseType::size())
93 for (
size_type i = BaseType::size() - 1; i > 0; --i)
95 T tmp = BaseType::at(i);
96 BaseType::at(i) = BaseType::at(0);
97 BaseType::at(0) = tmp;
104 if (BaseType::size() < _limit)
112 if (BaseType::size() < _limit)
114 BaseType::push_back(t);
115 if (BaseType::size() == _limit)
118 _instances = CountInstances(0);
123 if (m_pred(BaseType::front(), t))
127 if (m_pred(t, BaseType::front()))
131 if (BaseType::size() + 1 - _instances >= _limit)
134 for (
size_type i = 0; i < _instances; ++i)
136 std::swap(BaseType::front(), BaseType::back());
137 BaseType::pop_back();
138 Heapify(0, BaseType::size());
140 BaseType::push_back(t);
142 _instances = CountInstances(0);
145 BaseType::push_back(t);
149 BaseType::front() = t;
150 Heapify(0, BaseType::size());
151 _instances = CountInstances(0);
155 BaseType::push_back(t);
166 while ((
max = (i << 1) + 1) < iend)
168 if (
max + 1 < iend && m_pred(BaseType::at(
max), BaseType::at(
max + 1)))
172 if (!m_pred(BaseType::at(i), BaseType::at(
max)))
184 if (BaseType::size() == 1)
189 while (i && m_pred(BaseType::at(j = ((i + 1) >> 1) - 1), BaseType::at(i)))
191 std::swap(BaseType::at(i), BaseType::at(j));
199 if (child >= BaseType::size())
204 if (!m_pred(BaseType::at(child), BaseType::at(i)))
206 instances = CountInstances(child);
209 if (child >= BaseType::size())
211 return 1 + instances;
213 if (!m_pred(BaseType::at(child), BaseType::at(i)))
215 instances += CountInstances(child);
217 return 1 + instances;
226 template<
class T,
template<
class >
class ContainerT =
FlatCopyVector >
228 :
public ContainerT< T >
242 BaseType::reserve(limit);
248 BaseType::reserve(limit + 1);
259 for (
size_type i = BaseType::size() >> 1; i > 0; --i)
261 Heapify(i - 1, iend);
267 if (!BaseType::size())
271 for (
size_type i = BaseType::size() - 1; i > 0; --i)
273 T tmp = BaseType::at(i);
274 BaseType::at(i) = BaseType::at(0);
275 BaseType::at(0) = tmp;
282 if (BaseType::size() < _limit)
290 if (BaseType::size() < _limit)
292 BaseType::push_back(t);
293 if (BaseType::size() == _limit)
300 if (t >= BaseType::front())
304 BaseType::front() = t;
305 Heapify(0, BaseType::size());
313 while ((
max = (i << 1) + 1) < iend)
315 if (
max + 1 < iend && BaseType::at(
max) < BaseType::at(
max + 1))
319 if (BaseType::at(i) >= BaseType::at(
max))
330 if (BaseType::size() == 1)
335 while (i && BaseType::at(i) > BaseType::at(j = ((i + 1) >> 1) - 1))
337 std::swap(BaseType::at(i), BaseType::at(j));