/*
Компилятор языка программирования
Объектно-ориентированный продвинутый векторный транслятор
Copyright © 2021, 2024 Малик Разработчик
Это свободная программа: вы можете перераспространять ее и/или изменять
ее на условиях Стандартной общественной лицензии GNU в том виде,
в каком она была опубликована Фондом свободного программного обеспечения;
либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
Эта программа распространяется в надежде, что она будет полезной,
но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Стандартной
общественной лицензии GNU.
Вы должны были получить копию Стандартной общественной лицензии GNU
вместе с этой программой. Если это не так, см.
<https://www.gnu.org/licenses/>.
*/
package ru.malik.elaborarer.avtoo.compiler;
import avt.lang.array.*;
public class StringArray(ru.malik.elaborarer.avtoo.lang.StringArray, Cloneable, Measureable, ObjectArray)
{
private long[] fldHashs;
public (): super(new String[0x0f]) {
long[] hashs = new long[0x0f];
fldArray.length = hashs.length = 0;
fldHashs = hashs;
}
public void append(String item) {
long[] hashs = fldHashs;
String[] array = fldArray;
int length = array.length;
if(length == array.capacity)
{
if(length == Int.MAX_VALUE)
{
throw new BufferTooLargeError(avt.lang.package.getResourceString("!error.buffer-too-large"));
}
int capacity = length << 1 | 1;
Array.copy(hashs, 0, fldHashs = hashs = new long[capacity], 0, length);
Array.copy(array, 0, fldArray = array = new String[capacity], 0, length);
}
hashs.length = array.length = length + 1;
hashs[length] = item == null ? 0 : item.hashCodeAsLong();
array[length] = item;
}
public boolean contains(String item) {
String[] array = fldArray;
if(item == null) return Array.indexOf(null, array, 0, 0) >= 0;
if(Array.indexOf(item, array, 0, 0) >= 0) return true;
for(long[] hashs = fldHashs, long hash = item.hashCodeAsLong(), int index = -1; (index = Array.indexOf(hash, hashs, index + 1, 0)) >= 0; ) if(item.equals(array[index])) return true;
return false;
}
}