Vector.avt

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

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

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

    Copyright © 2021 Малик Разработчик

    Это свободная программа: вы можете перераспространять её и/или
    изменять её на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
    в каком она была опубликована Фондом свободного программного обеспечения;
    либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.

    Эта программа распространяется в надежде, что она может быть полезна,
    но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
    или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
    общественной лицензии GNU.

    Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
    вместе с этой программой. Если это не так, см.
    <http://www.gnu.org/licenses/>.
*/

package avt.util;

import avt.lang.array.*;
import platform.independent.streamformat.*;

public class Vector(Object, MutableDataHolder, DataHolder, Cloneable, Measureable, MutableObjectArray, ObjectArray)
{
    protected int fldLength;
    protected Object[] fldElements;

    public () { fldElements = new Object[15]; }

    public (int initialCapacity) { fldElements = new Object[initialCapacity <= 1 ? 1 : initialCapacity]; }

    public String toString() {
        StringBuilder result = new StringBuilder() + "[ ";
        for(Object[] elements = fldElements, int limit = fldLength - 1, int index = 0; index <= limit; index++)
        {
            result + elements[index];
            if(index < limit) result + ", ";
        }
        return (result + " ]").toString();
    }

    public void clear() {
        Array.fill(fldElements, 0, fldLength, null);
        fldLength = 0;
    }

    public boolean isEmpty() { return fldLength <= 0; }

    public Vector clone() {
        int length = fldLength;
        Vector result = new Vector(length);
        Array.copy(fldElements, 0, result.fldElements, 0, length);
        return result;
    }

    public void getElements(int beginIndex, int endIndex, MutableObjectArray dst, int offset) {
        int length = fldLength;
        if((beginIndex | endIndex) < 0 || beginIndex > length || endIndex > length || beginIndex > endIndex)
        {
            throw new IndexOutOfBoundsException("индекс элемента вектора выходит из диапазона");
        }
        if(dst == null)
        {
            throw new NullPointerException("аргумент dst равен нулевой ссылке");
        }
        if(dst == this)
        {
            throw new IllegalArgumentException("аргумент dst равен этому вектору");
        }
        Array.checkBounds(dst, offset, length = endIndex - beginIndex);
        for(Object[] elements = fldElements; length-- > 0; ) dst[offset++] = elements[beginIndex++];
    }

    public void copyInto(MutableObjectArray dst, int offset) {
        if(dst == null)
        {
            throw new NullPointerException("аргумент dst равен нулевой ссылке");
        }
        if(dst == this)
        {
            throw new IllegalArgumentException("аргумент dst равен этому вектору");
        }
        int length = fldLength;
        Array.checkBounds(dst, offset, length);
        for(Object[] elements = fldElements, int index = 0; length-- > 0; ) dst[offset++] = elements[index++];
    }

    public boolean contains(boolean element) { return findForward(element ? Boolean.TRUE : Boolean.FALSE, 0) >= 0; }

    public boolean contains(char element) { return findForward(new Char(element), 0) >= 0; }

    public boolean contains(byte element) { return findForward(new Byte(element), 0) >= 0; }

    public boolean contains(byte2 element) { return findForward(new Byte2(element), 0) >= 0; }

    public boolean contains(byte4 element) { return findForward(new Byte4(element), 0) >= 0; }

    public boolean contains(byte8 element) { return findForward(new Byte8(element), 0) >= 0; }

    public boolean contains(short element) { return findForward(new Short(element), 0) >= 0; }

    public boolean contains(short2 element) { return findForward(new Short2(element), 0) >= 0; }

    public boolean contains(short4 element) { return findForward(new Short4(element), 0) >= 0; }

    public boolean contains(short8 element) { return findForward(new Short8(element), 0) >= 0; }

    public boolean contains(int element) { return findForward(new Int(element), 0) >= 0; }

    public boolean contains(int2 element) { return findForward(new Int2(element), 0) >= 0; }

    public boolean contains(int4 element) { return findForward(new Int4(element), 0) >= 0; }

    public boolean contains(int8 element) { return findForward(new Int8(element), 0) >= 0; }

    public boolean contains(long element) { return findForward(new Long(element), 0) >= 0; }

