comparison src/luan/LuanTable.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
comparison
equal deleted inserted replaced
781:fbbdd369a13a 782:655280eab1e2
16 public final class LuanTable implements LuanCloneable { 16 public final class LuanTable implements LuanCloneable {
17 private Map map = null; 17 private Map map = null;
18 private List list = null; 18 private List list = null;
19 private LuanTable metatable = null; 19 private LuanTable metatable = null;
20 public LuanJava java; 20 public LuanJava java;
21 private LuanCloner cloner;
22
23 private LuanTable(LuanCloner cloner) {
24 this.cloner = cloner;
25 }
21 26
22 public LuanTable() {} 27 public LuanTable() {}
23 28
24 public LuanTable(List list) { 29 public LuanTable(List list) {
25 int n = list.size(); 30 int n = list.size();
53 if( tbl.rawLength() > 0 ) 58 if( tbl.rawLength() > 0 )
54 this.list = new ArrayList<Object>(tbl.list); 59 this.list = new ArrayList<Object>(tbl.list);
55 this.metatable = tbl.metatable; 60 this.metatable = tbl.metatable;
56 } 61 }
57 62
58 @Override public LuanTable shallowClone() { 63 @Override public LuanTable shallowClone(LuanCloner cloner) {
59 return new LuanTable(); 64 return new LuanTable(cloner.deep ? null : cloner);
60 } 65 }
61 66
62 @Override public void deepenClone(LuanCloneable dc,LuanCloner cloner) { 67 @Override public void deepenClone(LuanCloneable dc,LuanCloner cloner) {
63 LuanTable clone = (LuanTable)dc; 68 LuanTable clone = (LuanTable)dc;
64 if( map != null ) { 69 if( map != null ) {
65 clone.map = newMap(); 70 clone.map = newMap();
66 for( Object stupid : map.entrySet() ) { 71 for( Object stupid : map.entrySet() ) {
67 Map.Entry entry = (Map.Entry)stupid; 72 Map.Entry entry = (Map.Entry)stupid;
68 clone.map.put( cloner.get(entry.getKey()), cloner.get(entry.getValue()) ); 73 Object val = entry.getValue();
74 if( cloner.deep || !(val instanceof LuanTable) )
75 val = cloner.get(val);
76 clone.map.put( cloner.get(entry.getKey()), val );
69 } 77 }
70 } 78 }
71 if( list != null ) { 79 if( list != null ) {
72 clone.list = new ArrayList<Object>(); 80 clone.list = new ArrayList<Object>();
73 for( Object obj : list ) { 81 for( Object obj : list ) {
74 clone.list.add( cloner.get(obj) ); 82 if( cloner.deep || !(obj instanceof LuanTable) )
75 } 83 obj = cloner.get(obj);
76 } 84 clone.list.add(obj);
77 if( metatable != null ) 85 }
78 clone.metatable = (LuanTable)cloner.get(metatable); 86 }
79 clone.java = (LuanJava)cloner.deepClone(java); 87 clone.metatable = (LuanTable)cloner.clone(metatable);
88 clone.java = (LuanJava)cloner.clone(java);
80 } 89 }
81 90
82 public boolean isList() { 91 public boolean isList() {
83 return map==null || map.isEmpty(); 92 return map==null || map.isEmpty();
84 } 93 }
396 } 405 }
397 }; 406 };
398 } 407 }
399 408
400 public LuanTable rawSubList(int from,int to) { 409 public LuanTable rawSubList(int from,int to) {
401 LuanTable tbl = shallowClone(); 410 LuanTable tbl = new LuanTable(cloner);
402 tbl.list = new ArrayList<Object>(list().subList(from-1,to-1)); 411 tbl.list = new ArrayList<Object>(list().subList(from-1,to-1));
403 return tbl; 412 return tbl;
404 } 413 }
405 414
406 public LuanTable getMetatable() { 415 public LuanTable getMetatable() {