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