package yuku.alkitabconverter.util;
import gnu.trove.map.hash.TIntIntHashMap;
import java.io.IOException;
import yuku.bintex.BintexReader;
public class DesktopShiftTb {
public static final String TAG = DesktopShiftTb.class.getSimpleName();
/** Map from ari of tb to ari of kjv, but the most significant byte is used for flag */
static TIntIntHashMap tbToFkjv = new TIntIntHashMap(2048);
static {
try {
BintexReader br = new BintexReader(DesktopShiftTb.class.getResourceAsStream("shift_tb_bt.bt"));
int n = br.readInt();
int from = 0;
int to = 0;
int flag = 0;
for (int i = 0; i < n; i++) {
int mode = br.readUint8();
if (mode == 2) { // both from and to increase by 1 and flag is 0
from++;
to++;
flag = 0;
} else if (mode == 1) { // absolute
from = br.readInt();
to = br.readInt();
flag = br.readUint8();
} else if (mode == 0) { // relative with flag
from += br.readUint8();
to += br.readUint8();
flag = br.readUint8();
}
tbToFkjv.put(from, (flag << 24) | to);
}
br.close();
} catch (IOException e) {
throw new RuntimeException("Failed to read shift_tb_bt");
}
}
/**
* Convert tb ari to kjv ari.
* Impl note: only kjv ari with flag 0x0 or 0x1. With other flags, the original ari is returned.
*/
public static int shiftFromTb(int ari) {
int fkjv = tbToFkjv.get(ari);
if (fkjv == 0) return ari; // original ari
int flag = fkjv >> 24;
if (flag != 0 && flag != 1) return ari; // original ari
return fkjv & 0xffffff;
}
public static IntArrayList shiftFromTb(IntArrayList aris) {
if (aris == null) return null;
IntArrayList res = new IntArrayList(aris.size());
for (int i = 0, len = aris.size(); i < len; i++) {
res.add(shiftFromTb(aris.get(i)));
}
return res;
}
}