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
00046 PB_ASSOC_CLASS_T_DEC
00047 inline typename PB_ASSOC_CLASS_C_DEC::data_reference
00048 PB_ASSOC_CLASS_C_DEC::
00049 subscript_imp(const_key_reference r_key, int_to_type<true>)
00050 {
00051 PB_ASSOC_DBG_ONLY(assert_valid();)
00052
00053 comp_hash pos_hash_pair = my_ranged_hash_fn_base::operator()(r_key);
00054
00055 entry_pointer p_e = m_a_p_entries[pos_hash_pair.first];
00056
00057 my_resize_base::notify_insert_search_start();
00058
00059 while (p_e != NULL&&
00060 !my_hash_eq_fn_base::operator()(p_e->m_value.first, p_e->m_hash, r_key, pos_hash_pair.second))
00061 {
00062 my_resize_base::notify_insert_search_collision();
00063
00064 p_e = p_e->m_p_next;
00065 }
00066
00067 my_resize_base::notify_insert_search_end();
00068
00069 if (p_e != NULL)
00070 {
00071 PB_ASSOC_DBG_ONLY(my_map_debug_base::check_key_exists(r_key);)
00072
00073 return (p_e->m_value.second);
00074 }
00075
00076 PB_ASSOC_DBG_ONLY(my_map_debug_base::check_key_does_not_exist(r_key);)
00077
00078 return (insert_new_imp(
00079 value_type(r_key, Data()), pos_hash_pair)->second);
00080 }
00081
00082 PB_ASSOC_CLASS_T_DEC
00083 inline std::pair<typename PB_ASSOC_CLASS_C_DEC::find_iterator, bool>
00084 PB_ASSOC_CLASS_C_DEC::
00085 insert_imp(const_reference r_val, int_to_type<true>)
00086 {
00087 PB_ASSOC_DBG_ONLY(assert_valid();)
00088
00089 const_key_reference r_key = PB_ASSOC_V2F(r_val);
00090
00091 comp_hash pos_hash_pair = my_ranged_hash_fn_base::operator()(r_key);
00092
00093 entry_pointer p_e = m_a_p_entries[pos_hash_pair.first];
00094
00095 my_resize_base::notify_insert_search_start();
00096
00097 while (p_e != NULL&&
00098 !my_hash_eq_fn_base::operator()(
00099 PB_ASSOC_V2F(p_e->m_value),
00100 p_e->m_hash,
00101 r_key, pos_hash_pair.second))
00102 {
00103 my_resize_base::notify_insert_search_collision();
00104
00105 p_e = p_e->m_p_next;
00106 }
00107
00108 my_resize_base::notify_insert_search_end();
00109
00110 if (p_e != NULL)
00111 {
00112 PB_ASSOC_DBG_ONLY(my_map_debug_base::check_key_exists(r_key);)
00113
00114 return (
00115 std::make_pair(
00116 static_cast<pointer>(&p_e->m_value),
00117 false));
00118 }
00119
00120 PB_ASSOC_DBG_ONLY(my_map_debug_base::check_key_does_not_exist(r_key);)
00121
00122 return (
00123 std::make_pair(
00124 insert_new_imp(r_val, pos_hash_pair),
00125 true));
00126 }
00127
00128 PB_ASSOC_CLASS_T_DEC
00129 inline typename PB_ASSOC_CLASS_C_DEC::pointer
00130 PB_ASSOC_CLASS_C_DEC::
00131 insert_new_imp(const_reference r_val, comp_hash& r_pos_hash_pair)
00132 {
00133
00134
00135 if (do_resize_if_needed())
00136 r_pos_hash_pair = my_ranged_hash_fn_base::operator()(
00137 PB_ASSOC_V2F(r_val));
00138
00139 entry_pointer p_e = get_entry(r_val, my_traits_base::s_no_throw_copies_indicator);
00140
00141
00142
00143 p_e->m_hash = r_pos_hash_pair.second;
00144
00145 p_e->m_p_next = m_a_p_entries[r_pos_hash_pair.first];
00146
00147 m_a_p_entries[r_pos_hash_pair.first] = p_e;
00148
00149 my_resize_base::notify_inserted(++m_num_used_e);
00150
00151 PB_ASSOC_DBG_ONLY(my_map_debug_base::insert_new(r_key);)
00152
00153 PB_ASSOC_DBG_ONLY(assert_valid();)
00154
00155 return (static_cast<pointer>(&p_e->m_value));
00156 }
00157