Format imported Cloner code
This commit is contained in:
@@ -1,53 +1,54 @@
|
|||||||
package kiss.cloner;
|
package kiss.cloner;
|
||||||
|
|
||||||
import Array;
|
import Array;
|
||||||
import haxe.ds.ObjectMap;
|
import haxe.ds.ObjectMap;
|
||||||
import Type.ValueType;
|
import Type.ValueType;
|
||||||
import haxe.ds.IntMap;
|
import haxe.ds.IntMap;
|
||||||
import haxe.ds.StringMap;
|
import haxe.ds.StringMap;
|
||||||
class Cloner {
|
|
||||||
|
|
||||||
var cache:ObjectMap<Dynamic,Dynamic>;
|
class Cloner {
|
||||||
var classHandles:Map<String,Dynamic->Dynamic>;
|
var cache:ObjectMap<Dynamic, Dynamic>;
|
||||||
|
var classHandles:Map<String, Dynamic->Dynamic>;
|
||||||
var stringMapCloner:MapCloner<String>;
|
var stringMapCloner:MapCloner<String>;
|
||||||
var intMapCloner:MapCloner<Int>;
|
var intMapCloner:MapCloner<Int>;
|
||||||
|
|
||||||
public function new():Void {
|
public function new():Void {
|
||||||
stringMapCloner = new MapCloner(this,StringMap);
|
stringMapCloner = new MapCloner(this, StringMap);
|
||||||
intMapCloner = new MapCloner(this,IntMap);
|
intMapCloner = new MapCloner(this, IntMap);
|
||||||
classHandles = new Map<String,Dynamic->Dynamic>();
|
classHandles = new Map<String, Dynamic->Dynamic>();
|
||||||
classHandles.set('String',returnString);
|
classHandles.set('String', returnString);
|
||||||
classHandles.set('Array',cloneArray);
|
classHandles.set('Array', cloneArray);
|
||||||
classHandles.set('haxe.ds.StringMap',stringMapCloner.clone);
|
classHandles.set('haxe.ds.StringMap', stringMapCloner.clone);
|
||||||
classHandles.set('haxe.ds.IntMap',intMapCloner.clone);
|
classHandles.set('haxe.ds.IntMap', intMapCloner.clone);
|
||||||
}
|
}
|
||||||
|
|
||||||
function returnString(v:String):String {
|
function returnString(v:String):String {
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function clone <T> (v:T):T {
|
public function clone<T>(v:T):T {
|
||||||
cache = new ObjectMap<Dynamic,Dynamic>();
|
cache = new ObjectMap<Dynamic, Dynamic>();
|
||||||
var outcome:T = _clone(v);
|
var outcome:T = _clone(v);
|
||||||
cache = null;
|
cache = null;
|
||||||
return outcome;
|
return outcome;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function _clone <T> (v:T):T {
|
public function _clone<T>(v:T):T {
|
||||||
#if js
|
#if js
|
||||||
if(Std.is(v, String))
|
if (Std.is(v, String))
|
||||||
return v;
|
return v;
|
||||||
#end
|
#end
|
||||||
|
|
||||||
#if neko
|
#if neko
|
||||||
try {
|
try {
|
||||||
if(Type.getClassName(cast v) != null)
|
if (Type.getClassName(cast v) != null)
|
||||||
return v;
|
return v;
|
||||||
}catch(e:Dynamic) {}
|
} catch (e:Dynamic) {}
|
||||||
#else
|
#else
|
||||||
if(Type.getClassName(cast v) != null)
|
if (Type.getClassName(cast v) != null)
|
||||||
return v;
|
return v;
|
||||||
#end
|
#end
|
||||||
switch(Type.typeof(v)){
|
switch (Type.typeof(v)) {
|
||||||
case TNull:
|
case TNull:
|
||||||
return null;
|
return null;
|
||||||
case TInt:
|
case TInt:
|
||||||
@@ -61,8 +62,8 @@ class Cloner {
|
|||||||
case TFunction:
|
case TFunction:
|
||||||
return v;
|
return v;
|
||||||
case TClass(c):
|
case TClass(c):
|
||||||
if(!cache.exists(v))
|
if (!cache.exists(v))
|
||||||
cache.set(v,handleClass(c, v));
|
cache.set(v, handleClass(c, v));
|
||||||
return cache.get(v);
|
return cache.get(v);
|
||||||
case TEnum(e):
|
case TEnum(e):
|
||||||
return v;
|
return v;
|
||||||
@@ -71,7 +72,7 @@ class Cloner {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleAnonymous (v:Dynamic):Dynamic {
|
function handleAnonymous(v:Dynamic):Dynamic {
|
||||||
var properties:Array<String> = Reflect.fields(v);
|
var properties:Array<String> = Reflect.fields(v);
|
||||||
var anonymous:Dynamic = {};
|
var anonymous:Dynamic = {};
|
||||||
for (i in 0...properties.length) {
|
for (i in 0...properties.length) {
|
||||||
@@ -81,21 +82,21 @@ class Cloner {
|
|||||||
return anonymous;
|
return anonymous;
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleClass <T> (c:Class<T>,inValue:T):T {
|
function handleClass<T>(c:Class<T>, inValue:T):T {
|
||||||
var handle:T->T = classHandles.get(Type.getClassName(c));
|
var handle:T->T = classHandles.get(Type.getClassName(c));
|
||||||
if(handle == null)
|
if (handle == null)
|
||||||
handle = cloneClass;
|
handle = cloneClass;
|
||||||
return handle(inValue);
|
return handle(inValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
function cloneArray <T> (inValue:Array<T>):Array<T> {
|
function cloneArray<T>(inValue:Array<T>):Array<T> {
|
||||||
var array:Array<T> = inValue.copy();
|
var array:Array<T> = inValue.copy();
|
||||||
for (i in 0...array.length)
|
for (i in 0...array.length)
|
||||||
array[i] = _clone(array[i]);
|
array[i] = _clone(array[i]);
|
||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
function cloneClass <T> (inValue:T):T {
|
function cloneClass<T>(inValue:T):T {
|
||||||
var classValue = Type.getClass(inValue);
|
var classValue = Type.getClass(inValue);
|
||||||
var outValue:T = Type.createEmptyInstance(classValue);
|
var outValue:T = Type.createEmptyInstance(classValue);
|
||||||
var fields:Array<String> = Type.getInstanceFields(classValue);
|
var fields:Array<String> = Type.getInstanceFields(classValue);
|
||||||
@@ -111,5 +112,4 @@ class Cloner {
|
|||||||
}
|
}
|
||||||
return outValue;
|
return outValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@@ -1,22 +1,23 @@
|
|||||||
package kiss.cloner;
|
package kiss.cloner;
|
||||||
|
|
||||||
import haxe.Constraints.IMap;
|
import haxe.Constraints.IMap;
|
||||||
import kiss.cloner.Cloner;
|
import kiss.cloner.Cloner;
|
||||||
import Type.ValueType;
|
import Type.ValueType;
|
||||||
class MapCloner<K>{
|
|
||||||
|
|
||||||
|
class MapCloner<K> {
|
||||||
var cloner:Cloner;
|
var cloner:Cloner;
|
||||||
var type:Class<IMap<K,Dynamic>>;
|
var type:Class<IMap<K, Dynamic>>;
|
||||||
var noArgs:Array<Dynamic>;
|
var noArgs:Array<Dynamic>;
|
||||||
|
|
||||||
public function new(cloner:Cloner, type:Class<IMap<K,Dynamic>>):Void {
|
public function new(cloner:Cloner, type:Class<IMap<K, Dynamic>>):Void {
|
||||||
this.cloner = cloner;
|
this.cloner = cloner;
|
||||||
this.type = type;
|
this.type = type;
|
||||||
noArgs = [];
|
noArgs = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function clone <K,Dynamic> (inValue:IMap<K,Dynamic>):IMap<K,Dynamic> {
|
public function clone<K, Dynamic>(inValue:IMap<K, Dynamic>):IMap<K, Dynamic> {
|
||||||
var inMap:IMap<K,Dynamic> = inValue;
|
var inMap:IMap<K, Dynamic> = inValue;
|
||||||
var map:IMap<K,Dynamic> = cast Type.createInstance(type, noArgs);
|
var map:IMap<K, Dynamic> = cast Type.createInstance(type, noArgs);
|
||||||
for (key in inMap.keys()) {
|
for (key in inMap.keys()) {
|
||||||
map.set(key, cloner._clone(inMap.get(key)));
|
map.set(key, cloner._clone(inMap.get(key)));
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user