1*e4b17023SJohn Marino // -*- C++ -*-
2*e4b17023SJohn Marino 
3*e4b17023SJohn Marino // Copyright (C) 2005, 2006, 2007, 2008, 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 hash_standard_resize_policy_imp.hpp
38*e4b17023SJohn Marino  * Contains a resize policy implementation.
39*e4b17023SJohn Marino  */
40*e4b17023SJohn Marino 
41*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
42*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
hash_standard_resize_policy()43*e4b17023SJohn Marino hash_standard_resize_policy()
44*e4b17023SJohn Marino : m_size(Size_Policy::get_nearest_larger_size(1))
45*e4b17023SJohn Marino { trigger_policy_base::notify_externally_resized(m_size); }
46*e4b17023SJohn Marino 
47*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
48*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
hash_standard_resize_policy(const Size_Policy & r_size_policy)49*e4b17023SJohn Marino hash_standard_resize_policy(const Size_Policy& r_size_policy)
50*e4b17023SJohn Marino : Size_Policy(r_size_policy), m_size(Size_Policy::get_nearest_larger_size(1))
51*e4b17023SJohn Marino { trigger_policy_base::notify_externally_resized(m_size); }
52*e4b17023SJohn Marino 
53*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
54*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
hash_standard_resize_policy(const Size_Policy & r_size_policy,const Trigger_Policy & r_trigger_policy)55*e4b17023SJohn Marino hash_standard_resize_policy(const Size_Policy& r_size_policy,
56*e4b17023SJohn Marino 			    const Trigger_Policy& r_trigger_policy)
57*e4b17023SJohn Marino : Size_Policy(r_size_policy), Trigger_Policy(r_trigger_policy),
58*e4b17023SJohn Marino   m_size(Size_Policy::get_nearest_larger_size(1))
59*e4b17023SJohn Marino { trigger_policy_base::notify_externally_resized(m_size); }
60*e4b17023SJohn Marino 
61*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
62*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
~hash_standard_resize_policy()63*e4b17023SJohn Marino ~hash_standard_resize_policy()
64*e4b17023SJohn Marino { }
65*e4b17023SJohn Marino 
66*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
67*e4b17023SJohn Marino void
68*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
swap(PB_DS_CLASS_C_DEC & other)69*e4b17023SJohn Marino swap(PB_DS_CLASS_C_DEC& other)
70*e4b17023SJohn Marino {
71*e4b17023SJohn Marino   trigger_policy_base::swap(other);
72*e4b17023SJohn Marino   size_policy_base::swap(other);
73*e4b17023SJohn Marino   std::swap(m_size, other.m_size);
74*e4b17023SJohn Marino }
75*e4b17023SJohn Marino 
76*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
77*e4b17023SJohn Marino inline void
78*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
notify_find_search_start()79*e4b17023SJohn Marino notify_find_search_start()
80*e4b17023SJohn Marino { trigger_policy_base::notify_find_search_start(); }
81*e4b17023SJohn Marino 
82*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
83*e4b17023SJohn Marino inline void
84*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
notify_find_search_collision()85*e4b17023SJohn Marino notify_find_search_collision()
86*e4b17023SJohn Marino { trigger_policy_base::notify_find_search_collision(); }
87*e4b17023SJohn Marino 
88*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
89*e4b17023SJohn Marino inline void
90*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
notify_find_search_end()91*e4b17023SJohn Marino notify_find_search_end()
92*e4b17023SJohn Marino { trigger_policy_base::notify_find_search_end(); }
93*e4b17023SJohn Marino 
94*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
95*e4b17023SJohn Marino inline void
96*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
notify_insert_search_start()97*e4b17023SJohn Marino notify_insert_search_start()
98*e4b17023SJohn Marino { trigger_policy_base::notify_insert_search_start(); }
99*e4b17023SJohn Marino 
100*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
101*e4b17023SJohn Marino inline void
102*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
notify_insert_search_collision()103*e4b17023SJohn Marino notify_insert_search_collision()
104*e4b17023SJohn Marino { trigger_policy_base::notify_insert_search_collision(); }
105*e4b17023SJohn Marino 
106*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
107*e4b17023SJohn Marino inline void
108*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
notify_insert_search_end()109*e4b17023SJohn Marino notify_insert_search_end()
110*e4b17023SJohn Marino { trigger_policy_base::notify_insert_search_end(); }
111*e4b17023SJohn Marino 
112*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
113*e4b17023SJohn Marino inline void
114*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
notify_erase_search_start()115*e4b17023SJohn Marino notify_erase_search_start()
116*e4b17023SJohn Marino { trigger_policy_base::notify_erase_search_start(); }
117*e4b17023SJohn Marino 
118*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
119*e4b17023SJohn Marino inline void
120*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
notify_erase_search_collision()121*e4b17023SJohn Marino notify_erase_search_collision()
122*e4b17023SJohn Marino { trigger_policy_base::notify_erase_search_collision(); }
123*e4b17023SJohn Marino 
124*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
125*e4b17023SJohn Marino inline void
126*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
notify_erase_search_end()127*e4b17023SJohn Marino notify_erase_search_end()
128*e4b17023SJohn Marino { trigger_policy_base::notify_erase_search_end(); }
129*e4b17023SJohn Marino 
130*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
131*e4b17023SJohn Marino inline void
132*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
notify_inserted(size_type num_e)133*e4b17023SJohn Marino notify_inserted(size_type num_e)
134*e4b17023SJohn Marino { trigger_policy_base::notify_inserted(num_e); }
135*e4b17023SJohn Marino 
136*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
137*e4b17023SJohn Marino inline void
138*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
notify_erased(size_type num_e)139*e4b17023SJohn Marino notify_erased(size_type num_e)
140*e4b17023SJohn Marino { trigger_policy_base::notify_erased(num_e); }
141*e4b17023SJohn Marino 
142*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
143*e4b17023SJohn Marino void
144*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
notify_cleared()145*e4b17023SJohn Marino notify_cleared()
146*e4b17023SJohn Marino { trigger_policy_base::notify_cleared(); }
147*e4b17023SJohn Marino 
148*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
149*e4b17023SJohn Marino inline bool
150*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
is_resize_needed() const151*e4b17023SJohn Marino is_resize_needed() const
152*e4b17023SJohn Marino { return trigger_policy_base::is_resize_needed(); }
153*e4b17023SJohn Marino 
154*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
155*e4b17023SJohn Marino typename PB_DS_CLASS_C_DEC::size_type
156*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
get_new_size(size_type size,size_type num_used_e) const157*e4b17023SJohn Marino get_new_size(size_type size, size_type num_used_e) const
158*e4b17023SJohn Marino {
159*e4b17023SJohn Marino   if (trigger_policy_base::is_grow_needed(size, num_used_e))
160*e4b17023SJohn Marino     return size_policy_base::get_nearest_larger_size(size);
161*e4b17023SJohn Marino   return size_policy_base::get_nearest_smaller_size(size);
162*e4b17023SJohn Marino }
163*e4b17023SJohn Marino 
164*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
165*e4b17023SJohn Marino void
166*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
notify_resized(size_type new_size)167*e4b17023SJohn Marino notify_resized(size_type new_size)
168*e4b17023SJohn Marino {
169*e4b17023SJohn Marino   trigger_policy_base::notify_resized(new_size);
170*e4b17023SJohn Marino   m_size = new_size;
171*e4b17023SJohn Marino }
172*e4b17023SJohn Marino 
173*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
174*e4b17023SJohn Marino inline typename PB_DS_CLASS_C_DEC::size_type
175*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
get_actual_size() const176*e4b17023SJohn Marino get_actual_size() const
177*e4b17023SJohn Marino {
178*e4b17023SJohn Marino   PB_DS_STATIC_ASSERT(access, external_size_access);
179*e4b17023SJohn Marino   return m_size;
180*e4b17023SJohn Marino }
181*e4b17023SJohn Marino 
182*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
183*e4b17023SJohn Marino void
184*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
resize(size_type new_size)185*e4b17023SJohn Marino resize(size_type new_size)
186*e4b17023SJohn Marino {
187*e4b17023SJohn Marino   PB_DS_STATIC_ASSERT(access, external_size_access);
188*e4b17023SJohn Marino   size_type actual_size = size_policy_base::get_nearest_larger_size(1);
189*e4b17023SJohn Marino   while (actual_size < new_size)
190*e4b17023SJohn Marino     {
191*e4b17023SJohn Marino       const size_type pot = size_policy_base::get_nearest_larger_size(actual_size);
192*e4b17023SJohn Marino 
193*e4b17023SJohn Marino       if (pot == actual_size && pot < new_size)
194*e4b17023SJohn Marino 	__throw_resize_error();
195*e4b17023SJohn Marino       actual_size = pot;
196*e4b17023SJohn Marino     }
197*e4b17023SJohn Marino 
198*e4b17023SJohn Marino   if (actual_size > 0)
199*e4b17023SJohn Marino     --actual_size;
200*e4b17023SJohn Marino 
201*e4b17023SJohn Marino   const size_type old_size = m_size;
202*e4b17023SJohn Marino   __try
203*e4b17023SJohn Marino     {
204*e4b17023SJohn Marino       do_resize(actual_size - 1);
205*e4b17023SJohn Marino     }
206*e4b17023SJohn Marino   __catch(insert_error& )
207*e4b17023SJohn Marino     {
208*e4b17023SJohn Marino       m_size = old_size;
209*e4b17023SJohn Marino       __throw_resize_error();
210*e4b17023SJohn Marino     }
211*e4b17023SJohn Marino   __catch(...)
212*e4b17023SJohn Marino     {
213*e4b17023SJohn Marino       m_size = old_size;
214*e4b17023SJohn Marino       __throw_exception_again;
215*e4b17023SJohn Marino     }
216*e4b17023SJohn Marino }
217*e4b17023SJohn Marino 
218*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
219*e4b17023SJohn Marino void
220*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
do_resize(size_type)221*e4b17023SJohn Marino do_resize(size_type)
222*e4b17023SJohn Marino {
223*e4b17023SJohn Marino   // Do nothing
224*e4b17023SJohn Marino }
225*e4b17023SJohn Marino 
226*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
227*e4b17023SJohn Marino Trigger_Policy&
228*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
get_trigger_policy()229*e4b17023SJohn Marino get_trigger_policy()
230*e4b17023SJohn Marino { return *this; }
231*e4b17023SJohn Marino 
232*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
233*e4b17023SJohn Marino const Trigger_Policy&
234*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
get_trigger_policy() const235*e4b17023SJohn Marino get_trigger_policy() const
236*e4b17023SJohn Marino { return *this; }
237*e4b17023SJohn Marino 
238*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
239*e4b17023SJohn Marino Size_Policy&
240*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
get_size_policy()241*e4b17023SJohn Marino get_size_policy()
242*e4b17023SJohn Marino { return *this; }
243*e4b17023SJohn Marino 
244*e4b17023SJohn Marino PB_DS_CLASS_T_DEC
245*e4b17023SJohn Marino const Size_Policy&
246*e4b17023SJohn Marino PB_DS_CLASS_C_DEC::
get_size_policy() const247*e4b17023SJohn Marino get_size_policy() const
248*e4b17023SJohn Marino { return *this; }
249*e4b17023SJohn Marino 
250