1*38fd1498Szrj // -*- C++ -*-
2*38fd1498Szrj 
3*38fd1498Szrj // Copyright (C) 2005-2018 Free Software Foundation, Inc.
4*38fd1498Szrj //
5*38fd1498Szrj // This file is part of the GNU ISO C++ Library.  This library is free
6*38fd1498Szrj // software; you can redistribute it and/or modify it under the terms
7*38fd1498Szrj // of the GNU General Public License as published by the Free Software
8*38fd1498Szrj // Foundation; either version 3, or (at your option) any later
9*38fd1498Szrj // version.
10*38fd1498Szrj 
11*38fd1498Szrj // This library is distributed in the hope that it will be useful, but
12*38fd1498Szrj // WITHOUT ANY WARRANTY; without even the implied warranty of
13*38fd1498Szrj // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14*38fd1498Szrj // General Public License for more details.
15*38fd1498Szrj 
16*38fd1498Szrj // Under Section 7 of GPL version 3, you are granted additional
17*38fd1498Szrj // permissions described in the GCC Runtime Library Exception, version
18*38fd1498Szrj // 3.1, as published by the Free Software Foundation.
19*38fd1498Szrj 
20*38fd1498Szrj // You should have received a copy of the GNU General Public License and
21*38fd1498Szrj // a copy of the GCC Runtime Library Exception along with this program;
22*38fd1498Szrj // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23*38fd1498Szrj // <http://www.gnu.org/licenses/>.
24*38fd1498Szrj 
25*38fd1498Szrj // Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL.
26*38fd1498Szrj 
27*38fd1498Szrj // Permission to use, copy, modify, sell, and distribute this software
28*38fd1498Szrj // is hereby granted without fee, provided that the above copyright
29*38fd1498Szrj // notice appears in all copies, and that both that copyright notice
30*38fd1498Szrj // and this permission notice appear in supporting documentation. None
31*38fd1498Szrj // of the above authors, nor IBM Haifa Research Laboratories, make any
32*38fd1498Szrj // representation about the suitability of this software for any
33*38fd1498Szrj // purpose. It is provided "as is" without express or implied
34*38fd1498Szrj // warranty.
35*38fd1498Szrj 
36*38fd1498Szrj /**
37*38fd1498Szrj  * @file cc_hash_max_collision_check_resize_trigger_imp.hpp
38*38fd1498Szrj  * Contains a resize trigger implementation.
39*38fd1498Szrj  */
40*38fd1498Szrj 
41*38fd1498Szrj PB_DS_CLASS_T_DEC
42*38fd1498Szrj PB_DS_CLASS_C_DEC::
cc_hash_max_collision_check_resize_trigger(float load)43*38fd1498Szrj cc_hash_max_collision_check_resize_trigger(float load) :
44*38fd1498Szrj   m_load(load),
45*38fd1498Szrj   m_size(0),
46*38fd1498Szrj   m_num_col(0),
47*38fd1498Szrj   m_max_col(0),
48*38fd1498Szrj   m_resize_needed(false)
49*38fd1498Szrj { }
50*38fd1498Szrj 
51*38fd1498Szrj PB_DS_CLASS_T_DEC
52*38fd1498Szrj inline void
53*38fd1498Szrj PB_DS_CLASS_C_DEC::
notify_find_search_start()54*38fd1498Szrj notify_find_search_start()
55*38fd1498Szrj { }
56*38fd1498Szrj 
57*38fd1498Szrj PB_DS_CLASS_T_DEC
58*38fd1498Szrj inline void
59*38fd1498Szrj PB_DS_CLASS_C_DEC::
notify_find_search_collision()60*38fd1498Szrj notify_find_search_collision()
61*38fd1498Szrj { }
62*38fd1498Szrj 
63*38fd1498Szrj PB_DS_CLASS_T_DEC
64*38fd1498Szrj inline void
65*38fd1498Szrj PB_DS_CLASS_C_DEC::
notify_find_search_end()66*38fd1498Szrj notify_find_search_end()
67*38fd1498Szrj { }
68*38fd1498Szrj 
69*38fd1498Szrj PB_DS_CLASS_T_DEC
70*38fd1498Szrj inline void
71*38fd1498Szrj PB_DS_CLASS_C_DEC::
notify_insert_search_start()72*38fd1498Szrj notify_insert_search_start()
73*38fd1498Szrj { m_num_col = 0; }
74*38fd1498Szrj 
75*38fd1498Szrj PB_DS_CLASS_T_DEC
76*38fd1498Szrj inline void
77*38fd1498Szrj PB_DS_CLASS_C_DEC::
notify_insert_search_collision()78*38fd1498Szrj notify_insert_search_collision()
79*38fd1498Szrj { ++m_num_col; }
80*38fd1498Szrj 
81*38fd1498Szrj PB_DS_CLASS_T_DEC
82*38fd1498Szrj inline void
83*38fd1498Szrj PB_DS_CLASS_C_DEC::
notify_insert_search_end()84*38fd1498Szrj notify_insert_search_end()
85*38fd1498Szrj { calc_resize_needed(); }
86*38fd1498Szrj 
87*38fd1498Szrj PB_DS_CLASS_T_DEC
88*38fd1498Szrj inline void
89*38fd1498Szrj PB_DS_CLASS_C_DEC::
notify_erase_search_start()90*38fd1498Szrj notify_erase_search_start()
91*38fd1498Szrj { }
92*38fd1498Szrj 
93*38fd1498Szrj PB_DS_CLASS_T_DEC
94*38fd1498Szrj inline void
95*38fd1498Szrj PB_DS_CLASS_C_DEC::
notify_erase_search_collision()96*38fd1498Szrj notify_erase_search_collision()
97*38fd1498Szrj { }
98*38fd1498Szrj 
99*38fd1498Szrj PB_DS_CLASS_T_DEC
100*38fd1498Szrj inline void
101*38fd1498Szrj PB_DS_CLASS_C_DEC::
notify_erase_search_end()102*38fd1498Szrj notify_erase_search_end()
103*38fd1498Szrj { }
104*38fd1498Szrj 
105*38fd1498Szrj PB_DS_CLASS_T_DEC
106*38fd1498Szrj inline void
107*38fd1498Szrj PB_DS_CLASS_C_DEC::
notify_inserted(size_type)108*38fd1498Szrj notify_inserted(size_type)
109*38fd1498Szrj { }
110*38fd1498Szrj 
111*38fd1498Szrj PB_DS_CLASS_T_DEC
112*38fd1498Szrj inline void
113*38fd1498Szrj PB_DS_CLASS_C_DEC::
notify_erased(size_type)114*38fd1498Szrj notify_erased(size_type)
115*38fd1498Szrj { m_resize_needed = true; }
116*38fd1498Szrj 
117*38fd1498Szrj PB_DS_CLASS_T_DEC
118*38fd1498Szrj void
119*38fd1498Szrj PB_DS_CLASS_C_DEC::
notify_cleared()120*38fd1498Szrj notify_cleared()
121*38fd1498Szrj { m_resize_needed = false; }
122*38fd1498Szrj 
123*38fd1498Szrj PB_DS_CLASS_T_DEC
124*38fd1498Szrj inline bool
125*38fd1498Szrj PB_DS_CLASS_C_DEC::
is_resize_needed() const126*38fd1498Szrj is_resize_needed() const
127*38fd1498Szrj { return m_resize_needed; }
128*38fd1498Szrj 
129*38fd1498Szrj PB_DS_CLASS_T_DEC
130*38fd1498Szrj inline bool
131*38fd1498Szrj PB_DS_CLASS_C_DEC::
is_grow_needed(size_type,size_type) const132*38fd1498Szrj is_grow_needed(size_type /*size*/, size_type /*num_used_e*/) const
133*38fd1498Szrj { return m_num_col >= m_max_col; }
134*38fd1498Szrj 
135*38fd1498Szrj PB_DS_CLASS_T_DEC
136*38fd1498Szrj void
137*38fd1498Szrj PB_DS_CLASS_C_DEC::
notify_resized(size_type new_size)138*38fd1498Szrj notify_resized(size_type new_size)
139*38fd1498Szrj {
140*38fd1498Szrj   m_size = new_size;
141*38fd1498Szrj 
142*38fd1498Szrj #ifdef PB_DS_HT_MAP_RESIZE_TRACE_
143*38fd1498Szrj   std::cerr << "chmccrt::notify_resized "
144*38fd1498Szrj 	    << static_cast<unsigned long>(new_size) << std::endl;
145*38fd1498Szrj #endif
146*38fd1498Szrj 
147*38fd1498Szrj   calc_max_num_coll();
148*38fd1498Szrj   calc_resize_needed();
149*38fd1498Szrj   m_num_col = 0;
150*38fd1498Szrj }
151*38fd1498Szrj 
152*38fd1498Szrj PB_DS_CLASS_T_DEC
153*38fd1498Szrj void
154*38fd1498Szrj PB_DS_CLASS_C_DEC::
calc_max_num_coll()155*38fd1498Szrj calc_max_num_coll()
156*38fd1498Szrj {
157*38fd1498Szrj   // max_col <-- \sqrt{2 load \ln( 2 m \ln( m ) ) }
158*38fd1498Szrj   const double ln_arg = 2 * m_size * std::log(double(m_size));
159*38fd1498Szrj   m_max_col = size_type(std::ceil(std::sqrt(2 * m_load * std::log(ln_arg))));
160*38fd1498Szrj 
161*38fd1498Szrj #ifdef PB_DS_HT_MAP_RESIZE_TRACE_
162*38fd1498Szrj   std::cerr << "chmccrt::calc_max_num_coll "
163*38fd1498Szrj 	    << static_cast<unsigned long>(m_size) <<    "    "
164*38fd1498Szrj 	    << static_cast<unsigned long>(m_max_col) << std::endl;
165*38fd1498Szrj #endif
166*38fd1498Szrj }
167*38fd1498Szrj 
168*38fd1498Szrj PB_DS_CLASS_T_DEC
169*38fd1498Szrj void
170*38fd1498Szrj PB_DS_CLASS_C_DEC::
notify_externally_resized(size_type new_size)171*38fd1498Szrj notify_externally_resized(size_type new_size)
172*38fd1498Szrj { notify_resized(new_size); }
173*38fd1498Szrj 
174*38fd1498Szrj PB_DS_CLASS_T_DEC
175*38fd1498Szrj void
176*38fd1498Szrj PB_DS_CLASS_C_DEC::
swap(PB_DS_CLASS_C_DEC & other)177*38fd1498Szrj swap(PB_DS_CLASS_C_DEC& other)
178*38fd1498Szrj {
179*38fd1498Szrj   std::swap(m_load, other.m_load);
180*38fd1498Szrj   std::swap(m_size, other.m_size);
181*38fd1498Szrj   std::swap(m_num_col, other.m_num_col);
182*38fd1498Szrj   std::swap(m_max_col, other.m_max_col);
183*38fd1498Szrj   std::swap(m_resize_needed, other.m_resize_needed);
184*38fd1498Szrj }
185*38fd1498Szrj 
186*38fd1498Szrj PB_DS_CLASS_T_DEC
187*38fd1498Szrj inline float
188*38fd1498Szrj PB_DS_CLASS_C_DEC::
get_load() const189*38fd1498Szrj get_load() const
190*38fd1498Szrj {
191*38fd1498Szrj   PB_DS_STATIC_ASSERT(access, external_load_access);
192*38fd1498Szrj   return m_load;
193*38fd1498Szrj }
194*38fd1498Szrj 
195*38fd1498Szrj PB_DS_CLASS_T_DEC
196*38fd1498Szrj inline void
197*38fd1498Szrj PB_DS_CLASS_C_DEC::
calc_resize_needed()198*38fd1498Szrj calc_resize_needed()
199*38fd1498Szrj { m_resize_needed = m_resize_needed || m_num_col >= m_max_col; }
200*38fd1498Szrj 
201*38fd1498Szrj PB_DS_CLASS_T_DEC
202*38fd1498Szrj void
203*38fd1498Szrj PB_DS_CLASS_C_DEC::
set_load(float load)204*38fd1498Szrj set_load(float load)
205*38fd1498Szrj {
206*38fd1498Szrj   PB_DS_STATIC_ASSERT(access, external_load_access);
207*38fd1498Szrj   m_load = load;
208*38fd1498Szrj   calc_max_num_coll();
209*38fd1498Szrj   calc_resize_needed();
210*38fd1498Szrj }
211*38fd1498Szrj 
212