|
|
@@ -37,8 +37,10 @@ public: // typedefs
|
|
|
using bucket_type = std::list<value_type>;
|
|
|
using impl_type = std::vector<bucket_type>;
|
|
|
|
|
|
- using iterator = joining_iterator<typename impl_type::iterator>;
|
|
|
- using const_iterator = joining_iterator<typename impl_type::const_iterator>;
|
|
|
+ template <typename It>
|
|
|
+ using iter_wrap = iterator::joining_iterator<It>;
|
|
|
+ using iterator = iter_wrap<typename impl_type::iterator>;
|
|
|
+ using const_iterator = iter_wrap<typename impl_type::const_iterator>;
|
|
|
using local_iterator = typename bucket_type::const_iterator;
|
|
|
using local_const_iterator = typename bucket_type::const_iterator;
|
|
|
|
|
|
@@ -76,12 +78,12 @@ public:
|
|
|
size_type size() const { return size_; }
|
|
|
|
|
|
// Iterators
|
|
|
- iterator begin() { return { buckets_.begin(), buckets_.end() }; }
|
|
|
+ iterator begin() { return make_end_aware_iterator(buckets_); }
|
|
|
const_iterator begin() const { return cbegin(); }
|
|
|
- const_iterator cbegin() const { return { buckets_.begin(), buckets_.end() }; }
|
|
|
- iterator end() { return { buckets_.end(), buckets_.end() }; }
|
|
|
+ const_iterator cbegin() const { return make_end_aware_iterator(buckets_); }
|
|
|
+ iterator end() { return iterator{}; }
|
|
|
const_iterator end() const { return cend(); }
|
|
|
- const_iterator cend() const { return { buckets_.end(), buckets_.end() }; }
|
|
|
+ const_iterator cend() const { return const_iterator{}; }
|
|
|
|
|
|
// Create
|
|
|
std::pair<iterator, bool> insert(value_type const & vt) {
|
|
|
@@ -93,7 +95,7 @@ public:
|
|
|
++size_;
|
|
|
lookup.second = lookup.first->insert(end, vt);
|
|
|
}
|
|
|
- return { {lookup.first, buckets_.end(), lookup.second, end}, create };
|
|
|
+ return { {{lookup.first, buckets_.end()}, {lookup.second, end}}, create };
|
|
|
}
|
|
|
iterator insert(const_iterator, value_type const & vt) {
|
|
|
return insert(vt).first;
|
|
|
@@ -199,9 +201,9 @@ private:
|
|
|
Iterator find_impl(Bucket & bkt, key_type const & key) const {
|
|
|
auto lookup = lookup_impl(bkt, key);
|
|
|
if (lookup.second == lookup.first->end()) {
|
|
|
- return { bkt.end(), bkt.end() };
|
|
|
+ return Iterator{};
|
|
|
} else {
|
|
|
- return { lookup.first, bkt.end(), lookup.second, lookup.first->end() };
|
|
|
+ return { {lookup.first, bkt.end()}, {lookup.second, lookup.first->end()} };
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -213,7 +215,7 @@ private:
|
|
|
auto nit = buckets_.begin();
|
|
|
std::advance(nit, std::distance(buckets_.cbegin(), lit.current()));
|
|
|
|
|
|
- return { nit, buckets_.end(), nit->erase(iter.current(), iter.current()), nit->end() };
|
|
|
+ return { {nit, buckets_.end()}, {nit->erase(iter.current(), iter.current()), nit->end()} };
|
|
|
}
|
|
|
|
|
|
iterator erase_impl(iterator it) {
|
|
|
@@ -221,7 +223,7 @@ private:
|
|
|
auto l = it.element_iterator();
|
|
|
if ( b.done() || l.done() ) { return it; }
|
|
|
--size_;
|
|
|
- return { b.current(), b.end(), b->erase(l.current()), l.end(), true };
|
|
|
+ return { {b.current(), b.end()}, {b->erase(l.current()), l.end()}, true };
|
|
|
}
|
|
|
private: // members
|
|
|
impl_type buckets_{default_buckets};
|