Fix bug in hint-based overload for node_type insertion where elements were erroneously reallocated

This commit is contained in:
Christian Mazakas
2023-02-19 21:24:43 -08:00
parent d26aeed68f
commit 53580a3070
2 changed files with 22 additions and 6 deletions

View File

@ -422,8 +422,16 @@ namespace boost {
BOOST_ASSERT(get_allocator() == nh.get_allocator());
auto itp = table_.insert(map_types::move(nh.element()));
return itp.first;
typename map_types::element_type x;
x.p = std::addressof(nh.element());
auto itp = table_.insert(std::move(x));
if (itp.second) {
nh.reset();
return itp.first;
} else {
return itp.first;
}
}
template <class M>
@ -594,7 +602,7 @@ namespace boost {
node_type extract(key_type const& key)
{
auto pos = find(key);
return pos!=end()?extract(pos):node_type();
return pos != end() ? extract(pos) : node_type();
}
template <class K>
@ -605,7 +613,7 @@ namespace boost {
extract(K const& key)
{
auto pos = find(key);
return pos!=end()?extract(pos):node_type();
return pos != end() ? extract(pos) : node_type();
}
template <class H2, class P2>

View File

@ -410,8 +410,16 @@ namespace boost {
BOOST_ASSERT(get_allocator() == nh.get_allocator());
auto itp = table_.insert(set_types::move(nh.element()));
return itp.first;
typename set_types::element_type x;
x.p=std::addressof(nh.element());
auto itp = table_.insert(std::move(x));
if (itp.second) {
nh.reset();
return itp.first;
} else {
return itp.first;
}
}
template <class... Args>