comparison src/luan/lib/BasicLib.java @ 43:80b67b1a653c

implement string lib git-svn-id: https://luan-java.googlecode.com/svn/trunk@44 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Tue, 25 Dec 2012 03:42:42 +0000
parents 786699c78837
children 57054fa43189
comparison
equal deleted inserted replaced
42:786699c78837 43:80b67b1a653c
119 public static Object[] do_file(LuaState lua,String fileName) throws LuaException { 119 public static Object[] do_file(LuaState lua,String fileName) throws LuaException {
120 LuaFunction fn = load_file(lua,fileName); 120 LuaFunction fn = load_file(lua,fileName);
121 return lua.call(fn,LuaElement.JAVA,null); 121 return lua.call(fn,LuaElement.JAVA,null);
122 } 122 }
123 123
124 private static class TableIter { 124 public static LuaFunction pairs(LuaTable t) {
125 private final Iterator<Map.Entry<Object,Object>> iter; 125 final Iterator<Map.Entry<Object,Object>> iter = t.iterator();
126 126 return new LuaFunction() {
127 TableIter(Iterator<Map.Entry<Object,Object>> iter) { 127 public Object[] call(LuaState lua,Object[] args) {
128 this.iter = iter; 128 if( !iter.hasNext() )
129 } 129 return LuaFunction.EMPTY_RTN;
130 130 Map.Entry<Object,Object> entry = iter.next();
131 public Object[] next() { 131 return new Object[]{entry.getKey(),entry.getValue()};
132 if( !iter.hasNext() ) 132 }
133 return LuaFunction.EMPTY_RTN; 133 };
134 Map.Entry<Object,Object> entry = iter.next();
135 return new Object[]{entry.getKey(),entry.getValue()};
136 }
137 }
138 private static final Method nextTableIter;
139 static {
140 try {
141 nextTableIter = TableIter.class.getMethod("next");
142 nextTableIter.setAccessible(true);
143 } catch(NoSuchMethodException e) {
144 throw new RuntimeException(e);
145 }
146 } 134 }
147 135
148 static LuaFunction pairs(Iterator<Map.Entry<Object,Object>> iter) { 136 public static LuaFunction ipairs(final LuaTable t) {
149 TableIter ti = new TableIter(iter); 137 return new LuaFunction() {
150 return new LuaJavaFunction(nextTableIter,ti); 138 private double i = 0.0;
151 } 139 public Object[] call(LuaState lua,Object[] args) {
152 140 LuaNumber n = new LuaNumber(++i);
153 public static LuaFunction pairs(LuaTable t) { 141 Object val = t.get(n);
154 return pairs(t.iterator()); 142 return val==null ? LuaFunction.EMPTY_RTN : new Object[]{n,val};
155 } 143 }
156 144 };
157 private static class ArrayIter {
158 private final LuaTable t;
159 private double i = 0.0;
160
161 ArrayIter(LuaTable t) {
162 this.t = t;
163 }
164
165 public Object[] next() {
166 LuaNumber n = new LuaNumber(++i);
167 Object val = t.get(n);
168 return val==null ? LuaFunction.EMPTY_RTN : new Object[]{n,val};
169 }
170 }
171 private static final Method nextArrayIter;
172 static {
173 try {
174 nextArrayIter = ArrayIter.class.getMethod("next");
175 nextArrayIter.setAccessible(true);
176 } catch(NoSuchMethodException e) {
177 throw new RuntimeException(e);
178 }
179 }
180
181 public static LuaFunction ipairs(LuaTable t) {
182 ArrayIter ai = new ArrayIter(t);
183 return new LuaJavaFunction(nextArrayIter,ai);
184 } 145 }
185 146
186 public static LuaTable get_metatable(LuaState lua,Object obj) { 147 public static LuaTable get_metatable(LuaState lua,Object obj) {
187 return lua.getMetatable(obj); 148 return lua.getMetatable(obj);
188 } 149 }