forked from boostorg/intrusive
Remove static instances for size_holder, as it provokes false positives in thread debugging tools and simplify size_traits usage, specially in swaps.
This commit is contained in:
@@ -3839,6 +3839,7 @@ to be inserted in intrusive containers are allocated using `std::vector` or `std
|
|||||||
|
|
||||||
* Fixed bugs:
|
* Fixed bugs:
|
||||||
* [@https://svn.boost.org/trac/boost/ticket/12190 Boost Trac #12190: ['Intrusive List + Flat Map combination crashes]]
|
* [@https://svn.boost.org/trac/boost/ticket/12190 Boost Trac #12190: ['Intrusive List + Flat Map combination crashes]]
|
||||||
|
* [@https://svn.boost.org/trac/boost/ticket/12245 Boost Trac #12245: ['bstree uses a shared static size_traits for constant_time_size<false>]]
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
||||||
|
|
||||||
|
@@ -554,18 +554,10 @@ struct bstbase_hack<ValueTraits, VoidOrKeyOfValue, VoidOrKeyComp, false, SizeTyp
|
|||||||
|
|
||||||
typedef detail::size_holder<false, SizeType> size_traits;
|
typedef detail::size_holder<false, SizeType> size_traits;
|
||||||
|
|
||||||
size_traits &sz_traits()
|
size_traits sz_traits() const
|
||||||
{ return s_size_traits; }
|
{ return size_traits(); }
|
||||||
|
|
||||||
const size_traits &sz_traits() const
|
|
||||||
{ return s_size_traits; }
|
|
||||||
|
|
||||||
static size_traits s_size_traits;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class ValueTraits, class VoidOrKeyOfValue, class VoidOrKeyComp, class SizeType, algo_types AlgoType, typename HeaderHolder>
|
|
||||||
detail::size_holder<false, SizeType> bstbase_hack<ValueTraits, VoidOrKeyOfValue, VoidOrKeyComp, false, SizeType, AlgoType, HeaderHolder>::s_size_traits;
|
|
||||||
|
|
||||||
//This class will
|
//This class will
|
||||||
template<class ValueTraits, class VoidOrKeyOfValue, class VoidOrKeyComp, bool ConstantTimeSize, class SizeType, algo_types AlgoType, typename HeaderHolder>
|
template<class ValueTraits, class VoidOrKeyOfValue, class VoidOrKeyComp, bool ConstantTimeSize, class SizeType, algo_types AlgoType, typename HeaderHolder>
|
||||||
struct bstbase
|
struct bstbase
|
||||||
@@ -955,11 +947,7 @@ class bstree_impl
|
|||||||
::boost::adl_move_swap(this->comp(), this->comp());
|
::boost::adl_move_swap(this->comp(), this->comp());
|
||||||
//These can't throw
|
//These can't throw
|
||||||
node_algorithms::swap_tree(this->header_ptr(), node_ptr(other.header_ptr()));
|
node_algorithms::swap_tree(this->header_ptr(), node_ptr(other.header_ptr()));
|
||||||
if(constant_time_size){
|
this->sz_traits().swap(other.sz_traits());
|
||||||
size_type backup = this->sz_traits().get_size();
|
|
||||||
this->sz_traits().set_size(other.sz_traits().get_size());
|
|
||||||
other.sz_traits().set_size(backup);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
|
//! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
|
||||||
|
@@ -51,6 +51,9 @@ struct size_holder
|
|||||||
BOOST_INTRUSIVE_FORCEINLINE void decrease(SizeType n)
|
BOOST_INTRUSIVE_FORCEINLINE void decrease(SizeType n)
|
||||||
{ size_ -= n; }
|
{ size_ -= n; }
|
||||||
|
|
||||||
|
BOOST_INTRUSIVE_FORCEINLINE void swap(size_holder &other)
|
||||||
|
{ SizeType tmp(size_); size_ = other.size_; other.size_ = tmp; }
|
||||||
|
|
||||||
SizeType size_;
|
SizeType size_;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -77,6 +80,8 @@ struct size_holder<false, SizeType, Tag>
|
|||||||
|
|
||||||
BOOST_INTRUSIVE_FORCEINLINE void decrease(SizeType)
|
BOOST_INTRUSIVE_FORCEINLINE void decrease(SizeType)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
BOOST_INTRUSIVE_FORCEINLINE void swap(size_holder){}
|
||||||
};
|
};
|
||||||
|
|
||||||
} //namespace detail{
|
} //namespace detail{
|
||||||
|
@@ -119,6 +119,8 @@ struct prime_list_holder
|
|||||||
static const std::size_t prime_list_size;
|
static const std::size_t prime_list_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
|
||||||
|
|
||||||
//We only support LLP64(Win64) or LP64(most Unix) data models
|
//We only support LLP64(Win64) or LP64(most Unix) data models
|
||||||
#ifdef _WIN64 //In 64 bit windows sizeof(size_t) == sizeof(unsigned long long)
|
#ifdef _WIN64 //In 64 bit windows sizeof(size_t) == sizeof(unsigned long long)
|
||||||
#define BOOST_INTRUSIVE_PRIME_C(NUMBER) NUMBER##ULL
|
#define BOOST_INTRUSIVE_PRIME_C(NUMBER) NUMBER##ULL
|
||||||
@@ -173,6 +175,8 @@ const std::size_t prime_list_holder<Dummy>::prime_list[] = {
|
|||||||
#undef BOOST_INTRUSIVE_PRIME_C
|
#undef BOOST_INTRUSIVE_PRIME_C
|
||||||
#undef BOOST_INTRUSIVE_64_BIT_SIZE_T
|
#undef BOOST_INTRUSIVE_64_BIT_SIZE_T
|
||||||
|
|
||||||
|
#endif //#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
|
||||||
|
|
||||||
template<int Dummy>
|
template<int Dummy>
|
||||||
const std::size_t prime_list_holder<Dummy>::prime_list_size
|
const std::size_t prime_list_holder<Dummy>::prime_list_size
|
||||||
= sizeof(prime_list)/sizeof(std::size_t);
|
= sizeof(prime_list)/sizeof(std::size_t);
|
||||||
@@ -1243,10 +1247,13 @@ struct hashtable_size_traits_wrapper
|
|||||||
|
|
||||||
size_traits size_traits_;
|
size_traits size_traits_;
|
||||||
|
|
||||||
const size_traits &priv_size_traits() const
|
typedef const size_traits & size_traits_const_t;
|
||||||
|
typedef size_traits & size_traits_t;
|
||||||
|
|
||||||
|
size_traits_const_t priv_size_traits() const
|
||||||
{ return size_traits_; }
|
{ return size_traits_; }
|
||||||
|
|
||||||
size_traits &priv_size_traits()
|
size_traits_t priv_size_traits()
|
||||||
{ return size_traits_; }
|
{ return size_traits_; }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1265,18 +1272,13 @@ struct hashtable_size_traits_wrapper<DeriveFrom, SizeType, false>
|
|||||||
|
|
||||||
typedef detail::size_holder< false, SizeType> size_traits;
|
typedef detail::size_holder< false, SizeType> size_traits;
|
||||||
|
|
||||||
const size_traits &priv_size_traits() const
|
typedef size_traits size_traits_const_t;
|
||||||
{ return size_traits_; }
|
typedef size_traits size_traits_t;
|
||||||
|
|
||||||
size_traits &priv_size_traits()
|
BOOST_INTRUSIVE_FORCEINLINE size_traits priv_size_traits() const
|
||||||
{ return size_traits_; }
|
{ return size_traits(); }
|
||||||
|
|
||||||
static size_traits size_traits_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class DeriveFrom, class SizeType>
|
|
||||||
detail::size_holder< false, SizeType > hashtable_size_traits_wrapper<DeriveFrom, SizeType, false>::size_traits_;
|
|
||||||
|
|
||||||
//hashdata_internal
|
//hashdata_internal
|
||||||
//Stores bucket_hash_equal_t and split_traits
|
//Stores bucket_hash_equal_t and split_traits
|
||||||
template<class ValueTraits, class VoidOrKeyOfValue, class VoidOrKeyHash, class VoidOrKeyEqual, class BucketTraits, class SizeType, std::size_t BoolFlags>
|
template<class ValueTraits, class VoidOrKeyOfValue, class VoidOrKeyHash, class VoidOrKeyEqual, class BucketTraits, class SizeType, std::size_t BoolFlags>
|
||||||
@@ -1360,10 +1362,10 @@ struct hashdata_internal
|
|||||||
: internal_type(val_traits, ::boost::forward<BucketTraitsType>(b_traits), h, e)
|
: internal_type(val_traits, ::boost::forward<BucketTraitsType>(b_traits), h, e)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
split_traits &priv_split_traits()
|
BOOST_INTRUSIVE_FORCEINLINE typename internal_type::size_traits_t priv_split_traits()
|
||||||
{ return this->priv_size_traits(); }
|
{ return this->priv_size_traits(); }
|
||||||
|
|
||||||
const split_traits &priv_split_traits() const
|
BOOST_INTRUSIVE_FORCEINLINE typename internal_type::size_traits_const_t priv_split_traits() const
|
||||||
{ return this->priv_size_traits(); }
|
{ return this->priv_size_traits(); }
|
||||||
|
|
||||||
~hashdata_internal()
|
~hashdata_internal()
|
||||||
@@ -1790,15 +1792,10 @@ class hashtable_impl
|
|||||||
{
|
{
|
||||||
this->priv_swap_cache(x);
|
this->priv_swap_cache(x);
|
||||||
x.priv_initialize_cache();
|
x.priv_initialize_cache();
|
||||||
if(constant_time_size){
|
this->priv_size_traits().set_size(x.priv_size_traits().get_size());
|
||||||
this->priv_size_traits().set_size(size_type(0));
|
x.priv_size_traits().set_size(size_type(0));
|
||||||
this->priv_size_traits().set_size(x.priv_size_traits().get_size());
|
this->priv_split_traits().set_size(x.priv_split_traits().get_size());
|
||||||
x.priv_size_traits().set_size(size_type(0));
|
x.priv_split_traits().set_size(size_type(0));
|
||||||
}
|
|
||||||
if(incremental){
|
|
||||||
this->priv_split_traits().set_size(x.priv_split_traits().get_size());
|
|
||||||
x.priv_split_traits().set_size(size_type(0));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! <b>Effects</b>: to-do
|
//! <b>Effects</b>: to-do
|
||||||
@@ -1946,8 +1943,8 @@ class hashtable_impl
|
|||||||
::boost::adl_move_swap(this->priv_bucket_traits(), other.priv_bucket_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());
|
::boost::adl_move_swap(this->priv_value_traits(), other.priv_value_traits());
|
||||||
this->priv_swap_cache(other);
|
this->priv_swap_cache(other);
|
||||||
::boost::adl_move_swap(this->priv_size_traits(), other.priv_size_traits());
|
this->priv_size_traits().swap(other.priv_size_traits());
|
||||||
::boost::adl_move_swap(this->priv_split_traits(), other.priv_split_traits());
|
this->priv_split_traits().swap(other.priv_split_traits());
|
||||||
}
|
}
|
||||||
|
|
||||||
//! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw
|
//! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw
|
||||||
|
@@ -542,11 +542,7 @@ class list_impl
|
|||||||
void swap(list_impl& other)
|
void swap(list_impl& other)
|
||||||
{
|
{
|
||||||
node_algorithms::swap_nodes(this->get_root_node(), other.get_root_node());
|
node_algorithms::swap_nodes(this->get_root_node(), other.get_root_node());
|
||||||
if(constant_time_size){
|
this->priv_size_traits().swap(other.priv_size_traits());
|
||||||
size_type backup = this->priv_size_traits().get_size();
|
|
||||||
this->priv_size_traits().set_size(other.priv_size_traits().get_size());
|
|
||||||
other.priv_size_traits().set_size(backup);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! <b>Effects</b>: Moves backwards all the elements, so that the first
|
//! <b>Effects</b>: Moves backwards all the elements, so that the first
|
||||||
|
@@ -716,11 +716,7 @@ class slist_impl
|
|||||||
else{
|
else{
|
||||||
this->priv_swap_lists(this->get_root_node(), other.get_root_node(), detail::bool_<linear>());
|
this->priv_swap_lists(this->get_root_node(), other.get_root_node(), detail::bool_<linear>());
|
||||||
}
|
}
|
||||||
if(constant_time_size){
|
this->priv_size_traits().swap(other.priv_size_traits());
|
||||||
size_type backup = this->priv_size_traits().get_size();
|
|
||||||
this->priv_size_traits().set_size(other.priv_size_traits().get_size());
|
|
||||||
other.priv_size_traits().set_size(backup);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! <b>Effects</b>: Moves backwards all the elements, so that the first
|
//! <b>Effects</b>: Moves backwards all the elements, so that the first
|
||||||
|
Reference in New Issue
Block a user