hashtable.h (_Hashtable<>::__rehash_policy): Do not rehash container.
authorFrançois Dumont <fdumont@gcc.gnu.org>
Sun, 5 Jul 2015 21:16:07 +0000 (21:16 +0000)
committerFrançois Dumont <fdumont@gcc.gnu.org>
Sun, 5 Jul 2015 21:16:07 +0000 (21:16 +0000)
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

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/hashtable.h
libstdc++-v3/testsuite/23_containers/unordered_set/max_load_factor/robustness.cc

index b9db195575c85c1bfdcc2125654386680a295d02..86e9d4cfbfef22d144ac61331c5f38029adfb108 100644 (file)
@@ -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.
index 48810044079a9ec4761e74897f31e911a4489561..0495f4bdd2fe8c778444b1572b1bf03fe245e422 100644 (file)
@@ -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
@@ -1280,22 +1281,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
          = &__x._M_before_begin;
     }
 
-  template<typename _Key, typename _Value,
-          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,
index a72829e0d4356650925159fc416004a596dfd92e..59782286e22e461959316850b62dd55b0358fe70 100644 (file)
@@ -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 );
 }