package com.ripple.core.coretypes; import com.ripple.core.coretypes.hash.Hash256; import com.ripple.core.fields.Field; import com.ripple.core.fields.Type; import com.ripple.core.fields.Vector256Field; import com.ripple.core.serialized.BinaryParser; import com.ripple.core.serialized.BytesSink; import com.ripple.core.serialized.SerializedType; import com.ripple.core.serialized.TypeTranslator; import com.ripple.encodings.common.B16; import org.json.JSONArray; import java.util.ArrayList; public class Vector256 extends ArrayList<Hash256> implements SerializedType { @Override public Object toJSON() { return toJSONArray(); } public JSONArray toJSONArray() { JSONArray array = new JSONArray(); for (Hash256 hash256 : this) { array.put(hash256.toString()); } return array; } @Override public byte[] toBytes() { return translate.toBytes(this); } @Override public String toHex() { return translate.toHex(this); } @Override public void toBytesSink(BytesSink to) { for (Hash256 hash256 : this) { hash256.toBytesSink(to); } } @Override public Type type() { return Type.Vector256; } /** * This method puts the last element in the removed elements slot, and * pops off the back, thus preserving contiguity but losing ordering. * @param ledgerIndex the ledger entry index to remove */ public boolean removeUnstable(Hash256 ledgerIndex) { int i = indexOf(ledgerIndex); if (i == -1) { return false; } int last = size() - 1; Hash256 lastIndex = get(last); set(i, lastIndex); remove(last); return true; } public static class Translator extends TypeTranslator<Vector256> { @Override public Vector256 fromParser(BinaryParser parser, Integer hint) { Vector256 vector256 = new Vector256(); if (hint == null) { hint = parser.size() - parser.pos(); } for (int i = 0; i < hint / 32; i++) { vector256.add(Hash256.translate.fromParser(parser)); } return vector256; } @Override public JSONArray toJSONArray(Vector256 obj) { return obj.toJSONArray(); } @Override public Vector256 fromJSONArray(JSONArray jsonArray) { Vector256 vector = new Vector256(); for (int i = 0; i < jsonArray.length(); i++) { String hex = jsonArray.getString(i); vector.add(new Hash256(B16.decode(hex))); } return vector; } } static public Translator translate = new Translator(); public Vector256(){} public static Vector256Field vector256Field(final Field f) { return new Vector256Field(){ @Override public Field getField() {return f;}}; } static public Vector256Field Indexes = vector256Field(Field.Indexes); static public Vector256Field Hashes = vector256Field(Field.Hashes); static public Vector256Field Features = vector256Field(Field.Features); }