libstdc++
|
00001 // -*- C++ -*- 00002 00003 // Copyright (C) 2005, 2006, 2009 Free Software Foundation, Inc. 00004 // 00005 // This file is part of the GNU ISO C++ Library. This library is free 00006 // software; you can redistribute it and/or modify it under the terms 00007 // of the GNU General Public License as published by the Free Software 00008 // Foundation; either version 3, or (at your option) any later 00009 // version. 00010 00011 // This library is distributed in the hope that it will be useful, but 00012 // WITHOUT ANY WARRANTY; without even the implied warranty of 00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 // General Public License for more details. 00015 00016 // Under Section 7 of GPL version 3, you are granted additional 00017 // permissions described in the GCC Runtime Library Exception, version 00018 // 3.1, as published by the Free Software Foundation. 00019 00020 // You should have received a copy of the GNU General Public License and 00021 // a copy of the GCC Runtime Library Exception along with this program; 00022 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 00023 // <http://www.gnu.org/licenses/>. 00024 00025 // Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL. 00026 00027 // Permission to use, copy, modify, sell, and distribute this software 00028 // is hereby granted without fee, provided that the above copyright 00029 // notice appears in all copies, and that both that copyright notice 00030 // and this permission notice appear in supporting documentation. None 00031 // of the above authors, nor IBM Haifa Research Laboratories, make any 00032 // representation about the suitability of this software for any 00033 // purpose. It is provided "as is" without express or implied 00034 // warranty. 00035 00036 /** 00037 * @file hash_exponential_size_policy_imp.hpp 00038 * Contains a resize size policy implementation. 00039 */ 00040 00041 PB_DS_CLASS_T_DEC 00042 PB_DS_CLASS_C_DEC:: 00043 hash_exponential_size_policy(size_type start_size, size_type grow_factor) : 00044 m_start_size(start_size), 00045 m_grow_factor(grow_factor) 00046 { } 00047 00048 PB_DS_CLASS_T_DEC 00049 void 00050 PB_DS_CLASS_C_DEC:: 00051 swap(PB_DS_CLASS_C_DEC& other) 00052 { 00053 std::swap(m_start_size, other.m_start_size); 00054 std::swap(m_grow_factor, other.m_grow_factor); 00055 } 00056 00057 PB_DS_CLASS_T_DEC 00058 typename PB_DS_CLASS_C_DEC::size_type 00059 PB_DS_CLASS_C_DEC:: 00060 get_nearest_larger_size(size_type size) const 00061 { 00062 size_type ret = m_start_size; 00063 while (ret <= size) 00064 { 00065 const size_type next_ret = ret* m_grow_factor; 00066 if (next_ret < ret) 00067 __throw_insert_error(); 00068 ret = next_ret; 00069 } 00070 return ret; 00071 } 00072 00073 PB_DS_CLASS_T_DEC 00074 typename PB_DS_CLASS_C_DEC::size_type 00075 PB_DS_CLASS_C_DEC:: 00076 get_nearest_smaller_size(size_type size) const 00077 { 00078 size_type ret = m_start_size; 00079 while (true) 00080 { 00081 const size_type next_ret = ret* m_grow_factor; 00082 if (next_ret < ret) 00083 __throw_resize_error(); 00084 if (next_ret >= size) 00085 return (ret); 00086 ret = next_ret; 00087 } 00088 return ret; 00089 } 00090