From 1d6ad30876d1bc8eb30c3087bbce2252155d0864 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Fri, 4 Apr 2014 11:30:19 -0400 Subject: [PATCH] libs/collection: implements `reverse_iterator` in Array and List Signed-off-by: Jean Privat --- lib/standard/collection/array.nit | 15 +++++++++++++++ lib/standard/collection/list.nit | 18 ++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/lib/standard/collection/array.nit b/lib/standard/collection/array.nit index 36e878b..22da04e 100644 --- a/lib/standard/collection/array.nit +++ b/lib/standard/collection/array.nit @@ -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. diff --git a/lib/standard/collection/list.nit b/lib/standard/collection/list.nit index c9a7155..0c5ce5f 100644 --- a/lib/standard/collection/list.nit +++ b/lib/standard/collection/list.nit @@ -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] -- 1.7.9.5