|
@@ -0,0 +1,84 @@
|
|
|
|
|
+package net.ranides.assira.collection.lists;
|
|
|
|
|
+
|
|
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
|
|
+
|
|
|
|
|
+import net.ranides.assira.collection.arrays.ArrayAllocator;
|
|
|
|
|
+import net.ranides.assira.collection.arrays.ArrayUtils;
|
|
|
|
|
+
|
|
|
|
|
+import java.util.Collection;
|
|
|
|
|
+import java.util.List;
|
|
|
|
|
+
|
|
|
|
|
+public class ListBuilder<T> {
|
|
|
|
|
+
|
|
|
|
|
+ private int count = 0;
|
|
|
|
|
+ private Object[] list = new Object[8];
|
|
|
|
|
+
|
|
|
|
|
+ @SuppressWarnings({"unchecked"})
|
|
|
|
|
+ public List<T> list() {
|
|
|
|
|
+ return (List<T>)new Slice(list, count);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @SuppressWarnings({"unchecked"})
|
|
|
|
|
+ private <P extends T> ListBuilder<P> that() {
|
|
|
|
|
+ return (ListBuilder<P>)this;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public <P extends T> ListBuilder<P> value(P value) {
|
|
|
|
|
+ list = ArrayAllocator.grow(list, count+1);
|
|
|
|
|
+ list[count++] = value;
|
|
|
|
|
+ return that();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @SafeVarargs
|
|
|
|
|
+ public final <P extends T> ListBuilder<P> values(P value, P... values) {
|
|
|
|
|
+ int ds = values.length;
|
|
|
|
|
+ list = ArrayAllocator.grow(list, count+ ds + 1);
|
|
|
|
|
+ list[count++] = value;
|
|
|
|
|
+ ArrayUtils.copy(values, 0, list, count, ds);
|
|
|
|
|
+ count += ds;
|
|
|
|
|
+ return that();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public <P extends T> ListBuilder<P> values(P[] values) {
|
|
|
|
|
+ int ds = values.length;
|
|
|
|
|
+ list = ArrayAllocator.grow(list, count+ ds);
|
|
|
|
|
+ ArrayUtils.copy(values, 0, list, count, ds);
|
|
|
|
|
+ count += ds;
|
|
|
|
|
+ return that();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public <P extends T> ListBuilder<P> values(Collection<P> values) {
|
|
|
|
|
+ int ds = values.size();
|
|
|
|
|
+ list = ArrayAllocator.grow(list, count+ ds);
|
|
|
|
|
+ for(Object v : values) {
|
|
|
|
|
+ list[count++] = v;
|
|
|
|
|
+ }
|
|
|
|
|
+ return that();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public <P extends T> ListBuilder<P> values(Iterable<P> values) {
|
|
|
|
|
+ for(Object v : values) {
|
|
|
|
|
+ list = ArrayAllocator.grow(list, count+ 1);
|
|
|
|
|
+ list[count++] = v;
|
|
|
|
|
+ }
|
|
|
|
|
+ return that();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @RequiredArgsConstructor
|
|
|
|
|
+ private static final class Slice extends VirtualList<Object> {
|
|
|
|
|
+
|
|
|
|
|
+ private final Object[] data;
|
|
|
|
|
+ private final int size;
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public int size() {
|
|
|
|
|
+ return size;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public Object get(int index) {
|
|
|
|
|
+ return data[index];
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+}
|