diff --git a/core/src/com/riiablo/codec/excel/Excel.java b/core/src/com/riiablo/codec/excel/Excel.java index ea4c7472..c3d8cdfe 100644 --- a/core/src/com/riiablo/codec/excel/Excel.java +++ b/core/src/com/riiablo/codec/excel/Excel.java @@ -1,21 +1,7 @@ package com.riiablo.codec.excel; -import com.google.common.io.LittleEndianDataInputStream; - import android.support.annotation.CallSuper; - -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.files.FileHandle; -import com.badlogic.gdx.utils.GdxRuntimeException; -import com.badlogic.gdx.utils.IntMap; -import com.badlogic.gdx.utils.ObjectIntMap; -import com.badlogic.gdx.utils.ObjectMap; -import com.badlogic.gdx.utils.ObjectSet; -import com.badlogic.gdx.utils.StreamUtils; -import com.riiablo.util.ClassUtils; - -import org.apache.commons.io.IOUtils; - +import com.google.common.io.LittleEndianDataInputStream; import java.io.ByteArrayInputStream; import java.io.DataInput; import java.io.DataOutput; @@ -29,6 +15,19 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Iterator; +import org.apache.commons.io.IOUtils; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.GdxRuntimeException; +import com.badlogic.gdx.utils.IntMap; +import com.badlogic.gdx.utils.ObjectIntMap; +import com.badlogic.gdx.utils.ObjectMap; +import com.badlogic.gdx.utils.ObjectSet; +import com.badlogic.gdx.utils.StreamUtils; + +import com.riiablo.util.ClassUtils; public abstract class Excel implements Iterable { public static final String TAG = "Excel"; @@ -50,6 +49,8 @@ public abstract class Excel implements Iterable { private static final ObjectSet EMPTY_SET = new ObjectSet<>(); private static final ObjectIntMap EMPTY_MAP = new ObjectIntMap<>(); + public static boolean preserveOrder = false; + public static final ObjectSet EXPANSION = ObjectSet.with("Expansion"); @SuppressWarnings("unchecked") @@ -90,6 +91,7 @@ public abstract class Excel implements Iterable { ObjectIntMap STRING_TO_ID = EMPTY_MAP; IntMap entries = new IntMap<>(); + Array orderedEntries = new Array<>(Entry.class); public static T load(Class excelClass, FileHandle txt) { return load(excelClass, txt, Excel.emptySet()); @@ -318,6 +320,7 @@ public abstract class Excel implements Iterable { } } + if (preserveOrder) excel.orderedEntries.add(entry); putIndex(primaryKey, primaryKeyType, j++, index, excel, entry); } @@ -401,10 +404,20 @@ public abstract class Excel implements Iterable { Class binClass = Class.forName(binClassName); Method writeBin = binClass.getMethod("writeBin", entryClass, DataOutput.class); - int size = size(); - out.writeInt(size); - for (Entry entry : this) { - writeBin.invoke(null, entry, out); + if (preserveOrder) { + Entry[] items = orderedEntries.items; + int size = orderedEntries.size; + out.writeInt(size); + for (int i = 0; i < size; i++) { + Entry entry = items[i]; + writeBin.invoke(null, entry, out); + } + } else { + int size = size(); + out.writeInt(size); + for (Entry entry : this) { + writeBin.invoke(null, entry, out); + } } } catch (Throwable t) { throw new GdxRuntimeException("Failed to write bin for " + excelClass, t); diff --git a/tools/src/com/riiablo/codec/excel/BinGenerationTool.java b/tools/src/com/riiablo/codec/excel/BinGenerationTool.java index bc16c0d3..88abae23 100644 --- a/tools/src/com/riiablo/codec/excel/BinGenerationTool.java +++ b/tools/src/com/riiablo/codec/excel/BinGenerationTool.java @@ -33,6 +33,7 @@ public class BinGenerationTool extends ApplicationAdapter { @Override public void create() { + Excel.preserveOrder = true; try { Package pkg = Package.getPackage(args[0]); Gdx.app.log(TAG, "package=" + pkg.getName());