ByteArrayStream.avt

Переключить прокрутку окна
Загрузить этот исходный код

/*
    Исходный код среды исполнения ПВТ-ОО.

    Этот исходный код является частью проекта ПВТ-ОО.

    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; }
}