Commit e25fc78f by François Dumont Committed by Paolo Carlini

hashtable_policy.h (_Prime_rehash_policy:: _M_next_bkt): Cast _M_max_load_factor to long double.

2011-09-06  François Dumont  <fdumont@gcc.gnu.org>
	    Paolo Carlini  <paolo.carlini@oracle.com>

	* include/bits/hashtable_policy.h (_Prime_rehash_policy::
	_M_next_bkt): Cast _M_max_load_factor to long double.
	(_Prime_rehash_policy::_M_bkt_for_elements): Use _M_next_bkt.
	(_Prime_rehash_policy::_M_need_rehash): Likewise; cast all
	float quantities to long double.

Co-Authored-By: Paolo Carlini <paolo.carlini@oracle.com>

From-SVN: r178615
parent a30d6527
2011-09-06 François Dumont <fdumont@gcc.gnu.org>
Paolo Carlini <paolo.carlini@oracle.com>
* include/bits/hashtable_policy.h (_Prime_rehash_policy::
_M_next_bkt): Cast _M_max_load_factor to long double.
(_Prime_rehash_policy::_M_bkt_for_elements): Use _M_next_bkt.
(_Prime_rehash_policy::_M_need_rehash): Likewise; cast all
float quantities to long double.
2011-09-06 Paolo Carlini <paolo.carlini@oracle.com> 2011-09-06 Paolo Carlini <paolo.carlini@oracle.com>
PR libstdc++/50257 PR libstdc++/50257
......
...@@ -429,15 +429,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -429,15 +429,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ {
// Optimize lookups involving the first elements of __prime_list. // Optimize lookups involving the first elements of __prime_list.
// (useful to speed-up, eg, constructors) // (useful to speed-up, eg, constructors)
static const unsigned char __fastbkt[12] static const unsigned char __fast_bkt[12]
= { 2, 2, 2, 3, 5, 5, 7, 7, 11, 11, 11, 11 }; = { 2, 2, 2, 3, 5, 5, 7, 7, 11, 11, 11, 11 };
const unsigned long __p const unsigned long __p
= __n <= 11 ? __fastbkt[__n] = __n <= 11 ? __fast_bkt[__n]
: *std::lower_bound(__prime_list + 5, : *std::lower_bound(__prime_list + 5,
__prime_list + _S_n_primes, __n); __prime_list + _S_n_primes, __n);
_M_next_resize = _M_next_resize = __builtin_floor(__p * (long double)_M_max_load_factor);
static_cast<std::size_t>(__builtin_floor(__p * _M_max_load_factor));
return __p; return __p;
} }
...@@ -446,14 +445,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -446,14 +445,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
inline std::size_t inline std::size_t
_Prime_rehash_policy:: _Prime_rehash_policy::
_M_bkt_for_elements(std::size_t __n) const _M_bkt_for_elements(std::size_t __n) const
{ { return _M_next_bkt(__builtin_ceil(__n / (long double)_M_max_load_factor)); }
const float __min_bkts = __n / _M_max_load_factor;
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_floor(__p * _M_max_load_factor));
return __p;
}
// Finds the smallest prime p such that alpha p > __n_elt + __n_ins. // Finds the smallest prime p such that alpha p > __n_elt + __n_ins.
// If p > __n_bkt, return make_pair(true, p); otherwise return // If p > __n_bkt, return make_pair(true, p); otherwise return
...@@ -471,22 +463,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -471,22 +463,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ {
if (__n_elt + __n_ins > _M_next_resize) if (__n_elt + __n_ins > _M_next_resize)
{ {
float __min_bkts = ((float(__n_ins) + float(__n_elt)) long double __min_bkts = ((__n_elt + __n_ins)
/ _M_max_load_factor); / (long double)_M_max_load_factor);
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, (long double)_M_growth_factor
const unsigned long __p = * __n_bkt);
*std::lower_bound(__prime_list, __prime_list + _S_n_primes, return std::make_pair(true,
__min_bkts); _M_next_bkt(__builtin_ceil(__min_bkts)));
_M_next_resize = static_cast<std::size_t>
(__builtin_floor(__p * _M_max_load_factor));
return std::make_pair(true, __p);
} }
else else
{ {
_M_next_resize = static_cast<std::size_t> _M_next_resize
(__builtin_floor(__n_bkt * _M_max_load_factor)); = __builtin_floor(__n_bkt * (long double)_M_max_load_factor);
return std::make_pair(false, 0); return std::make_pair(false, 0);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment