diff options
author | fdumont <fdumont@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-07-24 19:20:26 +0000 |
---|---|---|
committer | fdumont <fdumont@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-07-24 19:20:26 +0000 |
commit | 5d25efc0fd72fef10dbc606561fade95f2c99a88 (patch) | |
tree | 3c6db059c61b19aac2c1e494763ccf3d46584377 /libstdc++-v3 | |
parent | e026bfe8b77d152edd035c38ed251fdbec237b4c (diff) |
2011-07-24 François Dumont <francois.cppdevs@free.fr>
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@176717 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/ChangeLog | 8 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/hashtable_policy.h | 18 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/23_containers/unordered_set/hash_policy/load_factor.cc | 58 |
3 files changed, 75 insertions, 9 deletions
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 <francois.cppdevs@free.fr> + + * 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 <bkoz@redhat.com> Daniel Krugler <daniel.kruegler@googlemail.com> 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<std::size_t>(__builtin_ceil(*__p * _M_max_load_factor)); + static_cast<std::size_t>(__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<std::size_t>(__builtin_ceil(*__p * _M_max_load_factor)); + static_cast<std::size_t>(__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<std::size_t> - (__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<std::size_t> - (__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 +// <http://www.gnu.org/licenses/>. +// +// { dg-options "-std=gnu++0x" } + +#include <unordered_set> +#include <testsuite_hooks.h> + +void test01() +{ + bool test __attribute__((unused)) = true; + { + std::unordered_set<int> us; + for (int i = 0; i != 100000; ++i) + { + us.insert(i); + VERIFY( us.load_factor() <= us.max_load_factor() ); + } + } + { + std::unordered_set<int> 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<int> 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; +} |