Quellcode durchsuchen

Updating to use namespace for joining_iterator, make_end_aware_iterator, and default constructor for end().

Samuel Jaffe vor 8 Jahren
Ursprung
Commit
32dbd25536
2 geänderte Dateien mit 26 neuen und 22 gelöschten Zeilen
  1. 13 11
      bucket_hash_map.hpp
  2. 13 11
      bucket_hash_set.hpp

+ 13 - 11
bucket_hash_map.hpp

@@ -38,8 +38,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::iterator;
   using local_const_iterator = typename bucket_type::const_iterator;
   
@@ -77,12 +79,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) {
@@ -94,7 +96,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;
@@ -221,9 +223,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()} };
     }
   }
   
@@ -235,7 +237,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) {
@@ -243,7 +245,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};

+ 13 - 11
bucket_hash_set.hpp

@@ -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};