initial commit
This commit is contained in:
commit
e49993f88a
31
.gitignore
vendored
Normal file
31
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
### IntelliJ IDEA ###
|
||||
out/
|
||||
!**/src/main/**/out/
|
||||
!**/src/test/**/out/
|
||||
|
||||
### Eclipse ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
bin/
|
||||
!**/src/main/**/bin/
|
||||
!**/src/test/**/bin/
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
|
||||
### Mac OS ###
|
||||
.DS_Store
|
||||
|
||||
.idea
|
||||
11
GeneralUtils.iml
Normal file
11
GeneralUtils.iml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="JAVA_MODULE" version="4">
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
162
src/dev/asdf00/general/utils/list/PrimitiveList.java
Normal file
162
src/dev/asdf00/general/utils/list/PrimitiveList.java
Normal file
|
|
@ -0,0 +1,162 @@
|
|||
package dev.asdf00.general.utils.list;
|
||||
|
||||
import dev.asdf00.general.utils.list.internal.AbstractBaseList;
|
||||
import dev.asdf00.general.utils.list.internal.ByteList;
|
||||
|
||||
public abstract class PrimitiveList<T> extends AbstractBaseList<T> {
|
||||
|
||||
public static <T> PrimitiveList<T> create(Class<T> type) {
|
||||
return create(type, 8);
|
||||
}
|
||||
|
||||
public static <T> PrimitiveList<T> create(Class<T> boxedType, int initial) {
|
||||
if (Byte.class == boxedType) {
|
||||
return (PrimitiveList<T>) new ByteList(initial);
|
||||
} else if (Short.class.equals(boxedType)) {
|
||||
return null;
|
||||
} else if (Integer.class.equals(boxedType)) {
|
||||
return null;
|
||||
} else if (Long.class.equals(boxedType)) {
|
||||
return null;
|
||||
} else if (Float.class.equals(boxedType)) {
|
||||
return null;
|
||||
} else if (Double.class.equals(boxedType)) {
|
||||
return null;
|
||||
} else if (Character.class.equals(boxedType)) {
|
||||
return null;
|
||||
} else if (Boolean.class.equals(boxedType)) {
|
||||
return null;
|
||||
} else {
|
||||
throw new IllegalArgumentException("%s is not a boxed type!".formatted(boxedType));
|
||||
}
|
||||
}
|
||||
|
||||
public void addByte(byte value) {
|
||||
throw new UnsupportedOperationException("this list is not of type Byte!");
|
||||
}
|
||||
|
||||
public void addShort(short value) {
|
||||
throw new UnsupportedOperationException("this list is not of type Short!");
|
||||
}
|
||||
|
||||
public void addInt(int value) {
|
||||
throw new UnsupportedOperationException("this list is not of type Integer!");
|
||||
}
|
||||
|
||||
public void addLong(long value) {
|
||||
throw new UnsupportedOperationException("this list is not of type Long!");
|
||||
}
|
||||
|
||||
public void addFloat(float value) {
|
||||
throw new UnsupportedOperationException("this list is not of type Float!");
|
||||
}
|
||||
|
||||
public void addDouble(double value) {
|
||||
throw new UnsupportedOperationException("this list is not of type Double!");
|
||||
}
|
||||
|
||||
public void addChar(char value) {
|
||||
throw new UnsupportedOperationException("this list is not of type Character!");
|
||||
}
|
||||
|
||||
public void addBoolean(boolean value) {
|
||||
throw new UnsupportedOperationException("this list is not of type Boolean!");
|
||||
}
|
||||
|
||||
public byte getByte(int index) {
|
||||
throw new UnsupportedOperationException("this list is not of type Byte!");
|
||||
}
|
||||
|
||||
public short getShort(int index) {
|
||||
throw new UnsupportedOperationException("this list is not of type Short!");
|
||||
}
|
||||
|
||||
public int getInt(int index) {
|
||||
throw new UnsupportedOperationException("this list is not of type Integer!");
|
||||
}
|
||||
|
||||
public long getLong(int index) {
|
||||
throw new UnsupportedOperationException("this list is not of type Long!");
|
||||
}
|
||||
|
||||
public float getFloat(int index) {
|
||||
throw new UnsupportedOperationException("this list is not of type Float!");
|
||||
}
|
||||
|
||||
public double getDouble(int index) {
|
||||
throw new UnsupportedOperationException("this list is not of type Double!");
|
||||
}
|
||||
|
||||
public char getChar(int index) {
|
||||
throw new UnsupportedOperationException("this list is not of type Character!");
|
||||
}
|
||||
|
||||
public boolean getBoolean(int index) {
|
||||
throw new UnsupportedOperationException("this list is not of type Boolean!");
|
||||
}
|
||||
public byte[] toByteArray() {
|
||||
throw new UnsupportedOperationException("this list is not of type Byte!");
|
||||
}
|
||||
|
||||
public short[] toShortArray() {
|
||||
throw new UnsupportedOperationException("this list is not of type Short!");
|
||||
}
|
||||
|
||||
public int[] toIntArray() {
|
||||
throw new UnsupportedOperationException("this list is not of type Integer!");
|
||||
}
|
||||
|
||||
public long[] toLongArray() {
|
||||
throw new UnsupportedOperationException("this list is not of type Long!");
|
||||
}
|
||||
|
||||
public float[] toFloatArray() {
|
||||
throw new UnsupportedOperationException("this list is not of type Float!");
|
||||
}
|
||||
|
||||
public double[] toDoubleArray() {
|
||||
throw new UnsupportedOperationException("this list is not of type Double!");
|
||||
}
|
||||
|
||||
public char[] toCharArray() {
|
||||
throw new UnsupportedOperationException("this list is not of type Character!");
|
||||
}
|
||||
|
||||
public boolean[] toBooleanArray() {
|
||||
throw new UnsupportedOperationException("this list is not of type Boolean!");
|
||||
}
|
||||
|
||||
public byte[] finalizeAsByteArray() {
|
||||
throw new UnsupportedOperationException("this list is not of type Byte!");
|
||||
}
|
||||
|
||||
public short[] finalizeAsShortArray() {
|
||||
throw new UnsupportedOperationException("this list is not of type Short!");
|
||||
}
|
||||
|
||||
public int[] finalizeAsIntArray() {
|
||||
throw new UnsupportedOperationException("this list is not of type Integer!");
|
||||
}
|
||||
|
||||
public long[] finalizeAsLongArray() {
|
||||
throw new UnsupportedOperationException("this list is not of type Long!");
|
||||
}
|
||||
|
||||
public float[] finalizeAsFloatArray() {
|
||||
throw new UnsupportedOperationException("this list is not of type Float!");
|
||||
}
|
||||
|
||||
public double[] finalizeAsDoubleArray() {
|
||||
throw new UnsupportedOperationException("this list is not of type Double!");
|
||||
}
|
||||
|
||||
public char[] finalizeAsCharArray() {
|
||||
throw new UnsupportedOperationException("this list is not of type Character!");
|
||||
}
|
||||
|
||||
public boolean[] finalizeAsBooleanArray() {
|
||||
throw new UnsupportedOperationException("this list is not of type Boolean!");
|
||||
}
|
||||
|
||||
public abstract boolean isFinalized();
|
||||
}
|
||||
489
src/dev/asdf00/general/utils/list/internal/AbstractBaseList.java
Normal file
489
src/dev/asdf00/general/utils/list/internal/AbstractBaseList.java
Normal file
|
|
@ -0,0 +1,489 @@
|
|||
package dev.asdf00.general.utils.list.internal;
|
||||
|
||||
import sun.misc.Unsafe;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.*;
|
||||
|
||||
public abstract class AbstractBaseList<T> implements List<T> {
|
||||
|
||||
static final Unsafe UNSAFE;
|
||||
static final long OFFSET_LEN;
|
||||
|
||||
static {
|
||||
try {
|
||||
Field f = Unsafe.class.getDeclaredField("theUnsafe");
|
||||
f.setAccessible(true);
|
||||
UNSAFE = (Unsafe) f.get(null);
|
||||
// OFFSET_LEN = sizeof(mark-word) + sizeof(klass-ptr)
|
||||
OFFSET_LEN = UNSAFE.addressSize() + (UNSAFE.addressSize() == 8 && System.getProperty("java.vm.compressedOopsMode") == null ? 8 : 4);
|
||||
} catch (NoSuchFieldException | IllegalAccessException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
protected int size;
|
||||
protected int modCnt;
|
||||
|
||||
@Override
|
||||
public Object[] toArray() {
|
||||
return toArray(Object[]::new);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T1> T1[] toArray(T1[] a) {
|
||||
return toArray(a, 0, size);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int size() {
|
||||
return size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return size() < 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean contains(Object o) {
|
||||
return indexOf(o) >= 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<T> iterator() {
|
||||
return listIterator();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean containsAll(Collection<?> c) {
|
||||
for (Object o : c) {
|
||||
if (!contains(o)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public T remove(int index) {
|
||||
Objects.checkIndex(index, size);
|
||||
return remove(index, 0, size);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean remove(Object o) {
|
||||
int index = indexOf(o);
|
||||
if (index >= 0) {
|
||||
remove(index);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean removeAll(Collection<?> c) {
|
||||
boolean changed = false;
|
||||
for (Object o : c) {
|
||||
changed = remove(o) || changed;
|
||||
}
|
||||
return changed;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean retainAll(Collection<?> c) {
|
||||
boolean changed = false;
|
||||
ListIterator<T> itr = listIterator();
|
||||
while (itr.hasNext()) {
|
||||
if (c.contains(itr.next())) {
|
||||
itr.remove();
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
return changed;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int indexOf(Object o) {
|
||||
return indexOf(o, 0, size);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int lastIndexOf(Object o) {
|
||||
return lastIndexOf(o, 0, size);
|
||||
}
|
||||
|
||||
@Override
|
||||
public T set(int index, T element) {
|
||||
Objects.checkIndex(index, size);
|
||||
return directSet(index, element);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean add(T t) {
|
||||
directSet(size++, t);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListIterator<T> listIterator() {
|
||||
return new ListItr<>(this, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListIterator<T> listIterator(int index) {
|
||||
Objects.checkIndex(index, size);
|
||||
return new ListItr<>(this, index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<T> subList(int fromIndex, int toIndex) {
|
||||
Objects.checkIndex(fromIndex, size);
|
||||
Objects.checkIndex(fromIndex, toIndex);
|
||||
int len = (toIndex - fromIndex) + 1;
|
||||
if (len < 0) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
return new SubList<>(this, fromIndex, len);
|
||||
}
|
||||
|
||||
protected abstract <T1> T1[] toArray(T1[] a, int start, int len);
|
||||
|
||||
protected abstract T remove(Object o, int start, int len);
|
||||
|
||||
protected abstract int indexOf(Object o, int start, int len);
|
||||
|
||||
protected abstract int lastIndexOf(Object o, int start, int len);
|
||||
|
||||
protected abstract T directSet(int index, T element);
|
||||
|
||||
protected abstract void removeRange(int start, int len);
|
||||
|
||||
|
||||
private static class ListItr<E> implements ListIterator<E> {
|
||||
|
||||
private final AbstractBaseList<E> base;
|
||||
private int modCnt;
|
||||
private int cur;
|
||||
private int last;
|
||||
|
||||
public ListItr(AbstractBaseList base, int start) {
|
||||
this.base = base;
|
||||
modCnt = base.modCnt;
|
||||
cur = start;
|
||||
last = -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return cur < base.size;
|
||||
}
|
||||
|
||||
@Override
|
||||
public E next() {
|
||||
checkConcurrentModification();
|
||||
if (!hasNext()) {
|
||||
throw new IndexOutOfBoundsException();
|
||||
}
|
||||
last = cur;
|
||||
return base.get(cur++);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPrevious() {
|
||||
return cur > 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public E previous() {
|
||||
checkConcurrentModification();
|
||||
if (!hasPrevious()) {
|
||||
throw new IndexOutOfBoundsException();
|
||||
}
|
||||
last = --cur;
|
||||
return base.get(cur);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int nextIndex() {
|
||||
return cur;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int previousIndex() {
|
||||
return cur - 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {
|
||||
checkConcurrentModification();
|
||||
Objects.checkIndex(cur, base.size);
|
||||
if (last == -1) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
modCnt++;
|
||||
base.remove(--cur);
|
||||
last = -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(E e) {
|
||||
checkConcurrentModification();
|
||||
Objects.checkIndex(cur, base.size);
|
||||
if (last == -1) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
modCnt++;
|
||||
base.set(cur, e);
|
||||
last = -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add(E e) {
|
||||
checkConcurrentModification();
|
||||
Objects.checkIndex(cur, base.size);
|
||||
if (last == -1) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
modCnt++;
|
||||
base.add(cur, e);
|
||||
last = -1;
|
||||
}
|
||||
|
||||
private void checkConcurrentModification() {
|
||||
if (base.modCnt != modCnt) {
|
||||
throw new ConcurrentModificationException();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static class SubList<E> extends AbstractBaseList<E> {
|
||||
|
||||
private final AbstractBaseList<E> base;
|
||||
private final int start;
|
||||
|
||||
public SubList(AbstractBaseList<E> base, int start, int size) {
|
||||
this.base = base;
|
||||
this.start = start;
|
||||
this.size = size;
|
||||
modCnt = base.modCnt;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addAll(Collection<? extends E> c) {
|
||||
for (E e : c) {
|
||||
add(e);
|
||||
}
|
||||
return c.size() > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addAll(int index, Collection<? extends E> c) {
|
||||
Objects.checkIndex(index, size);
|
||||
int i = 0;
|
||||
for (E e : c) {
|
||||
add(i, e);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
checkConcurrentModification();
|
||||
modCnt++;
|
||||
base.removeRange(start, size);
|
||||
size = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public E get(int index) {
|
||||
checkConcurrentModification();
|
||||
Objects.checkIndex(index, size);
|
||||
return base.get(start + index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add(int index, E element) {
|
||||
checkConcurrentModification();
|
||||
Objects.checkIndex(index, size);
|
||||
modCnt++;
|
||||
base.add(start + index, element);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListIterator<E> listIterator() {
|
||||
return new SubListItr<>(base, start, start, start + (size - 1));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListIterator<E> listIterator(int index) {
|
||||
Objects.checkIndex(index, size);
|
||||
return new SubListItr<>(base, start + index, start, start + (size - 1));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<E> subList(int fromIndex, int toIndex) {
|
||||
checkConcurrentModification();
|
||||
Objects.checkIndex(fromIndex, size);
|
||||
Objects.checkIndex(toIndex, size);
|
||||
int len = (toIndex - fromIndex) + 1;
|
||||
if (len < 0) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
return new SubList<>(base, start + fromIndex, len);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected <T1> T1[] toArray(T1[] a, int start, int len) {
|
||||
checkConcurrentModification();
|
||||
modCnt++;
|
||||
return base.toArray(a, this.start + start, len);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected E remove(Object o, int start, int len) {
|
||||
checkConcurrentModification();
|
||||
modCnt++;
|
||||
return base.remove(o, this.start + start, len);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int indexOf(Object o, int start, int len) {
|
||||
checkConcurrentModification();
|
||||
return base.indexOf(o, this.start + start, len);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int lastIndexOf(Object o, int start, int len) {
|
||||
checkConcurrentModification();
|
||||
return base.lastIndexOf(o, this.start + start, len);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected E directSet(int index, E element) {
|
||||
checkConcurrentModification();
|
||||
modCnt++;
|
||||
return base.directSet(index, element);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void removeRange(int start, int len) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
private void checkConcurrentModification() {
|
||||
if (base.modCnt != modCnt) {
|
||||
throw new ConcurrentModificationException();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static class SubListItr<TYPE> implements ListIterator<TYPE> {
|
||||
|
||||
private final AbstractBaseList<TYPE> base;
|
||||
private int modCnt;
|
||||
private int cur;
|
||||
private int lower;
|
||||
private int higher;
|
||||
private int last;
|
||||
|
||||
public SubListItr(AbstractBaseList<TYPE> base, int start, int lower, int higher) {
|
||||
this.base = base;
|
||||
modCnt = base.modCnt;
|
||||
cur = start;
|
||||
this.lower = lower;
|
||||
this.higher = higher;
|
||||
last = -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return cur <= higher;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TYPE next() {
|
||||
checkConcurrentModification();
|
||||
if (!hasNext()) {
|
||||
throw new IndexOutOfBoundsException();
|
||||
}
|
||||
last = cur;
|
||||
return base.get(cur++);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPrevious() {
|
||||
return cur > lower;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TYPE previous() {
|
||||
checkConcurrentModification();
|
||||
if (!hasPrevious()) {
|
||||
throw new IndexOutOfBoundsException();
|
||||
}
|
||||
last = --cur;
|
||||
return base.get(cur);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int nextIndex() {
|
||||
return cur - lower;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int previousIndex() {
|
||||
return cur - lower - 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {
|
||||
checkConcurrentModification();
|
||||
rangeCheck();
|
||||
if (last == -1) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
modCnt++;
|
||||
base.remove(last);
|
||||
last = -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(TYPE element) {
|
||||
checkConcurrentModification();
|
||||
rangeCheck();
|
||||
if (last == -1) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
modCnt++;
|
||||
base.set(last, element);
|
||||
last = -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add(TYPE element) {
|
||||
checkConcurrentModification();
|
||||
rangeCheck();
|
||||
if (last == -1) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
modCnt++;
|
||||
base.add(last, element);
|
||||
last = -1;
|
||||
}
|
||||
|
||||
private void checkConcurrentModification() {
|
||||
if (base.modCnt != modCnt) {
|
||||
throw new ConcurrentModificationException();
|
||||
}
|
||||
}
|
||||
|
||||
private void rangeCheck() {
|
||||
if (cur < lower || cur > higher) {
|
||||
throw new IndexOutOfBoundsException();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
97
src/dev/asdf00/general/utils/list/internal/ByteList.java
Normal file
97
src/dev/asdf00/general/utils/list/internal/ByteList.java
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
package dev.asdf00.general.utils.list.internal;
|
||||
|
||||
import dev.asdf00.general.utils.list.PrimitiveList;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public class ByteList extends PrimitiveList<Boolean> {
|
||||
|
||||
private byte[] data;
|
||||
|
||||
public ByteList(int initial) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFinalized() {
|
||||
return data == null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected <T1> T1[] toArray(T1[] a, int start, int len) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Boolean remove(Object o, int start, int len) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int indexOf(Object o, int start, int len) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int lastIndexOf(Object o, int start, int len) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Boolean directSet(int index, Boolean element) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void removeRange(int start, int len) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addAll(Collection<? extends Boolean> c) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addAll(int index, Collection<? extends Boolean> c) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean get(int index) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add(int index, Boolean element) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addByte(byte value) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte getByte(int index) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] toByteArray() {
|
||||
return new byte[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] finalizeAsByteArray() {
|
||||
byte[] res = data;
|
||||
data = null;
|
||||
AbstractBaseList.UNSAFE.putInt(data, AbstractBaseList.OFFSET_LEN, size);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
79
src/dev/asdf00/general/utils/listOld/PrimitiveList.java
Normal file
79
src/dev/asdf00/general/utils/listOld/PrimitiveList.java
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
package dev.asdf00.general.utils.listOld;
|
||||
|
||||
import dev.asdf00.general.utils.listOld.internal.PrimitiveListImpl;
|
||||
import sun.misc.Unsafe;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.List;
|
||||
import java.util.RandomAccess;
|
||||
|
||||
public abstract class PrimitiveList<T> implements List<T>, RandomAccess {
|
||||
|
||||
private static final Unsafe UNSAFE;
|
||||
|
||||
static {
|
||||
try {
|
||||
Field f = Unsafe.class.getDeclaredField("theUnsafe");
|
||||
f.setAccessible(true);
|
||||
UNSAFE = (Unsafe) f.get(null);
|
||||
} catch (NoSuchFieldException | IllegalAccessException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isSupportedOnCurrentJVMConfiguration() {
|
||||
return UNSAFE.arrayIndexScale(byte[].class) == 1 && UNSAFE.arrayIndexScale(short[].class) == 2 &&
|
||||
UNSAFE.arrayIndexScale(int[].class) == 4 && UNSAFE.arrayIndexScale(long[].class) == 8 &&
|
||||
UNSAFE.arrayIndexScale(float[].class) == 4 && UNSAFE.arrayIndexScale(double[].class) == 8;
|
||||
}
|
||||
|
||||
public static <T> PrimitiveList<T> create(Class<T> boxedType) throws IllegalArgumentException, UnsupportedOperationException {
|
||||
return PrimitiveListImpl.create(boxedType);
|
||||
}
|
||||
|
||||
public abstract byte[] toByteArray();
|
||||
|
||||
public abstract short[] toShortArray();
|
||||
|
||||
public abstract int[] toIntArray();
|
||||
|
||||
public abstract long[] toLongArray();
|
||||
|
||||
public abstract float[] toFloatArray();
|
||||
|
||||
public abstract double[] toDoubleArray();
|
||||
|
||||
public abstract char[] toCharArray();
|
||||
|
||||
public abstract boolean[] toBooleanArray();
|
||||
|
||||
public abstract byte getByte(int index);
|
||||
|
||||
public abstract short getShort(int index);
|
||||
|
||||
public abstract int getInt(int index);
|
||||
|
||||
public abstract long getLong(int index);
|
||||
|
||||
public abstract float getFloat(int index);
|
||||
|
||||
public abstract double getDouble(int index);
|
||||
|
||||
public abstract char getChar(int index);
|
||||
|
||||
public abstract boolean getBoolean(int index);
|
||||
|
||||
public abstract byte[] finalizeAsByteArray();
|
||||
|
||||
public abstract short[] finalizeAsShortArray();
|
||||
|
||||
public abstract int[] finalizeAsIntArray();
|
||||
|
||||
public abstract long[] finalizeAsLongArray();
|
||||
|
||||
public abstract float[] finalizeAsFloatArray();
|
||||
|
||||
public abstract double[] finalizeAsDoubleArray();
|
||||
|
||||
public abstract boolean isFinalized();
|
||||
}
|
||||
1218
src/dev/asdf00/general/utils/listOld/internal/PrimitiveListImpl.java
Normal file
1218
src/dev/asdf00/general/utils/listOld/internal/PrimitiveListImpl.java
Normal file
File diff suppressed because it is too large
Load Diff
5
src/module-info.java
Normal file
5
src/module-info.java
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
module GeneralUtils {
|
||||
requires jdk.unsupported;
|
||||
exports dev.asdf00.general.utils.listOld;
|
||||
exports dev.asdf00.general.utils.list;
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user