    public boolean contains(long2 element) { return findForward(new Long2(element), 0) >= 0; }

    public boolean contains(long4 element) { return findForward(new Long4(element), 0) >= 0; }

    public boolean contains(long8 element) { return findForward(new Long8(element), 0) >= 0; }

    public boolean contains(Object element) { return findForward(element, 0) >= 0; }

    public int remove(boolean element) { return deleteElement(element ? Boolean.TRUE : Boolean.FALSE); }

    public int remove(char element) { return deleteElement(new Char(element)); }

    public int remove(byte element) { return deleteElement(new Byte(element)); }

    public int remove(byte2 element) { return deleteElement(new Byte2(element)); }

    public int remove(byte4 element) { return deleteElement(new Byte4(element)); }

    public int remove(byte8 element) { return deleteElement(new Byte8(element)); }

    public int remove(short element) { return deleteElement(new Short(element)); }

    public int remove(short2 element) { return deleteElement(new Short2(element)); }

    public int remove(short4 element) { return deleteElement(new Short4(element)); }

    public int remove(short8 element) { return deleteElement(new Short8(element)); }

    public int remove(int element) { return deleteElement(new Int(element)); }

    public int remove(int2 element) { return deleteElement(new Int2(element)); }

    public int remove(int4 element) { return deleteElement(new Int4(element)); }

    public int remove(int8 element) { return deleteElement(new Int8(element)); }

    public int remove(long element) { return deleteElement(new Long(element)); }

    public int remove(long2 element) { return deleteElement(new Long2(element)); }

    public int remove(long4 element) { return deleteElement(new Long4(element)); }

    public int remove(long8 element) { return deleteElement(new Long8(element)); }

    public int remove(Object element) { return deleteElement(element); }

    public int indexOf(boolean element) { return findForward(element ? Boolean.TRUE : Boolean.FALSE, 0); }

    public int indexOf(char element) { return findForward(new Char(element), 0); }

    public int indexOf(byte element) { return findForward(new Byte(element), 0); }

    public int indexOf(byte2 element) { return findForward(new Byte2(element), 0); }

    public int indexOf(byte4 element) { return findForward(new Byte4(element), 0); }

    public int indexOf(byte8 element) { return findForward(new Byte8(element), 0); }

    public int indexOf(short element) { return findForward(new Short(element), 0); }

    public int indexOf(short2 element) { return findForward(new Short2(element), 0); }

    public int indexOf(short4 element) { return findForward(new Short4(element), 0); }

    public int indexOf(short8 element) { return findForward(new Short8(element), 0); }

    public int indexOf(int element) { return findForward(new Int(element), 0); }

    public int indexOf(int2 element) { return findForward(new Int2(element), 0); }

    public int indexOf(int4 element) { return findForward(new Int4(element), 0); }

    public int indexOf(int8 element) { return findForward(new Int8(element), 0); }

    public int indexOf(long element) { return findForward(new Long(element), 0); }

    public int indexOf(long2 element) { return findForward(new Long2(element), 0); }

    public int indexOf(long4 element) { return findForward(new Long4(element), 0); }

    public int indexOf(long8 element) { return findForward(new Long8(element), 0); }

    public int indexOf(Object element) { return findForward(element, 0); }

    public int indexOf(boolean element, int startFromIndex) { return findForward(element ? Boolean.TRUE : Boolean.FALSE, startFromIndex); }

    public int indexOf(char element, int startFromIndex) { return findForward(new Char(element), startFromIndex); }

    public int indexOf(byte element, int startFromIndex) { return findForward(new Byte(element), startFromIndex); }

    public int indexOf(byte2 element, int startFromIndex) { return findForward(new Byte2(element), startFromIndex); }

    public int indexOf(byte4 element, int startFromIndex) { return findForward(new Byte4(element), startFromIndex); }

    public int indexOf(byte8 element, int startFromIndex) { return findForward(new Byte8(element), startFromIndex); }

    public int indexOf(short element, int startFromIndex) { return findForward(new Short(element), startFromIndex); }

    public int indexOf(short2 element, int startFromIndex) { return findForward(new Short2(element), startFromIndex); }

    public int indexOf(short4 element, int startFromIndex) { return findForward(new Short4(element), startFromIndex); }

