Răsfoiți Sursa

neko now uses __id__ for ObjectMap keys

Simon Krajewski 12 ani în urmă
părinte
comite
28dd080984
2 a modificat fișierele cu 27 adăugiri și 9 ștergeri
  1. 1 1
      std/haxe/Serializer.hx
  2. 26 8
      std/neko/_std/haxe/ds/ObjectMap.hx

+ 1 - 1
std/haxe/Serializer.hx

@@ -313,7 +313,7 @@ class Serializer {
 				buf.add("M");
 				var v : haxe.ds.ObjectMap<Dynamic,Dynamic> = v;
 				for ( k in v.keys() ) {
-					#if (js || flash8)
+					#if (js || flash8 || neko)
 					var id = Reflect.field(k, "__id__");
 					Reflect.deleteField(k, "__id__");
 					serialize(k);

+ 26 - 8
std/neko/_std/haxe/ds/ObjectMap.hx

@@ -22,33 +22,51 @@
 package haxe.ds;
 
 @:coreApi
-class ObjectMap<K,V> {
+class ObjectMap<K:{},V> {
 
+	static var count = 0;
+	
+	static inline function assignId(obj: { } ):Int {
+		var newId = count++;
+		untyped obj.__id__ = newId;
+		return newId;
+	}
+	
+	static inline function getId(obj: { } ):Int {
+		return untyped obj.__id__;
+	}
+	
 	var h : { };
+	var k : { };
 	
 	public function new(weakKeys:Bool = false) : Void {
 		h = untyped __dollar__hnew(0);
+		k = untyped __dollar__hnew(0);
 	}
 
-	public inline function set( key : K, value : V ) : Void {
-		untyped __dollar__hset(h,key,value,null);
+	public inline function set( key : K, value : V ) : Void untyped {
+		var id = key.__id__ != null ? key.__id__ : assignId(key);
+		untyped __dollar__hset(h,id,value,null);
+		untyped __dollar__hset(k,id,key,null);
 	}
 
 	public function get( key : K ) : Null<V> {
-		return untyped __dollar__hget(h,key,null);
+		return untyped __dollar__hget(h,getId(key),null);
 	}
 
 	public inline function exists( key : K ) : Bool {
-		return untyped __dollar__hmem(h,key,null);
+		return untyped __dollar__hmem(h,getId(key),null);
 	}
 
-	public inline function remove( key : K ) : Bool {
-		return untyped __dollar__hremove(h,key,null);
+	public function remove( key : K ) : Bool {
+		var id = getId(key);
+		untyped __dollar__hremove(h,id,null);
+		return untyped __dollar__hremove(k,id,null);
 	}
 
 	public function keys() : Iterator<K> {
 		var l = new List<K>();
-		untyped __dollar__hiter(h,function(k,_) { l.push(k); });
+		untyped __dollar__hiter(k,function(_,v) { l.push(v); });
 		return l.iterator();
 	}