package hep.io.root.reps;
import hep.io.root.core.AbstractRootObject;
import hep.io.root.core.RootInput;
import hep.io.root.interfaces.TBranch;
import hep.io.root.interfaces.TLeafI;
import java.io.IOException;
import org.apache.bcel.Constants;
import org.apache.bcel.generic.ConstantPoolGen;
import org.apache.bcel.generic.InstructionFactory;
import org.apache.bcel.generic.InstructionList;
import org.apache.bcel.generic.Type;
/**
* @author Tony Johnson
* @version $Id: TLeafIRep.java 8584 2006-08-10 23:06:37Z duns $
*/
public abstract class TLeafIRep extends AbstractRootObject implements TLeafI, Constants
{
private Object lastValue;
private TBranch branch;
private int lastInteger;
private long lastIntegerIndex;
private long lastValueIndex;
public void setBranch(TBranch branch)
{
this.branch = branch;
lastIntegerIndex = -1;
lastValueIndex = -1;
}
public int getValue(long index) throws IOException
{
try
{
if (lastIntegerIndex == index)
return lastInteger;
RootInput in = branch.setPosition(this, lastIntegerIndex = index);
return lastInteger = in.readInt();
}
catch (IOException x)
{
lastIntegerIndex = -1;
throw x;
}
}
public Object getWrappedValue(long index) throws IOException
{
try
{
if (index == lastValueIndex)
return lastValue;
lastValueIndex = index;
RootInput in = branch.setPosition(this, index);
int arrayDim = getArrayDim();
if (arrayDim == 0)
return lastValue = new Integer(in.readInt());
else if (arrayDim == 1)
{
TLeafI count = (TLeafI) getLeafCount();
int len = (count == null) ? getLen() : count.getValue(index);
int[] array = new int[len];
in.readFixedArray(array);
return lastValue = array;
}
else
{
return lastValue = readMultiArray(in, Integer.TYPE, index);
}
}
catch (IOException x)
{
lastValueIndex = -1;
throw x;
}
}
public void generateReadCode(InstructionList il, InstructionFactory factory, ConstantPoolGen cp, String className)
{
String leafClassName = getClass().getName();
int arrayDim = getArrayDim();
if (arrayDim == 0)
il.append(factory.createInvoke(leafClassName, "getValue", Type.INT, new Type[]
{
Type.LONG
}, INVOKEVIRTUAL));
else
il.append(factory.createInvoke(leafClassName, "getWrappedValue", Type.OBJECT, new Type[]
{
Type.LONG
}, INVOKEVIRTUAL));
}
abstract Object[] readMultiArray(RootInput in, Class type, long index);
}