summaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorFrançois Dumont <fdumont@gcc.gnu.org>2015-07-05 21:16:07 +0000
committerFrançois Dumont <fdumont@gcc.gnu.org>2015-07-05 21:16:07 +0000
commit291e91daa73361a1f4a426a879f89c1ea6cf0e9f (patch)
tree152a853df6a0b5caf0d08a72377394d5d134c646 /libstdc++-v3
parent3b973a7f22d0006505139348a3871738328f0280 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--libstdc++-v3/include/bits/hashtable.h19
-rw-r--r--libstdc++-v3/testsuite/23_containers/unordered_set/max_load_factor/robustness.cc34
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 );
}