Mercurial Hosting > luan
diff core/src/luan/DeepCloner.java @ 433:c6bcb8859b93
make LuanState.registry a Map;
remove generics from DeepCloneable;
add Map support to DeepCloner;
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sun, 03 May 2015 15:45:39 -0600 |
parents | 24ede40ee0aa |
children |
line wrap: on
line diff
--- a/core/src/luan/DeepCloner.java Sat May 02 23:41:59 2015 -0600 +++ b/core/src/luan/DeepCloner.java Sun May 03 15:45:39 2015 -0600 @@ -1,17 +1,17 @@ package luan; import java.util.Map; +import java.util.HashMap; import java.util.IdentityHashMap; public final class DeepCloner { - private final Map<Object,Object> cloned = new IdentityHashMap<Object,Object>(); + private final Map cloned = new IdentityHashMap(); - public <T extends DeepCloneable<T>> T deepClone(T obj) { + public DeepCloneable deepClone(DeepCloneable obj) { if( obj==null ) return null; - @SuppressWarnings("unchecked") - T rtn = (T)cloned.get(obj); + DeepCloneable rtn = (DeepCloneable)cloned.get(obj); if( rtn == null ) { rtn = obj.shallowClone(); cloned.put(obj,rtn); @@ -20,28 +20,41 @@ return rtn; } - public <T> T[] deepClone(T[] obj) { + public Object[] deepClone(Object[] obj) { if( obj.length == 0 ) return obj; - @SuppressWarnings("unchecked") - T[] rtn = (T[])cloned.get(obj); + Object[] rtn = (Object[])cloned.get(obj); if( rtn == null ) { rtn = obj.clone(); cloned.put(obj,rtn); for( int i=0; i<rtn.length; i++ ) { - @SuppressWarnings("unchecked") - T t = get(rtn[i]); - rtn[i] = t; + rtn[i] = get(rtn[i]); } } return rtn; } - public <T> T get(T obj) { - if( !(obj instanceof DeepCloneable) ) - return obj; - @SuppressWarnings("unchecked") - T dc = (T)deepClone((DeepCloneable)obj); - return dc; + public Map deepClone(Map obj) { + if( !obj.getClass().equals(HashMap.class) ) + throw new RuntimeException("can only clone HashMap"); + Map rtn = (Map)cloned.get(obj); + if( rtn == null ) { + rtn = new HashMap(); + for( Object stupid : obj.entrySet() ) { + Map.Entry entry = (Map.Entry)stupid; + rtn.put( get(entry.getKey()), get(entry.getValue()) ); + } + } + return rtn; + } + + public Object get(Object obj) { + if( obj instanceof DeepCloneable ) + return deepClone((DeepCloneable)obj); + if( obj instanceof Object[] ) + return deepClone((Object[])obj); + if( obj instanceof Map ) + return deepClone((Map)obj); + return obj; } }