aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@suse.de>2006-04-19 22:58:23 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2006-04-19 22:58:23 +0000
commitd9a4b9eecb516ff2fcadceb58c5f35c54ed56016 (patch)
treed14824534cf4e7e014b8fd2d14610aa558fff249
parent94d285a53ceab450cbc35e0673c36cd7fc6dd2ea (diff)
downloadgcc-d9a4b9eecb516ff2fcadceb58c5f35c54ed56016.zip
gcc-d9a4b9eecb516ff2fcadceb58c5f35c54ed56016.tar.gz
gcc-d9a4b9eecb516ff2fcadceb58c5f35c54ed56016.tar.bz2
re PR libstdc++/26424 (tr1/unordered vs 64-bit machines)
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
-rw-r--r--libstdc++-v3/ChangeLog7
-rw-r--r--libstdc++-v3/include/tr1/hashtable59
2 files changed, 52 insertions, 14 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 2539000..08e6c3b 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -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
diff --git a/libstdc++-v3/include/tr1/hashtable b/libstdc++-v3/include/tr1/hashtable
index 7092e3c..3b8bcef 100644
--- a/libstdc++-v3/include/tr1/hashtable
+++ b/libstdc++-v3/include/tr1/hashtable
@@ -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));