/* | |
* $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); | |
} | |
} | |
} | |
} |