This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: RE :Re: RE :Re: hashtable local iterator


On 01/02/2012 02:27 PM, Paolo Carlini wrote:
Hi,
Hi

Here is a proposition of patch compiling all your remarks.

2012-01-02 François Dumont <fdumont@gcc.gnu.org>

* include/bits/hashtable_policy.h (_Ebo_helper<>): Rename into the
more specific _Hashtable_ebo_helper. Hide this implementation detail
thanks to private inheritance.


Tested under x86_64 linux normal and debug mode.

Ok to commit ?
Can you please also adjust those comments referring to the deprecated unary_function? Otherwise the patch looks good to me.
Like this Paolo ?

2012-01-02 François Dumont <fdumont@gcc.gnu.org>

* include/bits/hashtable_policy.h (_Ebo_helper<>): Rename into the
more specific _Hashtable_ebo_helper. Hide this implementation detail
thanks to private inheritance.
* include/bits/hashtable.h: Remove deprecated unary and binary
function concepts from comments.


I also forget to react to the Solaris issue. I just wanted to tell that I don't see how I could have been more careful regarding the patch. Even if I now know that _N is reserved under Solaris there are surely many different reserved keywords under the numerous supported platforms. Is there a list of those keywords ? If so I can only imagine an automated test based on it to avoid this kind of regression even if writing this test will require more than a simple grep.

François

Index: include/bits/hashtable.h
===================================================================
--- include/bits/hashtable.h	(revision 182774)
+++ include/bits/hashtable.h	(working copy)
@@ -54,16 +54,15 @@
   // _Equal: function object that takes two objects of type k and returns
   // a bool-like value that is true if the two objects are considered equal.
 
-  // _H1: the hash function.  A unary function object with argument type
-  // Key and result type size_t.  Return values should be distributed
-  // over the entire range [0, numeric_limits<size_t>:::max()].
+  // _H1: the hash function.  A function object with argument type Key and
+  // result type size_t.  Return values should be distributed over the entire
+  // range [0, numeric_limits<size_t>:::max()].
 
   // _H2: the range-hashing function (in the terminology of Tavori and
-  // Dreizin).  A binary function object whose argument types and result
-  // type are all size_t.  Given arguments r and N, the return value is
-  // in the range [0, N).
+  // Dreizin).  A function object whose argument types and result type are all
+  // size_t.  Given arguments r and N, the return value is in the range [0, N).
 
-  // _Hash: the ranged hash function (Tavori and Dreizin). A binary function
+  // _Hash: the ranged hash function (Tavori and Dreizin). A function object
   // whose argument types are _Key and size_t and whose result type is
   // size_t.  Given arguments k and N, the return value is in the range
   // [0, N).  Default: hash(k, N) = h2(h1(k), N).  If _Hash is anything other
@@ -74,7 +73,7 @@
   // than n.  _M_bkt_for_elements(n) returns a bucket count appropriate
   // for an element count of n.  _M_need_rehash(n_bkt, n_elt, n_ins)
   // determines whether, if the current bucket count is n_bkt and the
-  // current element count is n_elt, we need to increase the bucket
+  // current element count is n_elt, we need to change the bucket
   // count.  If so, returns make_pair(true, n), where n is the new
   // bucket count.  If not, returns make_pair(false, <anything>).
 
@@ -88,7 +87,7 @@
   // unordered_multiset, false for unordered_map and unordered_multimap.
 
   // __unique_keys: bool.  true if the return value of _Hashtable::count(k)
