2011-09-06 François Dumont <fdumont@gcc.gnu.org>
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 6 Sep 2011 22:13:46 +0000 (22:13 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 6 Sep 2011 22:13:46 +0000 (22:13 +0000)
    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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@178615 138bc75d-0d04-0410-961f-82ee72b054a4

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/hashtable_policy.h

index d0c1b11..6c85ef7 100644 (file)
@@ -1,3 +1,12 @@
+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>
 
        PR libstdc++/50257
index 08a6dcd..acb7e99 100644 (file)
@@ -429,15 +429,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   {
     // Optimize lookups involving the first elements of __prime_list.
     // (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 };
 
     const unsigned long __p
-      = __n <= 11 ? __fastbkt[__n]
+      = __n <= 11 ? __fast_bkt[__n]
                   : *std::lower_bound(__prime_list + 5,
                                      __prime_list + _S_n_primes, __n);
-    _M_next_resize =
-      static_cast<std::size_t>(__builtin_floor(__p * _M_max_load_factor));
+    _M_next_resize = __builtin_floor(__p * (long double)_M_max_load_factor);
     return __p;
   }
 
@@ -446,14 +445,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   inline std::size_t
   _Prime_rehash_policy::
   _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
-                                               + _S_n_primes, __min_bkts);
-    _M_next_resize =
-      static_cast<std::size_t>(__builtin_floor(__p * _M_max_load_factor));
-    return __p;
-  }
+  { return _M_next_bkt(__builtin_ceil(__n / (long double)_M_max_load_factor)); }
 
   // Finds the smallest prime p such that alpha p > __n_elt + __n_ins.
   // If p > __n_bkt, return make_pair(true, p); otherwise return
@@ -471,22 +463,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   {
     if (__n_elt + __n_ins > _M_next_resize)
       {
-       float __min_bkts = ((float(__n_ins) + float(__n_elt))
-                           _M_max_load_factor);
+       long double __min_bkts = ((__n_elt + __n_ins)
+                                 / (long double)_M_max_load_factor);
        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);
-           _M_next_resize = static_cast<std::size_t>
-             (__builtin_floor(__p * _M_max_load_factor));
-           return std::make_pair(true, __p);
+           __min_bkts = std::max(__min_bkts, (long double)_M_growth_factor
+                                 * __n_bkt);
+           return std::make_pair(true,
+                                 _M_next_bkt(__builtin_ceil(__min_bkts)));
          }
        else
          {
-           _M_next_resize = static_cast<std::size_t>
-             (__builtin_floor(__n_bkt * _M_max_load_factor));
+           _M_next_resize
+             = __builtin_floor(__n_bkt * (long double)_M_max_load_factor);
            return std::make_pair(false, 0);
          }
       }