+2010-03-10 Paolo Carlini <paolo.carlini@oracle.com>
+
+ * include/bits/hashtable_policy.h (_Rehash_base<_Prime_rehash_policy,
+ _Hashtable>::reserve): Add, per DR 1189.
+ * include/bits/hashtable.h (_Hashtable<>::size_type,
+ _Hashtable<>::difference_type): Do not typedef from _Allocator.
+ * testsuite/23_containers/unordered_map/dr1189.cc: New.
+ * testsuite/23_containers/unordered_set/dr1189.cc: Likewise.
+ * testsuite/23_containers/unordered_multimap/dr1189.cc: Likewise.
+ * testsuite/23_containers/unordered_multiset/dr1189.cc: Likewise.
+
2010-03-08 Paolo Carlini <paolo.carlini@oracle.com>
Revert:
typedef _Equal key_equal;
// mapped_type, if present, comes from _Map_base.
// hasher, if present, comes from _Hash_code_base.
- typedef typename _Allocator::difference_type difference_type;
- typedef typename _Allocator::size_type size_type;
typedef typename _Allocator::pointer pointer;
typedef typename _Allocator::const_pointer const_pointer;
typedef typename _Allocator::reference reference;
typedef typename _Allocator::const_reference const_reference;
-
+
+ typedef std::size_t size_type;
+ typedef std::ptrdiff_t difference_type;
typedef __detail::_Node_iterator<value_type, __constant_iterators,
__cache_hash_code>
local_iterator;
// Set number of buckets to be appropriate for container of n element.
void rehash(size_type __n);
-
+
+ // DR 1189.
+ // reserve, if present, comes from _Rehash_base.
+
private:
// Unconditionally change size of bucket array to n.
void _M_rehash(size_type __n);
}
// class template _Rehash_base. Give hashtable the max_load_factor
- // functions iff the rehash policy is _Prime_rehash_policy.
+ // functions and reserve iff the rehash policy is _Prime_rehash_policy.
template<typename _RehashPolicy, typename _Hashtable>
struct _Rehash_base { };
_Hashtable* __this = static_cast<_Hashtable*>(this);
__this->__rehash_policy(_Prime_rehash_policy(__z));
}
+
+ void
+ reserve(std::size_t __n)
+ {
+ _Hashtable* __this = static_cast<_Hashtable*>(this);
+ __this->rehash(__builtin_ceil(__n / max_load_factor()));
+ }
};
// Class template _Hash_code_base. Encapsulates two policy issues that
--- /dev/null
+// { dg-options "-std=gnu++0x" }
+// 2010-03-10 Paolo Carlini <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2010 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <unordered_map>
+#include <testsuite_hooks.h>
+
+// DR 1189. Awkward interface for changing the number of buckets
+// in an unordered associative container
+void test01()
+{
+ bool test __attribute__((unused)) = true;
+
+ std::unordered_map<int, double> m1;
+ m1.reserve(10);
+ VERIFY( m1.bucket_count() >= 10 );
+
+ m1.reserve(100);
+ VERIFY( m1.bucket_count() >= 100 );
+
+ std::unordered_map<int, double> m2(100);
+ VERIFY( m2.bucket_count() >= 100 );
+
+ m2.reserve(1000);
+ VERIFY( m2.bucket_count() >= 1000 );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
--- /dev/null
+// { dg-options "-std=gnu++0x" }
+// 2010-03-10 Paolo Carlini <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2010 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <unordered_map>
+#include <testsuite_hooks.h>
+
+// DR 1189. Awkward interface for changing the number of buckets
+// in an unordered associative container
+void test01()
+{
+ bool test __attribute__((unused)) = true;
+
+ std::unordered_multimap<int, double> mm1;
+ mm1.reserve(10);
+ VERIFY( mm1.bucket_count() >= 10 );
+
+ mm1.reserve(100);
+ VERIFY( mm1.bucket_count() >= 100 );
+
+ std::unordered_map<int, double> mm2(100);
+ VERIFY( mm2.bucket_count() >= 100 );
+
+ mm2.reserve(1000);
+ VERIFY( mm2.bucket_count() >= 1000 );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
--- /dev/null
+// { dg-options "-std=gnu++0x" }
+// 2010-03-10 Paolo Carlini <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2010 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <unordered_set>
+#include <testsuite_hooks.h>
+
+// DR 1189. Awkward interface for changing the number of buckets
+// in an unordered associative container
+void test01()
+{
+ bool test __attribute__((unused)) = true;
+
+ std::unordered_multiset<int> ms1;
+ ms1.reserve(10);
+ VERIFY( ms1.bucket_count() >= 10 );
+
+ ms1.reserve(100);
+ VERIFY( ms1.bucket_count() >= 100 );
+
+ std::unordered_multiset<int> ms2(100);
+ VERIFY( ms2.bucket_count() >= 100 );
+
+ ms2.reserve(1000);
+ VERIFY( ms2.bucket_count() >= 1000 );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
--- /dev/null
+// { dg-options "-std=gnu++0x" }
+// 2010-03-10 Paolo Carlini <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2010 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <unordered_set>
+#include <testsuite_hooks.h>
+
+// DR 1189. Awkward interface for changing the number of buckets
+// in an unordered associative container
+void test01()
+{
+ bool test __attribute__((unused)) = true;
+
+ std::unordered_set<int> s1;
+ s1.reserve(10);
+ VERIFY( s1.bucket_count() >= 10 );
+
+ s1.reserve(100);
+ VERIFY( s1.bucket_count() >= 100 );
+
+ std::unordered_set<int> s2(100);
+ VERIFY( s2.bucket_count() >= 100 );
+
+ s2.reserve(1000);
+ VERIFY( s2.bucket_count() >= 1000 );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}