    public int indexOf(short8 element, int startFromIndex) { return findForward(new Short8(element), startFromIndex); }

    public int indexOf(int element, int startFromIndex) { return findForward(new Int(element), startFromIndex); }

    public int indexOf(int2 element, int startFromIndex) { return findForward(new Int2(element), startFromIndex); }

    public int indexOf(int4 element, int startFromIndex) { return findForward(new Int4(element), startFromIndex); }

    public int indexOf(int8 element, int startFromIndex) { return findForward(new Int8(element), startFromIndex); }

    public int indexOf(long element, int startFromIndex) { return findForward(new Long(element), startFromIndex); }

    public int indexOf(long2 element, int startFromIndex) { return findForward(new Long2(element), startFromIndex); }

    public int indexOf(long4 element, int startFromIndex) { return findForward(new Long4(element), startFromIndex); }

    public int indexOf(long8 element, int startFromIndex) { return findForward(new Long8(element), startFromIndex); }

    public int indexOf(Object element, int startFromIndex) { return findForward(element, startFromIndex); }

    public int lastIndexOf(boolean element) { return findBackward(element ? Boolean.TRUE : Boolean.FALSE, Int.MAX_VALUE); }

    public int lastIndexOf(char element) { return findBackward(new Char(element), Int.MAX_VALUE); }

    public int lastIndexOf(byte element) { return findBackward(new Byte(element), Int.MAX_VALUE); }

    public int lastIndexOf(byte2 element) { return findBackward(new Byte2(element), Int.MAX_VALUE); }

    public int lastIndexOf(byte4 element) { return findBackward(new Byte4(element), Int.MAX_VALUE); }

    public int lastIndexOf(byte8 element) { return findBackward(new Byte8(element), Int.MAX_VALUE); }

    public int lastIndexOf(short element) { return findBackward(new Short(element), Int.MAX_VALUE); }

    public int lastIndexOf(short2 element) { return findBackward(new Short2(element), Int.MAX_VALUE); }

    public int lastIndexOf(short4 element) { return findBackward(new Short4(element), Int.MAX_VALUE); }

    public int lastIndexOf(short8 element) { return findBackward(new Short8(element), Int.MAX_VALUE); }

    public int lastIndexOf(int element) { return findBackward(new Int(element), Int.MAX_VALUE); }

    public int lastIndexOf(int2 element) { return findBackward(new Int2(element), Int.MAX_VALUE); }

    public int lastIndexOf(int4 element) { return findBackward(new Int4(element), Int.MAX_VALUE); }

    public int lastIndexOf(int8 element) { return findBackward(new Int8(element), Int.MAX_VALUE); }

    public int lastIndexOf(long element) { return findBackward(new Long(element), Int.MAX_VALUE); }

    public int lastIndexOf(long2 element) { return findBackward(new Long2(element), Int.MAX_VALUE); }

    public int lastIndexOf(long4 element) { return findBackward(new Long4(element), Int.MAX_VALUE); }

    public int lastIndexOf(long8 element) { return findBackward(new Long8(element), Int.MAX_VALUE); }

    public int lastIndexOf(Object element) { return findBackward(element, Int.MAX_VALUE); }

    public int lastIndexOf(boolean element, int startFromIndex) { return findBackward(element ? Boolean.TRUE : Boolean.FALSE, startFromIndex); }

    public int lastIndexOf(char element, int startFromIndex) { return findBackward(new Char(element), startFromIndex); }

    public int lastIndexOf(byte element, int startFromIndex) { return findBackward(new Byte(element), startFromIndex); }

    public int lastIndexOf(byte2 element, int startFromIndex) { return findBackward(new Byte2(element), startFromIndex); }

    public int lastIndexOf(byte4 element, int startFromIndex) { return findBackward(new Byte4(element), startFromIndex); }

    public int lastIndexOf(byte8 element, int startFromIndex) { return findBackward(new Byte8(element), startFromIndex); }

    public int lastIndexOf(short element, int startFromIndex) { return findBackward(new Short(element), startFromIndex); }

    public int lastIndexOf(short2 element, int startFromIndex) { return findBackward(new Short2(element), startFromIndex); }

