Browse Source

Cleaning some things up. Fixing bugs in typedefs, etc.

Samuel Jaffe 8 years ago
parent
commit
d162ccfb5b
3 changed files with 29 additions and 30 deletions
  1. 7 3
      trie.hpp
  2. 6 13
      trie_impl.hpp
  3. 16 14
      trie_iterator.hpp

+ 7 - 3
trie.hpp

@@ -54,7 +54,7 @@ public:
   using const_reverse_iterator = trie_reverse_iterator<self_t const, local_const_reverse_iterator>;
 private:
   using impl_iterator = detail::trie_iterator_base<self_t, local_iterator>;
-  using impl_const_iterator = detail::trie_iterator_base<self_t, local_const_iterator>;
+  using impl_const_iterator = detail::trie_iterator_base<self_t const, local_const_iterator>;
 public:
   trie() {}
   trie(trie const & other);
@@ -170,12 +170,16 @@ private:
     auto it1 = lhs.begin(), it2 = rhs.begin(), end1 = lhs.end(), end2 = lhs.end();
     for ( ; it1 != end1 && it2 != end2; ++it1, ++it2 ) {
       if (!it1.keys.empty() && !it2.keys.empty() && it1.keys.back() != it2.keys.back()) { return false; }
-      else if (it1.stk.top()->value_ != it2.stk.top()->value_) { return false; }
+      else if (it1.root().value_ != it2.root().value_) { return false; }
     }
     return it1 == end1 && it2 == end2;
   }
   
-  friend void swap(trie & lhs, trie & rhs);
+  friend void swap(trie & lhs, trie & rhs) {
+    using std::swap;
+    swap(lhs.value_, rhs.value_);
+    swap(lhs.impl_, rhs.impl_);
+  }
   
   mapped_type value_{};
   backing_t impl_{};

+ 6 - 13
trie_impl.hpp

@@ -19,7 +19,7 @@ trie<K, V, C>::trie(trie const & other) : value_(other.value_) {
   impl_iterator current{this};
   for (const_iterator it = ++const_iterator{&other}, end = {}; it != end; ++it) {
     while (current.keys.size() >= it.keys.size()) { current.pop(); }
-    auto tmp = current.stk.top()->insert(it.keys.back(), *it).first;
+    auto tmp = current.root().insert(it.keys.back(), *it).first;
     current.push(tmp.iters.top());
   }
 }
@@ -66,10 +66,10 @@ auto trie<K, V, C>::emplace_impl(KS && keys, Args &&... args) -> std::pair<impl_
   impl_iterator it{this};
   bool create{false};
   for ( auto && key : keys ) {
-    it.stk.top()->insert_impl(it, create, std::forward<decltype(key)>(key));
+    it.root().insert_impl(it, create, std::forward<decltype(key)>(key));
   }
   if (create) {
-    it.stk.top()->value_ = { std::forward<Args>(args)... };
+    it.root().value_ = { std::forward<Args>(args)... };
   }
   return { std::move(it) , create };
 }
@@ -91,11 +91,11 @@ void trie<K, V, C>::clear() {
 template <typename K, typename V, typename C>
 void trie<K, V, C>::drop(iterator it) {
   if (it == end()) return;
-  it.stk.top()->clear();
+  it.root().clear();
   if (!it.iters.empty()) {
     auto to_erase = it.iters.top().current();
     it.pop();
-    it.stk.top()->impl_.erase(to_erase);
+    it.root().impl_.erase(to_erase);
   }
 }
 
@@ -104,7 +104,7 @@ namespace detail {
   Iter find_impl(Trie * tr, KS const & keys) {
     Iter rval{tr};
     for (auto & key : keys) {
-      auto & top = rval.stk.top()->impl_;
+      auto & top = rval.root().impl_;
       auto it = top.find(key), end = top.end();
       if ( it == end ) { return {}; }
       rval.push({it, end});
@@ -112,10 +112,3 @@ namespace detail {
     return rval;
   }
 }
-
-template <typename K, typename V, typename C>
-void swap(trie<K, V, C> & lhs, trie<K, V, C> & rhs) {
-  using std::swap;
-  swap(lhs.value_, rhs.value_);
-  swap(lhs.impl_, rhs.impl_);
-}

+ 16 - 14
trie_iterator.hpp

@@ -10,6 +10,7 @@
 #include "trie.hpp"
 
 #include "iterator/end_aware_iterator.hpp"
+#include <list>
 #include <stack>
 
 namespace detail {
@@ -38,10 +39,23 @@ namespace detail {
     std::list<typename Trie::key_type> keys;
     std::stack<impl_t> iters;
     bool done{false};
+  public:
+    using reference = decltype(std::declval<Trie>().value());
+    using value_type = std::remove_reference_t<reference>;
+    using pointer = value_type *;
+    using difference_type = std::ptrdiff_t;
+    using iterator_category = std::forward_iterator_tag;
   public:
     trie_iterator_base() : done{true} {}
     trie_iterator_base(Trie * tr) { stk.push(tr); }
-    auto operator*() const -> decltype(this->stk.top()->value()) { return *stk.top(); }
+    auto operator*() const -> reference { return root(); }
+    auto operator->() const -> pointer { return std::addressof(operator*()); }
+    Trie & root() const { return *stk.top(); }
+    trie_iterator_base parent() const {
+      trie_iterator_base tmp{*this};
+      tmp.pop();
+      return tmp;
+    }
   protected:
     void push(impl_t it) {
       iters.push(it);
@@ -65,7 +79,7 @@ namespace detail {
     }
     bool can_recurse() { return !next().done(); }
     void recurse() { push(next()); }
-    impl_t next() { return helper()(*stk.top()); }
+    impl_t next() { return helper()(root()); }
     friend bool operator!=(trie_iterator_base const & lhs, trie_iterator_base const & rhs) {
       return !(lhs == rhs);
     }
@@ -85,12 +99,6 @@ template <typename Trie, typename Iter>
 class trie_iterator : public detail::trie_iterator_base<Trie, Iter> {
 private:
   using super = detail::trie_iterator_base<Trie, Iter>;
-public:
-  using reference = decltype(*(std::declval<super>()));
-  using value_type = std::remove_reference_t<reference>;
-  using pointer = value_type *;
-  using difference_type = std::ptrdiff_t;
-  using iterator_category = std::forward_iterator_tag;
 public:
   trie_iterator() : super() {}
   trie_iterator(Trie * tr) : super(tr) { }
@@ -117,12 +125,6 @@ template <typename Trie, typename Iter>
 class trie_reverse_iterator : public detail::trie_iterator_base<Trie, Iter> {
 private:
   using super = detail::trie_iterator_base<Trie, Iter>;
-public:
-  using reference = decltype(*(std::declval<super>()));
-  using value_type = std::remove_reference_t<reference>;
-  using pointer = value_type *;
-  using difference_type = std::ptrdiff_t;
-  using iterator_category = std::forward_iterator_tag;
 public:
   trie_reverse_iterator() : super() {}
   trie_reverse_iterator(Trie * tr) : super(tr) {