Mercurial Hosting > luan
annotate src/luan/LuanTable.java @ 1283:503bde9a7c80
add luan.require() and table.call()
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Fri, 21 Dec 2018 09:12:09 -0700 |
parents | 9fa8b8389578 |
children | 1b46c8e6c647 |
rev | line source |
---|---|
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
1 package luan; |
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
2 |
27
9de9be530625
minor
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
19
diff
changeset
|
3 import java.util.Iterator; |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
4 import java.util.ListIterator; |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
5 import java.util.Map; |
222
b76fcb72d97d
add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
221
diff
changeset
|
6 import java.util.AbstractMap; |
406
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
7 import java.util.LinkedHashMap; |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
8 import java.util.List; |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
9 import java.util.ArrayList; |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
10 import java.util.Collections; |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
11 import java.util.Comparator; |
47
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
12 import java.util.Set; |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
13 import java.util.HashSet; |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
14 |
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
15 |
781
fbbdd369a13a
rename DeepCloner to LuanCloner
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
16 public final class LuanTable implements LuanCloneable { |
1267 | 17 private LuanState luan; |
434 | 18 private Map map = null; |
19 private List list = null; | |
48
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
47
diff
changeset
|
20 private LuanTable metatable = null; |
1133 | 21 public LuanJavaOk javaOk; |
782
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
22 private LuanCloner cloner; |
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
23 |
1267 | 24 public LuanTable(LuanState luan) { |
25 this.luan = luan; | |
26 } | |
364 | 27 |
1267 | 28 public LuanTable(LuanState luan,List list) { |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
29 int n = list.size(); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
30 for( int i=0; i<n; i++ ) { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
31 Object val = list.get(i); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
32 if( val != null ) |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
33 rawPut(i+1,val); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
34 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
35 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
36 |
1267 | 37 public LuanTable(LuanState luan,Map map) { |
38 this.luan = luan; | |
434 | 39 for( Object stupid : map.entrySet() ) { |
40 Map.Entry entry = (Map.Entry)stupid; | |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
41 Object key = entry.getKey(); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
42 Object value = entry.getValue(); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
43 if( key != null && value != null ) |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
44 rawPut(key,value); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
45 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
46 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
47 |
1267 | 48 public LuanTable(LuanState luan,Set set) { |
49 this.luan = luan; | |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
50 for( Object el : set ) { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
51 if( el != null ) |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
52 rawPut(el,Boolean.TRUE); |
118
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
53 } |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
54 } |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
55 |
425
0a2fb80907f9
minor LuanTable cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents:
423
diff
changeset
|
56 public LuanTable(LuanTable tbl) { |
1267 | 57 this.luan = tbl.luan; |
425
0a2fb80907f9
minor LuanTable cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents:
423
diff
changeset
|
58 if( tbl.map != null && !tbl.map.isEmpty() ) |
0a2fb80907f9
minor LuanTable cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents:
423
diff
changeset
|
59 this.map = new LinkedHashMap<Object,Object>(tbl.map); |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
60 if( tbl.rawLength() > 0 ) |
425
0a2fb80907f9
minor LuanTable cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents:
423
diff
changeset
|
61 this.list = new ArrayList<Object>(tbl.list); |
0a2fb80907f9
minor LuanTable cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents:
423
diff
changeset
|
62 this.metatable = tbl.metatable; |
0a2fb80907f9
minor LuanTable cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents:
423
diff
changeset
|
63 } |
0a2fb80907f9
minor LuanTable cleanup
Franklin Schmidt <fschmidt@gmail.com>
parents:
423
diff
changeset
|
64 |
784
6a7c6879158d
revert shallowClone()
Franklin Schmidt <fschmidt@gmail.com>
parents:
782
diff
changeset
|
65 @Override public LuanTable shallowClone() { |
1267 | 66 return new LuanTable(luan); |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
72
diff
changeset
|
67 } |
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
72
diff
changeset
|
68 |
781
fbbdd369a13a
rename DeepCloner to LuanCloner
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
69 @Override public void deepenClone(LuanCloneable dc,LuanCloner cloner) { |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
70 check(); |
433
c6bcb8859b93
make LuanState.registry a Map;
Franklin Schmidt <fschmidt@gmail.com>
parents:
432
diff
changeset
|
71 LuanTable clone = (LuanTable)dc; |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
72 switch( cloner.type ) { |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
73 case COMPLETE: |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
74 deepenClone(clone,cloner); |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
75 return; |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
76 case INCREMENTAL: |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
77 clone.cloner = cloner; |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
78 clone.map = map; |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
79 clone.list = list; |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
80 clone.metatable = metatable; |
1133 | 81 clone.javaOk = javaOk; |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
82 return; |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
83 } |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
84 } |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
85 |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
86 private void check() { |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
87 if( cloner != null ) { |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
88 deepenClone(this,cloner); |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
89 cloner = null; |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
90 } |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
91 } |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
92 |
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
93 private void deepenClone(LuanTable clone,LuanCloner cloner) { |
1267 | 94 clone.luan = (LuanState)cloner.clone(luan); |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
72
diff
changeset
|
95 if( map != null ) { |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
96 Map newMap = newMap(); |
434 | 97 for( Object stupid : map.entrySet() ) { |
98 Map.Entry entry = (Map.Entry)stupid; | |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
99 newMap.put( cloner.get(entry.getKey()), cloner.get(entry.getValue()) ); |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
72
diff
changeset
|
100 } |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
101 clone.map = newMap; |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
72
diff
changeset
|
102 } |
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
72
diff
changeset
|
103 if( list != null ) { |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
104 List newList = new ArrayList<Object>(); |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
72
diff
changeset
|
105 for( Object obj : list ) { |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
106 newList.add(cloner.get(obj)); |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
72
diff
changeset
|
107 } |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
108 clone.list = newList; |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
72
diff
changeset
|
109 } |
782
655280eab1e2
start limited cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
781
diff
changeset
|
110 clone.metatable = (LuanTable)cloner.clone(metatable); |
1133 | 111 clone.javaOk = (LuanJavaOk)cloner.clone(javaOk); |
77
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
72
diff
changeset
|
112 } |
4bf3d0c0b6b9
make LuanState cloneable
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
72
diff
changeset
|
113 |
408
1b38de2b1845
merge LuanTableImpl into LuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
406
diff
changeset
|
114 public boolean isList() { |
47
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
115 return map==null || map.isEmpty(); |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
116 } |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
117 |
408
1b38de2b1845
merge LuanTableImpl into LuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
406
diff
changeset
|
118 public List<Object> asList() { |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
119 check(); |
47
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
120 return list!=null ? list : Collections.emptyList(); |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
121 } |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
122 |
1189 | 123 public Map rawMap() { |
124 check(); | |
125 return map!=null ? map : Collections.emptyMap(); | |
126 } | |
127 | |
1267 | 128 public String toStringLuan() throws LuanException { |
129 Object h = getHandler("__to_string"); | |
430
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
428
diff
changeset
|
130 if( h == null ) |
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
428
diff
changeset
|
131 return rawToString(); |
647
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
132 LuanFunction fn = Luan.checkFunction(h); |
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
133 return Luan.checkString( Luan.first( fn.call(luan,new Object[]{this}) ) ); |
430
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
428
diff
changeset
|
134 } |
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
428
diff
changeset
|
135 |
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
428
diff
changeset
|
136 public String rawToString() { |
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
428
diff
changeset
|
137 return "table: " + Integer.toHexString(hashCode()); |
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
428
diff
changeset
|
138 } |
f28320fd671d
fix LuanTable.toString() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
428
diff
changeset
|
139 |
1267 | 140 public Object get(Object key) throws LuanException { |
426
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
141 Object value = rawGet(key); |
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
142 if( value != null ) |
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
143 return value; |
1267 | 144 Object h = getHandler("__index"); |
426
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
145 if( h==null ) |
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
146 return null; |
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
147 if( h instanceof LuanFunction ) { |
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
148 LuanFunction fn = (LuanFunction)h; |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
149 return Luan.first(fn.call(luan,new Object[]{this,key})); |
426
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
150 } |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
151 return luan.index(h,key); |
426
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
152 } |
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
153 |
23a93c118042
fix LuanTable.get() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
425
diff
changeset
|
154 public Object rawGet(Object key) { |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
155 check(); |
46
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
156 if( list != null ) { |
48
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
47
diff
changeset
|
157 Integer iT = Luan.asInteger(key); |
46
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
158 if( iT != null ) { |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
159 int i = iT - 1; |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
160 if( i>=0 && i<list.size() ) |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
161 return list.get(i); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
162 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
163 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
164 if( map==null ) |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
165 return null; |
539
473e456444ff
Remove object-oriented primitive methods for string and binary
Franklin Schmidt <fschmidt@gmail.com>
parents:
533
diff
changeset
|
166 if( key instanceof Number && !(key instanceof Double) ) { |
473e456444ff
Remove object-oriented primitive methods for string and binary
Franklin Schmidt <fschmidt@gmail.com>
parents:
533
diff
changeset
|
167 Number n = (Number)key; |
473e456444ff
Remove object-oriented primitive methods for string and binary
Franklin Schmidt <fschmidt@gmail.com>
parents:
533
diff
changeset
|
168 key = Double.valueOf(n.doubleValue()); |
473e456444ff
Remove object-oriented primitive methods for string and binary
Franklin Schmidt <fschmidt@gmail.com>
parents:
533
diff
changeset
|
169 } |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
170 return map.get(key); |
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
171 } |
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
172 |
1267 | 173 public void put(Object key,Object value) throws LuanException { |
174 Object h = getHandler("__new_index"); | |
427
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
175 if( h==null || rawGet(key)!=null ) { |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
176 rawPut(key,value); |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
177 return; |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
178 } |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
179 if( h instanceof LuanFunction ) { |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
180 LuanFunction fn = (LuanFunction)h; |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
181 fn.call(luan,new Object[]{this,key,value}); |
427
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
182 return; |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
183 } |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
184 if( h instanceof LuanTable ) { |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
185 LuanTable tbl = (LuanTable)h; |
1267 | 186 tbl.put(key,value); |
427
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
187 return; |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
188 } |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
578
diff
changeset
|
189 throw new LuanException("invalid type "+Luan.type(h)+" for metamethod __new_index"); |
427
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
190 } |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
191 |
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
192 public void rawPut(Object key,Object val) { |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
193 check(); |
48
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
47
diff
changeset
|
194 Integer iT = Luan.asInteger(key); |
46
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
195 if( iT != null ) { |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
196 int i = iT - 1; |
47
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
197 if( list != null || i == 0 ) { |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
198 if( i == list().size() ) { |
46
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
199 if( val != null ) { |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
200 list.add(val); |
47
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
201 mapToList(); |
46
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
202 } |
224
05eb2837ddbf
change LuanTable.put() to not return old value
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
222
diff
changeset
|
203 return; |
46
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
204 } else if( i>=0 && i<list.size() ) { |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
205 list.set(i,val); |
118
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
206 if( val == null ) { |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
207 listToMap(i); |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
208 } |
224
05eb2837ddbf
change LuanTable.put() to not return old value
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
222
diff
changeset
|
209 return; |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
210 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
211 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
212 } |
539
473e456444ff
Remove object-oriented primitive methods for string and binary
Franklin Schmidt <fschmidt@gmail.com>
parents:
533
diff
changeset
|
213 if( map==null ) |
284
8870840251ea
use LinkedHashMap in LuanTable to preserve order
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
233
diff
changeset
|
214 map = newMap(); |
46
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
215 if( key instanceof Number && !(key instanceof Double) ) { |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
216 Number n = (Number)key; |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
217 key = Double.valueOf(n.doubleValue()); |
a443637829c1
remove LuaNumber
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
44
diff
changeset
|
218 } |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
219 if( val == null ) { |
224
05eb2837ddbf
change LuanTable.put() to not return old value
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
222
diff
changeset
|
220 map.remove(key); |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
221 } else { |
224
05eb2837ddbf
change LuanTable.put() to not return old value
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
222
diff
changeset
|
222 map.put(key,val); |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
223 } |
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
224 } |
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
225 |
47
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
226 private void mapToList() { |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
227 if( map != null ) { |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
228 while(true) { |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
229 Object v = map.remove(Double.valueOf(list.size()+1)); |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
230 if( v == null ) |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
231 break; |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
232 list.add(v); |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
233 } |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
234 } |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
235 } |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
236 |
118
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
237 private void listToMap(int from) { |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
238 if( list != null ) { |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
239 while( list.size() > from ) { |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
240 int i = list.size() - 1; |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
241 Object v = list.remove(i); |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
242 if( v != null ) { |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
243 if( map==null ) |
284
8870840251ea
use LinkedHashMap in LuanTable to preserve order
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
233
diff
changeset
|
244 map = newMap(); |
118
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
245 map.put(i+1,v); |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
246 } |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
247 } |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
248 } |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
249 } |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
108
diff
changeset
|
250 |
47
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
251 private List<Object> list() { |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
252 if( list == null ) { |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
253 list = new ArrayList<Object>(); |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
254 mapToList(); |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
255 } |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
256 return list; |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
257 } |
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
258 |
431 | 259 public void rawInsert(int pos,Object value) { |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
260 check(); |
108
3c404a296995
make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
261 if( value==null ) |
222
b76fcb72d97d
add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
221
diff
changeset
|
262 throw new IllegalArgumentException("can't insert a nil value"); |
47
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
263 list().add(pos-1,value); |
108
3c404a296995
make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
264 mapToList(); |
3c404a296995
make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
265 } |
3c404a296995
make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
88
diff
changeset
|
266 |
431 | 267 public Object rawRemove(int pos) { |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
268 check(); |
47
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
269 return list().remove(pos-1); |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
270 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
271 |
431 | 272 public void rawSort(Comparator<Object> cmp) { |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
273 check(); |
47
659c7139e903
better conversion
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
274 Collections.sort(list(),cmp); |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
275 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
276 |
1267 | 277 public int length() throws LuanException { |
278 Object h = getHandler("__len"); | |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
279 if( h != null ) { |
647
8e8c30b72e9b
move methods from LuanState to Luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
646
diff
changeset
|
280 LuanFunction fn = Luan.checkFunction(h); |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
281 return (Integer)Luan.first(fn.call(luan,new Object[]{this})); |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
282 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
283 return rawLength(); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
284 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
285 |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
286 public int rawLength() { |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
287 check(); |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
288 return list==null ? 0 : list.size(); |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
289 } |
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
290 |
1267 | 291 public Iterable<Map.Entry> iterable() throws LuanException { |
292 final Iterator<Map.Entry> iter = iterator(); | |
1113 | 293 return new Iterable<Map.Entry>() { |
294 public Iterator<Map.Entry> iterator() { | |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
295 return iter; |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
296 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
297 }; |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
298 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
299 |
1129
3234a14bb1f8
minor lucene changes
Franklin Schmidt <fschmidt@gmail.com>
parents:
1113
diff
changeset
|
300 public Iterable<Map.Entry> rawIterable() { |
1113 | 301 final Iterator<Map.Entry> iter = rawIterator(); |
302 return new Iterable<Map.Entry>() { | |
303 public Iterator<Map.Entry> iterator() { | |
498
ee55be414a34
Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
497
diff
changeset
|
304 return iter; |
ee55be414a34
Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
497
diff
changeset
|
305 } |
ee55be414a34
Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
497
diff
changeset
|
306 }; |
ee55be414a34
Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
497
diff
changeset
|
307 } |
ee55be414a34
Http.response is now mostly luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
497
diff
changeset
|
308 |
1267 | 309 public Iterator<Map.Entry> iterator() throws LuanException { |
310 if( getHandler("__pairs") == null ) | |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
311 return rawIterator(); |
1267 | 312 final LuanFunction fn = pairs(); |
1113 | 313 return new Iterator<Map.Entry>() { |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
314 private Map.Entry<Object,Object> next = getNext(); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
315 |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
316 private Map.Entry<Object,Object> getNext() { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
317 try { |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
318 Object obj = fn.call(luan); |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
319 if( obj==null ) |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
320 return null; |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
321 Object[] a = (Object[])obj; |
497
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
434
diff
changeset
|
322 if( a.length == 0 || a[0]==null ) |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
323 return null; |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
324 return new AbstractMap.SimpleEntry<Object,Object>(a[0],a[1]); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
325 } catch(LuanException e) { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
326 throw new LuanRuntimeException(e); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
327 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
328 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
329 |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
330 public boolean hasNext() { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
331 return next != null; |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
332 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
333 |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
334 public Map.Entry<Object,Object> next() { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
335 Map.Entry<Object,Object> rtn = next; |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
336 next = getNext(); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
337 return rtn; |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
338 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
339 |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
340 public void remove() { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
341 throw new UnsupportedOperationException(); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
342 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
343 }; |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
344 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
345 |
1267 | 346 public LuanFunction pairs() throws LuanException { |
347 Object h = getHandler("__pairs"); | |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
348 if( h != null ) { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
349 if( h instanceof LuanFunction ) { |
575
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
350 LuanFunction fn = (LuanFunction)h; |
7c3ad6db8ac3
make LuanState.JAVA private
Franklin Schmidt <fschmidt@gmail.com>
parents:
572
diff
changeset
|
351 Object obj = Luan.first(fn.call(luan,new Object[]{this})); |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
352 if( !(obj instanceof LuanFunction) ) |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
578
diff
changeset
|
353 throw new LuanException( "metamethod __pairs should return function but returned " + Luan.type(obj) ); |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
354 return (LuanFunction)obj; |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
355 } |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
578
diff
changeset
|
356 throw new LuanException( "invalid type of metamethod __pairs: " + Luan.type(h) ); |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
357 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
358 return rawPairs(); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
359 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
360 |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
361 private LuanFunction rawPairs() { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
362 return new LuanFunction() { |
1113 | 363 final Iterator<Map.Entry> iter = rawIterator(); |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
364 |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
365 @Override public Object[] call(LuanState luan,Object[] args) { |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
366 if( !iter.hasNext() ) |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
367 return LuanFunction.NOTHING; |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
368 Map.Entry<Object,Object> entry = iter.next(); |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
369 return new Object[]{entry.getKey(),entry.getValue()}; |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
370 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
371 }; |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
372 } |
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
373 |
1113 | 374 public Iterator<Map.Entry> rawIterator() { |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
375 check(); |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
376 if( list == null ) { |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
377 if( map == null ) |
1113 | 378 return Collections.<Map.Entry>emptyList().iterator(); |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
379 return map.entrySet().iterator(); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
380 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
381 if( map == null ) |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
382 return listIterator(); |
1113 | 383 return new Iterator<Map.Entry>() { |
384 Iterator<Map.Entry> iter = listIterator(); | |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
385 boolean isList = true; |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
386 |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
387 public boolean hasNext() { |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
388 boolean b = iter.hasNext(); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
389 if( !b && isList ) { |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
390 iter = map.entrySet().iterator(); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
391 isList = false; |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
392 b = iter.hasNext(); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
393 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
394 return b; |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
395 } |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
396 |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
397 public Map.Entry<Object,Object> next() { |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
398 return iter.next(); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
399 } |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
400 |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
401 public void remove() { |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
402 throw new UnsupportedOperationException(); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
403 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
404 }; |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
405 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
406 |
1113 | 407 private Iterator<Map.Entry> listIterator() { |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
408 if( list == null ) |
1113 | 409 return Collections.<Map.Entry>emptyList().iterator(); |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
410 final ListIterator iter = list.listIterator(); |
1113 | 411 return new Iterator<Map.Entry>() { |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
412 |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
413 public boolean hasNext() { |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
414 return iter.hasNext(); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
415 } |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
416 |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
417 public Map.Entry<Object,Object> next() { |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
418 Integer key = iter.nextIndex()+1; |
222
b76fcb72d97d
add AbstractLuanTable and improve HttpLuan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
221
diff
changeset
|
419 return new AbstractMap.SimpleEntry<Object,Object>(key,iter.next()); |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
420 } |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
421 |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
422 public void remove() { |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
423 throw new UnsupportedOperationException(); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
424 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
425 }; |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
35
diff
changeset
|
426 } |
221
ec016471c6eb
make LuanTable an interface
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
202
diff
changeset
|
427 |
431 | 428 public LuanTable rawSubList(int from,int to) { |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
429 check(); |
1267 | 430 LuanTable tbl = new LuanTable(luan); |
221
ec016471c6eb
make LuanTable an interface
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
202
diff
changeset
|
431 tbl.list = new ArrayList<Object>(list().subList(from-1,to-1)); |
ec016471c6eb
make LuanTable an interface
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
202
diff
changeset
|
432 return tbl; |
27
9de9be530625
minor
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
19
diff
changeset
|
433 } |
9de9be530625
minor
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
19
diff
changeset
|
434 |
408
1b38de2b1845
merge LuanTableImpl into LuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
406
diff
changeset
|
435 public LuanTable getMetatable() { |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
436 check(); |
35
e51906de0f11
implement metatables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
27
diff
changeset
|
437 return metatable; |
e51906de0f11
implement metatables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
27
diff
changeset
|
438 } |
e51906de0f11
implement metatables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
27
diff
changeset
|
439 |
408
1b38de2b1845
merge LuanTableImpl into LuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
406
diff
changeset
|
440 public void setMetatable(LuanTable metatable) { |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
441 check(); |
35
e51906de0f11
implement metatables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
27
diff
changeset
|
442 this.metatable = metatable; |
e51906de0f11
implement metatables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
27
diff
changeset
|
443 } |
300
9fb523472035
add java() to control java access
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
284
diff
changeset
|
444 |
1267 | 445 public Object getHandler(String op) throws LuanException { |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
446 check(); |
1267 | 447 return metatable==null ? null : metatable.get(op); |
419
8fbb961aabd5
improve repr() to check metamethod recursively
Franklin Schmidt <fschmidt@gmail.com>
parents:
414
diff
changeset
|
448 } |
8fbb961aabd5
improve repr() to check metamethod recursively
Franklin Schmidt <fschmidt@gmail.com>
parents:
414
diff
changeset
|
449 |
431 | 450 private Map<Object,Object> newMap() { |
406
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
451 return new LinkedHashMap<Object,Object>(); |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
452 } |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
453 |
1267 | 454 public boolean isSet() throws LuanException { |
455 for( Map.Entry<Object,Object> entry : iterable() ) { | |
406
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
456 if( !entry.getValue().equals(Boolean.TRUE) ) |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
457 return false; |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
458 } |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
459 return true; |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
460 } |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
461 |
1267 | 462 public Set<Object> asSet() throws LuanException { |
406
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
463 Set<Object> set = new HashSet<Object>(); |
1267 | 464 for( Map.Entry<Object,Object> entry : iterable() ) { |
406
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
465 set.add(entry.getKey()); |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
466 } |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
467 return set; |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
468 } |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
469 |
1267 | 470 public Map<Object,Object> asMap() throws LuanException { |
406
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
471 Map<Object,Object> map = newMap(); |
1267 | 472 for( Map.Entry<Object,Object> entry : iterable() ) { |
406
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
473 map.put(entry.getKey(),entry.getValue()); |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
474 } |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
475 return map; |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
476 } |
9321a33b9b1c
remove AbstractLuanTable
Franklin Schmidt <fschmidt@gmail.com>
parents:
397
diff
changeset
|
477 |
497
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
434
diff
changeset
|
478 public void rawClear() { |
785
d69d3c51c44e
more work on incremental cloning
Franklin Schmidt <fschmidt@gmail.com>
parents:
784
diff
changeset
|
479 check(); |
497
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
434
diff
changeset
|
480 map = null; |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
434
diff
changeset
|
481 list = null; |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
434
diff
changeset
|
482 } |
55f9f74f1e55
Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
434
diff
changeset
|
483 |
1095
2443152dc2f1
add Luan.hash_code() and Table.hash_value()
Franklin Schmidt <fschmidt@gmail.com>
parents:
796
diff
changeset
|
484 public int hashValue() { |
2443152dc2f1
add Luan.hash_code() and Table.hash_value()
Franklin Schmidt <fschmidt@gmail.com>
parents:
796
diff
changeset
|
485 int n = 99; |
2443152dc2f1
add Luan.hash_code() and Table.hash_value()
Franklin Schmidt <fschmidt@gmail.com>
parents:
796
diff
changeset
|
486 if( map != null ) |
2443152dc2f1
add Luan.hash_code() and Table.hash_value()
Franklin Schmidt <fschmidt@gmail.com>
parents:
796
diff
changeset
|
487 n ^= map.hashCode(); |
2443152dc2f1
add Luan.hash_code() and Table.hash_value()
Franklin Schmidt <fschmidt@gmail.com>
parents:
796
diff
changeset
|
488 if( list != null ) |
2443152dc2f1
add Luan.hash_code() and Table.hash_value()
Franklin Schmidt <fschmidt@gmail.com>
parents:
796
diff
changeset
|
489 n ^= list.hashCode(); |
2443152dc2f1
add Luan.hash_code() and Table.hash_value()
Franklin Schmidt <fschmidt@gmail.com>
parents:
796
diff
changeset
|
490 return n; |
2443152dc2f1
add Luan.hash_code() and Table.hash_value()
Franklin Schmidt <fschmidt@gmail.com>
parents:
796
diff
changeset
|
491 } |
1100
ad6b3b9fef40
add Table.is_empty() and Table.size()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1095
diff
changeset
|
492 |
ad6b3b9fef40
add Table.is_empty() and Table.size()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1095
diff
changeset
|
493 public boolean rawIsEmpty() { |
ad6b3b9fef40
add Table.is_empty() and Table.size()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1095
diff
changeset
|
494 return (map==null || map.isEmpty()) && (list==null || list.isEmpty()); |
ad6b3b9fef40
add Table.is_empty() and Table.size()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1095
diff
changeset
|
495 } |
ad6b3b9fef40
add Table.is_empty() and Table.size()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1095
diff
changeset
|
496 |
ad6b3b9fef40
add Table.is_empty() and Table.size()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1095
diff
changeset
|
497 public int rawSize() { |
ad6b3b9fef40
add Table.is_empty() and Table.size()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1095
diff
changeset
|
498 int n = 0; |
ad6b3b9fef40
add Table.is_empty() and Table.size()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1095
diff
changeset
|
499 if( map != null ) |
ad6b3b9fef40
add Table.is_empty() and Table.size()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1095
diff
changeset
|
500 n += map.size(); |
ad6b3b9fef40
add Table.is_empty() and Table.size()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1095
diff
changeset
|
501 if( list != null ) |
ad6b3b9fef40
add Table.is_empty() and Table.size()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1095
diff
changeset
|
502 n += list.size(); |
ad6b3b9fef40
add Table.is_empty() and Table.size()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1095
diff
changeset
|
503 return n; |
ad6b3b9fef40
add Table.is_empty() and Table.size()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1095
diff
changeset
|
504 } |
1267 | 505 |
506 protected void finalize() throws Throwable { | |
507 Object h = getHandler("__gc"); | |
508 if( h != null ) { | |
509 LuanFunction fn = Luan.checkFunction(h); | |
510 fn.call(luan,new Object[]{this}); | |
511 } | |
512 super.finalize(); | |
513 } | |
514 | |
1283
503bde9a7c80
add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1267
diff
changeset
|
515 public Object call(String fnName,Object... args) throws LuanException { |
503bde9a7c80
add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1267
diff
changeset
|
516 LuanFunction fn = Luan.checkFunction(get(fnName)); |
503bde9a7c80
add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1267
diff
changeset
|
517 return fn.call(luan,args); |
503bde9a7c80
add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1267
diff
changeset
|
518 } |
1
2df768b926aa
start Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
519 } |