    public int lastIndexOf(short4 element, int startFromIndex) { return findBackward(new Short4(element), startFromIndex); }

    public int lastIndexOf(short8 element, int startFromIndex) { return findBackward(new Short8(element), startFromIndex); }

    public int lastIndexOf(int element, int startFromIndex) { return findBackward(new Int(element), startFromIndex); }

    public int lastIndexOf(int2 element, int startFromIndex) { return findBackward(new Int2(element), startFromIndex); }

    public int lastIndexOf(int4 element, int startFromIndex) { return findBackward(new Int4(element), startFromIndex); }

    public int lastIndexOf(int8 element, int startFromIndex) { return findBackward(new Int8(element), startFromIndex); }

    public int lastIndexOf(long element, int startFromIndex) { return findBackward(new Long(element), startFromIndex); }

    public int lastIndexOf(long2 element, int startFromIndex) { return findBackward(new Long2(element), startFromIndex); }

    public int lastIndexOf(long4 element, int startFromIndex) { return findBackward(new Long4(element), startFromIndex); }

    public int lastIndexOf(long8 element, int startFromIndex) { return findBackward(new Long8(element), startFromIndex); }

    public int lastIndexOf(Object element, int startFromIndex) { return findBackward(element, startFromIndex); }

    public Object[] toObjectArray() {
        int length = fldLength;
        Object[] result = new Object[length];
        Array.copy(fldElements, 0, result, 0, length);
        return result;
    }

    public Object firstElement() {
        if(fldLength < 1)
        {
            throw new EmptyVectorException("вектор пуст");
        }
        return fldElements[0];
    }

    public Object lastElement() {
        int length = fldLength;
        if(length-- < 1)
        {
            throw new EmptyVectorException("вектор пуст");
        }
        return fldElements[length];
    }

    public Vector trimToLength() {
        trim();
        return this;
    }

    public Vector insert(int index, boolean src) {
        insertElement(index, src ? Boolean.TRUE : Boolean.FALSE);
        return this;
    }

    public Vector insert(int index, char src) {
        insertElement(index, new Char(src));
        return this;
    }

    public Vector insert(int index, byte src) {
        insertElement(index, new Byte(src));
        return this;
    }

    public Vector insert(int index, byte2 src) {
        insertElement(index, new Byte2(src));
        return this;
    }

    public Vector insert(int index, byte4 src) {
        insertElement(index, new Byte4(src));
        return this;
    }

    public Vector insert(int index, byte8 src) {
        insertElement(index, new Byte8(src));
        return this;
    }

    public Vector insert(int index, short src) {
        insertElement(index, new Short(src));
        return this;
    }

    public Vector insert(int index, short2 src) {
        insertElement(index, new Short2(src));
        return this;
    }

    public Vector insert(int index, short4 src) {
        insertElement(index, new Short4(src));
        return this;
    }

    public Vector insert(int index, short8 src) {
        insertElement(index, new Short8(src));
        return this;
    }

    public Vector insert(int index, int src) {
        insertElement(index, new Int(src));
        return this;
    }

    public Vector insert(int index, int2 src) {
        insertElement(index, new Int2(src));
        return this;
    }

    public Vector insert(int index, int4 src) {
        insertElement(index, new Int4(src));
        return this;
    }

    public Vector insert(int index, int8 src) {
        insertElement(index, new Int8(src));
        return this;
    }

    public Vector insert(int index, long src) {
        insertElement(index, new Long(src));
        return this;
    }

    public Vector insert(int index, long2 src) {
        insertElement(index, new Long2(src));
        return this;
    }

    public Vector insert(int index, long4 src) {
        insertElement(index, new Long4(src));
        return this;
    }

    public Vector insert(int index, long8 src) {
        insertElement(index, new Long8(src));
        return this;
    }

    public Vector insert(int index, float src) {
        insertElement(index, new Float(src));
        return this;
    }

    public Vector insert(int index, float2 src) {
        insertElement(index, new Float2(src));
        return this;
    }

    public Vector insert(int index, float4 src) {
        insertElement(index, new Float4(src));
        return this;
    }

    public Vector insert(int index, float8 src) {
        insertElement(index, new Float8(src));
        return this;
    }

