Ranides Atterwim 4 лет назад
Родитель
Сommit
5dcc06f5f4

+ 84 - 0
assira.core/src/main/java/net/ranides/assira/collection/lists/ListBuilder.java

@@ -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];
+        }
+    }
+
+}

+ 26 - 0
assira.core/src/test/java/net/ranides/assira/collection/lists/ListBuilderTest.java

@@ -0,0 +1,26 @@
+package net.ranides.assira.collection.lists;
+
+import org.junit.Test;
+
+import net.ranides.assira.collection.query.CQuery;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+public class ListBuilderTest {
+
+    @Test
+    public void name() {
+        List<String> list = new ListBuilder<>()
+                .value("x")
+                .values("a", "b", "c")
+                .values("p q r".split(" "))
+                .values(Arrays.asList("f", "g", "h", "i"))
+                .values(CQuery.from().values("A", "B", "C"))
+                .list();
+        assertEquals(Arrays.asList("x a b c p q r f g h i A B C".split(" ")), list);
+
+    }
+}