Mercurial Hosting > luan
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() { |