forked from boostorg/unordered
Unordered: Check that reserve works for both range and single element insert.
[SVN r78369]
This commit is contained in:
@ -535,7 +535,7 @@ namespace boost { namespace unordered { namespace detail {
|
|||||||
a.construct_node();
|
a.construct_node();
|
||||||
a.construct_value2(*i);
|
a.construct_value2(*i);
|
||||||
|
|
||||||
if(this->size_ + 1 >= this->max_load_)
|
if(this->size_ + 1 > this->max_load_)
|
||||||
this->reserve_for_insert(this->size_ +
|
this->reserve_for_insert(this->size_ +
|
||||||
boost::unordered::detail::insert_size(i, j));
|
boost::unordered::detail::insert_size(i, j));
|
||||||
|
|
||||||
|
@ -101,7 +101,44 @@ void rehash_test1(X* = 0,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class X>
|
template <class X>
|
||||||
void reserve_test(X* = 0,
|
void reserve_test1(X* = 0,
|
||||||
|
test::random_generator generator = test::default_generator)
|
||||||
|
{
|
||||||
|
for (int random_mlf = 0; random_mlf < 2; ++random_mlf)
|
||||||
|
{
|
||||||
|
for (int i = 1; i < 2000; i += i < 50 ? 1 : 13)
|
||||||
|
{
|
||||||
|
test::random_values<X> v(i, generator);
|
||||||
|
|
||||||
|
test::ordered<X> tracker;
|
||||||
|
tracker.insert_range(v.begin(), v.end());
|
||||||
|
|
||||||
|
X x;
|
||||||
|
x.max_load_factor(random_mlf ?
|
||||||
|
static_cast<float>(std::rand() % 1000) / 500.0f + 0.5f : 1.0f);
|
||||||
|
|
||||||
|
// For the current standard this should reserve i+1, I've
|
||||||
|
// submitted a defect report and will assume it's a defect
|
||||||
|
// for now.
|
||||||
|
x.reserve(i);
|
||||||
|
|
||||||
|
// Insert an element before the range insert, otherwise there are
|
||||||
|
// no iterators to invalidate in the range insert, and it can
|
||||||
|
// rehash.
|
||||||
|
typename test::random_values<X>::iterator it = v.begin();
|
||||||
|
x.insert(*it);
|
||||||
|
++it;
|
||||||
|
|
||||||
|
std::size_t bucket_count = x.bucket_count();
|
||||||
|
x.insert(it, v.end());
|
||||||
|
BOOST_TEST(bucket_count == x.bucket_count());
|
||||||
|
tracker.compare(x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class X>
|
||||||
|
void reserve_test2(X* = 0,
|
||||||
test::random_generator generator = test::default_generator)
|
test::random_generator generator = test::default_generator)
|
||||||
{
|
{
|
||||||
for (int random_mlf = 0; random_mlf < 2; ++random_mlf)
|
for (int random_mlf = 0; random_mlf < 2; ++random_mlf)
|
||||||
@ -115,13 +152,17 @@ void reserve_test(X* = 0,
|
|||||||
|
|
||||||
X x;
|
X x;
|
||||||
x.max_load_factor(random_mlf ?
|
x.max_load_factor(random_mlf ?
|
||||||
static_cast<float>(std::rand() % 1000) / 500.0 + 0.5f : 1.0f);
|
static_cast<float>(std::rand() % 1000) / 500.0f + 0.5f : 1.0f);
|
||||||
// For the current standard this should reserve i+1, I've
|
|
||||||
// submitted a defect report and will assume it's a defect
|
|
||||||
// for now.
|
|
||||||
x.reserve(i);
|
x.reserve(i);
|
||||||
std::size_t bucket_count = x.bucket_count();
|
std::size_t bucket_count = x.bucket_count();
|
||||||
x.insert(v.begin(), v.end());
|
|
||||||
|
for (typename test::random_values<X>::iterator it = v.begin();
|
||||||
|
it != v.end(); ++it)
|
||||||
|
{
|
||||||
|
x.insert(*it);
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_TEST(bucket_count == x.bucket_count());
|
BOOST_TEST(bucket_count == x.bucket_count());
|
||||||
tracker.compare(x);
|
tracker.compare(x);
|
||||||
}
|
}
|
||||||
@ -145,7 +186,10 @@ UNORDERED_TEST(rehash_empty_test3,
|
|||||||
UNORDERED_TEST(rehash_test1,
|
UNORDERED_TEST(rehash_test1,
|
||||||
((int_set_ptr)(int_multiset_ptr)(int_map_ptr)(int_multimap_ptr))
|
((int_set_ptr)(int_multiset_ptr)(int_map_ptr)(int_multimap_ptr))
|
||||||
)
|
)
|
||||||
UNORDERED_TEST(reserve_test,
|
UNORDERED_TEST(reserve_test1,
|
||||||
|
((int_set_ptr)(int_multiset_ptr)(int_map_ptr)(int_multimap_ptr))
|
||||||
|
)
|
||||||
|
UNORDERED_TEST(reserve_test2,
|
||||||
((int_set_ptr)(int_multiset_ptr)(int_map_ptr)(int_multimap_ptr))
|
((int_set_ptr)(int_multiset_ptr)(int_map_ptr)(int_multimap_ptr))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user