blob: de8b68beec0cbdc1da3ffc018f879afa02cab9cd [file] [log] [blame] [raw]
/*
* $Id: AbstractTableList.java 38 2012-01-04 22:44:15Z andre@naef.com $
* See LICENSE.txt for license terms.
*/
package com.naef.jnlua.util;
import java.util.AbstractList;
import java.util.RandomAccess;
import com.naef.jnlua.LuaState;
import com.naef.jnlua.LuaValueProxy;
/**
* Abstract list implementation backed by a Lua table.
*/
public abstract class AbstractTableList extends AbstractList<Object> implements
RandomAccess, LuaValueProxy {
// -- Construction
/**
* Creates a new instance.
*/
public AbstractTableList() {
}
// -- List methods
@Override
public void add(int index, Object element) {
LuaState luaState = getLuaState();
synchronized (luaState) {
int size = size();
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("index: " + index
+ ", size: " + size);
}
pushValue();
luaState.tableMove(-1, index + 1, index + 2, size - index);
luaState.pushJavaObject(element);
luaState.rawSet(-2, index + 1);
luaState.pop(1);
}
}
@Override
public Object get(int index) {
LuaState luaState = getLuaState();
synchronized (luaState) {
int size = size();
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("index: " + index
+ ", size: " + size);
}
pushValue();
luaState.rawGet(-1, index + 1);
try {
return luaState.toJavaObject(-1, Object.class);
} finally {
luaState.pop(2);
}
}
}
@Override
public Object remove(int index) {
LuaState luaState = getLuaState();
synchronized (luaState) {
int size = size();
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("index: " + index
+ ", size: " + size);
}
Object oldValue = get(index);
pushValue();
luaState.tableMove(-1, index + 2, index + 1, size - index - 1);
luaState.pushNil();
luaState.rawSet(-2, size);
luaState.pop(1);
return oldValue;
}
}
@Override
public Object set(int index, Object element) {
LuaState luaState = getLuaState();
synchronized (luaState) {
int size = size();
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("index: " + index
+ ", size: " + size);
}
Object oldValue = get(index);
pushValue();
luaState.pushJavaObject(element);
luaState.rawSet(-2, index + 1);
luaState.pop(1);
return oldValue;
}
}
@Override
public int size() {
LuaState luaState = getLuaState();
synchronized (luaState) {
pushValue();
try {
return luaState.rawLen(-1);
} finally {
luaState.pop(1);
}
}
}
}