Mercurial Hosting > luan
annotate src/luan/modules/TableLuan.java @ 1515:78d937870762
Thread.synchronized
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sat, 30 May 2020 17:58:35 -0600 |
parents | 225808b90cee |
children | b89212fd04b5 |
rev | line source |
---|---|
167
4c0131c2b650
merge luan/lib into modules
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
142
diff
changeset
|
1 package luan.modules; |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
2 |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
3 import java.util.Comparator; |
118
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
112
diff
changeset
|
4 import java.util.List; |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
5 import java.util.ArrayList; |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
6 import java.util.Arrays; |
48
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
7 import luan.Luan; |
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
8 import luan.LuanTable; |
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
9 import luan.LuanFunction; |
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
10 import luan.LuanException; |
76
97b03fc807ad
add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
74
diff
changeset
|
11 import luan.LuanRuntimeException; |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
12 |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
13 |
168
ebe9db183eb7
rename *Lib.java to *Luan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
167
diff
changeset
|
14 public final class TableLuan { |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
15 |
1334
c88b486a9511
make some Luan methods static
Franklin Schmidt <fschmidt@gmail.com>
parents:
1333
diff
changeset
|
16 public static String concat(LuanTable list,String sep,Integer i,Integer j) throws LuanException { |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
17 int first = i==null ? 1 : i; |
1267 | 18 int last = j==null ? list.length() : j; |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
19 StringBuilder buf = new StringBuilder(); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
20 for( int k=first; k<=last; k++ ) { |
1267 | 21 Object val = list.get(k); |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
22 if( val==null ) |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
23 break; |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
24 if( sep!=null && k > first ) |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
25 buf.append(sep); |
1334
c88b486a9511
make some Luan methods static
Franklin Schmidt <fschmidt@gmail.com>
parents:
1333
diff
changeset
|
26 String s = Luan.luanToString(val); |
440
93e6e67768d7
remove Luan.asString()
Franklin Schmidt <fschmidt@gmail.com>
parents:
432
diff
changeset
|
27 buf.append(s); |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
28 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
29 return buf.toString(); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
30 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
31 |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
613
diff
changeset
|
32 public static void insert(LuanTable list,int pos,Object value) throws LuanException { |
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
613
diff
changeset
|
33 Utils.checkNotNull(list); |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
34 if( list.getMetatable() != null ) |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
613
diff
changeset
|
35 throw new LuanException("can't insert into a table with a metatable"); |
431 | 36 list.rawInsert(pos,value); |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
37 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
38 |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
613
diff
changeset
|
39 public static Object remove(LuanTable list,int pos) throws LuanException { |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
40 if( list.getMetatable() != null ) |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
613
diff
changeset
|
41 throw new LuanException("can't remove from a table with a metatable"); |
1420 | 42 return list.removeFromList(pos); |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
43 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
44 |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
45 private static interface LessThan { |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
46 public boolean isLessThan(Object o1,Object o2); |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
47 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
48 |
1335 | 49 public static void sort(LuanTable list,final LuanFunction comp) throws LuanException { |
432
d9df6d6cb927
finish fixing LuanTable to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
431
diff
changeset
|
50 if( list.getMetatable() != null ) |
646
cdc70de628b5
simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents:
613
diff
changeset
|
51 throw new LuanException("can't sort a table with a metatable"); |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
52 final LessThan lt; |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
53 if( comp==null ) { |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
54 lt = new LessThan() { |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
55 public boolean isLessThan(Object o1,Object o2) { |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
56 try { |
1335 | 57 return Luan.isLessThan(o1,o2); |
48
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
58 } catch(LuanException e) { |
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
59 throw new LuanRuntimeException(e); |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
60 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
61 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
62 }; |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
63 } else { |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
64 lt = new LessThan() { |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
65 public boolean isLessThan(Object o1,Object o2) { |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
66 try { |
1335 | 67 return Luan.checkBoolean(Luan.first(comp.call(o1,o2))); |
48
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
68 } catch(LuanException e) { |
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
69 throw new LuanRuntimeException(e); |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
70 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
71 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
72 }; |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
73 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
74 try { |
431 | 75 list.rawSort( new Comparator<Object>() { |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
76 public int compare(Object o1,Object o2) { |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
77 return lt.isLessThan(o1,o2) ? -1 : lt.isLessThan(o2,o1) ? 1 : 0; |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
78 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
79 } ); |
48
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
80 } catch(LuanRuntimeException e) { |
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
81 throw (LuanException)e.getCause(); |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
82 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
83 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
84 |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
85 public static LuanTable pack(Luan luan,Object... args) throws LuanException { |
1267 | 86 LuanTable tbl = new LuanTable(luan,Arrays.asList(args)); |
427
dae264ad6a7b
fix LuanTable.put() to use metatables
Franklin Schmidt <fschmidt@gmail.com>
parents:
426
diff
changeset
|
87 tbl.rawPut( "n", args.length ); |
221
ec016471c6eb
make LuanTable an interface
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
171
diff
changeset
|
88 return tbl; |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
89 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
90 |
1335 | 91 public static Object[] unpack(LuanTable tbl,Integer iFrom,Integer iTo) throws LuanException { |
118
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
112
diff
changeset
|
92 int from = iFrom!=null ? iFrom : 1; |
1277 | 93 int to; |
94 if( iTo != null ) { | |
95 to = iTo; | |
96 } else { | |
97 Integer n = Luan.asInteger( tbl.get("n") ); | |
98 to = n!=null ? n : tbl.length(); | |
99 } | |
118
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
112
diff
changeset
|
100 List<Object> list = new ArrayList<Object>(); |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
112
diff
changeset
|
101 for( int i=from; i<=to; i++ ) { |
1267 | 102 list.add( tbl.get(i) ); |
118
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
112
diff
changeset
|
103 } |
735708619119
add Debug.debug()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
112
diff
changeset
|
104 return list.toArray(); |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
105 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
106 |
1335 | 107 public static LuanTable copy(LuanTable list,Integer from,Integer to) { |
565
22bfd8a2eaee
do Table documentation;
Franklin Schmidt <fschmidt@gmail.com>
parents:
443
diff
changeset
|
108 if( from == null ) |
22bfd8a2eaee
do Table documentation;
Franklin Schmidt <fschmidt@gmail.com>
parents:
443
diff
changeset
|
109 return new LuanTable(list); |
22bfd8a2eaee
do Table documentation;
Franklin Schmidt <fschmidt@gmail.com>
parents:
443
diff
changeset
|
110 if( to == null ) |
22bfd8a2eaee
do Table documentation;
Franklin Schmidt <fschmidt@gmail.com>
parents:
443
diff
changeset
|
111 to = list.rawLength(); |
431 | 112 return list.rawSubList(from,to); |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
113 } |
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
114 |
580 | 115 public static void clear(LuanTable tbl) { |
116 tbl.rawClear(); | |
117 } | |
118 | |
1095
2443152dc2f1
add Luan.hash_code() and Table.hash_value()
Franklin Schmidt <fschmidt@gmail.com>
parents:
796
diff
changeset
|
119 public static int hash_value(LuanTable tbl) throws LuanException { |
2443152dc2f1
add Luan.hash_code() and Table.hash_value()
Franklin Schmidt <fschmidt@gmail.com>
parents:
796
diff
changeset
|
120 return tbl.hashValue(); |
2443152dc2f1
add Luan.hash_code() and Table.hash_value()
Franklin Schmidt <fschmidt@gmail.com>
parents:
796
diff
changeset
|
121 } |
2443152dc2f1
add Luan.hash_code() and Table.hash_value()
Franklin Schmidt <fschmidt@gmail.com>
parents:
796
diff
changeset
|
122 |
1100
ad6b3b9fef40
add Table.is_empty() and Table.size()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1095
diff
changeset
|
123 public static boolean is_empty(LuanTable tbl) throws LuanException { |
1420 | 124 return tbl.isEmpty(); |
1100
ad6b3b9fef40
add Table.is_empty() and Table.size()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1095
diff
changeset
|
125 } |
ad6b3b9fef40
add Table.is_empty() and Table.size()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1095
diff
changeset
|
126 |
ad6b3b9fef40
add Table.is_empty() and Table.size()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1095
diff
changeset
|
127 public static int size(LuanTable tbl) throws LuanException { |
ad6b3b9fef40
add Table.is_empty() and Table.size()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1095
diff
changeset
|
128 return tbl.rawSize(); |
ad6b3b9fef40
add Table.is_empty() and Table.size()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1095
diff
changeset
|
129 } |
ad6b3b9fef40
add Table.is_empty() and Table.size()
Franklin Schmidt <fschmidt@gmail.com>
parents:
1095
diff
changeset
|
130 |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
131 public static LuanTable toTable(Luan luan,Object obj) { |
1267 | 132 return luan.toTable(obj); |
133 } | |
134 | |
44
57054fa43189
implement table lib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
135 } |