Mercurial Hosting > luan
annotate core/src/luan/LuanMeta.java @ 557:6268c1ce6ea8
sane queryparser update
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sun, 21 Jun 2015 16:15:52 -0600 |
parents | d9df6d6cb927 |
children |
rev | line source |
---|---|
405 | 1 package luan; |
2 | |
3 import java.util.Map; | |
413 | 4 import java.util.Iterator; |
5 import java.util.Set; | |
6 import java.util.HashSet; | |
405 | 7 |
8 | |
413 | 9 public abstract class LuanMeta { |
405 | 10 |
11 public abstract Object __index(LuanState luan,LuanTable tbl,Object key) throws LuanException; | |
12 | |
415
ce8e19567911
make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents:
413
diff
changeset
|
13 protected abstract Iterator keys(LuanTable tbl); |
413 | 14 |
15 public LuanFunction __pairs(final LuanState luan,final LuanTable tbl) { | |
16 return new LuanFunction() { | |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
430
diff
changeset
|
17 final Iterator<Map.Entry<Object,Object>> iter1 = tbl.rawIterator(); |
415
ce8e19567911
make LuanPropertyMeta a singleton
Franklin Schmidt <fschmidt@gmail.com>
parents:
413
diff
changeset
|
18 final Iterator<Object> iter2 = keys(tbl); |
413 | 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 } | |
405 | 39 |
40 public boolean canNewindex() { | |
41 return false; | |
42 } | |
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 | 45 throw new UnsupportedOperationException(); |
46 } | |
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 |
429
e3a6d9dbd694
rename __tostring to __to_string
Franklin Schmidt <fschmidt@gmail.com>
parents:
428
diff
changeset
|
50 public String __to_string(LuanState luan,LuanTable tbl) throws LuanException { |
430
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
429
diff
changeset
|
51 return type(tbl) + "-" + tbl.rawToString(); |
416
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 | 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 ); |
429
e3a6d9dbd694
rename __tostring to __to_string
Franklin Schmidt <fschmidt@gmail.com>
parents:
428
diff
changeset
|
58 mt.rawPut( "__to_string", this ); |
405 | 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 | 61 return mt; |
62 } | |
63 | |
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 | 66 tbl.setMetatable( newMetatable() ); |
67 return tbl; | |
68 } | |
69 } |