diff options
author | François Dumont <fdumont@gcc.gnu.org> | 2013-02-01 20:44:41 +0000 |
---|---|---|
committer | François Dumont <fdumont@gcc.gnu.org> | 2013-02-01 20:44:41 +0000 |
commit | 6e1479465794ad3ba7fe99b4d8986c6fd463feb0 (patch) | |
tree | 84518f8f30d1e3aa18963b72f5e5994b1c6e4483 /libstdc++-v3/include | |
parent | 99113dff9d9f04184797e8f3565dfe0c900a2345 (diff) | |
download | gcc-6e1479465794ad3ba7fe99b4d8986c6fd463feb0.zip gcc-6e1479465794ad3ba7fe99b4d8986c6fd463feb0.tar.gz gcc-6e1479465794ad3ba7fe99b4d8986c6fd463feb0.tar.bz2 |
2013-02-01 François Dumont <fdumont@gcc.gnu.org>
* include/bits/hashtable_policy.h
(_Prime_rehash_policy::_M_next_bkt)
(_Prime_rehash_policy::_M_need_rehash): Move definition...
* src/c++11/hashtable_c++0x.cc: ... here.
* src/shared/hashtable-aux.cc: Remove c++config.h include.
* config/abi/gnu.ver (GLIBCXX_3.4.18): Export _Prime_rehash_policy
symbols.
From-SVN: r195676
Diffstat (limited to 'libstdc++-v3/include')
-rw-r--r-- | libstdc++-v3/include/bits/hashtable_policy.h | 74 |
1 files changed, 2 insertions, 72 deletions
diff --git a/libstdc++-v3/include/bits/hashtable_policy.h b/libstdc++-v3/include/bits/hashtable_policy.h index 17c25bc..f4d8dc0 100644 --- a/libstdc++-v3/include/bits/hashtable_policy.h +++ b/libstdc++-v3/include/bits/hashtable_policy.h @@ -369,7 +369,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Return a bucket count appropriate for n elements std::size_t - _M_bkt_for_elements(std::size_t __n) const; + _M_bkt_for_elements(std::size_t __n) const + { return __builtin_ceil(__n / (long double)_M_max_load_factor); } // __n_bkt is current bucket count, __n_elt is current element count, // and __n_ins is number of elements to be inserted. Do we need to @@ -397,77 +398,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION mutable std::size_t _M_next_resize; }; - extern const unsigned long __prime_list[]; - - // XXX This is a hack. There's no good reason for any of - // _Prime_rehash_policy's member functions to be inline. - - // Return a prime no smaller than n. - inline std::size_t - _Prime_rehash_policy:: - _M_next_bkt(std::size_t __n) const - { - // Optimize lookups involving the first elements of __prime_list. - // (useful to speed-up, eg, constructors) - static const unsigned char __fast_bkt[12] - = { 2, 2, 2, 3, 5, 5, 7, 7, 11, 11, 11, 11 }; - - if (__n <= 11) - { - _M_next_resize - = __builtin_ceil(__fast_bkt[__n] - * (long double)_M_max_load_factor); - return __fast_bkt[__n]; - } - - const unsigned long* __next_bkt - = std::lower_bound(__prime_list + 5, __prime_list + _S_n_primes, - __n); - _M_next_resize - = __builtin_ceil(*__next_bkt * (long double)_M_max_load_factor); - return *__next_bkt; - } - - // Return the smallest integer p such that alpha p >= n, where alpha - // is the load factor. - inline std::size_t - _Prime_rehash_policy:: - _M_bkt_for_elements(std::size_t __n) const - { return __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 - // make_pair(false, 0). In principle this isn't very different from - // _M_bkt_for_elements. - - // The only tricky part is that we're caching the element count at - // which we need to rehash, so we don't have to do a floating-point - // multiply for every insertion. - - inline std::pair<bool, std::size_t> - _Prime_rehash_policy:: - _M_need_rehash(std::size_t __n_bkt, std::size_t __n_elt, - std::size_t __n_ins) const - { - if (__n_elt + __n_ins >= _M_next_resize) - { - long double __min_bkts = (__n_elt + __n_ins) - / (long double)_M_max_load_factor; - if (__min_bkts >= __n_bkt) - return std::make_pair(true, - _M_next_bkt(std::max<std::size_t>(__builtin_floor(__min_bkts) + 1, - __n_bkt * _S_growth_factor))); - else - { - _M_next_resize - = __builtin_floor(__n_bkt * (long double)_M_max_load_factor); - return std::make_pair(false, 0); - } - } - else - return std::make_pair(false, 0); - } - // Base classes for std::_Hashtable. We define these base classes // because in some cases we want to do different things depending on // the value of a policy class. In some cases the policy class |