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 typename PB_ASSOC_CLASS_C_DEC::entry_allocator
00047 PB_ASSOC_CLASS_C_DEC::s_entry_allocator;
00048 
00049 PB_ASSOC_CLASS_T_DEC
00050 template<class It>
00051 void
00052 PB_ASSOC_CLASS_C_DEC::
00053 copy_from_range(It first_it, It last_it)
00054 {
00055   while (first_it != last_it)
00056     insert(*(first_it++));
00057 }
00058 
00059 PB_ASSOC_CLASS_T_DEC
00060 PB_ASSOC_CLASS_C_DEC::
00061 PB_ASSOC_CLASS_NAME() :
00062   m_p_l(s_entry_allocator.allocate(1)),
00063   m_size(0)
00064 {
00065   initialize();
00066 
00067   PB_ASSOC_DBG_ONLY(assert_valid();)
00068     }
00069 
00070 PB_ASSOC_CLASS_T_DEC
00071 PB_ASSOC_CLASS_C_DEC::
00072 PB_ASSOC_CLASS_NAME(const Eq_Fn& r_eq_fn) :
00073   Eq_Fn(r_eq_fn),
00074   m_p_l(s_entry_allocator.allocate(1)),
00075   m_size(0)
00076 {
00077   initialize();
00078 
00079   PB_ASSOC_DBG_ONLY(assert_valid();)
00080     }
00081 
00082 PB_ASSOC_CLASS_T_DEC
00083 PB_ASSOC_CLASS_C_DEC::
00084 PB_ASSOC_CLASS_NAME(const Eq_Fn& r_eq_fn, const Update_Policy& r_update_policy) :
00085   Eq_Fn(r_eq_fn),
00086   Update_Policy(r_update_policy),
00087   m_p_l(s_entry_allocator.allocate(1)),
00088   m_size(0)
00089 {
00090   initialize();
00091 
00092   PB_ASSOC_DBG_ONLY(assert_valid();)
00093     }
00094 
00095 PB_ASSOC_CLASS_T_DEC
00096 PB_ASSOC_CLASS_C_DEC::
00097 PB_ASSOC_CLASS_NAME(const PB_ASSOC_CLASS_C_DEC& r_other) :
00098   Eq_Fn(r_other),
00099   Update_Policy(r_other),
00100   m_p_l(s_entry_allocator.allocate(1)),
00101   m_size(0)
00102 {
00103   initialize();
00104 
00105   try
00106     {
00107       copy_from_range(r_other.begin(), r_other.end());
00108     }
00109   catch(...)
00110     {
00111       deallocate_all(true);
00112 
00113       throw;
00114     }
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 swap(PB_ASSOC_CLASS_C_DEC& r_other)
00123 {
00124   PB_ASSOC_DBG_ONLY(assert_valid();)
00125     PB_ASSOC_DBG_ONLY(r_other.assert_valid();)
00126 
00127     std::swap(m_p_l, r_other.m_p_l);
00128 
00129   std::swap(m_size, r_other.m_size);
00130 
00131   std::swap((Eq_Fn& )(*this), (Eq_Fn& )r_other);
00132 
00133   Update_Policy::swap(r_other);
00134 
00135   PB_ASSOC_DBG_ONLY(my_map_debug_base::swap(r_other);)
00136 
00137     PB_ASSOC_DBG_ONLY(assert_valid();)
00138     PB_ASSOC_DBG_ONLY(r_other.assert_valid();)
00139     }
00140 
00141 PB_ASSOC_CLASS_T_DEC
00142 void
00143 PB_ASSOC_CLASS_C_DEC::
00144 deallocate_all(bool deallocate_root)
00145 {
00146   entry_pointer p_l = m_p_l->m_p_next;
00147 
00148   while (p_l != NULL)
00149     {
00150       entry_pointer p_next_l = p_l->m_p_next;
00151 
00152       p_l->~entry();
00153 
00154       s_entry_allocator.deallocate(p_l, 1);
00155 
00156       p_l = p_next_l;
00157     }
00158 
00159   if (deallocate_root)
00160     s_entry_allocator.deallocate(m_p_l, 1);
00161   else
00162     m_p_l->m_p_next = NULL;
00163 }
00164 
00165 PB_ASSOC_CLASS_T_DEC
00166 PB_ASSOC_CLASS_C_DEC::
00167 ~PB_ASSOC_CLASS_NAME()
00168 {
00169   deallocate_all(true);
00170 }
00171 
00172 PB_ASSOC_CLASS_T_DEC
00173 void
00174 PB_ASSOC_CLASS_C_DEC::
00175 initialize()
00176 {
00177   m_p_l->m_p_next = NULL;
00178 }