Преглед на файлове

[php] php.NativeString.iterator() and keyValueIterator()

Alexander Kuzmenko преди 6 години
родител
ревизия
14bc569448
променени са 2 файла, в които са добавени 61 реда и са изтрити 0 реда
  1. 42 0
      std/php/NativeString.hx
  2. 19 0
      tests/unit/src/unit/TestPhp.hx

+ 42 - 0
std/php/NativeString.hx

@@ -28,4 +28,46 @@ package php;
 
 	@:arrayAccess function get(key:Int):String;
 	@:arrayAccess function set(key:Int, val:String):String;
+
+	public inline function iterator() {
+		return new NativeStringIterator(this);
+	}
+
+	public inline function keyValueIterator() {
+		return new NativeStringKeyValueIterator(this);
+	}
+}
+
+class NativeStringIterator {
+	var s:NativeString;
+	var i:Int = 0;
+
+	public inline function new(s:NativeString) {
+		this.s = s;
+	}
+
+	public inline function hasNext():Bool {
+		return i < Global.strlen(s);
+	}
+
+	public inline function next():String {
+		return s[i++];
+	}
+}
+
+class NativeStringKeyValueIterator {
+	var s:NativeString;
+	var i:Int = 0;
+
+	public inline function new(s:NativeString) {
+		this.s = s;
+	}
+
+	public inline function hasNext():Bool {
+		return i < Global.strlen(s);
+	}
+
+	public inline function next():{key:Int, value:String} {
+		return {key:i, value:s[i++]};
+	}
 }

+ 19 - 0
tests/unit/src/unit/TestPhp.hx

@@ -226,6 +226,25 @@ class TestPhp extends Test
 		eq("unit\\Annotation", Syntax.nativeClassName(enm));
 	}
 
+	function testNativeString() {
+		var expected:php.NativeString = '123456';
+
+		var actual = '';
+		for(c in expected) {
+			actual += c;
+		}
+		eq(expected, actual);
+
+		var actual = '';
+		var keys = [];
+		for(i => c in expected) {
+			keys.push(i);
+			actual += c;
+		}
+		eq(expected, actual);
+		aeq([0, 1, 2, 3, 4, 5], keys);
+	}
+
 	function testNativeArray() {
 		var keys:Array<Dynamic> = ['hello', 12];
 		var values:Array<Dynamic> = [10, 'world'];