159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/* 259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Copyright (c) 2009-2010 jMonkeyEngine 359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * All rights reserved. 459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Redistribution and use in source and binary forms, with or without 659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * modification, are permitted provided that the following conditions are 759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * met: 859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions of source code must retain the above copyright 1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * notice, this list of conditions and the following disclaimer. 1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions in binary form must reproduce the above copyright 1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * notice, this list of conditions and the following disclaimer in the 1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * documentation and/or other materials provided with the distribution. 1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Neither the name of 'jMonkeyEngine' nor the names of its contributors 1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * may be used to endorse or promote products derived from this software 1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * without specific prior written permission. 1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.animation; 3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.lang.reflect.Array; 3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.HashMap; 3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.Map; 3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/** 3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Object is indexed and stored in primitive float[] 4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Lim, YongHoon 4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param <T> 4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic abstract class CompactArray<T> { 4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Map<T, Integer> indexPool = new HashMap<T, Integer>(); 4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected int[] index; 4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected float[] array; 4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private boolean invalid; 4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Creates a compact array 5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public CompactArray() { 5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * create array using serialized data 5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param compressedArray 5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param index 6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public CompactArray(float[] compressedArray, int[] index) { 6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.array = compressedArray; 6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.index = index; 6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Add objects. 6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * They are serialized automatically when get() method is called. 6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param objArray 7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void add(T... objArray) { 7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (objArray == null || objArray.length == 0) { 7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return; 7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta invalid = true; 7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int base = 0; 7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (index == null) { 7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta index = new int[objArray.length]; 7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (indexPool.isEmpty()) { 8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new RuntimeException("Internal is already fixed"); 8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta base = index.length; 8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int[] tmp = new int[base + objArray.length]; 8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta System.arraycopy(index, 0, tmp, 0, index.length); 8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta index = tmp; 8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //index = Arrays.copyOf(index, base+objArray.length); 8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int j = 0; j < objArray.length; j++) { 9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta T obj = objArray[j]; 9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (obj == null) { 9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta index[base + j] = -1; 9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Integer i = indexPool.get(obj); 9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (i == null) { 9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta i = indexPool.size(); 9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta indexPool.put(obj, i); 9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta index[base + j] = i; 10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * release objects. 10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * add() method call is not allowed anymore. 10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void freeze() { 11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta serialize(); 11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta indexPool.clear(); 11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param index 11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param value 11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public final void set(int index, T value) { 11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int j = getCompactIndex(index); 12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta serialize(j, value); 12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * returns the object for the given index 12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param index the index 12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param store an object to store the result 12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return 12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public final T get(int index, T store) { 13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta serialize(); 13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int j = getCompactIndex(index); 13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return deserialize(j, store); 13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * return a float array of serialized data 13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return 13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public final float[] getSerializedData() { 14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta serialize(); 14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return array; 14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * serialize this compact array 14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public final void serialize() { 14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (invalid) { 14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int newSize = indexPool.size() * getTupleSize(); 15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (array == null || Array.getLength(array) < newSize) { 15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta array = ensureCapacity(array, newSize); 15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (Map.Entry<T, Integer> entry : indexPool.entrySet()) { 15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int i = entry.getValue(); 15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta T obj = entry.getKey(); 15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta serialize(i, obj); 15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta invalid = false; 15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return compacted array's primitive size 16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected final int getSerializedSize() { 16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return Array.getLength(getSerializedData()); 16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Ensure the capacity for the given array and the given size 17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param arr the array 17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param size the size 17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return 17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected float[] ensureCapacity(float[] arr, int size) { 17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (arr == null) { 17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return new float[size]; 17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else if (arr.length >= size) { 17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return arr; 18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float[] tmp = new float[size]; 18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta System.arraycopy(arr, 0, tmp, 0, arr.length); 18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return tmp; 18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //return Arrays.copyOf(arr, size); 18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * retrun an array of indices for the given objects 19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param objArray 19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return 19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public final int[] getIndex(T... objArray) { 19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int[] index = new int[objArray.length]; 19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < index.length; i++) { 19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta T obj = objArray[i]; 19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta index[i] = obj != null ? indexPool.get(obj) : -1; 19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return index; 20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 20159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 20259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 20359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * returns the corresponding index in the compact array 20459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param objIndex 20559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return object index in the compacted object array 20659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 20759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public int getCompactIndex(int objIndex) { 20859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return index != null ? index[objIndex] : objIndex; 20959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 21059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 21159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 21259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return uncompressed object size 21359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 21459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public final int getTotalObjectSize() { 21559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta assert getSerializedSize() % getTupleSize() == 0; 21659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return index != null ? index.length : getSerializedSize() / getTupleSize(); 21759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 21859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 21959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 22059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return compressed object size 22159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 22259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public final int getCompactObjectSize() { 22359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta assert getSerializedSize() % getTupleSize() == 0; 22459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return getSerializedSize() / getTupleSize(); 22559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 22659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 22759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 22859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * decompress and return object array 22959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return decompress and return object array 23059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 23159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public final T[] toObjectArray() { 23259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta try { 23359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta T[] compactArr = (T[]) Array.newInstance(getElementClass(), getSerializedSize() / getTupleSize()); 23459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < compactArr.length; i++) { 23559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta compactArr[i] = getElementClass().newInstance(); 23659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta deserialize(i, compactArr[i]); 23759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 23859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 23959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta T[] objArr = (T[]) Array.newInstance(getElementClass(), getTotalObjectSize()); 24059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < objArr.length; i++) { 24159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int compactIndex = getCompactIndex(i); 24259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta objArr[i] = compactArr[compactIndex]; 24359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 24459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return objArr; 24559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } catch (Exception e) { 24659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return null; 24759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 24859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 24959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 25059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 25159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * serialize object 25259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param compactIndex compacted object index 25359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param store 25459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 25559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected abstract void serialize(int compactIndex, T store); 25659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 25759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 25859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * deserialize object 25959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param compactIndex compacted object index 26059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param store 26159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 26259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected abstract T deserialize(int compactIndex, T store); 26359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 26459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 26559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * serialized size of one object element 26659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 26759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected abstract int getTupleSize(); 26859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 26959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected abstract Class<T> getElementClass(); 27059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta} 271