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