]> git.ipfire.org Git - thirdparty/gcc.git/blob
63656723f7bdaea786b0a589296a2aeb2c1c1ff9
[thirdparty/gcc.git] /
1 // -*- C++ -*-
2
3 // Copyright (C) 2005, 2006 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the terms
7 // of the GNU General Public License as published by the Free Software
8 // Foundation; either version 2, or (at your option) any later
9 // version.
10
11 // This library is distributed in the hope that it will be useful, but
12 // WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // General Public License for more details.
15
16 // You should have received a copy of the GNU General Public License
17 // along with this library; see the file COPYING. If not, write to
18 // the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
19 // MA 02111-1307, USA.
20
21 // As a special exception, you may use this file as part of a free
22 // software library without restriction. Specifically, if other files
23 // instantiate templates or use macros or inline functions from this
24 // file, or you compile this file and link it with other files to
25 // produce an executable, this file does not by itself cause the
26 // resulting executable to be covered by the GNU General Public
27 // License. This exception does not however invalidate any other
28 // reasons why the executable file might be covered by the GNU General
29 // Public License.
30
31 // Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL.
32
33 // Permission to use, copy, modify, sell, and distribute this software
34 // is hereby granted without fee, provided that the above copyright
35 // notice appears in all copies, and that both that copyright notice
36 // and this permission notice appear in supporting documentation. None
37 // of the above authors, nor IBM Haifa Research Laboratories, make any
38 // representation about the suitability of this software for any
39 // purpose. It is provided "as is" without express or implied
40 // warranty.
41
42 /**
43 * @file cc_hash_max_collision_check_resize_trigger_imp.hpp
44 * Contains a resize trigger implementation.
45 */
46
47 #define PB_DS_STATIC_ASSERT(UNIQUE, E) \
48 typedef detail::static_assert_dumclass<sizeof(detail::static_assert<(bool)(E)>)> \
49 UNIQUE##static_assert_type
50
51 PB_DS_CLASS_T_DEC
52 PB_DS_CLASS_C_DEC::
53 cc_hash_max_collision_check_resize_trigger(float load) :
54 m_load(load),
55 m_size(0),
56 m_num_col(0),
57 m_max_col(0),
58 m_resize_needed(false)
59 { }
60
61 PB_DS_CLASS_T_DEC
62 inline void
63 PB_DS_CLASS_C_DEC::
64 notify_find_search_start()
65 { }
66
67 PB_DS_CLASS_T_DEC
68 inline void
69 PB_DS_CLASS_C_DEC::
70 notify_find_search_collision()
71 { }
72
73 PB_DS_CLASS_T_DEC
74 inline void
75 PB_DS_CLASS_C_DEC::
76 notify_find_search_end()
77 { }
78
79 PB_DS_CLASS_T_DEC
80 inline void
81 PB_DS_CLASS_C_DEC::
82 notify_insert_search_start()
83 {
84 m_num_col = 0;
85 }
86
87 PB_DS_CLASS_T_DEC
88 inline void
89 PB_DS_CLASS_C_DEC::
90 notify_insert_search_collision()
91 {
92 ++m_num_col;
93 }
94
95 PB_DS_CLASS_T_DEC
96 inline void
97 PB_DS_CLASS_C_DEC::
98 notify_insert_search_end()
99 {
100 calc_resize_needed();
101 }
102
103 PB_DS_CLASS_T_DEC
104 inline void
105 PB_DS_CLASS_C_DEC::
106 notify_erase_search_start()
107 { }
108
109 PB_DS_CLASS_T_DEC
110 inline void
111 PB_DS_CLASS_C_DEC::
112 notify_erase_search_collision()
113 { }
114
115 PB_DS_CLASS_T_DEC
116 inline void
117 PB_DS_CLASS_C_DEC::
118 notify_erase_search_end()
119 { }
120
121 PB_DS_CLASS_T_DEC
122 inline void
123 PB_DS_CLASS_C_DEC::
124 notify_inserted(size_type /*num_e*/)
125 { }
126
127 PB_DS_CLASS_T_DEC
128 inline void
129 PB_DS_CLASS_C_DEC::
130 notify_erased(size_type /*num_e*/)
131 {
132 m_resize_needed = true;
133 }
134
135 PB_DS_CLASS_T_DEC
136 void
137 PB_DS_CLASS_C_DEC::
138 notify_cleared()
139 {
140 m_resize_needed = false;
141 }
142
143 PB_DS_CLASS_T_DEC
144 inline bool
145 PB_DS_CLASS_C_DEC::
146 is_resize_needed() const
147 {
148 return (m_resize_needed);
149 }
150
151 PB_DS_CLASS_T_DEC
152 inline bool
153 PB_DS_CLASS_C_DEC::
154 is_grow_needed(size_type /*size*/, size_type /*num_used_e*/) const
155 {
156 return (m_num_col >= m_max_col);
157 }
158
159 PB_DS_CLASS_T_DEC
160 void
161 PB_DS_CLASS_C_DEC::
162 notify_resized(size_type new_size)
163 {
164 m_size = new_size;
165
166 #ifdef PB_DS_HT_MAP_RESIZE_TRACE_
167 std::cerr << "chmccrt::notify_resized " <<
168 static_cast<unsigned long>(new_size) << std::endl;
169 #endif // #ifdef PB_DS_HT_MAP_RESIZE_TRACE_
170
171 calc_max_num_coll();
172
173 calc_resize_needed();
174
175 m_num_col = 0;
176 }
177
178 PB_DS_CLASS_T_DEC
179 void
180 PB_DS_CLASS_C_DEC::
181 calc_max_num_coll()
182 {
183 // max_col <-- \sqrt{2 load \ln( 2 m \ln( m ) ) }
184
185 const double ln_arg = 2* m_size* ::log( (double)m_size);
186
187 m_max_col =(size_type)::ceil( ::sqrt(2* m_load* ::log(ln_arg) ) );
188
189 #ifdef PB_DS_HT_MAP_RESIZE_TRACE_
190 std::cerr << "chmccrt::calc_max_num_coll " <<
191 static_cast<unsigned long>(m_size) << " " <<
192 static_cast<unsigned long>(m_max_col) << std::endl;
193 #endif // #ifdef PB_DS_HT_MAP_RESIZE_TRACE_
194 }
195
196 PB_DS_CLASS_T_DEC
197 void
198 PB_DS_CLASS_C_DEC::
199 notify_externally_resized(size_type new_size)
200 {
201 notify_resized(new_size);
202 }
203
204 PB_DS_CLASS_T_DEC
205 void
206 PB_DS_CLASS_C_DEC::
207 swap(PB_DS_CLASS_C_DEC& other)
208 {
209 std::swap(m_load, other.m_load);
210
211 std::swap(m_size, other.m_size);
212
213 std::swap(m_num_col, other.m_num_col);
214
215 std::swap(m_max_col, other.m_max_col);
216
217 std::swap(m_resize_needed, other.m_resize_needed);
218 }
219
220 PB_DS_CLASS_T_DEC
221 inline float
222 PB_DS_CLASS_C_DEC::
223 get_load() const
224 {
225 PB_DS_STATIC_ASSERT(access, external_load_access);
226
227 return (m_load);
228 }
229
230 PB_DS_CLASS_T_DEC
231 inline void
232 PB_DS_CLASS_C_DEC::
233 calc_resize_needed()
234 {
235 m_resize_needed =
236 m_resize_needed || m_num_col >= m_max_col;
237 }
238
239 PB_DS_CLASS_T_DEC
240 void
241 PB_DS_CLASS_C_DEC::
242 set_load(float load)
243 {
244 PB_DS_STATIC_ASSERT(access, external_load_access);
245
246 m_load = load;
247
248 calc_max_num_coll();
249
250 calc_resize_needed();
251 }
252
253 #undef PB_DS_STATIC_ASSERT