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 
00045 PB_ASSOC_CLASS_T_DEC
00046 inline bool
00047 PB_ASSOC_CLASS_C_DEC::
00048 do_resize_if_needed()
00049 {
00050   if (!my_resize_base::is_resize_needed())
00051     return (false);
00052 
00053   do
00054     do_resize(my_resize_base::get_new_size(m_num_e_p, m_num_used_e));
00055   while (my_resize_base::is_resize_needed());
00056 
00057   return (true);
00058 }
00059 
00060 PB_ASSOC_CLASS_T_DEC
00061 inline void
00062 PB_ASSOC_CLASS_C_DEC::
00063 do_resize_if_needed_no_throw()
00064 {
00065   if (!my_resize_base::is_resize_needed())
00066     return;
00067 
00068   try
00069     {
00070       do
00071     do_resize(my_resize_base::get_new_size(m_num_e_p, m_num_used_e));
00072       while (my_resize_base::is_resize_needed());
00073     }
00074   catch(...)
00075     { }
00076 
00077   PB_ASSOC_DBG_ONLY(assert_valid();)
00078     }
00079 
00080 PB_ASSOC_CLASS_T_DEC
00081 void
00082 PB_ASSOC_CLASS_C_DEC::
00083 do_resize(size_type new_size)
00084 {
00085   PB_ASSOC_DBG_ONLY(assert_valid();)
00086 
00087     const size_type old_size = m_num_e_p;
00088 
00089   entry_pointer_array a_p_entries_resized;
00090 
00091   
00092 
00093   my_ranged_hash_fn_base::notify_resized(new_size);
00094 
00095   try
00096     {
00097       
00098 
00099       a_p_entries_resized = s_entry_pointer_allocator.allocate(new_size);
00100 
00101       m_num_e_p = new_size;
00102     }
00103   catch(...)
00104     {
00105       my_ranged_hash_fn_base::notify_resized(old_size);
00106 
00107       throw;
00108     }
00109 
00110   
00111 
00112   resize_imp_no_exceptions(new_size, a_p_entries_resized, old_size);
00113 
00114   Resize_Policy::notify_resized(new_size);
00115 
00116   PB_ASSOC_DBG_ONLY(assert_valid();)
00117     }
00118 
00119 PB_ASSOC_CLASS_T_DEC
00120 void
00121 PB_ASSOC_CLASS_C_DEC::
00122 resize_imp_no_exceptions(size_type new_size, entry_pointer_array a_p_entries_resized, size_type old_size)
00123 {
00124   std::fill(a_p_entries_resized, a_p_entries_resized + m_num_e_p,(entry_pointer)NULL);
00125 
00126   for (size_type pos = 0; pos < old_size; ++pos)
00127     {
00128       entry_pointer p_e = m_a_p_entries[pos];
00129 
00130       while (p_e != NULL)
00131     p_e = resize_imp_no_exceptions_reassign_pointer(p_e, a_p_entries_resized, my_hash_traits_base::s_store_hash_indicator);
00132     }
00133 
00134   m_num_e_p = new_size;
00135 
00136   PB_ASSOC_DBG_ONLY(assert_entry_pointer_array_valid(a_p_entries_resized);)
00137 
00138     s_entry_pointer_allocator.deallocate(m_a_p_entries, old_size);
00139 
00140   m_a_p_entries = a_p_entries_resized;
00141 
00142   PB_ASSOC_DBG_ONLY(assert_valid();)
00143     }
00144 
00145 #include <ext/pb_assoc/detail/cc_ht_map_/resize_no_store_hash_fn_imps.hpp>
00146 #include <ext/pb_assoc/detail/cc_ht_map_/resize_store_hash_fn_imps.hpp>