comparison src/luan/LuanMeta.java @ 775:1a68fc55a80c

simplify dir structure
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 26 Aug 2016 14:36:40 -0600
parents core/src/luan/LuanMeta.java@d9df6d6cb927
children
comparison
equal deleted inserted replaced
774:3e30cf310e56 775:1a68fc55a80c
1 package luan;
2
3 import java.util.Map;
4 import java.util.Iterator;
5 import java.util.Set;
6 import java.util.HashSet;
7
8
9 public abstract class LuanMeta {
10
11 public abstract Object __index(LuanState luan,LuanTable tbl,Object key) throws LuanException;
12
13 protected abstract Iterator keys(LuanTable tbl);
14
15 public LuanFunction __pairs(final LuanState luan,final LuanTable tbl) {
16 return new LuanFunction() {
17 final Iterator<Map.Entry<Object,Object>> iter1 = tbl.rawIterator();
18 final Iterator<Object> iter2 = keys(tbl);
19 final Set<Object> set = new HashSet<Object>();
20
21 @Override public Object[] call(LuanState luan,Object[] args) throws LuanException {
22 if( iter1.hasNext() ) {
23 Map.Entry<Object,Object> entry = iter1.next();
24 Object key = entry.getKey();
25 set.add(key);
26 return new Object[]{key,entry.getValue()};
27 }
28 while( iter2.hasNext() ) {
29 Object key = iter2.next();
30 if( set.add(key) ) {
31 Object value = __index(luan,tbl,key);
32 return new Object[]{key,value};
33 }
34 }
35 return LuanFunction.NOTHING;
36 }
37 };
38 }
39
40 public boolean canNewindex() {
41 return false;
42 }
43
44 public void __new_index(LuanState luan,LuanTable tbl,Object key,Object value) throws LuanException {
45 throw new UnsupportedOperationException();
46 }
47
48 protected abstract String type(LuanTable tbl);
49
50 public String __to_string(LuanState luan,LuanTable tbl) throws LuanException {
51 return type(tbl) + "-" + tbl.rawToString();
52 }
53
54 public LuanTable newMetatable() {
55 LuanTable mt = new LuanTable();
56 mt.rawPut( "__index", this );
57 mt.rawPut( "__pairs", this );
58 mt.rawPut( "__to_string", this );
59 if( canNewindex() )
60 mt.rawPut( "__new_index", this );
61 return mt;
62 }
63
64 public LuanTable newTable() {
65 LuanTable tbl = new LuanTable();
66 tbl.setMetatable( newMetatable() );
67 return tbl;
68 }
69 }