annotate core/src/luan/LuanMeta.java @ 428:df95199ca4c0

rename __newindex to __new_index
author Franklin Schmidt <fschmidt@gmail.com>
date Sat, 02 May 2015 20:10:31 -0600
parents dae264ad6a7b
children e3a6d9dbd694
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
405
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1 package luan;
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
2
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3 import java.util.Map;
413
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
4 import java.util.Iterator;
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
5 import java.util.Set;
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
6 import java.util.HashSet;
405
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
7
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
8
413
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
9 public abstract class LuanMeta {
405
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
10
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
11 public abstract Object __index(LuanState luan,LuanTable tbl,Object key) throws LuanException;
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
12
415
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
13 protected abstract Iterator keys(LuanTable tbl);
413
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
14
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
15 public LuanFunction __pairs(final LuanState luan,final LuanTable tbl) {
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
16 return new LuanFunction() {
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
17 final Iterator<Map.Entry<Object,Object>> iter1 = tbl.iterator();
415
ce8e19567911 make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents: 413
diff changeset
18 final Iterator<Object> iter2 = keys(tbl);
413
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
19 final Set<Object> set = new HashSet<Object>();
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
20
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
21 @Override public Object[] call(LuanState luan,Object[] args) throws LuanException {
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
22 if( iter1.hasNext() ) {
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
23 Map.Entry<Object,Object> entry = iter1.next();
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
24 Object key = entry.getKey();
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
25 set.add(key);
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
26 return new Object[]{key,entry.getValue()};
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
27 }
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
28 while( iter2.hasNext() ) {
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
29 Object key = iter2.next();
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
30 if( set.add(key) ) {
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
31 Object value = __index(luan,tbl,key);
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
32 return new Object[]{key,value};
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
33 }
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
34 }
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
35 return LuanFunction.NOTHING;
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
36 }
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
37 };
8937263f59f6 add __pairs;
Franklin Schmidt <fschmidt@gmail.com>
parents: 408
diff changeset
38 }
405
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
39
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
40 public boolean canNewindex() {
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
41 return false;
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
42 }
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
43
428
df95199ca4c0 rename __newindex to __new_index
Franklin Schmidt <fschmidt@gmail.com>
parents: 427
diff changeset
44 public void __new_index(LuanState luan,LuanTable tbl,Object key,Object value) throws LuanException {
405
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
45 throw new UnsupportedOperationException();
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
46 }
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
47
416
91af5337b9ae add LuanMeta.__tostring()
Franklin Schmidt <fschmidt@gmail.com>
parents: 415
diff changeset
48 protected abstract String type(LuanTable tbl);
91af5337b9ae add LuanMeta.__tostring()
Franklin Schmidt <fschmidt@gmail.com>
parents: 415
diff changeset
49
91af5337b9ae add LuanMeta.__tostring()
Franklin Schmidt <fschmidt@gmail.com>
parents: 415
diff changeset
50 public String __tostring(LuanState luan,LuanTable tbl) throws LuanException {
91af5337b9ae add LuanMeta.__tostring()
Franklin Schmidt <fschmidt@gmail.com>
parents: 415
diff changeset
51 return type(tbl) + "-" + tbl;
91af5337b9ae add LuanMeta.__tostring()
Franklin Schmidt <fschmidt@gmail.com>
parents: 415
diff changeset
52 }
91af5337b9ae add LuanMeta.__tostring()
Franklin Schmidt <fschmidt@gmail.com>
parents: 415
diff changeset
53
405
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
54 public LuanTable newMetatable() {
408
1b38de2b1845 merge LuanTableImpl into LuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
55 LuanTable mt = new LuanTable();
427
dae264ad6a7b fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 416
diff changeset
56 mt.rawPut( "__index", this );
dae264ad6a7b fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 416
diff changeset
57 mt.rawPut( "__pairs", this );
dae264ad6a7b fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents: 416
diff changeset
58 mt.rawPut( "__tostring", this );
405
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
59 if( canNewindex() )
428
df95199ca4c0 rename __newindex to __new_index
Franklin Schmidt <fschmidt@gmail.com>
parents: 427
diff changeset
60 mt.rawPut( "__new_index", this );
405
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
61 return mt;
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
62 }
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
63
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
64 public LuanTable newTable() {
408
1b38de2b1845 merge LuanTableImpl into LuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents: 405
diff changeset
65 LuanTable tbl = new LuanTable();
405
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
66 tbl.setMetatable( newMetatable() );
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
67 return tbl;
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
68 }
3e68917a0dc6 add LuanMeta
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
69 }