libs/collection: implements `reverse_iterator` in Array and List
authorJean Privat <jean@pryen.org>
Fri, 4 Apr 2014 15:30:19 +0000 (11:30 -0400)
committerJean Privat <jean@pryen.org>
Fri, 4 Apr 2014 18:16:09 +0000 (14:16 -0400)
Signed-off-by: Jean Privat <jean@pryen.org>

lib/standard/collection/array.nit
lib/standard/collection/list.nit

index 36e878b..22da04e 100644 (file)
@@ -131,6 +131,7 @@ abstract class AbstractArrayRead[E]
        end
 
        redef fun iterator: ArrayIterator[E] do return new ArrayIterator[E](self)
+       redef fun reverse_iterator do return new ArrayReverseIterator[E](self)
 end
 
 # Resizable one dimension array of objects.
@@ -364,6 +365,20 @@ private class ArrayIterator[E]
        var _array: AbstractArrayRead[E]
 end
 
+private class ArrayReverseIterator[E]
+       super ArrayIterator[E]
+
+       redef fun is_ok do return _index >= 0
+
+       redef fun next do _index -= 1
+
+       init(a: AbstractArrayRead[E])
+       do
+               _array = a
+               _index = a.length - 1
+       end
+end
+
 # Others collections ##########################################################
 
 # A set implemented with an Array.
index c9a7155..0c5ce5f 100644 (file)
@@ -201,6 +201,7 @@ class List[E]
 
 
        redef fun iterator: ListIterator[E] do return new ListIterator[E](self)
+       redef fun reverse_iterator: ListIterator[E] do return new ListReverseIterator[E](self)
 
        # Build an empty list.
        init do end
@@ -315,6 +316,23 @@ class ListIterator[E]
        end
 end
 
+private class ListReverseIterator[E]
+       super ListIterator[E]
+
+       redef fun next
+       do
+               _node = _node.prev
+               _index -= 1
+       end
+
+       private init(list: List[E])
+       do
+               _list = list
+               _node = list._tail
+               _index = list.length
+       end
+end
+
 # Linked nodes that constitute a linked list.
 private class ListNode[E]
        super Container[E]