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);
+	}
+*/
 }