    public Vector insert(int index, double src) {
        insertElement(index, new Double(src));
        return this;
    }

    public Vector insert(int index, double2 src) {
        insertElement(index, new Double2(src));
        return this;
    }

    public Vector insert(int index, double4 src) {
        insertElement(index, new Double4(src));
        return this;
    }

    public Vector insert(int index, double8 src) {
        insertElement(index, new Double8(src));
        return this;
    }

    public Vector insert(int index, real src) {
        insertElement(index, new Real(src));
        return this;
    }

    public Vector insert(int index, Object src) {
        insertElement(index, src);
        return this;
    }

    public Vector inserta(int index, ObjectArray src) {
        if(src != null) insertArray(index, src, 0, src.length);
        return this;
    }

    public Vector inserta(int index, ObjectArray src, int offset, int length) {
        if(src != null)
        {
            int2 bounds = Array.intersectBounds(src, offset, length);
            insertArray(index, src, bounds[0], bounds[1]);
        }
        return this;
    }

    public Vector insertf(int index, String form, ObjectArray data) {
        insertElement(index, String.format(form, data));
        return this;
    }

    public Vector delete(int beginIndex, int endIndex) {
        deletePortion(beginIndex, endIndex);
        return this;
    }

    public Vector delete(int index) {
        deletePortion(index, index + 1);
        return this;
    }

    public Vector append(boolean src) {
        appendElement(src ? Boolean.TRUE : Boolean.FALSE);
        return this;
    }

    public Vector append(char src) {
        appendElement(new Char(src));
        return this;
    }

    public Vector append(byte src) {
        appendElement(new Byte(src));
        return this;
    }

    public Vector append(byte2 src) {
        appendElement(new Byte2(src));
        return this;
    }

    public Vector append(byte4 src) {
        appendElement(new Byte4(src));
        return this;
    }

    public Vector append(byte8 src) {
        appendElement(new Byte8(src));
        return this;
    }

    public Vector append(short src) {
        appendElement(new Short(src));
        return this;
    }

    public Vector append(short2 src) {
        appendElement(new Short2(src));
        return this;
    }

    public Vector append(short4 src) {
        appendElement(new Short4(src));
        return this;
    }

    public Vector append(short8 src) {
        appendElement(new Short8(src));
        return this;
    }

    public Vector append(int src) {
        appendElement(new Int(src));
        return this;
    }

    public Vector append(int2 src) {
        appendElement(new Int2(src));
        return this;
    }

    public Vector append(int4 src) {
        appendElement(new Int4(src));
        return this;
    }

    public Vector append(int8 src) {
        appendElement(new Int8(src));
        return this;
    }

    public Vector append(long src) {
        appendElement(new Long(src));
        return this;
    }

    public Vector append(long2 src) {
        appendElement(new Long2(src));
        return this;
    }

    public Vector append(long4 src) {
        appendElement(new Long4(src));
        return this;
    }

    public Vector append(long8 src) {
        appendElement(new Long8(src));
        return this;
    }

    public Vector append(float src) {
        appendElement(new Float(src));
        return this;
    }

    public Vector append(float2 src) {
        appendElement(new Float2(src));
        return this;
    }

    public Vector append(float4 src) {
        appendElement(new Float4(src));
        return this;
    }

    public Vector append(float8 src) {
        appendElement(new Float8(src));
        return this;
    }

    public Vector append(double src) {
        appendElement(new Double(src));
        return this;
    }

    public Vector append(double2 src) {
        appendElement(new Double2(src));
        return this;
    }

    public Vector append(double4 src) {
        appendElement(new Double4(src));
        return this;
    }

    public Vector append(double8 src) {
        appendElement(new Double8(src));
        return this;
    }

    public Vector append(real src) {
        appendElement(new Real(src));
        return this;
    }

    public Vector append(Object src) {
        appendElement(src);
        return this;
    }

    public Vector appenda(ObjectArray src) {
        if(src != null) appendArray(src, 0, src.length);
        return this;
    }

    public Vector appenda(ObjectArray src, int offset, int length) {
        if(src != null)
        {
            int2 bounds = Array.intersectBounds(src, offset, length);
            appendArray(src, bounds[0], bounds[1]);
        }
        return this;
    }

