1169691Skan// -*- C++ -*-
2169691Skan
3169691Skan// Copyright (C) 2005, 2006 Free Software Foundation, Inc.
4169691Skan//
5169691Skan// This file is part of the GNU ISO C++ Library.  This library is free
6169691Skan// software; you can redistribute it and/or modify it under the terms
7169691Skan// of the GNU General Public License as published by the Free Software
8169691Skan// Foundation; either version 2, or (at your option) any later
9169691Skan// version.
10169691Skan
11169691Skan// This library is distributed in the hope that it will be useful, but
12169691Skan// WITHOUT ANY WARRANTY; without even the implied warranty of
13169691Skan// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14169691Skan// General Public License for more details.
15169691Skan
16169691Skan// You should have received a copy of the GNU General Public License
17169691Skan// along with this library; see the file COPYING.  If not, write to
18169691Skan// the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
19169691Skan// MA 02111-1307, USA.
20169691Skan
21169691Skan// As a special exception, you may use this file as part of a free
22169691Skan// software library without restriction.  Specifically, if other files
23169691Skan// instantiate templates or use macros or inline functions from this
24169691Skan// file, or you compile this file and link it with other files to
25169691Skan// produce an executable, this file does not by itself cause the
26169691Skan// resulting executable to be covered by the GNU General Public
27169691Skan// License.  This exception does not however invalidate any other
28169691Skan// reasons why the executable file might be covered by the GNU General
29169691Skan// Public License.
30169691Skan
31169691Skan// Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL.
32169691Skan
33169691Skan// Permission to use, copy, modify, sell, and distribute this software
34169691Skan// is hereby granted without fee, provided that the above copyright
35169691Skan// notice appears in all copies, and that both that copyright notice
36169691Skan// and this permission notice appear in supporting documentation. None
37169691Skan// of the above authors, nor IBM Haifa Research Laboratories, make any
38169691Skan// representation about the suitability of this software for any
39169691Skan// purpose. It is provided "as is" without express or implied
40169691Skan// warranty.
41169691Skan
42169691Skan/**
43169691Skan * @file cc_hash_max_collision_check_resize_trigger_imp.hpp
44169691Skan * Contains a resize trigger implementation.
45169691Skan */
46169691Skan
47169691Skan#define PB_DS_STATIC_ASSERT(UNIQUE, E) \
48169691Skan  typedef detail::static_assert_dumclass<sizeof(detail::static_assert<(bool)(E)>)> UNIQUE##static_assert_type
49169691Skan
50169691SkanPB_DS_CLASS_T_DEC
51169691SkanPB_DS_CLASS_C_DEC::
52169691Skancc_hash_max_collision_check_resize_trigger(float load) :
53169691Skan  m_load(load),
54169691Skan  m_size(0),
55169691Skan  m_num_col(0),
56169691Skan  m_max_col(0),
57169691Skan  m_resize_needed(false)
58169691Skan{ }
59169691Skan
60169691SkanPB_DS_CLASS_T_DEC
61169691Skaninline void
62169691SkanPB_DS_CLASS_C_DEC::
63169691Skannotify_find_search_start()
64169691Skan{ }
65169691Skan
66169691SkanPB_DS_CLASS_T_DEC
67169691Skaninline void
68169691SkanPB_DS_CLASS_C_DEC::
69169691Skannotify_find_search_collision()
70169691Skan{ }
71169691Skan
72169691SkanPB_DS_CLASS_T_DEC
73169691Skaninline void
74169691SkanPB_DS_CLASS_C_DEC::
75169691Skannotify_find_search_end()
76169691Skan{ }
77169691Skan
78169691SkanPB_DS_CLASS_T_DEC
79169691Skaninline void
80169691SkanPB_DS_CLASS_C_DEC::
81169691Skannotify_insert_search_start()
82169691Skan{ m_num_col = 0; }
83169691Skan
84169691SkanPB_DS_CLASS_T_DEC
85169691Skaninline void
86169691SkanPB_DS_CLASS_C_DEC::
87169691Skannotify_insert_search_collision()
88169691Skan{ ++m_num_col; }
89169691Skan
90169691SkanPB_DS_CLASS_T_DEC
91169691Skaninline void
92169691SkanPB_DS_CLASS_C_DEC::
93169691Skannotify_insert_search_end()
94169691Skan{ calc_resize_needed(); }
95169691Skan
96169691SkanPB_DS_CLASS_T_DEC
97169691Skaninline void
98169691SkanPB_DS_CLASS_C_DEC::
99169691Skannotify_erase_search_start()
100169691Skan{ }
101169691Skan
102169691SkanPB_DS_CLASS_T_DEC
103169691Skaninline void
104169691SkanPB_DS_CLASS_C_DEC::
105169691Skannotify_erase_search_collision()
106169691Skan{ }
107169691Skan
108169691SkanPB_DS_CLASS_T_DEC
109169691Skaninline void
110169691SkanPB_DS_CLASS_C_DEC::
111169691Skannotify_erase_search_end()
112169691Skan{ }
113169691Skan
114169691SkanPB_DS_CLASS_T_DEC
115169691Skaninline void
116169691SkanPB_DS_CLASS_C_DEC::
117169691Skannotify_inserted(size_type)
118169691Skan{ }
119169691Skan
120169691SkanPB_DS_CLASS_T_DEC
121169691Skaninline void
122169691SkanPB_DS_CLASS_C_DEC::
123169691Skannotify_erased(size_type)
124169691Skan{ m_resize_needed = true; }
125169691Skan
126169691SkanPB_DS_CLASS_T_DEC
127169691Skanvoid
128169691SkanPB_DS_CLASS_C_DEC::
129169691Skannotify_cleared()
130169691Skan{ m_resize_needed = false; }
131169691Skan
132169691SkanPB_DS_CLASS_T_DEC
133169691Skaninline bool
134169691SkanPB_DS_CLASS_C_DEC::
135169691Skanis_resize_needed() const
136169691Skan{ return m_resize_needed; }
137169691Skan
138169691SkanPB_DS_CLASS_T_DEC
139169691Skaninline bool
140169691SkanPB_DS_CLASS_C_DEC::
141169691Skanis_grow_needed(size_type /*size*/, size_type /*num_used_e*/) const
142169691Skan{ return m_num_col >= m_max_col; }
143169691Skan
144169691SkanPB_DS_CLASS_T_DEC
145169691Skanvoid
146169691SkanPB_DS_CLASS_C_DEC::
147169691Skannotify_resized(size_type new_size)
148169691Skan{
149169691Skan  m_size = new_size;
150169691Skan
151169691Skan#ifdef PB_DS_HT_MAP_RESIZE_TRACE_
152169691Skan  std::cerr << "chmccrt::notify_resized "
153169691Skan	    << static_cast<unsigned long>(new_size) << std::endl;
154169691Skan#endif
155169691Skan
156169691Skan  calc_max_num_coll();
157169691Skan  calc_resize_needed();
158169691Skan  m_num_col = 0;
159169691Skan}
160169691Skan
161169691SkanPB_DS_CLASS_T_DEC
162169691Skanvoid
163169691SkanPB_DS_CLASS_C_DEC::
164169691Skancalc_max_num_coll()
165169691Skan{
166169691Skan  // max_col <-- \sqrt{2 load \ln( 2 m \ln( m ) ) }
167169691Skan  const double ln_arg = 2 * m_size * ::log(double(m_size));
168169691Skan  m_max_col = size_type(::ceil(::sqrt(2 * m_load * ::log(ln_arg))));
169169691Skan
170169691Skan#ifdef PB_DS_HT_MAP_RESIZE_TRACE_
171169691Skan  std::cerr << "chmccrt::calc_max_num_coll "
172169691Skan	    << static_cast<unsigned long>(m_size) <<    "    "
173169691Skan	    << static_cast<unsigned long>(m_max_col) << std::endl;
174169691Skan#endif
175169691Skan}
176169691Skan
177169691SkanPB_DS_CLASS_T_DEC
178169691Skanvoid
179169691SkanPB_DS_CLASS_C_DEC::
180169691Skannotify_externally_resized(size_type new_size)
181169691Skan{ notify_resized(new_size); }
182169691Skan
183169691SkanPB_DS_CLASS_T_DEC
184169691Skanvoid
185169691SkanPB_DS_CLASS_C_DEC::
186169691Skanswap(PB_DS_CLASS_C_DEC& other)
187169691Skan{
188169691Skan  std::swap(m_load, other.m_load);
189169691Skan  std::swap(m_size, other.m_size);
190169691Skan  std::swap(m_num_col, other.m_num_col);
191169691Skan  std::swap(m_max_col, other.m_max_col);
192169691Skan  std::swap(m_resize_needed, other.m_resize_needed);
193169691Skan}
194169691Skan
195169691SkanPB_DS_CLASS_T_DEC
196169691Skaninline float
197169691SkanPB_DS_CLASS_C_DEC::
198169691Skanget_load() const
199169691Skan{
200169691Skan  PB_DS_STATIC_ASSERT(access, external_load_access);
201169691Skan  return m_load;
202169691Skan}
203169691Skan
204169691SkanPB_DS_CLASS_T_DEC
205169691Skaninline void
206169691SkanPB_DS_CLASS_C_DEC::
207169691Skancalc_resize_needed()
208169691Skan{ m_resize_needed = m_resize_needed || m_num_col >= m_max_col; }
209169691Skan
210169691SkanPB_DS_CLASS_T_DEC
211169691Skanvoid
212169691SkanPB_DS_CLASS_C_DEC::
213169691Skanset_load(float load)
214169691Skan{
215169691Skan  PB_DS_STATIC_ASSERT(access, external_load_access);
216169691Skan  m_load = load;
217169691Skan  calc_max_num_coll();
218169691Skan  calc_resize_needed();
219169691Skan}
220169691Skan
221169691Skan#undef PB_DS_STATIC_ASSERT
222