hashtable_policy.h (_Prime_rehash_policy): Use __builtin_floor rather than __builtin_ceil to compute next resize value.
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. From-SVN: r176717
This commit is contained in:
parent
7d5997c66c
commit
4f7b188f20
|
@ -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>
|
2011-07-22 Benjamin Kosnik <bkoz@redhat.com>
|
||||||
Daniel Krugler <daniel.kruegler@googlemail.com>
|
Daniel Krugler <daniel.kruegler@googlemail.com>
|
||||||
|
|
||||||
|
|
|
@ -427,10 +427,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
_Prime_rehash_policy::
|
_Prime_rehash_policy::
|
||||||
_M_next_bkt(std::size_t __n) const
|
_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);
|
+ _S_n_primes, __n);
|
||||||
_M_next_resize =
|
_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;
|
return *__p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -441,10 +441,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
_M_bkt_for_elements(std::size_t __n) const
|
_M_bkt_for_elements(std::size_t __n) const
|
||||||
{
|
{
|
||||||
const float __min_bkts = __n / _M_max_load_factor;
|
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);
|
+ _S_n_primes, __min_bkts);
|
||||||
_M_next_resize =
|
_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;
|
return *__p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -469,17 +469,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
if (__min_bkts > __n_bkt)
|
if (__min_bkts > __n_bkt)
|
||||||
{
|
{
|
||||||
__min_bkts = std::max(__min_bkts, _M_growth_factor * __n_bkt);
|
__min_bkts = std::max(__min_bkts, _M_growth_factor * __n_bkt);
|
||||||
const unsigned long* __p =
|
const unsigned long __p =
|
||||||
std::lower_bound(__prime_list, __prime_list + _S_n_primes,
|
*std::lower_bound(__prime_list, __prime_list + _S_n_primes,
|
||||||
__min_bkts);
|
__min_bkts);
|
||||||
_M_next_resize = static_cast<std::size_t>
|
_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);
|
return std::make_pair(true, *__p);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_M_next_resize = static_cast<std::size_t>
|
_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);
|
return std::make_pair(false, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
Loading…
Reference in New Issue