Mercurial Hosting > luan
diff src/luan/LuanCloner.java @ 782:655280eab1e2
start limited cloning
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 30 Aug 2016 01:29:33 -0600 |
parents | fbbdd369a13a |
children | 6a7c6879158d |
line wrap: on
line diff
--- a/src/luan/LuanCloner.java Mon Aug 29 22:49:32 2016 -0600 +++ b/src/luan/LuanCloner.java Tue Aug 30 01:29:33 2016 -0600 @@ -6,21 +6,26 @@ public final class LuanCloner { + public final boolean deep; private final Map cloned = new IdentityHashMap(); - public LuanCloneable deepClone(LuanCloneable obj) { + public LuanCloner(boolean deep) { + this.deep = deep; + } + + public LuanCloneable clone(LuanCloneable obj) { if( obj==null ) return null; LuanCloneable rtn = (LuanCloneable)cloned.get(obj); if( rtn == null ) { - rtn = obj.shallowClone(); + rtn = obj.shallowClone(this); cloned.put(obj,rtn); obj.deepenClone(rtn,this); } return rtn; } - public Object[] deepClone(Object[] obj) { + public Object[] clone(Object[] obj) { if( obj.length == 0 ) return obj; Object[] rtn = (Object[])cloned.get(obj); @@ -34,7 +39,7 @@ return rtn; } - public Map deepClone(Map obj) { + public Map clone(Map obj) { if( !obj.getClass().equals(HashMap.class) ) throw new RuntimeException("can only clone HashMap"); Map rtn = (Map)cloned.get(obj); @@ -50,11 +55,21 @@ public Object get(Object obj) { if( obj instanceof LuanCloneable ) - return deepClone((LuanCloneable)obj); + return clone((LuanCloneable)obj); if( obj instanceof Object[] ) - return deepClone((Object[])obj); + return clone((Object[])obj); if( obj instanceof Map ) - return deepClone((Map)obj); + return clone((Map)obj); return obj; } +/* + public Object check(Object obj) { + if( deep ) + throw new RuntimeException(); + if( !(obj instanceof LuanCloneable) ) + return obj; + LuanCloneable lc = (LuanCloneable)obj; + return lc.getCloner() == this ? lc : clone(lc); + } +*/ }