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