Pārlūkot izejas kodu

support arrays in EnumValueMap (closes #1905)

Simon Krajewski 12 gadi atpakaļ
vecāks
revīzija
05e3114526

+ 13 - 5
std/haxe/ds/EnumValueMap.hx

@@ -30,7 +30,7 @@ package haxe.ds;
 **/
 class EnumValueMap<K:EnumValue, V> extends haxe.ds.BalancedTree<K, V> implements Map.IMap<K,V> {
 	
-	override function compare(k1:EnumValue, k2:EnumValue) {
+	override function compare(k1:EnumValue, k2:EnumValue):Int {
 		var d = k1.getIndex() - k2.getIndex();
 		if (d != 0) return d;
 		var p1 = k1.getParameters();
@@ -39,15 +39,23 @@ class EnumValueMap<K:EnumValue, V> extends haxe.ds.BalancedTree<K, V> implements
 		return compareArgs(p1, p2);
 	}
 	
-	function compareArgs(a1:Array<Dynamic>, a2:Array<Dynamic>) {
+	function compareArgs(a1:Array<Dynamic>, a2:Array<Dynamic>):Int {
 		var ld = a1.length - a2.length;
 		if (ld != 0) return ld;
 		for (i in 0...a1.length) {
-			var v1:Dynamic = a1[i], v2:Dynamic = a2[i];
-			var d = if (Reflect.isEnumValue(v1) && Reflect.isEnumValue(v2)) compare(v1, v2);
-			else Reflect.compare(v1, v2);
+			var d = compareArg(a1[i], a2[i]);
 			if (d != 0) return d;
 		}
 		return 0;
 	}
+	
+	function compareArg(v1:Dynamic, v2:Dynamic):Int {
+		return if (Reflect.isEnumValue(v1) && Reflect.isEnumValue(v2)) {
+			compare(v1, v2);
+		} else if (Std.is(v1, Array) && Std.is(v2, Array)) {
+			compareArgs(v1, v2);
+		} else {
+			Reflect.compare(v1, v2);
+		}
+	}
 }

+ 1 - 0
tests/unit/TestSpecification.hx

@@ -119,6 +119,7 @@ enum EVMTest {
 	EVMC(s:String, ?i:Int);
 	EVMD(n:EVMTest);
 	EVME(?n:EVMTest);
+	EVMF(a:Array<EVMTest>);
 }
 
 #if !macro

+ 7 - 1
tests/unit/unitstd/haxe/ds/EnumValueMap.unit.hx

@@ -89,4 +89,10 @@ evm.set(EVME(null),99);
 evm.exists(EVME(null)) == true;
 evm.exists(EVME()) == true;
 evm.get(EVME(null)) == 99;
-evm.get(EVME()) == 99;
+evm.get(EVME()) == 99;
+
+evm.set(EVMF([EVMA, EVMB()]), 12);
+evm.exists(EVMF([EVMA, EVMB()])) == true;
+evm.exists(EVMF([EVMA, EVMB(null)])) == true;
+evm.get(EVMF([EVMA, EVMB()])) == 12;
+evm.get(EVMF([EVMA, EVMB(null)])) == 12;