-  // is always at most one, false if it may be an arbitrary number.  This
+  // is always at most one, false if it may be an arbitrary number.  This is
   // true for unordered_set and unordered_map, false for unordered_multiset
   // and unordered_multimap.
   /**
Index: include/bits/hashtable_policy.h
===================================================================
--- include/bits/hashtable_policy.h	(revision 182774)
+++ include/bits/hashtable_policy.h	(working copy)
@@ -1,6 +1,6 @@
 // Internal policy header for unordered_set and unordered_map -*- C++ -*-
 
-// Copyright (C) 2010, 2011 Free Software Foundation, Inc.
+// Copyright (C) 2010, 2011, 2012 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
@@ -517,43 +517,43 @@
   // and when it worth it, type is empty.
   template<int _Nm, typename _Tp,
 	   bool __use_ebo = !__is_final(_Tp) && __is_empty(_Tp)>
-    struct _Ebo_helper;
+    struct _Hashtable_ebo_helper;
 
   // Specialization using EBO.
   template<int _Nm, typename _Tp>
-    struct _Ebo_helper<_Nm, _Tp, true> : _Tp
+    struct _Hashtable_ebo_helper<_Nm, _Tp, true> : private _Tp
     {
-      _Ebo_helper() = default;
-      _Ebo_helper(const _Tp& __tp) : _Tp(__tp)
+      _Hashtable_ebo_helper() = default;
+      _Hashtable_ebo_helper(const _Tp& __tp) : _Tp(__tp)
       { }
 
       static const _Tp&
-      _S_cget(const _Ebo_helper& __eboh)
+      _S_cget(const _Hashtable_ebo_helper& __eboh)
       { return static_cast<const _Tp&>(__eboh); }
 
       static _Tp&
-      _S_get(_Ebo_helper& __eboh)
+      _S_get(_Hashtable_ebo_helper& __eboh)
       { return static_cast<_Tp&>(__eboh); }
     };
 
   // Specialization not using EBO.
   template<int _Nm, typename _Tp>
-    struct _Ebo_helper<_Nm, _Tp, false>
+    struct _Hashtable_ebo_helper<_Nm, _Tp, false>
     {
-      _Ebo_helper() = default;
-      _Ebo_helper(const _Tp& __tp) : __m_tp(__tp)
+      _Hashtable_ebo_helper() = default;
+      _Hashtable_ebo_helper(const _Tp& __tp) : _M_tp(__tp)
       { }
 
       static const _Tp&
-      _S_cget(const _Ebo_helper& __eboh)
-      { return __eboh.__m_tp; }
+      _S_cget(const _Hashtable_ebo_helper& __eboh)
+      { return __eboh._M_tp; }
 
       static _Tp&
-      _S_get(_Ebo_helper& __eboh)
-      { return __eboh.__m_tp; }
+      _S_get(_Hashtable_ebo_helper& __eboh)
+      { return __eboh._M_tp; }
 
     private:
-      _Tp __m_tp;
+      _Tp _M_tp;
     };
 
   // Class template _Hash_code_base.  Encapsulates two policy issues that
@@ -583,11 +583,13 @@
   template<typename _Key, typename _Value, typename _ExtractKey, 
 	   typename _H1, typename _H2, typename _Hash>
     struct _Hash_code_base<_Key, _Value, _ExtractKey, _H1, _H2, _Hash, false>
-    : _Ebo_helper<0, _ExtractKey>, _Ebo_helper<1, _Hash>
+    : private _Hashtable_ebo_helper<0, _ExtractKey>,
+      private _Hashtable_ebo_helper<1, _Hash>
     {
     private:
-      typedef _Ebo_helper<0, _ExtractKey> _EboExtractKey;
-      typedef _Ebo_helper<1, _Hash> _EboHash;
+      typedef _Hashtable_ebo_helper<0, _ExtractKey> _EboExtractKey;
+      typedef _Hashtable_ebo_helper<1, _Hash> _EboHash;
+
     protected:
       // We need the default constructor for the local iterators.
       _Hash_code_base() = default;
@@ -655,12 +657,14 @@
 	   typename _H1, typename _H2>
     struct _Hash_code_base<_Key, _Value, _ExtractKey, _H1, _H2,
 			   _Default_ranged_hash, false>
-    : _Ebo_helper<0, _ExtractKey>, _Ebo_helper<1, _H1>, _Ebo_helper<2, _H2>
+    : private _Hashtable_ebo_helper<0, _ExtractKey>,
+      private _Hashtable_ebo_helper<1, _H1>,
+      private _Hashtable_ebo_helper<2, _H2>
     {
     private:
-      typedef _Ebo_helper<0, _ExtractKey> _EboExtractKey;
-      typedef _Ebo_helper<1, _H1> _EboH1;
-      typedef _Ebo_helper<2, _H2> _EboH2;
+      typedef _Hashtable_ebo_helper<0, _ExtractKey> _EboExtractKey;
+      typedef _Hashtable_ebo_helper<1, _H1> _EboH1;
+      typedef _Hashtable_ebo_helper<2, _H2> _EboH2;
 
     public:
       typedef _H1 hasher;
@@ -732,12 +736,14 @@
 	   typename _H1, typename _H2>
     struct _Hash_code_base<_Key, _Value, _ExtractKey, _H1, _H2,
 			   _Default_ranged_hash, true>
-    : _Ebo_helper<0, _ExtractKey>, _Ebo_helper<1, _H1>, _Ebo_helper<2, _H2>
+    : private _Hashtable_ebo_helper<0, _ExtractKey>,
+      private _Hashtable_ebo_helper<1, _H1>,
+      private _Hashtable_ebo_helper<2, _H2>
     {
     private:
-      typedef _Ebo_helper<0, _ExtractKey> _EboExtractKey;
-      typedef _Ebo_helper<1, _H1> _EboH1;
-      typedef _Ebo_helper<2, _H2> _EboH2;
+      typedef _Hashtable_ebo_helper<0, _ExtractKey> _EboExtractKey;
+      typedef _Hashtable_ebo_helper<1, _H1> _EboH1;
+      typedef _Hashtable_ebo_helper<2, _H2> _EboH2;
 
     public:
       typedef _H1 hasher;
@@ -835,12 +841,12 @@
 	   typename _H1, typename _H2, typename _Hash,
 	   bool __cache_hash_code>
   struct _Hashtable_base
-  : _Hash_code_base<_Key, _Value, _ExtractKey, _H1, _H2, _Hash,
-		    __cache_hash_code>,
-    _Ebo_helper<0, _Equal>
+  : public  _Hash_code_base<_Key, _Value, _ExtractKey, _H1, _H2, _Hash,
+			    __cache_hash_code>,
+    private _Hashtable_ebo_helper<0, _Equal>
   {
   private:
-    typedef _Ebo_helper<0, _Equal> _EboEqual;
+    typedef _Hashtable_ebo_helper<0, _Equal> _EboEqual;
 
   protected:
     typedef _Hash_code_base<_Key, _Value, _ExtractKey,
@@ -859,7 +865,8 @@
       typedef _Equal_helper<_Key, _Value, _ExtractKey,
 			   _Equal, _Hash_code_type,
 			   __cache_hash_code> _EqualHelper;
-      return _EqualHelper::_S_equals(_M_eq(), this->_M_extract(), __k, __c, __n);
+      return _EqualHelper::_S_equals(_M_eq(), this->_M_extract(),
+				     __k, __c, __n);
     }
 
     void
@@ -887,7 +894,7 @@
 	   typename _H1, typename _H2, typename _Hash>
     struct _Local_iterator_base<_Key, _Value, _ExtractKey,
 				_H1, _H2, _Hash, true>
-      : _H2
+      : private _H2
     {
       _Local_iterator_base() = default;
       _Local_iterator_base(_Hash_node<_Value, true>* __p,
@@ -918,8 +925,8 @@
 	   typename _H1, typename _H2, typename _Hash>
     struct _Local_iterator_base<_Key, _Value, _ExtractKey,
 				_H1, _H2, _Hash, false>
-      : _Hash_code_base<_Key, _Value, _ExtractKey,
-			_H1, _H2, _Hash, false>
+      : private _Hash_code_base<_Key, _Value, _ExtractKey,
+				_H1, _H2, _Hash, false>
     {
       _Local_iterator_base() = default;
       _Local_iterator_base(_Hash_node<_Value, false>* __p,

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]