41 #ifndef PB_DS_BINARY_HEAP_RESIZE_POLICY_HPP
42 #define PB_DS_BINARY_HEAP_RESIZE_POLICY_HPP
51 template<
typename _Tp>
68 typedef _Tp size_type;
70 static const _Tp min_size = 16;
73 { PB_DS_ASSERT_VALID((*
this)) }
76 : m_shrink_size(other.m_shrink_size), m_grow_size(other.m_grow_size)
77 { PB_DS_ASSERT_VALID((*
this)) }
83 resize_needed_for_grow(size_type)
const;
86 resize_needed_for_shrink(size_type)
const;
89 grow_needed(size_type)
const;
92 shrink_needed(size_type)
const;
95 get_new_size_for_grow()
const;
98 get_new_size_for_shrink()
const;
101 get_new_size_for_arbitrary(size_type)
const;
104 notify_grow_resize();
107 notify_shrink_resize();
110 notify_arbitrary(size_type);
112 #ifdef _GLIBCXX_DEBUG
114 assert_valid(
const char*,
int)
const;
117 #ifdef PB_DS_BINARY_HEAP_TRACE_
123 template<
typename _Tp>
126 template<
typename _Tp>
131 std::swap(m_shrink_size, other.m_shrink_size);
132 std::swap(m_grow_size, other.m_grow_size);
135 template<
typename _Tp>
138 resize_needed_for_grow(size_type size)
const
140 _GLIBCXX_DEBUG_ASSERT(size <= m_grow_size);
141 return size == m_grow_size;
144 template<
typename _Tp>
147 resize_needed_for_shrink(size_type size)
const
149 _GLIBCXX_DEBUG_ASSERT(size <= m_grow_size);
150 return size == m_shrink_size;
153 template<
typename _Tp>
154 inline typename resize_policy<_Tp>::size_type
156 get_new_size_for_grow()
const
157 {
return m_grow_size * factor; }
159 template<
typename _Tp>
160 inline typename resize_policy<_Tp>::size_type
162 get_new_size_for_shrink()
const
164 const size_type half_size = m_grow_size / factor;
165 return std::max(min_size, half_size);
168 template<
typename _Tp>
169 inline typename resize_policy<_Tp>::size_type
171 get_new_size_for_arbitrary(size_type size)
const
173 size_type ret = min_size;
179 template<
typename _Tp>
184 PB_DS_ASSERT_VALID((*
this))
185 _GLIBCXX_DEBUG_ASSERT(m_grow_size >= min_size);
186 m_grow_size *= factor;
187 m_shrink_size = m_grow_size / ratio;
188 PB_DS_ASSERT_VALID((*this))
191 template<typename _Tp>
194 notify_shrink_resize()
196 PB_DS_ASSERT_VALID((*
this))
197 m_shrink_size /= factor;
198 if (m_shrink_size == 1)
200 m_grow_size =
std::
max(m_grow_size / factor, min_size);
201 PB_DS_ASSERT_VALID((*this))
204 template<typename _Tp>
207 notify_arbitrary(size_type actual_size)
209 m_grow_size = actual_size;
210 m_shrink_size = m_grow_size / ratio;
211 PB_DS_ASSERT_VALID((*
this))
214 #ifdef _GLIBCXX_DEBUG
215 template<
typename _Tp>
218 assert_valid(
const char* __file,
int __line)
const
220 PB_DS_DEBUG_VERIFY(m_shrink_size == 0
221 || m_shrink_size * ratio == m_grow_size);
222 PB_DS_DEBUG_VERIFY(m_grow_size >= min_size);
226 #ifdef PB_DS_BINARY_HEAP_TRACE_
227 template<
typename _Tp>
232 std::cerr <<
"shrink = " << m_shrink_size
233 <<
" grow = " << m_grow_size << std::endl;
GNU extensions for policy-based data structures for public use.
const _Tp & max(const _Tp &, const _Tp &)
This does what you think it does.
ISO C++ entities toplevel namespace is std.
Resize policy for binary heap.
void swap(_Tp &, _Tp &) noexcept(__and_< is_nothrow_move_constructible< _Tp >, is_nothrow_move_assignable< _Tp >>::value)
Swaps two values.