mirror of
https://github.com/boostorg/unordered.git
synced 2025-07-30 03:17:15 +02:00
Update code to be valid when the internal buckets_
data member is moved-from
This commit is contained in:
@ -646,7 +646,7 @@ namespace boost {
|
|||||||
|
|
||||||
size_type bucket_count() const { return size_; }
|
size_type bucket_count() const { return size_; }
|
||||||
|
|
||||||
iterator begin() const { return ++at(size_); }
|
iterator begin() const { return size_ == 0 ? end() : ++at(size_); }
|
||||||
|
|
||||||
iterator end() const
|
iterator end() const
|
||||||
{
|
{
|
||||||
@ -660,6 +660,10 @@ namespace boost {
|
|||||||
|
|
||||||
local_iterator begin(size_type n) const
|
local_iterator begin(size_type n) const
|
||||||
{
|
{
|
||||||
|
if (size_ == 0) {
|
||||||
|
return this->end(n);
|
||||||
|
}
|
||||||
|
|
||||||
return local_iterator(
|
return local_iterator(
|
||||||
(buckets + static_cast<difference_type>(n))->next);
|
(buckets + static_cast<difference_type>(n))->next);
|
||||||
}
|
}
|
||||||
@ -670,12 +674,16 @@ namespace boost {
|
|||||||
|
|
||||||
iterator at(size_type n) const
|
iterator at(size_type n) const
|
||||||
{
|
{
|
||||||
std::size_t const N = group::N;
|
if (size_ > 0) {
|
||||||
|
std::size_t const N = group::N;
|
||||||
|
|
||||||
iterator pbg(buckets + static_cast<difference_type>(n),
|
iterator pbg(buckets + static_cast<difference_type>(n),
|
||||||
groups + static_cast<difference_type>(n / N));
|
groups + static_cast<difference_type>(n / N));
|
||||||
|
|
||||||
return pbg;
|
return pbg;
|
||||||
|
} else {
|
||||||
|
return this->end();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
span<Bucket> raw()
|
span<Bucket> raw()
|
||||||
|
@ -2054,12 +2054,14 @@ namespace boost {
|
|||||||
|
|
||||||
std::size_t bucket_size(std::size_t index) const
|
std::size_t bucket_size(std::size_t index) const
|
||||||
{
|
{
|
||||||
bucket_iterator itb = buckets_.at(index);
|
|
||||||
node_pointer n = itb->next;
|
|
||||||
std::size_t count = 0;
|
std::size_t count = 0;
|
||||||
while (n) {
|
if (size_ > 0) {
|
||||||
++count;
|
bucket_iterator itb = buckets_.at(index);
|
||||||
n = n->next;
|
node_pointer n = itb->next;
|
||||||
|
while (n) {
|
||||||
|
++count;
|
||||||
|
n = n->next;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
@ -2420,11 +2422,14 @@ namespace boost {
|
|||||||
node_pointer find_node_impl(
|
node_pointer find_node_impl(
|
||||||
Key const& x, bucket_iterator itb) const
|
Key const& x, bucket_iterator itb) const
|
||||||
{
|
{
|
||||||
key_equal const& pred = this->key_eq();
|
node_pointer p = node_pointer();
|
||||||
node_pointer p = itb->next;
|
if (itb != buckets_.end()) {
|
||||||
for (; p; p = p->next) {
|
key_equal const& pred = this->key_eq();
|
||||||
if (pred(x, extractor::extract(p->value()))) {
|
p = itb->next;
|
||||||
break;
|
for (; p; p = p->next) {
|
||||||
|
if (pred(x, extractor::extract(p->value()))) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return p;
|
return p;
|
||||||
@ -2453,11 +2458,13 @@ namespace boost {
|
|||||||
inline iterator transparent_find(
|
inline iterator transparent_find(
|
||||||
Key const& k, Hash const& h, Pred const& pred) const
|
Key const& k, Hash const& h, Pred const& pred) const
|
||||||
{
|
{
|
||||||
std::size_t const key_hash = h(k);
|
if (size_ > 0) {
|
||||||
bucket_iterator itb = buckets_.at(buckets_.position(key_hash));
|
std::size_t const key_hash = h(k);
|
||||||
for (node_pointer p = itb->next; p; p = p->next) {
|
bucket_iterator itb = buckets_.at(buckets_.position(key_hash));
|
||||||
if (BOOST_LIKELY(pred(k, extractor::extract(p->value())))) {
|
for (node_pointer p = itb->next; p; p = p->next) {
|
||||||
return iterator(p, itb);
|
if (BOOST_LIKELY(pred(k, extractor::extract(p->value())))) {
|
||||||
|
return iterator(p, itb);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2467,11 +2474,13 @@ namespace boost {
|
|||||||
template <class Key>
|
template <class Key>
|
||||||
node_pointer* find_prev(Key const& key, bucket_iterator itb)
|
node_pointer* find_prev(Key const& key, bucket_iterator itb)
|
||||||
{
|
{
|
||||||
key_equal pred = this->key_eq();
|
if (size_ > 0) {
|
||||||
for (node_pointer* pp = boost::addressof(itb->next); *pp;
|
key_equal pred = this->key_eq();
|
||||||
pp = boost::addressof((*pp)->next)) {
|
for (node_pointer* pp = boost::addressof(itb->next); *pp;
|
||||||
if (pred(key, extractor::extract((*pp)->value()))) {
|
pp = boost::addressof((*pp)->next)) {
|
||||||
return pp;
|
if (pred(key, extractor::extract((*pp)->value()))) {
|
||||||
|
return pp;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
typedef node_pointer* node_pointer_pointer;
|
typedef node_pointer* node_pointer_pointer;
|
||||||
|
@ -2069,6 +2069,10 @@ namespace boost {
|
|||||||
template <class K, class T, class H, class P, class A>
|
template <class K, class T, class H, class P, class A>
|
||||||
float unordered_map<K, T, H, P, A>::load_factor() const BOOST_NOEXCEPT
|
float unordered_map<K, T, H, P, A>::load_factor() const BOOST_NOEXCEPT
|
||||||
{
|
{
|
||||||
|
if (table_.size_ == 0) {
|
||||||
|
return 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_ASSERT(table_.bucket_count() != 0);
|
BOOST_ASSERT(table_.bucket_count() != 0);
|
||||||
return static_cast<float>(table_.size_) /
|
return static_cast<float>(table_.size_) /
|
||||||
static_cast<float>(table_.bucket_count());
|
static_cast<float>(table_.bucket_count());
|
||||||
@ -2506,6 +2510,10 @@ namespace boost {
|
|||||||
template <class K, class T, class H, class P, class A>
|
template <class K, class T, class H, class P, class A>
|
||||||
float unordered_multimap<K, T, H, P, A>::load_factor() const BOOST_NOEXCEPT
|
float unordered_multimap<K, T, H, P, A>::load_factor() const BOOST_NOEXCEPT
|
||||||
{
|
{
|
||||||
|
if (table_.size_ == 0) {
|
||||||
|
return 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_ASSERT(table_.bucket_count() != 0);
|
BOOST_ASSERT(table_.bucket_count() != 0);
|
||||||
return static_cast<float>(table_.size_) /
|
return static_cast<float>(table_.size_) /
|
||||||
static_cast<float>(table_.bucket_count());
|
static_cast<float>(table_.bucket_count());
|
||||||
|
@ -1586,6 +1586,10 @@ namespace boost {
|
|||||||
template <class T, class H, class P, class A>
|
template <class T, class H, class P, class A>
|
||||||
float unordered_set<T, H, P, A>::load_factor() const BOOST_NOEXCEPT
|
float unordered_set<T, H, P, A>::load_factor() const BOOST_NOEXCEPT
|
||||||
{
|
{
|
||||||
|
if (table_.size_ == 0) {
|
||||||
|
return 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_ASSERT(table_.bucket_count() != 0);
|
BOOST_ASSERT(table_.bucket_count() != 0);
|
||||||
return static_cast<float>(table_.size_) /
|
return static_cast<float>(table_.size_) /
|
||||||
static_cast<float>(table_.bucket_count());
|
static_cast<float>(table_.bucket_count());
|
||||||
@ -1986,6 +1990,10 @@ namespace boost {
|
|||||||
template <class T, class H, class P, class A>
|
template <class T, class H, class P, class A>
|
||||||
float unordered_multiset<T, H, P, A>::load_factor() const BOOST_NOEXCEPT
|
float unordered_multiset<T, H, P, A>::load_factor() const BOOST_NOEXCEPT
|
||||||
{
|
{
|
||||||
|
if (table_.size_ == 0) {
|
||||||
|
return 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_ASSERT(table_.bucket_count() != 0);
|
BOOST_ASSERT(table_.bucket_count() != 0);
|
||||||
return static_cast<float>(table_.size_) /
|
return static_cast<float>(table_.size_) /
|
||||||
static_cast<float>(table_.bucket_count());
|
static_cast<float>(table_.bucket_count());
|
||||||
|
Reference in New Issue
Block a user