tikhomirov@574: /* tikhomirov@574: * Copyright (c) 2013 TMate Software Ltd tikhomirov@574: * tikhomirov@574: * This program is free software; you can redistribute it and/or modify tikhomirov@574: * it under the terms of the GNU General Public License as published by tikhomirov@574: * the Free Software Foundation; version 2 of the License. tikhomirov@574: * tikhomirov@574: * This program is distributed in the hope that it will be useful, tikhomirov@574: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@574: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@574: * GNU General Public License for more details. tikhomirov@574: * tikhomirov@574: * For information on how to redistribute this software under tikhomirov@574: * the terms of a license other than GNU General Public License tikhomirov@574: * contact TMate Software at support@hg4j.com tikhomirov@574: */ tikhomirov@574: package org.tmatesoft.hg.internal; tikhomirov@574: tikhomirov@574: import java.io.ByteArrayOutputStream; tikhomirov@574: tikhomirov@574: /** tikhomirov@574: * Alternative to {@link ByteArrayOutputStream}, with extra operation that prevent extra byte[] instances tikhomirov@574: * tikhomirov@574: * @author Artem Tikhomirov tikhomirov@574: * @author TMate Software Ltd. tikhomirov@574: */ tikhomirov@574: public class ByteVector { tikhomirov@574: private byte[] data; tikhomirov@574: private int count; tikhomirov@574: private final int increment; tikhomirov@574: tikhomirov@574: tikhomirov@574: public ByteVector(int initialSize, int increment) { tikhomirov@574: data = new byte[initialSize]; tikhomirov@574: this.increment = increment; tikhomirov@574: } tikhomirov@574: tikhomirov@574: public void add(int b) { tikhomirov@574: if (count == data.length) { tikhomirov@574: byte[] newData = new byte[count + increment]; tikhomirov@574: System.arraycopy(data, 0, newData, 0, count); tikhomirov@574: data = newData; tikhomirov@574: } tikhomirov@574: data[count++] = (byte) b; tikhomirov@574: } tikhomirov@574: tikhomirov@574: public int size() { tikhomirov@574: return count; tikhomirov@574: } tikhomirov@574: tikhomirov@574: public void clear() { tikhomirov@574: count = 0; tikhomirov@574: } tikhomirov@574: tikhomirov@574: public boolean equalsTo(byte[] array) { tikhomirov@574: if (array == null || array.length != count) { tikhomirov@574: return false; tikhomirov@574: } tikhomirov@574: for (int i = 0; i < count; i++) { tikhomirov@574: if (data[i] != array[i]) { tikhomirov@574: return false; tikhomirov@574: } tikhomirov@574: } tikhomirov@574: return true; tikhomirov@574: } tikhomirov@574: tikhomirov@574: /** tikhomirov@574: * Copies content of this vector into destination array. tikhomirov@574: * @param destination array, greater or equal to {@link #size()} of the vector tikhomirov@574: */ tikhomirov@574: public void copyTo(byte[] destination) { tikhomirov@574: if (destination == null || destination.length < count) { tikhomirov@574: throw new IllegalArgumentException(); tikhomirov@574: } tikhomirov@574: System.arraycopy(data, 0, destination, 0, count); tikhomirov@574: } tikhomirov@574: tikhomirov@574: public byte[] toByteArray() { tikhomirov@574: byte[] rv = new byte[count]; tikhomirov@574: copyTo(rv); tikhomirov@574: return rv; tikhomirov@574: } tikhomirov@574: }