stdlib/strings: Added reverse iterators on char views for Strings.
authorLucas Bajolet <r4pass@hotmail.com>
Mon, 24 Mar 2014 17:01:20 +0000 (13:01 -0400)
committerLucas Bajolet <r4pass@hotmail.com>
Mon, 24 Mar 2014 17:01:20 +0000 (13:01 -0400)
Signed-off-by: Lucas Bajolet <r4pass@hotmail.com>

lib/standard/string.nit

index 524d4d4..f33bc0b 100644 (file)
@@ -380,8 +380,42 @@ abstract class StringCharView
 
        redef fun iterator: IndexedIterator[Char] do return self.iterator_from(0)
 
+       # Gets a new Iterator starting at position `pos`
+       #
+       # Ex :
+       #       var iter = "abcd".iterator_from(2)
+       #       while iter.is_ok do
+       #               printn iter.item
+       #               iter.next
+       #       end
+       #
+       # Outputs : cd
        fun iterator_from(pos: Int): IndexedIterator[Char] is abstract
 
+       # Gets an iterator starting at the end and going backwards
+       #
+       # Ex :
+       #       var reviter = "now step live...".reverse_iterator
+       #       while reviter.is_ok do
+       #               printn reviter.item
+       #               reviter.next
+       #       end
+       #
+       # Outputs : ...evil pets won
+       fun reverse_iterator: IndexedIterator[Char] do return self.reverse_iterator_from(self.length - 1)
+
+       # Gets an iterator on the chars of self starting from `pos`
+       #
+       # Ex :
+       #       var iter = "abcd".reverse_iterator_from(1)
+       #       while iter.is_ok do
+       #               printn iter.item
+       #               iter.next
+       #       end
+       #
+       # Outputs : ba
+       fun reverse_iterator_from(pos: Int): IndexedIterator[Char] is abstract
+
        redef fun has(c: Char): Bool
        do
                for i in self do
@@ -711,6 +745,32 @@ class String
        end
 end
 
+private class FlatStringReverseIterator
+       super IndexedIterator[Char]
+
+       var target: String
+
+       var target_items: NativeString
+
+       var curr_pos: Int
+
+       init with_pos(tgt: String, pos: Int)
+       do
+               target = tgt
+               target_items = tgt.items
+               curr_pos = pos + tgt.index_from
+       end
+
+       redef fun is_ok do return curr_pos >= 0
+
+       redef fun item do return target_items[curr_pos]
+
+       redef fun next do curr_pos -= 1
+
+       redef fun index do return curr_pos - target.index_from
+
+end
+
 private class FlatStringIterator
        super IndexedIterator[Char]
 
@@ -753,6 +813,8 @@ private class FlatStringCharView
 
        redef fun iterator_from(start) do return new FlatStringIterator.with_pos(target, start)
 
+       redef fun reverse_iterator_from(start) do return new FlatStringReverseIterator.with_pos(target, start)
+
 end
 
 # Mutable strings of characters.
@@ -882,6 +944,32 @@ class Buffer
        readable private var _capacity: Int
 end
 
+private class FlatBufferReverseIterator
+       super IndexedIterator[Char]
+
+       var target: Buffer
+
+       var target_items: NativeString
+
+       var curr_pos: Int
+
+       init with_pos(tgt: Buffer, pos: Int)
+       do
+               target = tgt
+               target_items = tgt.items
+               curr_pos = pos
+       end
+
+       redef fun index do return curr_pos
+
+       redef fun is_ok do return curr_pos >= 0
+
+       redef fun item do return target_items[curr_pos]
+
+       redef fun next do curr_pos -= 1
+
+end
+
 private class FlatBufferCharView
        super BufferCharView
        super StringCapable
@@ -924,6 +1012,8 @@ private class FlatBufferCharView
 
        redef fun iterator_from(pos) do return new FlatBufferIterator.with_pos(target, pos)
 
+       redef fun reverse_iterator_from(pos) do return new FlatBufferReverseIterator.with_pos(target, pos)
+
 end
 
 private class FlatBufferIterator