/*
Исходный код среды исполнения ПВТ-ОО.
Этот исходный код является частью проекта ПВТ-ОО.
Copyright © 2021 Малик Разработчик
Это свободная программа: вы можете перераспространять её и/или
изменять её на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
в каком она была опубликована Фондом свободного программного обеспечения;
либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
Эта программа распространяется в надежде, что она может быть полезна,
но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
общественной лицензии GNU.
Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
вместе с этой программой. Если это не так, см.
<http://www.gnu.org/licenses/>.
*/
package avt.io;
import avt.io.extension.*;
import avt.lang.array.*;
public class ByteArrayStream(Object, Closeable, Extension, MarkExtension, Extendable, RawData, Cloneable, ByteStream, Measureable, MutableByteArray, ByteArray)
{
private int fldReaderMarkedPosition;
private int fldWriterMarkedPosition;
private final ByteArrayInputStream fldReader;
private final ByteArrayOutputStream fldWriter;
public () {
byte[] array = new byte[127];
ByteArrayInputStream source =
fldReader = new ByteArrayInputStream(array, 0, 0);
fldWriter = new ByteArrayOutputStream(source, source.fldLength);
}
public (byte[] array) {
ByteArrayInputStream source =
fldReader = new ByteArrayInputStream(array, Int.MAX_VALUE, 0);
fldWriter = new ByteArrayOutputStream(source, source.fldLength);
}
public (byte[] array, int length) {
ByteArrayInputStream source =
fldReader = new ByteArrayInputStream(array, length, 0);
fldWriter = new ByteArrayOutputStream(source, source.fldLength);
}
public (byte[] array, int length, int readPosition, int writePosition) {
ByteArrayInputStream source =
fldReader = new ByteArrayInputStream(array, length, readPosition);
fldWriter = new ByteArrayOutputStream(source, writePosition);
}
protected (ByteArrayInputStream reader, ByteArrayOutputStream writer) {
if(reader == null)
{
throw new NullPointerException("аргумент reader равен нулевой ссылке");
}
if(writer == null)
{
throw new NullPointerException("аргумент writer равен нулевой ссылке");
}
if(writer.fldSource != reader)
{
throw new IllegalArgumentException("аргумент writer не связан с аргументом reader");
}
fldReader = reader;
fldWriter = writer;
}
public void close() { }
public void reset() {
fldReader.seek(fldReaderMarkedPosition, SeekExtension.BEGIN);
fldWriter.seek(fldWriterMarkedPosition, SeekExtension.BEGIN);
}
public void mark(int readLimit) {
fldReaderMarkedPosition = fldReader.fldPosition;
fldWriterMarkedPosition = fldWriter.fldPosition;
}
public Extension[] getExtensions() { return new Extension[] { this }; }
public final long getPointer() { return fldReader.fldArray.getPointer(); }
public final long getLength() { return fldReader.fldArray.getLength(); }
public final Cloneable clone() { throw new CloneNotSupportedException("потоки ввода-вывода не поддерживают операцию клонирования"); }
public ByteArrayInputStream reader { read = fldReader }
public ByteArrayOutputStream writer { read = fldWriter }
public int readPosition { read = getReadPosition, write = setReadPosition }
public int writePosition { read = getWritePosition, write = setWritePosition }
public byte[] array { read = getArray, write = setArray }
public final int length { read = getArrayLength }
public final void operator []=(int index, byte value) { reader.fldArray[index] = value; }
public final byte operator [](int index) { return reader.fldArray[index]; }
private void setReadPosition(int readPosition) { fldReader.seek(readPosition, SeekExtension.BEGIN); }
private void setWritePosition(int writePosition) { fldWriter.seek(writePosition, SeekExtension.BEGIN); }
private void setArray(byte[] array) {
ByteArrayInputStream reader = fldReader;
ByteArrayOutputStream writer = fldWriter;
int newlen = array == null ? 0 : array.length;
int curlen = reader.fldLength;
reader.fldLength = writer.fldLength = newlen;
reader.fldArray = writer.fldArray = array;
if(newlen < curlen)
{
reader.notifyLengthChanged(newlen);
writer.notifyLengthChanged(newlen);
}
}
private int getArrayLength() { return fldReader.fldArray.length; }
private int getReadPosition() { return fldReader.fldPosition; }
private int getWritePosition() { return fldWriter.fldPosition; }
private byte[] getArray() { return fldReader.fldArray; }
}