re PR libstdc++/26424 (tr1/unordered vs 64-bit machines)
authorPaolo Carlini <pcarlini@suse.de>
Wed, 19 Apr 2006 22:58:23 +0000 (22:58 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 19 Apr 2006 22:58:23 +0000 (22:58 +0000)
2006-04-19  Paolo Carlini  <pcarlini@suse.de>

PR libstdc++/26424
* include/tr1/hashtable (X<>::primes): Extend for 64-bit machines.
(X<>::n_primes): Adjust.
(prime_rehash_policy::next_bkt, bkt_for_elements, need_rehash): Adjust.

From-SVN: r113100

libstdc++-v3/ChangeLog
libstdc++-v3/include/tr1/hashtable

index 2539000811ffdb1ba51a1af0cf5fa1338c61abb8..08e6c3be93ecf53b32831bf7481609326abd0bdb 100644 (file)
@@ -1,3 +1,10 @@
+2006-04-19  Paolo Carlini  <pcarlini@suse.de>
+
+       PR libstdc++/26424
+       * include/tr1/hashtable (X<>::primes): Extend for 64-bit machines.
+       (X<>::n_primes): Adjust.
+       (prime_rehash_policy::next_bkt, bkt_for_elements, need_rehash): Adjust.
+
 2006-04-18  Paolo Carlini  <pcarlini@suse.de>
 
        * docs/html/faq/index.html ([5.5]): Adjust to mention function
index 7092e3cf39d66753fc3f41a5d94e27ef588a16d8..3b8bcef8f7dd5e1a661308fa5d593ef100ffae89 100644 (file)
@@ -470,18 +470,18 @@ namespace Internal
       { return x < y; }
   };
 
-  template<int dummy>
+  template<int ulongsize = sizeof(unsigned long)>
     struct X
     {
-      static const int n_primes = 256;
-      static const unsigned long primes[n_primes + 1];
+      static const int n_primes = ulongsize != 8 ? 256 : 256 + 48;
+      static const unsigned long primes[256 + 48 + 1];
     };
 
-  template<int dummy>
-    const int X<dummy>::n_primes;
+  template<int ulongsize>
+    const int X<ulongsize>::n_primes;
 
-  template<int dummy>
-    const unsigned long X<dummy>::primes[n_primes + 1] =
+  template<int ulongsize>
+    const unsigned long X<ulongsize>::primes[256 + 48 + 1] =
     {
       2ul, 3ul, 5ul, 7ul, 11ul, 13ul, 17ul, 19ul, 23ul, 29ul, 31ul,
       37ul, 41ul, 43ul, 47ul, 53ul, 59ul, 61ul, 67ul, 71ul, 73ul, 79ul,
@@ -524,7 +524,38 @@ namespace Internal
       2364114217ul, 2557710269ul, 2767159799ul, 2993761039ul,
       3238918481ul, 3504151727ul, 3791104843ul, 4101556399ul,
       4294967291ul,
-      4294967291ul // sentinel so we don't have to test result of lower_bound
+      // Sentinel, so we don't have to test the result of lower_bound,
+      // or, on 64-bit machines, rest of the table.
+      ulongsize != 8 ? 4294967291ul : (unsigned long)6442450933ull,
+      (unsigned long)8589934583ull,
+      (unsigned long)12884901857ull, (unsigned long)17179869143ull,
+      (unsigned long)25769803693ull, (unsigned long)34359738337ull,
+      (unsigned long)51539607367ull, (unsigned long)68719476731ull,
+      (unsigned long)103079215087ull, (unsigned long)137438953447ull,
+      (unsigned long)206158430123ull, (unsigned long)274877906899ull,
+      (unsigned long)412316860387ull, (unsigned long)549755813881ull,
+      (unsigned long)824633720731ull, (unsigned long)1099511627689ull,
+      (unsigned long)1649267441579ull, (unsigned long)2199023255531ull,
+      (unsigned long)3298534883309ull, (unsigned long)4398046511093ull,
+      (unsigned long)6597069766607ull, (unsigned long)8796093022151ull,
+      (unsigned long)13194139533241ull, (unsigned long)17592186044399ull,
+      (unsigned long)26388279066581ull, (unsigned long)35184372088777ull,
+      (unsigned long)52776558133177ull, (unsigned long)70368744177643ull,
+      (unsigned long)105553116266399ull, (unsigned long)140737488355213ull,
+      (unsigned long)211106232532861ull, (unsigned long)281474976710597ull,
+      (unsigned long)562949953421231ull, (unsigned long)1125899906842597ull,
+      (unsigned long)2251799813685119ull, (unsigned long)4503599627370449ull,
+      (unsigned long)9007199254740881ull, (unsigned long)18014398509481951ull,
+      (unsigned long)36028797018963913ull, (unsigned long)72057594037927931ull,
+      (unsigned long)144115188075855859ull,
+      (unsigned long)288230376151711717ull,
+      (unsigned long)576460752303423433ull,
+      (unsigned long)1152921504606846883ull,
+      (unsigned long)2305843009213693951ull,
+      (unsigned long)4611686018427387847ull,
+      (unsigned long)9223372036854775783ull,
+      (unsigned long)18446744073709551557ull,
+      (unsigned long)18446744073709551557ull
     };
 
   inline
@@ -543,8 +574,8 @@ namespace Internal
   prime_rehash_policy::
   next_bkt(std::size_t n) const
   {
-    const unsigned long* const last = X<0>::primes + X<0>::n_primes;
-    const unsigned long* p = std::lower_bound(X<0>::primes, last, n);
+    const unsigned long* const last = X<>::primes + X<>::n_primes;
+    const unsigned long* p = std::lower_bound(X<>::primes, last, n);
     m_next_resize = static_cast<std::size_t>(std::ceil(*p * m_max_load_factor));
     return *p;
   }
@@ -555,9 +586,9 @@ namespace Internal
   prime_rehash_policy::
   bkt_for_elements(std::size_t n) const
   {
-    const unsigned long* const last = X<0>::primes + X<0>::n_primes;
+    const unsigned long* const last = X<>::primes + X<>::n_primes;
     const float min_bkts = n / m_max_load_factor;
-    const unsigned long* p = std::lower_bound(X<0>::primes, last,
+    const unsigned long* p = std::lower_bound(X<>::primes, last,
                                              min_bkts, lt());
     m_next_resize = static_cast<std::size_t>(std::ceil(*p * m_max_load_factor));
     return *p;
@@ -582,8 +613,8 @@ namespace Internal
        if (min_bkts > n_bkt)
          {
            min_bkts = std::max(min_bkts, m_growth_factor * n_bkt);
-           const unsigned long* const last = X<0>::primes + X<0>::n_primes;
-           const unsigned long* p = std::lower_bound(X<0>::primes, last,
+           const unsigned long* const last = X<>::primes + X<>::n_primes;
+           const unsigned long* p = std::lower_bound(X<>::primes, last,
                                                      min_bkts, lt());
            m_next_resize = 
              static_cast<std::size_t>(std::ceil(*p * m_max_load_factor));