diff --git a/example/node_iterator2.hpp b/example/node_iterator2.hpp index 22c9bf2..15b40aa 100755 --- a/example/node_iterator2.hpp +++ b/example/node_iterator2.hpp @@ -5,7 +5,7 @@ # define NODE_ITERATOR2_DWA2004110_HPP # include "node.hpp" -# include +# include # ifndef BOOST_NO_SFINAE # include @@ -14,26 +14,21 @@ template class node_iter - : public boost::iterator_adaptor< - node_iter // Derived - , Value* // Base - , boost::use_default // Value - , boost::forward_traversal_tag // CategoryOrTraversal + : public boost::iterator_facade< + node_iter + , Value + , boost::forward_traversal_tag > { private: struct enabler {}; // a private type avoids misuse - typedef boost::iterator_adaptor< - node_iter, Value*, boost::use_default, boost::forward_traversal_tag - > super_t; - public: node_iter() - : super_t(0) {} + : m_node(0) {} explicit node_iter(Value* p) - : super_t(p) {} + : m_node(p) {} template node_iter( @@ -47,9 +42,29 @@ class node_iter ) : m_node(other.m_node) {} - private: + +# if !BOOST_WORKAROUND(__GNUC__, == 2) + private: // GCC2 can't even grant that friendship to template member functions +# endif friend class boost::iterator_core_access; + + template + bool equal(node_iter const& other) const + { + return this->m_node == other.m_node; + } + + private: void increment() { m_node = m_node->next(); } + + Value& dereference() const { return *m_node; } + +# ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS + public: +# else + template friend class node_iter; +# endif + Value* m_node; }; typedef node_iter node_iterator; diff --git a/example/node_iterator3.hpp b/example/node_iterator3.hpp index ec632b0..12e7652 100755 --- a/example/node_iterator3.hpp +++ b/example/node_iterator3.hpp @@ -45,7 +45,7 @@ class node_iter >::type = enabler() # endif ) - : m_node(other.m_node) {} + : super_t(other.base()) {} private: friend class boost::iterator_core_access;