comparison core/src/luan/LuanTableImpl.java @ 406:9321a33b9b1c

remove AbstractLuanTable
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 29 Apr 2015 11:24:00 -0600
parents 5e0acdeaea93
children
comparison
equal deleted inserted replaced
405:3e68917a0dc6 406:9321a33b9b1c
2 2
3 import java.util.Iterator; 3 import java.util.Iterator;
4 import java.util.ListIterator; 4 import java.util.ListIterator;
5 import java.util.Map; 5 import java.util.Map;
6 import java.util.AbstractMap; 6 import java.util.AbstractMap;
7 import java.util.LinkedHashMap;
7 import java.util.List; 8 import java.util.List;
8 import java.util.ArrayList; 9 import java.util.ArrayList;
9 import java.util.Collections; 10 import java.util.Collections;
10 import java.util.Comparator; 11 import java.util.Comparator;
11 import java.util.Set; 12 import java.util.Set;
12 import java.util.HashSet; 13 import java.util.HashSet;
13 import java.util.IdentityHashMap; 14 import java.util.IdentityHashMap;
14 import java.util.regex.Pattern; 15 import java.util.regex.Pattern;
15 16
16 17
17 class LuanTableImpl extends AbstractLuanTable implements LuanTable, DeepCloneable<LuanTableImpl> { 18 class LuanTableImpl implements LuanTable, LuanRepr, DeepCloneable<LuanTableImpl> {
18 private Map<Object,Object> map = null; 19 private Map<Object,Object> map = null;
19 private List<Object> list = null; 20 private List<Object> list = null;
20 private LuanTable metatable = null; 21 private LuanTable metatable = null;
21 private boolean hasJava = false; 22 private boolean hasJava = false;
22 23
79 80
80 @Override public List<Object> asList() { 81 @Override public List<Object> asList() {
81 return list!=null ? list : Collections.emptyList(); 82 return list!=null ? list : Collections.emptyList();
82 } 83 }
83 84
84 @Override protected Map<Object,Object> map() { 85 protected Map<Object,Object> map() {
85 return map!=null ? map : Collections.emptyMap(); 86 return map!=null ? map : Collections.emptyMap();
86 } 87 }
87 /* 88 /*
88 @Override public boolean isSet() { 89 @Override public boolean isSet() {
89 if( list != null ) { 90 if( list != null ) {
109 rtn.add(i); 110 rtn.add(i);
110 } 111 }
111 return rtn; 112 return rtn;
112 } 113 }
113 */ 114 */
114 @Override protected String type() { 115 protected String type() {
115 return "table"; 116 return "table";
116 } 117 }
117 118
118 @Override public Object get(Object key) { 119 @Override public Object get(Object key) {
119 if( list != null ) { 120 if( list != null ) {
288 } 289 }
289 290
290 @Override public void setJava() { 291 @Override public void setJava() {
291 hasJava = true; 292 hasJava = true;
292 } 293 }
294
295
296 // from AbstractLuanTable
297
298 protected final Map<Object,Object> newMap() {
299 return new LinkedHashMap<Object,Object>();
300 }
301
302 @Override public boolean isEmpty() {
303 return isList() && length()==0;
304 }
305
306 @Override public boolean isSet() {
307 for( Map.Entry<Object,Object> entry : this ) {
308 if( !entry.getValue().equals(Boolean.TRUE) )
309 return false;
310 }
311 return true;
312 }
313
314 @Override public Set<Object> asSet() {
315 Set<Object> set = new HashSet<Object>();
316 for( Map.Entry<Object,Object> entry : this ) {
317 set.add(entry.getKey());
318 }
319 return set;
320 }
321
322 @Override public Map<Object,Object> asMap() {
323 Map<Object,Object> map = newMap();
324 for( Map.Entry<Object,Object> entry : this ) {
325 map.put(entry.getKey(),entry.getValue());
326 }
327 return map;
328 }
329
330 @Override public LuanTable cloneTable() {
331 return isList() ? new LuanTableImpl(new ArrayList<Object>(asList())) : new LuanTableImpl(asMap());
332 }
333
334 @Override public String repr() {
335 return repr( Collections.newSetFromMap(new IdentityHashMap<LuanTableImpl,Boolean>()) );
336 }
337
338 private String repr(Set<LuanTableImpl> set) {
339 if( !set.add(this) ) {
340 return "\"<circular reference>\"";
341 }
342 StringBuilder sb = new StringBuilder();
343 sb.append('{');
344 boolean isFirst = true;
345 for( Object obj : asList() ) {
346 if( isFirst ) {
347 isFirst = false;
348 } else {
349 sb.append(", ");
350 }
351 sb.append(repr(set,obj));
352 }
353 for( Map.Entry<Object,Object> entry : map().entrySet() ) {
354 if( isFirst ) {
355 isFirst = false;
356 } else {
357 sb.append(", ");
358 }
359 sb.append(reprKey(set,entry.getKey())).append('=').append(repr(set,entry.getValue()));
360 }
361 sb.append('}');
362 return sb.toString();
363 }
364
365 private static final Pattern namePtn = Pattern.compile("[a-zA-Z_][a-zA-Z_0-9]*");
366
367 private String reprKey(Set<LuanTableImpl> set,Object obj) {
368 if( obj instanceof String ) {
369 String s = (String)obj;
370 if( namePtn.matcher(s).matches() )
371 return s;
372 }
373 return "[" + repr(set,obj) + "]";
374 }
375
376 String repr(Set<LuanTableImpl> set,Object obj) {
377 if( obj instanceof LuanTableImpl ) {
378 LuanTableImpl t = (LuanTableImpl)obj;
379 return t.repr(set);
380 } else {
381 String s = Luan.repr(obj);
382 if( s == null )
383 s = "<couldn't repr: " + Luan.stringEncode(Luan.toString(obj)) + ">";
384 return s;
385 }
386 }
387
293 } 388 }