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 #ifdef PB_ASSOC_HT_EXPONENTIAL_SIZE_POLICY_DEBUG
00046 #define PB_ASSOC_DBG_ASSERT(X) assert(X)
00047 #define PB_ASSOC_DBG_VERIFY(X) assert(X)
00048 #define PB_ASSOC_DBG_ONLY(X) X
00049 #else // #ifdef PB_ASSOC_HT_EXPONENTIAL_SIZE_POLICY_DEBUG
00050 #define PB_ASSOC_DBG_ASSERT(X)
00051 #define PB_ASSOC_DBG_VERIFY(X) {if((X)==0);}
00052 #define PB_ASSOC_DBG_ONLY(X) ;
00053 #endif // #ifdef PB_ASSOC_HT_EXPONENTIAL_SIZE_POLICY_DEBUG
00054
00055 PB_ASSOC_CLASS_T_DEC
00056 PB_ASSOC_CLASS_C_DEC::
00057 hash_exponential_size_policy(size_type start_size, size_type grow_factor) :
00058 m_start_size(start_size),
00059 m_grow_factor(grow_factor)
00060 { }
00061
00062 PB_ASSOC_CLASS_T_DEC
00063 void
00064 PB_ASSOC_CLASS_C_DEC::
00065 swap(PB_ASSOC_CLASS_C_DEC& r_other)
00066 {
00067 std::swap(m_start_size, r_other.m_start_size);
00068
00069 std::swap(m_grow_factor, r_other.m_grow_factor);
00070 }
00071
00072 PB_ASSOC_CLASS_T_DEC
00073 typename PB_ASSOC_CLASS_C_DEC::size_type
00074 PB_ASSOC_CLASS_C_DEC::
00075 get_init_size(size_type suggested_size) const
00076 {
00077 size_type ret = m_start_size;
00078
00079 while (ret < suggested_size)
00080 ret *= m_grow_factor;
00081
00082 return (ret);
00083 }
00084
00085 PB_ASSOC_CLASS_T_DEC
00086 typename PB_ASSOC_CLASS_C_DEC::size_type
00087 PB_ASSOC_CLASS_C_DEC::
00088 get_nearest_larger_size(size_type cur_size) const
00089 {
00090 PB_ASSOC_DBG_ONLY(assert_is_one_of_my_sizes(size);)
00091
00092 const size_type pot_ret = cur_size* m_grow_factor;
00093
00094 return ((pot_ret > cur_size)? pot_ret : cur_size);
00095 }
00096
00097 PB_ASSOC_CLASS_T_DEC
00098 typename PB_ASSOC_CLASS_C_DEC::size_type
00099 PB_ASSOC_CLASS_C_DEC::
00100 get_nearest_smaller_size(size_type cur_size) const
00101 {
00102 PB_ASSOC_DBG_ONLY(assert_is_one_of_my_sizes(size);)
00103
00104 const size_type pot_ret = cur_size / m_grow_factor;
00105
00106 return ((pot_ret > 0)? pot_ret : m_start_size);
00107 }
00108
00109 #ifdef PB_ASSOC_HT_EXPONENTIAL_SIZE_POLICY_DEBUG
00110 PB_ASSOC_CLASS_T_DEC
00111 void
00112 PB_ASSOC_CLASS_C_DEC::
00113 assert_is_one_of_my_sizes(size_type size)
00114 {
00115 PB_ASSOC_DBG_ASSERT(size >= m_start_size);
00116
00117 while (size >m_start_size)
00118 size /= m_grow_factor;
00119
00120 PB_ASSOC_DBG_ASSERT(size == m_start_size);
00121 }
00122 #endif // #ifdef PB_ASSOC_HT_EXPONENTIAL_SIZE_POLICY_DEBUG
00123