소스 검색

Removing redundant V param to trie_{,reverse_}iterator template list, as this did not add anything other than risk or more template errors.

Samuel Jaffe 8 년 전
부모
커밋
462c8234ca
2개의 변경된 파일24개의 추가작업 그리고 26개의 파일을 삭제
  1. 8 8
      trie.hpp
  2. 16 18
      trie_iterator.hpp

+ 8 - 8
trie.hpp

@@ -15,9 +15,9 @@
 template <typename K, typename V, typename Compare = std::less<K>>
 class trie;
 
-template <typename Trie, typename V, typename Iter>
+template <typename Trie, typename Iter>
 class trie_iterator;
-template <typename Trie, typename V, typename Iter>
+template <typename Trie, typename Iter>
 class trie_reverse_iterator;
 
 template <typename K, typename V, typename Compare>
@@ -39,12 +39,12 @@ public:
   using local_reverse_iterator = typename backing_t::reverse_iterator;
   using local_const_reverse_iterator = typename backing_t::const_reverse_iterator;
   
-  using iterator = trie_iterator<self_t, mapped_type, local_iterator>;
-  using const_iterator = trie_iterator<self_t const, mapped_type const, local_const_iterator>;
-  using post_iterator = trie_iterator<self_t, mapped_type, local_reverse_iterator>;
-  using const_post_iterator = trie_iterator<self_t const, mapped_type const, local_const_reverse_iterator>;
-  using reverse_iterator = trie_reverse_iterator<self_t, mapped_type, local_reverse_iterator>;
-  using const_reverse_iterator = trie_reverse_iterator<self_t const, mapped_type const,  local_const_reverse_iterator>;
+  using iterator = trie_iterator<self_t, local_iterator>;
+  using const_iterator = trie_iterator<self_t const, local_const_iterator>;
+  using post_iterator = trie_iterator<self_t, local_reverse_iterator>;
+  using const_post_iterator = trie_iterator<self_t const, local_const_reverse_iterator>;
+  using reverse_iterator = trie_reverse_iterator<self_t, local_reverse_iterator>;
+  using const_reverse_iterator = trie_reverse_iterator<self_t const,  local_const_reverse_iterator>;
 public:
   trie() = default;
   trie(mapped_type const & value);

+ 16 - 18
trie_iterator.hpp

@@ -29,14 +29,18 @@ namespace detail {
     }
   };
   
-  template <typename Trie, typename V, typename Iter>
+  template <typename Trie, typename Iter>
   class trie_iterator_base {
   protected:
     using impl_t = ::iterator::end_aware_iterator<Iter>;
+    std::stack<Trie *> stk;
+    std::list<typename Trie::key_type> keys;
+    std::stack<impl_t> iters;
+    bool done{false};
   public:
     trie_iterator_base() : done{true} {}
     trie_iterator_base(Trie * tr) { stk.push(tr); }
-    V & operator*() const { return *stk.top(); }
+    auto operator*() const -> decltype(this->stk.top()->value()) { return *stk.top(); }
   protected:
     bool poping_empty() {
       if (iters.top().done()) {
@@ -70,22 +74,16 @@ namespace detail {
       else if ( lhs.done != rhs.done ) return false;
       else return *lhs == *rhs;
     }
-  protected:
-    friend Trie;
-    std::stack<Trie *> stk;
-    std::list<typename Trie::key_type> keys;
-    std::stack<impl_t> iters;
-    bool done{false};
   };
 }
 
-template <typename Trie, typename V, typename Iter>
-class trie_iterator : public detail::trie_iterator_base<Trie, V, Iter> {
+template <typename Trie, typename Iter>
+class trie_iterator : public detail::trie_iterator_base<Trie, Iter> {
 private:
-  using super = detail::trie_iterator_base<Trie, V, Iter>;
+  using super = detail::trie_iterator_base<Trie, Iter>;
 public:
-  using value_type = V;
-  using reference = value_type &;
+  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;
@@ -110,13 +108,13 @@ private:
   friend Trie;
 };
 
-template <typename Trie, typename V, typename Iter>
-class trie_reverse_iterator : public detail::trie_iterator_base<Trie, V, Iter> {
+template <typename Trie, typename Iter>
+class trie_reverse_iterator : public detail::trie_iterator_base<Trie, Iter> {
 private:
-  using super = detail::trie_iterator_base<Trie, V, Iter>;
+  using super = detail::trie_iterator_base<Trie, Iter>;
 public:
-  using value_type = V;
-  using reference = value_type &;
+  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;