package hep.io.root.reps; import hep.io.root.core.AbstractRootObject; import hep.io.root.core.RootInput; import hep.io.root.interfaces.TLeaf; import hep.io.root.interfaces.TLeafI; import java.io.IOException; /** * @author Tony Johnson * @version $Id: TLeafRep.java 8584 2006-08-10 23:06:37Z duns $ */ public abstract class TLeafRep extends AbstractRootObject implements TLeaf { private int[] maxIndex; private int arrayDim; public int getArrayDim() { return arrayDim; } public int[] getMaxIndex() { return maxIndex; } public void read(RootInput in) throws IOException { super.read(in); // There should be a better way of doing this! // If we could reliably associate a TStreamerInfo with each leaf it would // be much better. arrayDim = 0; maxIndex = new int[5]; String title = getTitle() + getName(); // both may contain array decls int p1 = 0; int p2 = 0; for (; title != null; arrayDim++) { p1 = title.indexOf('[', p2); p2 = title.indexOf(']', p1); if ((p1 < 0) || (p2 <= p1)) break; try { maxIndex[arrayDim] = Integer.parseInt(title.substring(p1 + 1, p2)); } catch (NumberFormatException x) { maxIndex[arrayDim] = -1; } } } Object[] readMultiArray(RootInput in, Class type, long index) throws IOException { TLeafI count = (TLeafI) getLeafCount(); int[] maxIndex = getMaxIndex(); int[] dims = new int[arrayDim]; for (int i = 0; i < arrayDim; i++) { dims[i] = (maxIndex[i] >= 0) ? maxIndex[i] : count.getValue(index); } Object[] array = (Object[]) java.lang.reflect.Array.newInstance(type, dims); in.readMultiArray(array); return array; } }