Mercurial Hosting > luan
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 } |