00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 PB_ASSOC_CLASS_T_DEC
00046 pb_assoc::detail::int_to_type<External_Load_Access>
00047 PB_ASSOC_CLASS_C_DEC::s_external_load_access_ind;
00048
00049 PB_ASSOC_CLASS_T_DEC
00050 PB_ASSOC_CLASS_C_DEC::
00051 hash_load_check_resize_trigger(float load_min, float load_max) :
00052 m_load_min(load_min),
00053 m_load_max(load_max),
00054 m_next_shrink_size(0),
00055 m_next_grow_size(0),
00056 m_resize_needed(false)
00057 {
00058 PB_ASSOC_DBG_ONLY(assert_valid();)
00059 }
00060
00061 PB_ASSOC_CLASS_T_DEC
00062 inline void
00063 PB_ASSOC_CLASS_C_DEC::
00064 notify_find_search_start()
00065 {
00066 PB_ASSOC_DBG_ONLY(assert_valid();)
00067 }
00068
00069 PB_ASSOC_CLASS_T_DEC
00070 inline void
00071 PB_ASSOC_CLASS_C_DEC::
00072 notify_find_search_collision()
00073 {
00074 PB_ASSOC_DBG_ONLY(assert_valid();)
00075 }
00076
00077 PB_ASSOC_CLASS_T_DEC
00078 inline void
00079 PB_ASSOC_CLASS_C_DEC::
00080 notify_find_search_end()
00081 {
00082 PB_ASSOC_DBG_ONLY(assert_valid();)
00083 }
00084
00085 PB_ASSOC_CLASS_T_DEC
00086 inline void
00087 PB_ASSOC_CLASS_C_DEC::
00088 notify_insert_search_start()
00089 {
00090 PB_ASSOC_DBG_ONLY(assert_valid();)
00091 }
00092
00093 PB_ASSOC_CLASS_T_DEC
00094 inline void
00095 PB_ASSOC_CLASS_C_DEC::
00096 notify_insert_search_collision()
00097 {
00098 PB_ASSOC_DBG_ONLY(assert_valid();)
00099 }
00100
00101 PB_ASSOC_CLASS_T_DEC
00102 inline void
00103 PB_ASSOC_CLASS_C_DEC::
00104 notify_insert_search_end()
00105 {
00106 PB_ASSOC_DBG_ONLY(assert_valid();)
00107 }
00108
00109 PB_ASSOC_CLASS_T_DEC
00110 inline void
00111 PB_ASSOC_CLASS_C_DEC::
00112 notify_erase_search_start()
00113 {
00114 PB_ASSOC_DBG_ONLY(assert_valid();)
00115 }
00116
00117 PB_ASSOC_CLASS_T_DEC
00118 inline void
00119 PB_ASSOC_CLASS_C_DEC::
00120 notify_erase_search_collision()
00121 {
00122 PB_ASSOC_DBG_ONLY(assert_valid();)
00123 }
00124
00125 PB_ASSOC_CLASS_T_DEC
00126 inline void
00127 PB_ASSOC_CLASS_C_DEC::
00128 notify_erase_search_end()
00129 {
00130 PB_ASSOC_DBG_ONLY(assert_valid();)
00131 }
00132
00133 PB_ASSOC_CLASS_T_DEC
00134 inline void
00135 PB_ASSOC_CLASS_C_DEC::
00136 notify_inserted(size_type num_entries)
00137 {
00138 PB_ASSOC_DBG_ASSERT(num_entries <= m_next_grow_size);
00139
00140 my_size_base::set_size(num_entries);
00141
00142 m_resize_needed = (num_entries == m_next_grow_size);
00143
00144 PB_ASSOC_DBG_ONLY(assert_valid();)
00145 }
00146
00147 PB_ASSOC_CLASS_T_DEC
00148 inline void
00149 PB_ASSOC_CLASS_C_DEC::
00150 notify_erased(size_type num_entries)
00151 {
00152 PB_ASSOC_DBG_ASSERT(num_entries >= m_next_shrink_size);
00153
00154 my_size_base::set_size(num_entries);
00155
00156 m_resize_needed = (num_entries == m_next_shrink_size);
00157
00158 PB_ASSOC_DBG_ONLY(assert_valid();)
00159
00160 PB_ASSOC_DBG_ONLY(assert_valid();)
00161 }
00162
00163 PB_ASSOC_CLASS_T_DEC
00164 inline bool
00165 PB_ASSOC_CLASS_C_DEC::
00166 is_resize_needed() const
00167 {
00168 PB_ASSOC_DBG_ONLY(assert_valid();)
00169
00170 return (m_resize_needed);
00171 }
00172
00173 PB_ASSOC_CLASS_T_DEC
00174 inline bool
00175 PB_ASSOC_CLASS_C_DEC::
00176 is_grow_needed(size_type , size_type num_entries) const
00177 {
00178 PB_ASSOC_DBG_ASSERT(m_resize_needed);
00179
00180 return (num_entries >= m_next_grow_size);
00181 }
00182
00183 PB_ASSOC_CLASS_T_DEC
00184 inline bool
00185 PB_ASSOC_CLASS_C_DEC::
00186 is_shrink_needed(size_type , size_type num_entries) const
00187 {
00188 PB_ASSOC_DBG_ASSERT(m_resize_needed);
00189
00190 return (num_entries <= m_next_shrink_size);
00191 }
00192
00193 PB_ASSOC_CLASS_T_DEC
00194 PB_ASSOC_CLASS_C_DEC::
00195 ~hash_load_check_resize_trigger()
00196 { }
00197
00198 PB_ASSOC_CLASS_T_DEC
00199 void
00200 PB_ASSOC_CLASS_C_DEC::
00201 notify_resized(size_type new_size)
00202 {
00203 m_resize_needed = false;
00204
00205 m_next_grow_size =
00206 size_type(m_load_max* new_size - 1);
00207
00208 m_next_shrink_size =
00209 size_type(m_load_min* new_size );
00210
00211 PB_ASSOC_DBG_ONLY(assert_valid();)
00212 }
00213
00214 PB_ASSOC_CLASS_T_DEC
00215 void
00216 PB_ASSOC_CLASS_C_DEC::
00217 notify_externally_resized(size_type new_size)
00218 {
00219 m_resize_needed = false;
00220
00221 size_type new_grow_size =
00222 size_type(m_load_max* new_size - 1);
00223
00224 size_type new_shrink_size =
00225 size_type(m_load_min* new_size );
00226
00227 if (new_grow_size >= m_next_grow_size)
00228 {
00229 PB_ASSOC_DBG_ASSERT(new_shrink_size > m_next_shrink_size);
00230
00231 m_next_grow_size = new_grow_size;
00232
00233 PB_ASSOC_DBG_ONLY(assert_valid();)
00234
00235 return;
00236 }
00237
00238 PB_ASSOC_DBG_ASSERT(new_shrink_size <= m_next_shrink_size);
00239
00240 m_next_shrink_size = new_shrink_size;
00241
00242 PB_ASSOC_DBG_ONLY(assert_valid();)
00243 }
00244
00245 PB_ASSOC_CLASS_T_DEC
00246 void
00247 PB_ASSOC_CLASS_C_DEC::
00248 notify_cleared()
00249 {
00250 my_size_base::set_size(0);
00251
00252 m_resize_needed = (0 < m_next_shrink_size);
00253
00254 PB_ASSOC_DBG_ONLY(assert_valid();)
00255 }
00256
00257 PB_ASSOC_CLASS_T_DEC
00258 void
00259 PB_ASSOC_CLASS_C_DEC::
00260 swap(PB_ASSOC_CLASS_C_DEC& r_other)
00261 {
00262 PB_ASSOC_DBG_ONLY(assert_valid();)
00263 PB_ASSOC_DBG_ONLY(r_other.assert_valid();)
00264
00265 my_size_base::swap(r_other);
00266
00267 std::swap(m_load_min, r_other.m_load_min);
00268 std::swap(m_load_max, r_other.m_load_max);
00269
00270 std::swap(m_resize_needed, r_other.m_resize_needed);
00271
00272 std::swap(m_next_grow_size, r_other.m_next_grow_size);
00273 std::swap(m_next_shrink_size, r_other.m_next_shrink_size);
00274
00275 PB_ASSOC_DBG_ONLY(assert_valid();)
00276 PB_ASSOC_DBG_ONLY(r_other.assert_valid();)
00277 }
00278
00279 PB_ASSOC_CLASS_T_DEC
00280 inline std::pair<float, float>
00281 PB_ASSOC_CLASS_C_DEC::
00282 get_loads() const
00283 {
00284 return (get_loads_imp(s_external_load_access_ind));
00285 }
00286
00287 PB_ASSOC_CLASS_T_DEC
00288 void
00289 PB_ASSOC_CLASS_C_DEC::
00290 set_loads(std::pair<float, float> load_pair)
00291 {
00292 set_loads_imp(load_pair, s_external_load_access_ind);
00293 }
00294
00295 PB_ASSOC_CLASS_T_DEC
00296 inline std::pair<float, float>
00297 PB_ASSOC_CLASS_C_DEC::
00298 get_loads_imp(pb_assoc::detail::int_to_type<true>) const
00299 {
00300 return (std::make_pair(m_load_min, m_load_max));
00301 }
00302
00303 PB_ASSOC_CLASS_T_DEC
00304 void
00305 PB_ASSOC_CLASS_C_DEC::
00306 set_loads_imp(std::pair<float, float> load_pair, pb_assoc::detail::int_to_type<true>)
00307 {
00308 const float old_load_min = m_load_min;
00309 const float old_load_max = m_load_max;
00310 const size_type old_next_shrink_size = m_next_shrink_size;
00311 const size_type old_next_grow_size = m_next_grow_size;
00312 const bool old_resize_needed = m_resize_needed;
00313
00314 try
00315 {
00316 m_load_min = load_pair.first;
00317 m_load_max = load_pair.second;
00318
00319 do_resize(static_cast<size_type>(
00320 my_size_base::get_size() / ((m_load_min + m_load_max) / 2)));
00321 }
00322 catch(...)
00323 {
00324 m_load_min = old_load_min;
00325 m_load_max = old_load_max;
00326 m_next_shrink_size = old_next_shrink_size;
00327 m_next_grow_size = old_next_grow_size;
00328 m_resize_needed = old_resize_needed;
00329
00330 throw;
00331 }
00332 }
00333
00334 PB_ASSOC_CLASS_T_DEC
00335 void
00336 PB_ASSOC_CLASS_C_DEC::
00337 do_resize(size_type )
00338 {
00339 abort();
00340 }
00341
00342 #ifdef PB_ASSOC_HT_LOAD_CHECK_RESIZE_TRIGGER_DEBUG
00343 PB_ASSOC_CLASS_T_DEC
00344 void
00345 PB_ASSOC_CLASS_C_DEC::
00346 assert_valid() const
00347 {
00348 PB_ASSOC_DBG_ASSERT(m_load_max > m_load_min);
00349
00350 PB_ASSOC_DBG_ASSERT(m_next_grow_size >= m_next_shrink_size);
00351 }
00352 #endif // #ifdef PB_ASSOC_HT_LOAD_CHECK_RESIZE_TRIGGER_DEBUG