diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index d76a2daecaf..30b954e4a38 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2011-07-24 François Dumont + + * include/bits/hashtable_policy.h (_Prime_rehash_policy): Use + __builtin_floor rather than __builtin_ceil to compute next resize + value. + * testsuite/23_containers/unordered_set/hash_policy/load_factor.cc: + New. + 2011-07-22 Benjamin Kosnik Daniel Krugler diff --git a/libstdc++-v3/include/bits/hashtable_policy.h b/libstdc++-v3/include/bits/hashtable_policy.h index 3a22e9ac5c9..df17855e950 100644 --- a/libstdc++-v3/include/bits/hashtable_policy.h +++ b/libstdc++-v3/include/bits/hashtable_policy.h @@ -427,10 +427,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _Prime_rehash_policy:: _M_next_bkt(std::size_t __n) const { - const unsigned long* __p = std::lower_bound(__prime_list, __prime_list + const unsigned long __p = *std::lower_bound(__prime_list, __prime_list + _S_n_primes, __n); _M_next_resize = - static_cast(__builtin_ceil(*__p * _M_max_load_factor)); + static_cast(__builtin_floor(__p * _M_max_load_factor)); return *__p; } @@ -441,10 +441,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_bkt_for_elements(std::size_t __n) const { const float __min_bkts = __n / _M_max_load_factor; - const unsigned long* __p = std::lower_bound(__prime_list, __prime_list + const unsigned long __p = *std::lower_bound(__prime_list, __prime_list + _S_n_primes, __min_bkts); _M_next_resize = - static_cast(__builtin_ceil(*__p * _M_max_load_factor)); + static_cast(__builtin_floor(__p * _M_max_load_factor)); return *__p; } @@ -469,17 +469,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION if (__min_bkts > __n_bkt) { __min_bkts = std::max(__min_bkts, _M_growth_factor * __n_bkt); - const unsigned long* __p = - std::lower_bound(__prime_list, __prime_list + _S_n_primes, - __min_bkts); + const unsigned long __p = + *std::lower_bound(__prime_list, __prime_list + _S_n_primes, + __min_bkts); _M_next_resize = static_cast - (__builtin_ceil(*__p * _M_max_load_factor)); + (__builtin_floor(__p * _M_max_load_factor)); return std::make_pair(true, *__p); } else { _M_next_resize = static_cast - (__builtin_ceil(__n_bkt * _M_max_load_factor)); + (__builtin_floor(__n_bkt * _M_max_load_factor)); return std::make_pair(false, 0); } } diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/hash_policy/load_factor.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/hash_policy/load_factor.cc new file mode 100644 index 00000000000..818274a3d51 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/unordered_set/hash_policy/load_factor.cc @@ -0,0 +1,58 @@ +// Copyright (C) 2011 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . +// +// { dg-options "-std=gnu++0x" } + +#include +#include + +void test01() +{ + bool test __attribute__((unused)) = true; + { + std::unordered_set us; + for (int i = 0; i != 100000; ++i) + { + us.insert(i); + VERIFY( us.load_factor() <= us.max_load_factor() ); + } + } + { + std::unordered_set us; + us.max_load_factor(3.f); + for (int i = 0; i != 100000; ++i) + { + us.insert(i); + VERIFY( us.load_factor() <= us.max_load_factor() ); + } + } + { + std::unordered_set us; + us.max_load_factor(.3f); + for (int i = 0; i != 100000; ++i) + { + us.insert(i); + VERIFY( us.load_factor() <= us.max_load_factor() ); + } + } +} + +int main() +{ + test01(); + return 0; +}