Quellcode durchsuchen

[js] inline StringMap iterators (#9702)

Dan Korostelev vor 5 Jahren
Ursprung
Commit
271b369b62
1 geänderte Dateien mit 70 neuen und 28 gelöschten Zeilen
  1. 70 28
      std/js/_std/haxe/ds/StringMap.hx

+ 70 - 28
std/js/_std/haxe/ds/StringMap.hx

@@ -55,15 +55,15 @@ import haxe.DynamicAccess;
 	}
 
 	public inline function keys():Iterator<String> {
-		return keysIterator(h);
+		return new StringMapKeyIterator(h);
 	}
 
 	public inline function iterator():Iterator<T> {
-		return valueIterator(h);
+		return new StringMapValueIterator(h);
 	}
 
 	public inline function keyValueIterator():KeyValueIterator<String, T> {
-		return kvIterator(h);
+		return new StringMapKeyValueIterator(h);
 	}
 
 	public inline function copy():StringMap<T> {
@@ -79,31 +79,6 @@ import haxe.DynamicAccess;
 	}
 
 	// impl
-
-	static function keysIterator(h:Dynamic):Iterator<String> {
-		var keys = Object.keys(h), len = keys.length, idx = 0;
-		return {
-			hasNext: () -> idx < len,
-			next: () -> keys[idx++]
-		};
-	}
-
-	static function valueIterator<T>(h:Dynamic):Iterator<T> {
-		var keys = Object.keys(h), len = keys.length, idx = 0;
-		return {
-			hasNext: () -> idx < len,
-			next: () -> h[cast keys[idx++]]
-		};
-	}
-
-	static function kvIterator<T>(h:Dynamic):KeyValueIterator<String, T> {
-		var keys = Object.keys(h), len = keys.length, idx = 0;
-		return {
-			hasNext: () -> idx < len,
-			next: () -> {var k = keys[idx++]; {key: k, value: h[cast k]}}
-		};
-	}
-
 	static function createCopy<T>(h:Dynamic):StringMap<T> {
 		var copy = new StringMap();
 		js.Syntax.code("for (var key in {0}) {1}[key] = {0}[key]", h, copy.h);
@@ -120,6 +95,73 @@ import haxe.DynamicAccess;
 		return s + "}";
 	}
 }
+
+private class StringMapKeyIterator {
+	final h:Dynamic;
+	final keys:Array<String>;
+	final length:Int;
+	var current:Int;
+
+	public inline function new(h:Dynamic) {
+		this.h = h;
+		keys = Object.keys(h);
+		length = keys.length;
+		current = 0;
+	}
+
+	public inline function hasNext():Bool {
+		return current < length;
+	}
+
+	public inline function next():String {
+		return keys[current++];
+	}
+}
+
+private class StringMapValueIterator<T> {
+	final h:Dynamic;
+	final keys:Array<String>;
+	final length:Int;
+	var current:Int;
+
+	public inline function new(h:Dynamic) {
+		this.h = h;
+		keys = Object.keys(h);
+		length = keys.length;
+		current = 0;
+	}
+
+	public inline function hasNext():Bool {
+		return current < length;
+	}
+
+	public inline function next():T {
+		return h[cast keys[current++]];
+	}
+}
+
+private class StringMapKeyValueIterator<T> {
+	final h:Dynamic;
+	final keys:Array<String>;
+	final length:Int;
+	var current:Int;
+
+	public inline function new(h:Dynamic) {
+		this.h = h;
+		keys = Object.keys(h);
+		length = keys.length;
+		current = 0;
+	}
+
+	public inline function hasNext():Bool {
+		return current < length;
+	}
+
+	public inline function next():{key:String, value:T} {
+		var key = keys[current++];
+		return {key: key, value: h[cast key]};
+	}
+}
 #else
 private class StringMapIterator<T> {
 	var map:StringMap<T>;