package hep.io.root.core;
import hep.io.root.RootClass;
import hep.io.root.RootMember;
import org.apache.bcel.generic.ArrayType;
import org.apache.bcel.generic.BasicType;
import org.apache.bcel.generic.ConstantPoolGen;
import org.apache.bcel.generic.Instruction;
import org.apache.bcel.generic.InstructionFactory;
import org.apache.bcel.generic.InstructionList;
import org.apache.bcel.generic.PUSH;
import org.apache.bcel.generic.Type;
/**
* @author Tony Johnson (tonyj@slac.stanford.edu)
* @version $Id: IntrinsicRootClass.java 8584 2006-08-10 23:06:37Z duns $
*/
abstract class IntrinsicRootClass extends BasicRootClass
{
private static final Type[] objectArrayArgType =
{
new ArrayType(Type.OBJECT, 1)
};
private static final RootClass[] none = { };
private static final RootMember[] noMembers = { };
private BasicType type;
private Class javaClass;
private String name;
private String readMethod;
private Type[] arrayArgType;
IntrinsicRootClass(String name, BasicType type, Class javaClass, String readMethod)
{
this.name = name;
this.type = type;
this.javaClass = javaClass;
this.readMethod = readMethod;
this.arrayArgType = new Type[] { new ArrayType(type, 1) };
}
public int getCheckSum()
{
return 0;
}
public String getClassName()
{
return name;
}
public Class getJavaClass()
{
return javaClass;
}
public Type getJavaType()
{
return type;
}
public RootMember[] getMembers()
{
return noMembers;
}
public RootClass[] getSuperClasses()
{
return none;
}
public int getVersion()
{
return 0;
}
public void generateReadArrayCode(InstructionList il, InstructionFactory factory, ConstantPoolGen cp, int dim, int[] maxIndex)
{
for (int i = 0; i < dim; i++)
il.append(new PUSH(cp, maxIndex[i]));
il.append((Instruction) factory.createNewArray(type, (short) dim));
il.append(InstructionFactory.DUP_X1);
if (dim == 1)
il.append(factory.createInvoke("hep.io.root.core.RootInput", "readFixedArray", Type.VOID, arrayArgType, INVOKEINTERFACE));
else
il.append(factory.createInvoke("hep.io.root.core.RootInput", "readMultiArray", Type.VOID, objectArrayArgType, INVOKEINTERFACE));
}
public void generateReadCode(InstructionList il, InstructionFactory factory, ConstantPoolGen cp)
{
il.append(factory.createInvoke("hep.io.root.core.RootInput", readMethod, type, Type.NO_ARGS, INVOKEINTERFACE));
}
public boolean instanceOf(RootClass superClass)
{
return superClass == this;
}
public void resolve(RootClassFactory factory) {}
}
class IntegerClass extends IntrinsicRootClass
{
IntegerClass()
{
super("Integer", Type.INT, Integer.TYPE, "readInt");
}
}
class LongClass extends IntrinsicRootClass
{
LongClass()
{
super("Integer", Type.LONG, Long.TYPE, "readLong");
}
}
class DoubleClass extends IntrinsicRootClass
{
DoubleClass()
{
super("Double", Type.DOUBLE, Double.TYPE, "readDouble");
}
}
class FloatClass extends IntrinsicRootClass
{
FloatClass()
{
super("Float", Type.FLOAT, Float.TYPE, "readFloat");
}
}
class ShortClass extends IntrinsicRootClass
{
ShortClass()
{
super("Short", Type.SHORT, Short.TYPE, "readShort");
}
}
class ByteClass extends IntrinsicRootClass
{
ByteClass()
{
super("Byte", Type.BYTE, Byte.TYPE, "readByte");
}
}
class BooleanClass extends IntrinsicRootClass
{
BooleanClass()
{
super("Boolean", Type.BOOLEAN, Boolean.TYPE, "readBoolean");
}
}