Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r57005 - in trunk/boost/unordered: . detail
From: daniel_james_at_[hidden]
Date: 2009-10-19 15:24:34


Author: danieljames
Date: 2009-10-19 15:24:33 EDT (Mon, 19 Oct 2009)
New Revision: 57005
URL: http://svn.boost.org/trac/boost/changeset/57005

Log:
Use normal emplace implementation for emplace_hint and insert with hint.

There's a bug in the emplace_hint implementation for unordered
containers with equivalent keys. Since my tests missed it, I'm just
going to use the normal emplace implementation until I write better
tests.
Text files modified:
   trunk/boost/unordered/detail/equivalent.hpp | 61 ----------------------------------------
   trunk/boost/unordered/detail/fwd.hpp | 10 -----
   trunk/boost/unordered/unordered_map.hpp | 21 ++++++-------
   trunk/boost/unordered/unordered_set.hpp | 19 +++++------
   4 files changed, 20 insertions(+), 91 deletions(-)

Modified: trunk/boost/unordered/detail/equivalent.hpp
==============================================================================
--- trunk/boost/unordered/detail/equivalent.hpp (original)
+++ trunk/boost/unordered/detail/equivalent.hpp 2009-10-19 15:24:33 EDT (Mon, 19 Oct 2009)
@@ -97,36 +97,6 @@
     }
     
     template <class H, class P, class A, class K>
- inline BOOST_DEDUCED_TYPENAME
- hash_equivalent_table<H, P, A, K>::iterator_base
- hash_equivalent_table<H, P, A, K>
- ::emplace_hint_impl(iterator_base const& it, node_constructor& a)
- {
- // equal can throw, but with no effects
- if (!it.node_ || !equal(get_key(a.value()), *it)) {
- // Use the standard emplace if the iterator doesn't point
- // to a matching key.
- return emplace_impl(a);
- }
- else {
- // Find the first node in the group - so that the node
- // will be added at the end of the group.
-
- node_ptr start = node::first_in_group(it.node_);
-
- // reserve has basic exception safety if the hash function
- // throws, strong otherwise.
- bucket_ptr bucket = this->reserve_for_insert(this->size_ + 1) ?
- get_bucket(this->bucket_index(get_key(a.value()))) :
- it.bucket_;
-
- // Nothing after this point can throw
-
- return iterator_base(bucket, add_node(a, bucket, start));
- }
- }
-
- template <class H, class P, class A, class K>
     inline void hash_equivalent_table<H, P, A, K>
             ::emplace_impl_no_rehash(node_constructor& a)
     {
@@ -156,25 +126,6 @@
         return emplace_impl(a);
     }
 
- // Emplace (equivalent key containers)
- // (I'm using an overloaded emplace for both 'insert' and 'emplace')
-
- // if hash function throws, basic exception safety
- // strong otherwise
- template <class H, class P, class A, class K>
- template <class... Args>
- BOOST_DEDUCED_TYPENAME hash_equivalent_table<H, P, A, K>::iterator_base
- hash_equivalent_table<H, P, A, K>
- ::emplace_hint(iterator_base const& it, Args&&... args)
- {
- // Create the node before rehashing in case it throws an
- // exception (need strong safety in such a case).
- node_constructor a(*this);
- a.construct(std::forward<Args>(args)...);
-
- return emplace_hint_impl(it, a);
- }
-
 #else
 
 #define BOOST_UNORDERED_INSERT_IMPL(z, num_params, _) \
@@ -187,18 +138,6 @@
         node_constructor a(*this); \
         a.construct(BOOST_UNORDERED_CALL_PARAMS(z, num_params)); \
         return emplace_impl(a); \
- } \
- \
- template <class H, class P, class A, class K> \
- template <BOOST_UNORDERED_TEMPLATE_ARGS(z, num_params)> \
- BOOST_DEDUCED_TYPENAME hash_equivalent_table<H, P, A, K>::iterator_base \
- hash_equivalent_table<H, P, A, K> \
- ::emplace_hint(iterator_base const& it, \
- BOOST_UNORDERED_FUNCTION_PARAMS(z, num_params)) \
- { \
- node_constructor a(*this); \
- a.construct(BOOST_UNORDERED_CALL_PARAMS(z, num_params)); \
- return emplace_hint_impl(it, a); \
     }
 
     BOOST_PP_REPEAT_FROM_TO(1, BOOST_UNORDERED_EMPLACE_LIMIT,

Modified: trunk/boost/unordered/detail/fwd.hpp
==============================================================================
--- trunk/boost/unordered/detail/fwd.hpp (original)
+++ trunk/boost/unordered/detail/fwd.hpp 2009-10-19 15:24:33 EDT (Mon, 19 Oct 2009)
@@ -710,8 +710,6 @@
         // Insert methods
 
         iterator_base emplace_impl(node_constructor& a);
- iterator_base emplace_hint_impl(iterator_base const& it,
- node_constructor& a);
         void emplace_impl_no_rehash(node_constructor& a);
 
         // equals
@@ -725,18 +723,12 @@
 
         template <class... Args>
         iterator_base emplace(Args&&... args);
- template <class... Args>
- iterator_base emplace_hint(iterator_base const& it, Args&&... args);
 
 #else
 
 #define BOOST_UNORDERED_INSERT_IMPL(z, n, _) \
         template <BOOST_UNORDERED_TEMPLATE_ARGS(z, n)> \
- iterator_base emplace(BOOST_UNORDERED_FUNCTION_PARAMS(z, n)); \
- \
- template <BOOST_UNORDERED_TEMPLATE_ARGS(z, n)> \
- iterator_base emplace_hint(iterator_base const& it, \
- BOOST_UNORDERED_FUNCTION_PARAMS(z, n));
+ iterator_base emplace(BOOST_UNORDERED_FUNCTION_PARAMS(z, n));
 
         BOOST_PP_REPEAT_FROM_TO(1, BOOST_UNORDERED_EMPLACE_LIMIT,
             BOOST_UNORDERED_INSERT_IMPL, _)

Modified: trunk/boost/unordered/unordered_map.hpp
==============================================================================
--- trunk/boost/unordered/unordered_map.hpp (original)
+++ trunk/boost/unordered/unordered_map.hpp 2009-10-19 15:24:33 EDT (Mon, 19 Oct 2009)
@@ -311,7 +311,7 @@
             template < \
                 BOOST_UNORDERED_TEMPLATE_ARGS(z, n) \
> \
- iterator emplace_hint(const_iterator hint, \
+ iterator emplace_hint(const_iterator, \
                 BOOST_UNORDERED_FUNCTION_PARAMS(z, n) \
             ) \
             { \
@@ -332,7 +332,7 @@
                     table_.emplace(obj));
         }
 
- iterator insert(const_iterator hint, const value_type& obj)
+ iterator insert(const_iterator, const value_type& obj)
         {
             return iterator(table_.emplace(obj).first);
         }
@@ -776,10 +776,9 @@
         }
 
         template <class... Args>
