Mercurial Hosting > luan
annotate core/src/luan/LuanMeta.java @ 413:8937263f59f6
add __pairs;
add back HttpServicer.get_parameter_values;
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Wed, 29 Apr 2015 19:01:18 -0600 |
parents | 1b38de2b1845 |
children | ce8e19567911 |
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 | |
413 | 13 protected abstract Iterator keys(); |
14 | |
15 public LuanFunction __pairs(final LuanState luan,final LuanTable tbl) { | |
16 return new LuanFunction() { | |
17 final Iterator<Map.Entry<Object,Object>> iter1 = tbl.iterator(); | |
18 final Iterator<Object> iter2 = keys(); | |
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 | |
44 public void __newindex(LuanState luan,LuanTable tbl,Object key,Object value) throws LuanException { | |
45 throw new UnsupportedOperationException(); | |
46 } | |
47 | |
48 public LuanTable newMetatable() { | |
408
1b38de2b1845
merge LuanTableImpl into LuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
405
diff
changeset
|
49 LuanTable mt = new LuanTable(); |
405 | 50 mt.put( "__index", this ); |
413 | 51 mt.put( "__pairs", this ); |
405 | 52 if( canNewindex() ) |
53 mt.put( "__newindex", this ); | |
54 return mt; | |
55 } | |
56 | |
57 public LuanTable newTable() { | |
408
1b38de2b1845
merge LuanTableImpl into LuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
405
diff
changeset
|
58 LuanTable tbl = new LuanTable(); |
405 | 59 tbl.setMetatable( newMetatable() ); |
60 return tbl; | |
61 } | |
62 } |