forked from boostorg/unordered
Unordered: Fix using a C++03 allocator with C++11 compiler.
Because the nodes had an implicit constructor, the `has_construct` traits was detecting that the nodes could be constructed by construction then copy, which really wasn't wanted. Also add a check that nodes aren't been copy constructed to make sure this doesn't happen again. Refs #7100. [SVN r79358]
This commit is contained in:
@@ -37,7 +37,7 @@ namespace boost { namespace unordered { namespace detail {
|
|||||||
|
|
||||||
#if BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT
|
#if BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT
|
||||||
template <BOOST_UNORDERED_EMPLACE_TEMPLATE>
|
template <BOOST_UNORDERED_EMPLACE_TEMPLATE>
|
||||||
grouped_node(BOOST_UNORDERED_EMPLACE_ARGS) :
|
explicit grouped_node(BOOST_UNORDERED_EMPLACE_ARGS) :
|
||||||
node_base(),
|
node_base(),
|
||||||
group_prev_(),
|
group_prev_(),
|
||||||
hash_(0)
|
hash_(0)
|
||||||
@@ -49,6 +49,10 @@ namespace boost { namespace unordered { namespace detail {
|
|||||||
~grouped_node() {
|
~grouped_node() {
|
||||||
boost::unordered::detail::destroy(this->value_ptr());
|
boost::unordered::detail::destroy(this->value_ptr());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
grouped_node(grouped_node const&) {
|
||||||
|
assert(false);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
grouped_node() :
|
grouped_node() :
|
||||||
node_base(),
|
node_base(),
|
||||||
@@ -61,6 +65,9 @@ namespace boost { namespace unordered { namespace detail {
|
|||||||
{
|
{
|
||||||
group_prev_ = self;
|
group_prev_ = self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
grouped_node& operator=(grouped_node const&);
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@@ -77,7 +84,7 @@ namespace boost { namespace unordered { namespace detail {
|
|||||||
|
|
||||||
#if BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT
|
#if BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT
|
||||||
template <BOOST_UNORDERED_EMPLACE_TEMPLATE>
|
template <BOOST_UNORDERED_EMPLACE_TEMPLATE>
|
||||||
grouped_ptr_node(BOOST_UNORDERED_EMPLACE_ARGS) :
|
explicit grouped_ptr_node(BOOST_UNORDERED_EMPLACE_ARGS) :
|
||||||
bucket_base(),
|
bucket_base(),
|
||||||
group_prev_(0),
|
group_prev_(0),
|
||||||
hash_(0)
|
hash_(0)
|
||||||
@@ -89,6 +96,10 @@ namespace boost { namespace unordered { namespace detail {
|
|||||||
~grouped_ptr_node() {
|
~grouped_ptr_node() {
|
||||||
boost::unordered::detail::destroy(this->value_ptr());
|
boost::unordered::detail::destroy(this->value_ptr());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
grouped_ptr_node(grouped_ptr_node const&) {
|
||||||
|
assert(false);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
grouped_ptr_node() :
|
grouped_ptr_node() :
|
||||||
bucket_base(),
|
bucket_base(),
|
||||||
@@ -101,6 +112,9 @@ namespace boost { namespace unordered { namespace detail {
|
|||||||
{
|
{
|
||||||
group_prev_ = self;
|
group_prev_ = self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
grouped_ptr_node& operator=(grouped_ptr_node const&);
|
||||||
};
|
};
|
||||||
|
|
||||||
// If the allocator uses raw pointers use grouped_ptr_node
|
// If the allocator uses raw pointers use grouped_ptr_node
|
||||||
|
@@ -38,7 +38,7 @@ namespace boost { namespace unordered { namespace detail {
|
|||||||
|
|
||||||
#if BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT
|
#if BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT
|
||||||
template <BOOST_UNORDERED_EMPLACE_TEMPLATE>
|
template <BOOST_UNORDERED_EMPLACE_TEMPLATE>
|
||||||
unique_node(BOOST_UNORDERED_EMPLACE_ARGS) :
|
explicit unique_node(BOOST_UNORDERED_EMPLACE_ARGS) :
|
||||||
node_base(),
|
node_base(),
|
||||||
hash_(0)
|
hash_(0)
|
||||||
{
|
{
|
||||||
@@ -49,6 +49,10 @@ namespace boost { namespace unordered { namespace detail {
|
|||||||
~unique_node() {
|
~unique_node() {
|
||||||
boost::unordered::detail::destroy(this->value_ptr());
|
boost::unordered::detail::destroy(this->value_ptr());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unique_node(unique_node const&) {
|
||||||
|
BOOST_ASSERT(false);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
unique_node() :
|
unique_node() :
|
||||||
node_base(),
|
node_base(),
|
||||||
@@ -59,6 +63,9 @@ namespace boost { namespace unordered { namespace detail {
|
|||||||
void init(link_pointer)
|
void init(link_pointer)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
unique_node& operator=(unique_node const&);
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@@ -74,7 +81,7 @@ namespace boost { namespace unordered { namespace detail {
|
|||||||
|
|
||||||
#if BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT
|
#if BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT
|
||||||
template <BOOST_UNORDERED_EMPLACE_TEMPLATE>
|
template <BOOST_UNORDERED_EMPLACE_TEMPLATE>
|
||||||
ptr_node(BOOST_UNORDERED_EMPLACE_ARGS) :
|
explicit ptr_node(BOOST_UNORDERED_EMPLACE_ARGS) :
|
||||||
bucket_base(),
|
bucket_base(),
|
||||||
hash_(0)
|
hash_(0)
|
||||||
{
|
{
|
||||||
@@ -85,6 +92,10 @@ namespace boost { namespace unordered { namespace detail {
|
|||||||
~ptr_node() {
|
~ptr_node() {
|
||||||
boost::unordered::detail::destroy(this->value_ptr());
|
boost::unordered::detail::destroy(this->value_ptr());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ptr_node(ptr_node const&) {
|
||||||
|
BOOST_ASSERT(false);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
ptr_node() :
|
ptr_node() :
|
||||||
bucket_base(),
|
bucket_base(),
|
||||||
@@ -95,6 +106,9 @@ namespace boost { namespace unordered { namespace detail {
|
|||||||
void init(link_pointer)
|
void init(link_pointer)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
ptr_node& operator=(ptr_node const&);
|
||||||
};
|
};
|
||||||
|
|
||||||
// If the allocator uses raw pointers use ptr_node
|
// If the allocator uses raw pointers use ptr_node
|
||||||
|
Reference in New Issue
Block a user