diff options
author | François Dumont <fdumont@gcc.gnu.org> | 2015-07-05 21:16:07 +0000 |
---|---|---|
committer | François Dumont <fdumont@gcc.gnu.org> | 2015-07-05 21:16:07 +0000 |
commit | 291e91daa73361a1f4a426a879f89c1ea6cf0e9f (patch) | |
tree | 152a853df6a0b5caf0d08a72377394d5d134c646 /libstdc++-v3 | |
parent | 3b973a7f22d0006505139348a3871738328f0280 (diff) | |
download | gcc-291e91daa73361a1f4a426a879f89c1ea6cf0e9f.tar.gz |
hashtable.h (_Hashtable<>::__rehash_policy): Do not rehash container.
2015-07-05 François Dumont <fdumont@gcc.gnu.org>
* include/bits/hashtable.h (_Hashtable<>::__rehash_policy): Do not
rehash container.
* testsuite/23_containers/unordered_set/max_load_factor/robustness.cc:
Adapt.
From-SVN: r225436
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/ChangeLog | 7 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/hashtable.h | 19 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/23_containers/unordered_set/max_load_factor/robustness.cc | 34 |
3 files changed, 29 insertions, 31 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index b9db195575c..86e9d4cfbfe 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2015-07-05 François Dumont <fdumont@gcc.gnu.org> + + * include/bits/hashtable.h (_Hashtable<>::__rehash_policy): Do not + rehash container. + * testsuite/23_containers/unordered_set/max_load_factor/robustness.cc: + Adapt. + 2015-07-03 Jonathan Wakely <jwakely@redhat.com> * doc/xml/manual/status_cxx2017.xml: Update status table. diff --git a/libstdc++-v3/include/bits/hashtable.h b/libstdc++-v3/include/bits/hashtable.h index 48810044079..0495f4bdd2f 100644 --- a/libstdc++-v3/include/bits/hashtable.h +++ b/libstdc++-v3/include/bits/hashtable.h @@ -594,7 +594,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return _M_rehash_policy; } void - __rehash_policy(const _RehashPolicy&); + __rehash_policy(const _RehashPolicy& __pol) + { _M_rehash_policy = __pol; } // Lookup. iterator @@ -1284,22 +1285,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION typename _Alloc, typename _ExtractKey, typename _Equal, typename _H1, typename _H2, typename _Hash, typename _RehashPolicy, typename _Traits> - void - _Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal, - _H1, _H2, _Hash, _RehashPolicy, _Traits>:: - __rehash_policy(const _RehashPolicy& __pol) - { - auto __do_rehash = - __pol._M_need_rehash(_M_bucket_count, _M_element_count, 0); - if (__do_rehash.first) - _M_rehash(__do_rehash.second, _M_rehash_policy._M_state()); - _M_rehash_policy = __pol; - } - - template<typename _Key, typename _Value, - typename _Alloc, typename _ExtractKey, typename _Equal, - typename _H1, typename _H2, typename _Hash, typename _RehashPolicy, - typename _Traits> auto _Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, _Traits>:: diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/max_load_factor/robustness.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/max_load_factor/robustness.cc index a72829e0d43..59782286e22 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_set/max_load_factor/robustness.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_set/max_load_factor/robustness.cc @@ -32,41 +32,47 @@ void test01() int val = 0; for (; val != 100; ++val) { - VERIFY( us.insert(val).second) ; + VERIFY( us.insert(val).second ); VERIFY( us.load_factor() <= us.max_load_factor() ); } float cur_max_load_factor = us.max_load_factor(); int counter = 0; std::size_t thrown_exceptions = 0; + + // Reduce max load factor. + us.max_load_factor(us.max_load_factor() / 2); + + // At this point load factor is higher than max_load_factor because we can't + // rehash in max_load_factor call. + VERIFY( us.load_factor() > us.max_load_factor() ); + while (true) { __gnu_cxx::limit_condition::set_limit(counter++); bool do_break = false; try { - us.max_load_factor(.5f); + size_t nbkts = us.bucket_count(); + // Check that unordered_set will still be correctly resized when + // needed. + VERIFY( us.insert(val++).second ); + + VERIFY( us.bucket_count() != nbkts ); + VERIFY( us.load_factor() <= us.max_load_factor() ); do_break = true; } catch (const __gnu_cxx::forced_error&) { - VERIFY( us.max_load_factor() == cur_max_load_factor ); + // max load factor doesn't change. + VERIFY( us.max_load_factor() == .5f ); ++thrown_exceptions; } - // Lets check that unordered_set will still be correctly resized - // when needed - __gnu_cxx::limit_condition::set_limit(nl_size_t::max()); - for (;;) - { - VERIFY( us.load_factor() <= us.max_load_factor() ); - size_t nbkts = us.bucket_count(); - VERIFY( us.insert(val++).second ); - if (us.bucket_count() != nbkts) - break; - } + if (do_break) break; } + VERIFY( thrown_exceptions > 0 ); } |