diff --git a/include/boost/unordered/detail/equivalent.hpp b/include/boost/unordered/detail/equivalent.hpp index 2e55bec7..c112b398 100644 --- a/include/boost/unordered/detail/equivalent.hpp +++ b/include/boost/unordered/detail/equivalent.hpp @@ -234,11 +234,9 @@ namespace boost { namespace unordered { namespace detail { Key const& k, Pred const& eq) const { - if (!this->size_) return iterator(); - std::size_t bucket_index = policy::to_bucket(this->bucket_count_, key_hash); - iterator n = this->get_start(bucket_index); + iterator n = this->begin(bucket_index); for (;;) { @@ -293,9 +291,8 @@ namespace boost { namespace unordered { namespace detail { bool equals(grouped_table_impl const& other) const { if(this->size_ != other.size_) return false; - if(!this->size_) return true; - for(iterator n1 = this->get_start(); n1.node_;) + for(iterator n1 = this->begin(); n1.node_;) { iterator n2 = other.find_matching_node(n1); if (!n2.node_) return false; diff --git a/include/boost/unordered/detail/table.hpp b/include/boost/unordered/detail/table.hpp index d80760f2..3713d063 100644 --- a/include/boost/unordered/detail/table.hpp +++ b/include/boost/unordered/detail/table.hpp @@ -222,6 +222,7 @@ namespace boost { namespace unordered { namespace detail { bucket_pointer get_bucket(std::size_t bucket_index) const { + BOOST_ASSERT(buckets_); return buckets_ + static_cast(bucket_index); } @@ -235,14 +236,15 @@ namespace boost { namespace unordered { namespace detail { return get_bucket(bucket_index)->next_; } - iterator get_start() const + iterator begin() const { - return iterator(static_cast( - get_previous_start()->next_)); + return size_ ? iterator(static_cast( + get_previous_start()->next_)) : iterator(); } - iterator get_start(std::size_t bucket_index) const + iterator begin(std::size_t bucket_index) const { + if (!size_) return iterator(); previous_pointer prev = get_previous_start(bucket_index); return prev ? iterator(static_cast(prev->next_)) : iterator(); @@ -257,8 +259,7 @@ namespace boost { namespace unordered { namespace detail { std::size_t bucket_size(std::size_t index) const { - if (!size_) return 0; - iterator it = get_start(index); + iterator it = begin(index); if (!it.node_) return 0; std::size_t count = 0; @@ -384,7 +385,7 @@ namespace boost { namespace unordered { namespace detail { if (x.size_) { create_buckets(bucket_count_); copy_nodes copy(node_alloc()); - table_impl::fill_buckets(x.get_start(), *this, copy); + table_impl::fill_buckets(x.begin(), *this, copy); } } @@ -526,7 +527,7 @@ namespace boost { namespace unordered { namespace detail { void delete_buckets() { if(buckets_) { - delete_nodes(get_start(), iterator()); + delete_nodes(begin(), iterator()); if (bucket::extra_node) { node_pointer n = static_cast( @@ -548,7 +549,7 @@ namespace boost { namespace unordered { namespace detail { { if(!size_) return; - delete_nodes(get_start(), iterator()); + delete_nodes(begin(), iterator()); get_previous_start()->next_ = link_pointer(); clear_buckets(); @@ -651,13 +652,6 @@ namespace boost { namespace unordered { namespace detail { } } - //////////////////////////////////////////////////////////////////////// - // Iterators - - iterator begin() const { - return !buckets_ ? iterator() : get_start(); - } - //////////////////////////////////////////////////////////////////////// // Assignment @@ -694,10 +688,7 @@ namespace boost { namespace unordered { namespace detail { // assigning to them if possible, and deleting any that are // left over. assign_nodes assign(*this); - - if (x.size_) { - table_impl::fill_buckets(x.get_start(), *this, assign); - } + table_impl::fill_buckets(x.begin(), *this, assign); } void assign(table const& x, true_type) @@ -725,7 +716,7 @@ namespace boost { namespace unordered { namespace detail { if (x.size_) { create_buckets(bucket_count_); copy_nodes copy(node_alloc()); - table_impl::fill_buckets(x.get_start(), *this, copy); + table_impl::fill_buckets(x.begin(), *this, copy); } } } diff --git a/include/boost/unordered/detail/unique.hpp b/include/boost/unordered/detail/unique.hpp index 59e44663..88056525 100644 --- a/include/boost/unordered/detail/unique.hpp +++ b/include/boost/unordered/detail/unique.hpp @@ -231,11 +231,9 @@ namespace boost { namespace unordered { namespace detail { Key const& k, Pred const& eq) const { - if (!this->size_) return iterator(); - std::size_t bucket_index = policy::to_bucket(this->bucket_count_, key_hash); - iterator n = this->get_start(bucket_index); + iterator n = this->begin(bucket_index); for (;;) { @@ -288,9 +286,8 @@ namespace boost { namespace unordered { namespace detail { bool equals(table_impl const& other) const { if(this->size_ != other.size_) return false; - if(!this->size_) return true; - for(iterator n1 = this->get_start(); n1.node_; ++n1) + for(iterator n1 = this->begin(); n1.node_; ++n1) { iterator n2 = other.find_matching_node(n1); diff --git a/include/boost/unordered/unordered_map.hpp b/include/boost/unordered/unordered_map.hpp index 66b2ab63..d6067395 100644 --- a/include/boost/unordered/unordered_map.hpp +++ b/include/boost/unordered/unordered_map.hpp @@ -469,16 +469,14 @@ namespace unordered local_iterator begin(size_type n) { - return table_.size_ ? local_iterator( - table_.get_start(n), n, table_.bucket_count_) : - local_iterator(); + return local_iterator( + table_.begin(n), n, table_.bucket_count_); } const_local_iterator begin(size_type n) const { - return table_.size_ ? const_local_iterator( - table_.get_start(n), n, table_.bucket_count_) : - const_local_iterator(); + return const_local_iterator( + table_.begin(n), n, table_.bucket_count_); } local_iterator end(size_type) @@ -493,9 +491,8 @@ namespace unordered const_local_iterator cbegin(size_type n) const { - return table_.size_ ? const_local_iterator( - table_.get_start(n), n, table_.bucket_count_) : - const_local_iterator(); + return const_local_iterator( + table_.begin(n), n, table_.bucket_count_); } const_local_iterator cend(size_type) const @@ -951,16 +948,14 @@ namespace unordered local_iterator begin(size_type n) { - return table_.size_ ? local_iterator( - table_.get_start(n), n, table_.bucket_count_) : - local_iterator(); + return local_iterator( + table_.begin(n), n, table_.bucket_count_); } const_local_iterator begin(size_type n) const { - return table_.size_ ? const_local_iterator( - table_.get_start(n), n, table_.bucket_count_) : - const_local_iterator(); + return const_local_iterator( + table_.begin(n), n, table_.bucket_count_); } local_iterator end(size_type) @@ -975,9 +970,8 @@ namespace unordered const_local_iterator cbegin(size_type n) const { - return table_.size_ ? const_local_iterator( - table_.get_start(n), n, table_.bucket_count_) : - const_local_iterator(); + return const_local_iterator( + table_.begin(n), n, table_.bucket_count_); } const_local_iterator cend(size_type) const diff --git a/include/boost/unordered/unordered_set.hpp b/include/boost/unordered/unordered_set.hpp index f1e97caf..92cb2f65 100644 --- a/include/boost/unordered/unordered_set.hpp +++ b/include/boost/unordered/unordered_set.hpp @@ -454,16 +454,14 @@ namespace unordered local_iterator begin(size_type n) { - return table_.size_ ? local_iterator( - table_.get_start(n), n, table_.bucket_count_) : - local_iterator(); + return local_iterator( + table_.begin(n), n, table_.bucket_count_); } const_local_iterator begin(size_type n) const { - return table_.size_ ? const_local_iterator( - table_.get_start(n), n, table_.bucket_count_) : - const_local_iterator(); + return const_local_iterator( + table_.begin(n), n, table_.bucket_count_); } local_iterator end(size_type) @@ -478,9 +476,8 @@ namespace unordered const_local_iterator cbegin(size_type n) const { - return table_.size_ ? const_local_iterator( - table_.get_start(n), n, table_.bucket_count_) : - const_local_iterator(); + return const_local_iterator( + table_.begin(n), n, table_.bucket_count_); } const_local_iterator cend(size_type) const @@ -926,16 +923,14 @@ namespace unordered local_iterator begin(size_type n) { - return table_.size_ ? local_iterator( - table_.get_start(n), n, table_.bucket_count_) : - local_iterator(); + return local_iterator( + table_.begin(n), n, table_.bucket_count_); } const_local_iterator begin(size_type n) const { - return table_.size_ ? const_local_iterator( - table_.get_start(n), n, table_.bucket_count_) : - const_local_iterator(); + return const_local_iterator( + table_.begin(n), n, table_.bucket_count_); } local_iterator end(size_type) @@ -950,9 +945,8 @@ namespace unordered const_local_iterator cbegin(size_type n) const { - return table_.size_ ? const_local_iterator( - table_.get_start(n), n, table_.bucket_count_) : - const_local_iterator(); + return const_local_iterator( + table_.begin(n), n, table_.bucket_count_); } const_local_iterator cend(size_type) const diff --git a/test/unordered/insert_tests.cpp b/test/unordered/insert_tests.cpp index c167e0ee..a136b9c1 100644 --- a/test/unordered/insert_tests.cpp +++ b/test/unordered/insert_tests.cpp @@ -276,6 +276,21 @@ void insert_tests2(X*, test::random_generator generator) test::check_equivalent_keys(x); } + + std::cerr<<"insert copy iterator range test 2.\n"; + + { + test::check_instances check_; + + X x; + + test::random_values v1(500, generator); + test::random_values v2(500, generator); + x.insert(test::copy_iterator(v1.begin()), test::copy_iterator(v1.end())); + x.insert(test::copy_iterator(v2.begin()), test::copy_iterator(v2.end())); + + test::check_equivalent_keys(x); + } } #if !defined(BOOST_NO_RVALUE_REFERENCES) && !defined(BOOST_NO_VARIADIC_TEMPLATES)