Ranides Atterwim 13 роки тому
батько
коміт
63d507e84f

+ 95 - 0
src/main/java/net/ranides/assira/collection/list/RTList.java

@@ -0,0 +1,95 @@
+/*
+ * @author Ranides Atterwim <ranides@gmail.com>
+ * @copyright Ranides Atterwim
+ * @license WTFPL
+ * @url http://ranides.net/projects/assira
+ */
+package net.ranides.assira.collection.list;
+
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ *
+ * @author ranides
+ */
+@SuppressWarnings("unchecked")
+public class RTList<T> extends AbstractList<T> {
+    
+    private final static Object[] EMPTY = new Object[0];
+    private Object[] content = EMPTY;
+
+    public RTList() {
+        // do nothing
+    }
+    
+    public RTList(Collection<? extends T> values) {
+        content = values.toArray();
+    }
+    
+    @Override
+    public T get(int index) {
+        return (T)content[index];
+    }
+
+    @Override
+    public int size() {
+        return content.length;
+    }
+    
+    @Override
+    public void clear() {
+        content = EMPTY;
+    }
+    
+    @Override
+    public T set(int index, T element) {
+        T prev = (T)content[index];
+        content[index] = element;
+        return prev;
+    }
+
+    @Override
+    public void add(int index, T element) {
+        if(index > content.length) {
+                throw new IndexOutOfBoundsException(index + " out of bound " + content.length);
+            }
+        if(content == EMPTY) {
+            content = new Object[]{ element };
+            return;
+        }
+        Object[] buffer = new Object[content.length + 1];
+        if(index > 0) {
+            System.arraycopy(content, 0, buffer, 0, index);
+        }
+        if(index < content.length) {
+            System.arraycopy(content, index, buffer, index+1, content.length - index);
+        }
+        buffer[index] = element;
+        content = buffer;
+    }
+
+    @Override
+    public T remove(int index) {
+        if(index > content.length) {
+            throw new IndexOutOfBoundsException(index + " out of bound " + content.length);
+        }
+        T prev = (T)content[index];
+        if(content.length == 1) {
+            content = EMPTY;
+            return prev;
+        }
+        Object[] buffer = new Object[content.length - 1];
+        if(index > 0) {
+            System.arraycopy(content, 0, buffer, 0, index);
+        }
+        if( content.length - index > 1) {
+            System.arraycopy(content, index+1, buffer, index, content.length - index - 1);
+        }
+        
+        content = buffer;
+        return prev;
+    }
+    
+}

+ 66 - 0
src/test/java/net/ranides/assira/collection/list/RTListTest.java

@@ -0,0 +1,66 @@
+/*
+ * @author Ranides Atterwim <ranides@gmail.com>
+ * @copyright Ranides Atterwim
+ * @license WTFPL
+ * @url http://ranides.net/projects/assira
+ */
+package net.ranides.assira.collection.list;
+
+import java.util.Arrays;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ *
+ * @author ranides
+ */
+public class RTListTest {
+    
+    public RTListTest() {
+    }
+
+    @Test
+    public void testContent() {
+        RTList<Integer> values = new RTList<Integer>(Arrays.asList(11, 22, 33, 44, 55));
+        assertEquals(5, values.size());
+        assertEquals(11, (int)values.get(0));
+        assertEquals(22, (int)values.get(1));
+        assertEquals(33, (int)values.get(2));
+        assertEquals(44, (int)values.get(3));
+        assertEquals(55, (int)values.get(4));
+    }
+
+    @Test
+    public void testSet() {
+        RTList<Integer> values = new RTList<Integer>(Arrays.asList(11, 22, 33, 44, 55));
+        values.set(0, 71);
+        values.set(3, 77);
+        assertEquals(71, (int)values.get(0));
+        assertEquals(22, (int)values.get(1));
+        assertEquals(33, (int)values.get(2));
+        assertEquals(77, (int)values.get(3));
+        assertEquals(55, (int)values.get(4));
+    }
+
+    @Test
+    public void testAdd() {
+        RTList<Integer> values = new RTList<Integer>(Arrays.asList(11, 22, 33));
+        values.add(91);
+        values.add(92);
+        assertEquals(Arrays.asList(11,22,33,91,92), values);
+        values.add(1, 93);
+        values.add(3, 94);
+        assertEquals(Arrays.asList(11,93,22,94,33,91,92), values);
+    }
+
+    @Test
+    public void testRemove() {
+        RTList<Long> values = new RTList<Long>(Arrays.asList(11L, 22L, 33L, 44L, 55L, 66L));
+        values.remove(1);
+        values.remove(2);
+        assertEquals(Arrays.asList(11L, 33L, 55L, 66L), values);
+        values.add(1, 91L);
+        values.remove(3);
+        assertEquals(Arrays.asList(11L, 91L, 33L, 66L), values);
+    }
+}