- iterator emplace_hint(const_iterator hint, Args&&... args)
+ iterator emplace_hint(const_iterator, Args&&... args)
         {
- return iterator(table_.emplace_hint(get(hint),
- std::forward<Args>(args)...));
+ return iterator(table_.emplace(std::forward<Args>(args)...));
         }
 #else
 
@@ -788,10 +787,10 @@
             return iterator(table_.emplace(v));
         }
         
- iterator emplace_hint(const_iterator hint,
+ iterator emplace_hint(const_iterator,
             value_type const& v = value_type())
         {
- return iterator(table_.emplace_hint(get(hint), v));
+ return iterator(table_.emplace(v));
         }
 
 
@@ -812,11 +811,11 @@
             template < \
                 BOOST_UNORDERED_TEMPLATE_ARGS(z, n) \
> \
- iterator emplace_hint(const_iterator hint, \
+ iterator emplace_hint(const_iterator, \
                 BOOST_UNORDERED_FUNCTION_PARAMS(z, n) \
             ) \
             { \
- return iterator(table_.emplace_hint(get(hint), \
+ return iterator(table_.emplace( \
                         BOOST_UNORDERED_CALL_PARAMS(z, n) \
                 )); \
             }
@@ -833,9 +832,9 @@
             return iterator(table_.emplace(obj));
         }
 
- iterator insert(const_iterator hint, const value_type& obj)
+ iterator insert(const_iterator, const value_type& obj)
         {
- return iterator(table_.emplace_hint(get(hint), obj));
+ return iterator(table_.emplace(obj));
         }
 
         template <class InputIt>

Modified: trunk/boost/unordered/unordered_set.hpp
==============================================================================
--- trunk/boost/unordered/unordered_set.hpp (original)
+++ trunk/boost/unordered/unordered_set.hpp 2009-10-19 15:24:33 EDT (Mon, 19 Oct 2009)
@@ -326,7 +326,7 @@
                     table_.emplace(obj));
         }
 
- iterator insert(const_iterator hint, const value_type& obj)
+ iterator insert(const_iterator, const value_type& obj)
         {
             return iterator(table_.emplace(obj).first);
         }
@@ -735,10 +735,9 @@
         }
 
         template <class... Args>
- iterator emplace_hint(const_iterator hint, Args&&... args)
+ iterator emplace_hint(const_iterator, Args&&... args)
         {
- return iterator(table_.emplace_hint(get(hint),
- std::forward<Args>(args)...));
+ return iterator(table_.emplace(std::forward<Args>(args)...));
         }
 #else
 
@@ -747,10 +746,10 @@
             return iterator(table_.emplace(v));
         }
 
- iterator emplace_hint(const_iterator hint,
+ iterator emplace_hint(const_iterator,
             value_type const& v = value_type())
         {
- return iterator(table_.emplace_hint(get(hint), v));
+ return iterator(table_.emplace(v));
         }
 
 #define BOOST_UNORDERED_EMPLACE(z, n, _) \
@@ -768,11 +767,11 @@
             template < \
                 BOOST_UNORDERED_TEMPLATE_ARGS(z, n) \
> \
- iterator emplace_hint(const_iterator hint, \
+ iterator emplace_hint(const_iterator, \
                 BOOST_UNORDERED_FUNCTION_PARAMS(z, n) \
             ) \
             { \
- return iterator(table_.emplace_hint(get(hint), \
+ return iterator(table_.emplace( \
                         BOOST_UNORDERED_CALL_PARAMS(z, n) \
                 )); \
             }
@@ -789,9 +788,9 @@
             return iterator(table_.emplace(obj));
         }
 
- iterator insert(const_iterator hint, const value_type& obj)
+ iterator insert(const_iterator, const value_type& obj)
         {
- return iterator(table_.emplace_hint(get(hint), obj));
+ return iterator(table_.emplace(obj));
         }
 
         template <class InputIt>


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk