Unordered: Stop using void_pointer.

Was breaking for allocators that don't have good enough support for
void_pointer. Which I suspect is pretty common.

[SVN r74800]
This commit is contained in:
Daniel James
2011-10-08 12:17:27 +00:00
parent 5a2bf64a65
commit f304e56818
4 changed files with 23 additions and 30 deletions

View File

@ -356,13 +356,13 @@ namespace boost { namespace unordered { namespace detail {
typename pointer_to_other<const value_type>::type) typename pointer_to_other<const value_type>::type)
const_pointer; const_pointer;
typedef BOOST_UNORDERED_DEFAULT_TYPE(Alloc, void_pointer, //typedef BOOST_UNORDERED_DEFAULT_TYPE(Alloc, void_pointer,
typename pointer_to_other<void>::type) // typename pointer_to_other<void>::type)
void_pointer; // void_pointer;
//
typedef BOOST_UNORDERED_DEFAULT_TYPE(Alloc, const_void_pointer, //typedef BOOST_UNORDERED_DEFAULT_TYPE(Alloc, const_void_pointer,
typename pointer_to_other<const void>::type) // typename pointer_to_other<const void>::type)
const_void_pointer; // const_void_pointer;
typedef BOOST_UNORDERED_DEFAULT_TYPE(Alloc, difference_type, typedef BOOST_UNORDERED_DEFAULT_TYPE(Alloc, difference_type,
std::ptrdiff_t) difference_type; std::ptrdiff_t) difference_type;

View File

@ -192,7 +192,6 @@ namespace boost { namespace unordered { namespace detail {
public: public:
typedef boost::unordered::detail::allocator_traits<A> traits; typedef boost::unordered::detail::allocator_traits<A> traits;
typedef typename traits::value_type value_type; typedef typename traits::value_type value_type;
typedef typename traits::void_pointer void_pointer;
typedef Node node; typedef Node node;
typedef Bucket bucket; typedef Bucket bucket;

View File

@ -17,15 +17,16 @@
namespace boost { namespace unordered { namespace detail { namespace boost { namespace unordered { namespace detail {
template <typename VoidPointer, typename T> struct grouped_node; template <typename A, typename T> struct grouped_node;
template <typename T> struct grouped_ptr_node; template <typename T> struct grouped_ptr_node;
template <typename Types> struct grouped_table_impl; template <typename Types> struct grouped_table_impl;
template <typename VoidPointer, typename T> template <typename A, typename T>
struct grouped_node : struct grouped_node :
boost::unordered::detail::value_base<T> boost::unordered::detail::value_base<T>
{ {
typedef VoidPointer link_pointer; typedef typename ::boost::unordered::detail::rebind_wrap<
A, grouped_node<A, T> >::type::pointer link_pointer;
link_pointer next_; link_pointer next_;
link_pointer group_prev_; link_pointer group_prev_;
@ -69,22 +70,21 @@ namespace boost { namespace unordered { namespace detail {
// If the allocator uses raw pointers use grouped_ptr_node // If the allocator uses raw pointers use grouped_ptr_node
// Otherwise use grouped_node. // Otherwise use grouped_node.
template <typename A, typename T, template <typename A, typename T, typename NodePtr, typename BucketPtr>
typename VoidPointer, typename NodePtr, typename BucketPtr>
struct pick_grouped_node2 struct pick_grouped_node2
{ {
typedef boost::unordered::detail::grouped_node<VoidPointer, T> node; typedef boost::unordered::detail::grouped_node<A, T> node;
typedef typename boost::unordered::detail::allocator_traits< typedef typename boost::unordered::detail::allocator_traits<
typename boost::unordered::detail::rebind_wrap<A, node>::type typename boost::unordered::detail::rebind_wrap<A, node>::type
>::pointer node_pointer; >::pointer node_pointer;
typedef boost::unordered::detail::bucket<node_pointer> bucket; typedef boost::unordered::detail::bucket<node_pointer> bucket;
typedef VoidPointer link_pointer; typedef node_pointer link_pointer;
}; };
template <typename A, typename T> template <typename A, typename T>
struct pick_grouped_node2<A, T, void*, struct pick_grouped_node2<A, T,
boost::unordered::detail::grouped_ptr_node<T>*, boost::unordered::detail::grouped_ptr_node<T>*,
boost::unordered::detail::ptr_bucket*> boost::unordered::detail::ptr_bucket*>
{ {
@ -107,7 +107,6 @@ namespace boost { namespace unordered { namespace detail {
> tentative_bucket_traits; > tentative_bucket_traits;
typedef pick_grouped_node2<A, T, typedef pick_grouped_node2<A, T,
typename tentative_node_traits::void_pointer,
typename tentative_node_traits::pointer, typename tentative_node_traits::pointer,
typename tentative_bucket_traits::pointer> pick; typename tentative_bucket_traits::pointer> pick;
@ -127,7 +126,6 @@ namespace boost { namespace unordered { namespace detail {
typedef boost::unordered::detail::allocator_traits<A> traits; typedef boost::unordered::detail::allocator_traits<A> traits;
typedef typename traits::value_type value_type; typedef typename traits::value_type value_type;
typedef typename traits::void_pointer void_pointer;
typedef value_type key_type; typedef value_type key_type;
typedef boost::unordered::detail::pick_grouped_node<A, value_type> pick; typedef boost::unordered::detail::pick_grouped_node<A, value_type> pick;
@ -151,7 +149,6 @@ namespace boost { namespace unordered { namespace detail {
typedef boost::unordered::detail::allocator_traits<A> traits; typedef boost::unordered::detail::allocator_traits<A> traits;
typedef typename traits::value_type value_type; typedef typename traits::value_type value_type;
typedef typename traits::void_pointer void_pointer;
typedef boost::unordered::detail::pick_grouped_node<A, value_type> pick; typedef boost::unordered::detail::pick_grouped_node<A, value_type> pick;
typedef typename pick::node node; typedef typename pick::node node;

View File

@ -19,15 +19,16 @@
namespace boost { namespace unordered { namespace detail { namespace boost { namespace unordered { namespace detail {
template <typename VoidPointer, typename T> struct node; template <typename A, typename T> struct node;
template <typename T> struct ptr_node; template <typename T> struct ptr_node;
template <typename Types> struct table_impl; template <typename Types> struct table_impl;
template <typename VoidPointer, typename T> template <typename A, typename T>
struct node : struct node :
boost::unordered::detail::value_base<T> boost::unordered::detail::value_base<T>
{ {
typedef VoidPointer link_pointer; typedef typename ::boost::unordered::detail::rebind_wrap<
A, node<A, T> >::type::pointer link_pointer;
link_pointer next_; link_pointer next_;
std::size_t hash_; std::size_t hash_;
@ -65,22 +66,21 @@ namespace boost { namespace unordered { namespace detail {
// If the allocator uses raw pointers use ptr_node // If the allocator uses raw pointers use ptr_node
// Otherwise use node. // Otherwise use node.
template <typename A, typename T, template <typename A, typename T, typename NodePtr, typename BucketPtr>
typename VoidPointer, typename NodePtr, typename BucketPtr>
struct pick_node2 struct pick_node2
{ {
typedef boost::unordered::detail::node<VoidPointer, T> node; typedef boost::unordered::detail::node<A, T> node;
typedef typename boost::unordered::detail::allocator_traits< typedef typename boost::unordered::detail::allocator_traits<
typename boost::unordered::detail::rebind_wrap<A, node>::type typename boost::unordered::detail::rebind_wrap<A, node>::type
>::pointer node_pointer; >::pointer node_pointer;
typedef boost::unordered::detail::bucket<node_pointer> bucket; typedef boost::unordered::detail::bucket<node_pointer> bucket;
typedef VoidPointer link_pointer; typedef node_pointer link_pointer;
}; };
template <typename A, typename T> template <typename A, typename T>
struct pick_node2<A, T, void*, struct pick_node2<A, T,
boost::unordered::detail::ptr_node<T>*, boost::unordered::detail::ptr_node<T>*,
boost::unordered::detail::ptr_bucket*> boost::unordered::detail::ptr_bucket*>
{ {
@ -103,7 +103,6 @@ namespace boost { namespace unordered { namespace detail {
> tentative_bucket_traits; > tentative_bucket_traits;
typedef pick_node2<A, T, typedef pick_node2<A, T,
typename tentative_node_traits::void_pointer,
typename tentative_node_traits::pointer, typename tentative_node_traits::pointer,
typename tentative_bucket_traits::pointer> pick; typename tentative_bucket_traits::pointer> pick;
@ -123,7 +122,6 @@ namespace boost { namespace unordered { namespace detail {
typedef boost::unordered::detail::allocator_traits<A> traits; typedef boost::unordered::detail::allocator_traits<A> traits;
typedef typename traits::value_type value_type; typedef typename traits::value_type value_type;
typedef typename traits::void_pointer void_pointer;
typedef value_type key_type; typedef value_type key_type;
typedef boost::unordered::detail::pick_node<A, value_type> pick; typedef boost::unordered::detail::pick_node<A, value_type> pick;
@ -147,7 +145,6 @@ namespace boost { namespace unordered { namespace detail {
typedef boost::unordered::detail::allocator_traits<A> traits; typedef boost::unordered::detail::allocator_traits<A> traits;
typedef typename traits::value_type value_type; typedef typename traits::value_type value_type;
typedef typename traits::void_pointer void_pointer;
typedef boost::unordered::detail::pick_node<A, value_type> pick; typedef boost::unordered::detail::pick_node<A, value_type> pick;
typedef typename pick::node node; typedef typename pick::node node;