view core/src/luan/LuanMeta.java @ 416:91af5337b9ae

add LuanMeta.__tostring()
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 30 Apr 2015 06:28:25 -0600
parents ce8e19567911
children dae264ad6a7b
line wrap: on
line source

package luan;

import java.util.Map;
import java.util.Iterator;
import java.util.Set;
import java.util.HashSet;


public abstract class LuanMeta {

	public abstract Object __index(LuanState luan,LuanTable tbl,Object key) throws LuanException;

	protected abstract Iterator keys(LuanTable tbl);

	public LuanFunction __pairs(final LuanState luan,final LuanTable tbl) {
		return new LuanFunction() {
			final Iterator<Map.Entry<Object,Object>> iter1 = tbl.iterator();
			final Iterator<Object> iter2 = keys(tbl);
			final Set<Object> set = new HashSet<Object>();

			@Override public Object[] call(LuanState luan,Object[] args) throws LuanException {
				if( iter1.hasNext() ) {
					Map.Entry<Object,Object> entry = iter1.next();
					Object key = entry.getKey();
					set.add(key);
					return new Object[]{key,entry.getValue()};
				}
				while( iter2.hasNext() ) {
					Object key = iter2.next();
					if( set.add(key) ) {
						Object value = __index(luan,tbl,key);
						return new Object[]{key,value};
					}
				}
				return LuanFunction.NOTHING;
			}
		};
	}

	public boolean canNewindex() {
		return false;
	}

	public void __newindex(LuanState luan,LuanTable tbl,Object key,Object value) throws LuanException {
		throw new UnsupportedOperationException();
	}

	protected abstract String type(LuanTable tbl);

	public String __tostring(LuanState luan,LuanTable tbl) throws LuanException {
		return type(tbl) + "-" + tbl;
	}

	public LuanTable newMetatable() {
		LuanTable mt = new LuanTable();
		mt.put( "__index", this );
		mt.put( "__pairs", this );
		mt.put( "__tostring", this );
		if( canNewindex() )
			mt.put( "__newindex", this );
		return mt;
	}

	public LuanTable newTable() {
		LuanTable tbl = new LuanTable();
		tbl.setMetatable( newMetatable() );
		return tbl;
	}
}