diff src/luan/LuanTable.java @ 77:4bf3d0c0b6b9

make LuanState cloneable git-svn-id: https://luan-java.googlecode.com/svn/trunk@78 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Fri, 15 Feb 2013 09:55:17 +0000
parents cd9dbd7477ca
children 9df729fa4419
line wrap: on
line diff
--- a/src/luan/LuanTable.java	Fri Feb 15 04:52:16 2013 +0000
+++ b/src/luan/LuanTable.java	Fri Feb 15 09:55:17 2013 +0000
@@ -13,7 +13,7 @@
 import java.util.IdentityHashMap;
 
 
-public class LuanTable {
+public class LuanTable implements DeepCloneable<LuanTable> {
 	private Map<Object,Object> map = null;
 	private List<Object> list = null;
 	private LuanTable metatable = null;
@@ -35,6 +35,27 @@
 		}
 	}
 
+	@Override public LuanTable shallowClone() {
+		return new LuanTable();
+	}
+
+	@Override public void deepenClone(LuanTable clone,DeepCloner cloner) {
+		if( map != null ) {
+			clone.map = new HashMap<Object,Object>();
+			for( Map.Entry<Object,Object> entry : map.entrySet() ) {
+				clone.map.put( cloner.get(entry.getKey()), cloner.get(entry.getValue()) );
+			}
+		}
+		if( list != null ) {
+			clone.list = new ArrayList<Object>();
+			for( Object obj : list ) {
+				clone.list.add( cloner.get(obj) );
+			}
+		}
+		if( metatable != null )
+			clone.metatable = cloner.deepClone(metatable);
+	}
+
 	public boolean isList() {
 		return map==null || map.isEmpty();
 	}