From 3522342c0ba70ac4768291596eb735889faf9992 Mon Sep 17 00:00:00 2001 From: Lucas Bajolet Date: Mon, 24 Mar 2014 13:01:20 -0400 Subject: [PATCH] stdlib/strings: Added reverse iterators on char views for Strings. Signed-off-by: Lucas Bajolet --- lib/standard/string.nit | 90 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/lib/standard/string.nit b/lib/standard/string.nit index 524d4d4..f33bc0b 100644 --- a/lib/standard/string.nit +++ b/lib/standard/string.nit @@ -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 -- 1.7.9.5