    public Vector appendf(String form, ObjectArray data) {
        appendElement(String.format(form, data));
        return this;
    }

    public Enumeration enumerateForward() { return new VectorEnumeration(this, false); }

    public Enumeration enumerateReverse() { return new VectorEnumeration(this, true); }

    public int length { read = fldLength, write = setLength }

    public final int capacity { read = getCapacity }

    public void operator []=(int index, Object element) {
        if(index < 0 || index >= fldLength)
        {
            throw new IndexOutOfBoundsException("индекс элемента вектора выходит из диапазона");
        }
        fldElements[index] = element;
    }

    public Object operator [](int index) {
        if(index < 0 || index >= fldLength)
        {
            throw new IndexOutOfBoundsException("индекс элемента вектора выходит из диапазона");
        }
        return fldElements[index];
    }

    public final Vector operator +(boolean src) { return append(src); }

    public final Vector operator +(char src) { return append(src); }

    public final Vector operator +(byte src) { return append(src); }

    public final Vector operator +(byte2 src) { return append(src); }

    public final Vector operator +(byte4 src) { return append(src); }

    public final Vector operator +(byte8 src) { return append(src); }

    public final Vector operator +(short src) { return append(src); }

    public final Vector operator +(short2 src) { return append(src); }

    public final Vector operator +(short4 src) { return append(src); }

    public final Vector operator +(short8 src) { return append(src); }

    public final Vector operator +(int src) { return append(src); }

    public final Vector operator +(int2 src) { return append(src); }

    public final Vector operator +(int4 src) { return append(src); }

    public final Vector operator +(int8 src) { return append(src); }

    public final Vector operator +(long src) { return append(src); }

    public final Vector operator +(long2 src) { return append(src); }

    public final Vector operator +(long4 src) { return append(src); }

    public final Vector operator +(long8 src) { return append(src); }

    public final Vector operator +(float src) { return append(src); }

    public final Vector operator +(float2 src) { return append(src); }

    public final Vector operator +(float4 src) { return append(src); }

    public final Vector operator +(float8 src) { return append(src); }

    public final Vector operator +(double src) { return append(src); }

    public final Vector operator +(double2 src) { return append(src); }

    public final Vector operator +(double4 src) { return append(src); }

    public final Vector operator +(double8 src) { return append(src); }

    public final Vector operator +(real src) { return append(src); }

    public final Vector operator +(Object src) { return append(src); }

    protected void trim() {
        int length = fldLength;
        Object[] elements = fldElements;
        if(length < elements.length)
        {
            Array.copy(elements, 0, fldElements = new Object[length], 0, length);
        }
    }

    protected void setLength(int newLength) {
        if(newLength < 0)
        {
            throw new NegativeArrayLengthException("длина не может быть отрицательной");
        }
        int length = fldLength;
        Object[] elements = fldElements;
        if(newLength > elements.length) elements = madeLarger(newLength);
        if(newLength > length) Array.fill(elements, length, newLength - length, null);
        fldLength = newLength;
    }

    protected void insertArray(int index, ObjectArray src, int offset, int length) {
        if(length > 0)
        {
            int currentLength = fldLength;
            int newLength = currentLength + length;
            Object[] elements = madeLarger(newLength);
            if(index < 0) index = 0;
            if(index > currentLength) index = currentLength;
            Array.copy(elements, index, elements, index + length, currentLength - index);
            if(src instanceof Object[])
            {
                Array.copy((Object[]) src, offset, elements, index, length);
            } else
            {
                while(length-- > 0) elements[index++] = src[offset++];
            }
            fldLength = newLength;
        }
    }

    protected void insertElement(int index, Object src) {
        int currentLength = fldLength;
        int newLength = currentLength + 1;
        Object[] elements = madeLarger(newLength);
        if(index < 0) index = 0;
        if(index > currentLength) index = currentLength;
        Array.copy(elements, index, elements, index + 1, currentLength - index);
        elements[index] = src;
        fldLength = newLength;
    }

