summaryrefslogtreecommitdiff
path: root/boost/intrusive/hashtable.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/intrusive/hashtable.hpp')
-rw-r--r--boost/intrusive/hashtable.hpp65
1 files changed, 36 insertions, 29 deletions
diff --git a/boost/intrusive/hashtable.hpp b/boost/intrusive/hashtable.hpp
index af73f70629..1d4f3d3f0c 100644
--- a/boost/intrusive/hashtable.hpp
+++ b/boost/intrusive/hashtable.hpp
@@ -12,21 +12,9 @@
#ifndef BOOST_INTRUSIVE_HASHTABLE_HPP
#define BOOST_INTRUSIVE_HASHTABLE_HPP
-#if defined(_MSC_VER)
-# pragma once
-#endif
-
#include <boost/intrusive/detail/config_begin.hpp>
#include <boost/intrusive/intrusive_fwd.hpp>
-//std C++
-#include <functional> //std::equal_to
-#include <utility> //std::pair
-#include <algorithm> //std::swap, std::lower_bound, std::upper_bound
-#include <cstddef> //std::size_t
-//boost
-#include <boost/intrusive/detail/assert.hpp>
-#include <boost/static_assert.hpp>
-#include <boost/functional/hash.hpp>
+
//General intrusive utilities
#include <boost/intrusive/detail/hashtable_node.hpp>
#include <boost/intrusive/detail/transform_iterator.hpp>
@@ -44,7 +32,23 @@
#include <boost/intrusive/slist.hpp>
#include <boost/intrusive/pointer_traits.hpp>
#include <boost/intrusive/detail/mpl.hpp>
+
+//boost
+#include <boost/functional/hash.hpp>
+#include <boost/intrusive/detail/assert.hpp>
+#include <boost/static_assert.hpp>
#include <boost/move/utility_core.hpp>
+#include <boost/move/adl_move_swap.hpp>
+
+//std C++
+#include <boost/intrusive/detail/minimal_less_equal_header.hpp> //std::equal_to
+#include <boost/intrusive/detail/minimal_pair_header.hpp> //std::pair
+#include <algorithm> //std::lower_bound, std::upper_bound
+#include <cstddef> //std::size_t
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+# pragma once
+#endif
namespace boost {
namespace intrusive {
@@ -550,7 +554,8 @@ struct downcast_node_to_value_t
template<class F, class SlistNodePtr, class NodePtr>
struct node_cast_adaptor
- : private detail::ebo_functor_holder<F>
+ //Use public inheritance to avoid MSVC bugs with closures
+ : public detail::ebo_functor_holder<F>
{
typedef detail::ebo_functor_holder<F> base_t;
@@ -800,6 +805,7 @@ struct get_hash<void, T>
//Stores bucket_plus_vtraits plust the hash function
template<class VoidOrKeyHash, class ValueTraits, class BucketTraits>
struct bucket_hash_t
+ //Use public inheritance to avoid MSVC bugs with closures
: public detail::ebo_functor_holder
<typename get_hash< VoidOrKeyHash
, typename bucket_plus_vtraits<ValueTraits,BucketTraits>::value_traits::value_type
@@ -852,6 +858,7 @@ struct get_equal_to<void, T>
//non-empty bucket shall not be cached.
template<class VoidOrKeyHash, class VoidOrKeyEqual, class ValueTraits, class BucketTraits, bool>
struct bucket_hash_equal_t
+ //Use public inheritance to avoid MSVC bugs with closures
: public detail::ebo_functor_holder //equal
<typename get_equal_to< VoidOrKeyEqual
, typename bucket_plus_vtraits<ValueTraits,BucketTraits>::value_traits::value_type
@@ -929,6 +936,7 @@ struct bucket_hash_equal_t
//non-empty bucket shall be cached.
template<class VoidOrKeyHash, class VoidOrKeyEqual, class ValueTraits, class BucketTraits> //cache_begin == true version
struct bucket_hash_equal_t<VoidOrKeyHash, VoidOrKeyEqual, ValueTraits, BucketTraits, true>
+ //Use public inheritance to avoid MSVC bugs with closures
: public detail::ebo_functor_holder //equal
<typename get_equal_to< VoidOrKeyEqual
, typename bucket_plus_vtraits<ValueTraits,BucketTraits>::value_traits::value_type
@@ -973,7 +981,7 @@ struct bucket_hash_equal_t<VoidOrKeyHash, VoidOrKeyEqual, ValueTraits, BucketTra
void priv_swap_cache(bucket_hash_equal_t &other)
{
- std::swap(this->cached_begin_, other.cached_begin_);
+ ::boost::adl_move_swap(this->cached_begin_, other.cached_begin_);
}
siterator priv_begin() const
@@ -1308,7 +1316,7 @@ class hashtable_impl
typedef detail::transform_iterator
< typename slist_impl::iterator
- , downcast_node_to_value_t
+ , downcast_node_to_value_t
< value_traits
, true> > const_local_iterator;
@@ -1510,13 +1518,12 @@ class hashtable_impl
//! found using ADL throw. Basic guarantee.
void swap(hashtable_impl& other)
{
- using std::swap;
//These can throw
- swap(this->priv_equal(), other.priv_equal());
- swap(this->priv_hasher(), other.priv_hasher());
+ ::boost::adl_move_swap(this->priv_equal(), other.priv_equal());
+ ::boost::adl_move_swap(this->priv_hasher(), other.priv_hasher());
//These can't throw
- swap(this->priv_bucket_traits(), other.priv_bucket_traits());
- swap(this->priv_value_traits(), other.priv_value_traits());
+ ::boost::adl_move_swap(this->priv_bucket_traits(), other.priv_bucket_traits());
+ ::boost::adl_move_swap(this->priv_value_traits(), other.priv_value_traits());
this->priv_swap_cache(other);
if(constant_time_size){
size_type backup = this->priv_size_traits().get_size();
@@ -1568,7 +1575,7 @@ class hashtable_impl
const bucket_ptr src_buckets = src.priv_bucket_pointer();
const bucket_ptr dst_buckets = this->priv_bucket_pointer();
size_type constructed;
-
+
typedef node_cast_adaptor< detail::node_disposer<Disposer, value_traits, CircularSListAlgorithms>
, slist_node_ptr, node_ptr > NodeDisposer;
typedef node_cast_adaptor< detail::node_cloner <Cloner, value_traits, CircularSListAlgorithms>
@@ -1660,7 +1667,7 @@ class hashtable_impl
//!
//! <b>Effects</b>: Equivalent to this->insert_equal(t) for each element in [b, e).
//!
- //! <b>Complexity</b>: Average case O(N), where N is std::distance(b, e).
+ //! <b>Complexity</b>: Average case O(N), where N is distance(b, e).
//! Worst case O(N*this->size()).
//!
//! <b>Throws</b>: If the internal hasher or the equality functor throws. Basic guarantee.
@@ -1706,7 +1713,7 @@ class hashtable_impl
//!
//! <b>Effects</b>: Equivalent to this->insert_unique(t) for each element in [b, e).
//!
- //! <b>Complexity</b>: Average case O(N), where N is std::distance(b, e).
+ //! <b>Complexity</b>: Average case O(N), where N is distance(b, e).
//! Worst case O(N*this->size()).
//!
//! <b>Throws</b>: If the internal hasher or the equality functor throws. Basic guarantee.
@@ -1819,7 +1826,7 @@ class hashtable_impl
//! <b>Effects</b>: Erases the range pointed to by b end e.
//!
- //! <b>Complexity</b>: Average case O(std::distance(b, e)),
+ //! <b>Complexity</b>: Average case O(distance(b, e)),
//! worst case O(this->size()).
//!
//! <b>Throws</b>: Nothing.
@@ -1896,7 +1903,7 @@ class hashtable_impl
//! <b>Effects</b>: Erases the range pointed to by b end e.
//! Disposer::operator()(pointer) is called for the removed elements.
//!
- //! <b>Complexity</b>: Average case O(std::distance(b, e)),
+ //! <b>Complexity</b>: Average case O(distance(b, e)),
//! worst case O(this->size()).
//!
//! <b>Throws</b>: Nothing.
@@ -2805,7 +2812,7 @@ class hashtable_impl
siterator priv_invalid_local_it() const
{ return this->data_type::internal.internal.internal.internal.priv_invalid_local_it(); }
-
+
split_traits &priv_split_traits()
{ return this->data_type::internal.priv_split_traits(); }
@@ -3287,11 +3294,11 @@ class hashtable
{}
hashtable(BOOST_RV_REF(hashtable) x)
- : Base(::boost::move(static_cast<Base&>(x)))
+ : Base(BOOST_MOVE_BASE(Base, x))
{}
hashtable& operator=(BOOST_RV_REF(hashtable) x)
- { return static_cast<hashtable&>(this->Base::operator=(::boost::move(static_cast<Base&>(x)))); }
+ { return static_cast<hashtable&>(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); }
};
#endif