$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: chintanraoh_at_[hidden]
Date: 2008-06-19 13:50:02
Author: chintanraoh
Date: 2008-06-19 13:50:02 EDT (Thu, 19 Jun 2008)
New Revision: 46528
URL: http://svn.boost.org/trac/boost/changeset/46528
Log:
reverse_iterator
Text files modified: 
   sandbox/SOC/2008/digital_searching/dsearch/boost/dsearch/patricia_iterator.hpp |    85 ++++++++++++++++++++++++++++++++++++--- 
   1 files changed, 78 insertions(+), 7 deletions(-)
Modified: sandbox/SOC/2008/digital_searching/dsearch/boost/dsearch/patricia_iterator.hpp
==============================================================================
--- sandbox/SOC/2008/digital_searching/dsearch/boost/dsearch/patricia_iterator.hpp	(original)
+++ sandbox/SOC/2008/digital_searching/dsearch/boost/dsearch/patricia_iterator.hpp	2008-06-19 13:50:02 EDT (Thu, 19 Jun 2008)
@@ -6,11 +6,12 @@
 
 namespace boost{
 namespace dsearch{
-template<class Value_type, class Node_type, class Alloc=std::allocator<char> >
+template<class Value_type, class Node_type, class Alloc>
 class patricia_iterator
 :public iterator_facade< patricia_iterator<Value_type,Node_type, Alloc>, 
 Value_type, bidirectional_traversal_tag >
 {
+	protected:
         struct enabler {};
         friend class boost::iterator_core_access;
         Node_type *cur;
@@ -36,14 +37,17 @@
 
         void decrement()
         {
-		while(cur && ( cur->left==next || cur->left==0 ) )
-		{
-			next=cur;
-			cur=cur->par;
-		}
-
                 if(cur)
+		{
+			while(cur && ( cur->left==next || cur->left==0 ) )
+			{
+				next=cur;
+				cur=cur->par;
+			}
+			if(cur==0)
+				return;
                         next=cur->left;
+		}
                 else
                 {
                         cur=next;
@@ -70,8 +74,10 @@
                                 enabler >::type = enabler()
         ) const
         {
+		
                 if ( cur == other.cur && next == other.next )
                         return true;
+		//std::cout<<"In equal"<<next->value.first << "!=" << other.next->value.first<<std::endl;
                 return false;
         }
 
@@ -114,8 +120,73 @@
                                     ) : cur(other.cur),next(other.next)
         {
         }
+	
+	patricia_iterator (Node_type* found,Node_type *prev):
+	cur(prev),next(found)
+	{
+	}
 };
+
+template<class Value_type, class Node_type, class Alloc >
+class patricia_reverse_iterator:
+public patricia_iterator<Value_type, Node_type, Alloc>
+{
+	typedef patricia_iterator<Value_type, Node_type, Alloc> forward_type;
+	private:
+	struct enabler {};
+	void decrement()
+	{
+		forward_type::increment();
+	}
         
+	void increment()
+	{
+		forward_type::decrement();
+	}
+	
+	template<class V,class N,class A>
+	bool equal(patricia_reverse_iterator<V,N,A> const &other,
+	typename enable_if< is_convertible<V*,Value_type*>, 
+				enabler >::type = enabler()
+	) const
+	{
+		if ( forward_type::cur == other.cur && forward_type::next == other.next )
+			return true;
+		return false;
+	}
+	
+	Value_type &dereference() const
+	{
+		return forward_type::dereference();
+	}
+	public:
+	patricia_reverse_iterator(): forward_type()
+	{
+	}
+	patricia_reverse_iterator(Node_type *found,Node_type*prev)
+	: forward_type(found,prev)
+	{
+	}
+	
+	patricia_reverse_iterator(Node_type *root,bool start) 
+	{
+		forward_type::cur=0;
+		forward_type::next=root;
+		if(start)
+		{
+			decrement();
+		}
+	}
+	template<class V,class N,class A>
+	patricia_reverse_iterator ( patricia_reverse_iterator<V,N,A> const& other,
+				typename enable_if< is_convertible<V*,Value_type*>, 
+				enabler >::type = enabler()
+		    		) 
+	: forward_type(other.next,other.cur)
+	{
+	}
+};
+
 }
 }
 #endif //BOOST_DSEARCH_PATRICIA_ITERATOR_HPP