    protected void appendArray(ObjectArray src, int offset, int length) {
        if(length > 0)
        {
            int currentLength = fldLength;
            int newLength = currentLength + length;
            Object[] elements = madeLarger(newLength);
            if(src instanceof Object[])
            {
                Array.copy((Object[]) src, offset, elements, currentLength, length);
            } else
            {
                while(length-- > 0) elements[currentLength++] = src[offset++];
            }
            fldLength = newLength;
        }
    }

    protected void appendElement(Object src) {
        int currentLength = fldLength;
        int newLength = currentLength + 1;
        Object[] elements = madeLarger(newLength);
        elements[currentLength] = src;
        fldLength = newLength;
    }

    protected void deletePortion(int beginIndex, int endIndex) {
        int length = fldLength;
        if((beginIndex | endIndex) < 0 || beginIndex > length || endIndex > length || beginIndex > endIndex)
        {
            throw new IndexOutOfBoundsException("индекс элемента вектора выходит из диапазона");
        }
        Object[] elements = fldElements;
        int quantity = endIndex - beginIndex;
        Array.copy(elements, endIndex, elements, beginIndex, length - endIndex);
        Array.fill(elements, length -= quantity, quantity, null);
        fldLength = length;
    }

    protected int deleteElement(Object element) {
        int length = fldLength;
        if(length > 0)
        {
            int index = -1;
            Object[] elements = fldElements;
            if(element == null)
            {
                index = Array.indexOf(null, elements, 0, length);
            } else
            {
                for(int i = 0; i < length; i++) if(element.equals(elements[i]))
                {
                    index = i;
                    break;
                }
            }
            if(index >= 0)
            {
                Array.copy(elements, index + 1, elements, index, --length - index);
                elements[fldLength = length] = null;
            }
            return index;
        }
        return -1;
    }

    protected int findForward(Object element, int startFromIndex) {
        int length = fldLength;
        if(startFromIndex < 0) startFromIndex = 0;
        if(startFromIndex < length)
        {
            Object[] elements = fldElements;
            if(element == null)
            {
                return Array.indexOf(null, elements, 0, length - startFromIndex);
            } else
            {
                for(int index = startFromIndex; index < length; index++) if(element.equals(elements[index])) return index;
            }
        }
        return -1;
    }

    protected int findBackward(Object element, int startFromIndex) {
        int limit = fldLength - 1;
        if(startFromIndex > limit) startFromIndex = limit;
        if(startFromIndex > -1)
        {
            Object[] elements = fldElements;
            if(element == null)
            {
                return Array.lastIndexOf(null, elements, startFromIndex, startFromIndex + 1);
            } else
            {
                for(int index = startFromIndex; index > -1; index--) if(element.equals(elements[index])) return index;
            }
        }
        return -1;
    }

    protected Object elementAt(int index) { return index < 0 || index >= fldLength ? null : fldElements[index]; }

    protected final Object[] madeLarger(int minimumCapacity) {
        if(minimumCapacity < 0)
        {
            throw new BufferTooLargeError("объём буфера очень велик");
        }
        Object[] elements = fldElements;
        int currentCapacity = elements.length;
        if(currentCapacity < minimumCapacity)
        {
            int newCapacity = currentCapacity >= (Int.MAX_VALUE >> 1) ? Int.MAX_VALUE : (currentCapacity << 1) + 1;
            if(newCapacity < minimumCapacity) newCapacity = minimumCapacity;
            Array.copy(elements, 0, fldElements = elements = new Object[newCapacity], 0, currentCapacity);
        }
        return elements;
    }

    private int getCapacity() { return fldElements.length; }
}

class VectorEnumeration(Enumeration)
{
    private int fldIndex;
    private final boolean fldReverse;
    private final Vector fldVector;

    public (Vector vector, boolean reverse) {
        fldIndex = reverse ? vector.length - 1 : 0;
        fldReverse = reverse;
        fldVector = vector;
    }

    public boolean hasMoreElements() { return fldReverse ? fldIndex >= 0 : fldIndex < fldVector.length; }

    public Object nextElement() {
        int index = fldIndex;
        Vector vector = fldVector;
        if(index < 0 || index >= vector.length) return super.nextElement();
        Object result = vector.elementAt(index);
        fldIndex = fldReverse ? index - 1 : index + 1;
        return result;
    }
}