{
private final Mnemonic[] values;
private final String[] stringValues;
- private final Map<String, Mnemonic> byText;
- private final int vectorLength;
+ private Map<String, Mnemonic> byText;
+ private int vectorLength;
+
+ public MnemonicFamily(String... names)
+ {
+ this(false, (int) Math.round(Math.ceil(Math.log(names.length) / Math.log(2))), names);
+ }
+
+ public MnemonicFamily(boolean reverse, String... names)
+ {
+ this(reverse, (int) Math.round(Math.ceil(Math.log(names.length) / Math.log(2))), names);
+ }
+
+ public MnemonicFamily(int bits, String... names)
+ {
+ this(false, bits, names);
+ }
+
+ public MnemonicFamily(boolean reverse, int bits, String... names)
+ {
+ this.values = new Mnemonic[names.length];
+ this.stringValues = new String[names.length];
+ BitVector[] values = new BitVector[names.length];
+ for(int i = 0; i < names.length; i++)
+ {
+ values[i] = BitVector.from(i, bits);
+ }
+
+ setup(names, values, reverse);
+ }
+
+ public MnemonicFamily(String[] names, long[] values, int bits)
+ {
+ this(false, names, values, bits);
+ }
+
+ public MnemonicFamily(boolean reverse, String[] names, long[] values, int bits)
+ {
+ if(names.length != values.length)
+ throw new IllegalArgumentException();
+ this.values = new Mnemonic[values.length];
+ this.stringValues = new String[values.length];
+ BitVector[] vectors = new BitVector[values.length];
+
+ for(int i = 0; i < vectors.length; i++)
+ {
+ vectors[i] = BitVector.from(values[i], bits);
+ }
+
+ setup(names, vectors, reverse);
+ }
+
+ public MnemonicFamily(String[] names, BitVector[] values)
+ {
+ this(false, names, values);
+ }
+
+ public MnemonicFamily(boolean reverse, String[] names, BitVector[] values)
+ {
+ if(names.length != values.length)
+ throw new IllegalArgumentException();
+ this.values = new Mnemonic[values.length];
+ this.stringValues = new String[values.length];
+
+ setup(names, values, reverse);
+ }
public MnemonicFamily(MnemonicPair... values)
+ {
+ this(false, values);
+ }
+
+ public MnemonicFamily(boolean reverse, MnemonicPair... values)
{
this.values = new Mnemonic[values.length];
this.stringValues = new String[values.length];
+ setup(values);
+ }
+
+ private void setup(String[] names, BitVector[] values, boolean reverse)
+ {
+ MnemonicPair[] mnemonics = new MnemonicPair[values.length];
+ for(int i = 0; i < values.length; i++)
+ mnemonics[i] = new MnemonicPair(names[i], reverse ? values[i].reverse() : values[i]);
+ setup(mnemonics);
+ }
+
+ private void setup(MnemonicPair[] values)
+ {
for(int i = 0; i < values.length; i++)
{
this.values[i] = createMnemonic(values[i], i);
if(values.length != byText.keySet().size())
throw new IllegalArgumentException("MnemonicFamily contains multiple Mnemonics with the same name!");
}
-
+
private Mnemonic createMnemonic(MnemonicPair mnemonicPair, int ordinal)
{
return new Mnemonic(mnemonicPair.name, mnemonicPair.value, this, ordinal);
return stringValues.clone();
}
-
-
@Override
public int hashCode()
{
{
return this == obj;
}
-
-
+
+ @Override
+ public Mnemonic parse(String toParse)
+ {
+ Mnemonic parsed = get(toParse);
+ if(parsed == null)
+ throw new UnknownMnemonicException(toParse);
+ return parsed;
+ }
public static class MnemonicPair
{