-package org.simantics.scl.runtime.list;\r
-\r
-import java.util.AbstractList;\r
-import java.util.Arrays;\r
-import java.util.List;\r
-\r
-public class ShareableList<T> extends AbstractList<T> {\r
-\r
- public static final int INITIAL_CAPACITY = 4;\r
- \r
- T[] elements;\r
- int size;\r
- boolean head;\r
- \r
- public ShareableList(T[] elements, int size, boolean head) {\r
- this.elements = elements;\r
- this.size = size;\r
- this.head = head;\r
- }\r
- \r
- @SuppressWarnings("unchecked")\r
- public ShareableList() {\r
- this.elements = (T[])new Object[INITIAL_CAPACITY];\r
- this.size = 0;\r
- this.head = true;\r
- }\r
-\r
- @Override\r
- public T get(int index) {\r
- if(index < 0 || index >= size)\r
- throw new IndexOutOfBoundsException();\r
- return elements[index];\r
- }\r
-\r
- @Override\r
- public int size() {\r
- return size;\r
- }\r
-\r
- @SuppressWarnings("unchecked")\r
- public ShareableList<T> append(T element) {\r
- T[] newElements;\r
- if(size < elements.length) { \r
- if(head) {\r
- head = false;\r
- newElements = elements;\r
- }\r
- else {\r
- newElements = (T[])new Object[elements.length];\r
- System.arraycopy(elements, 0, newElements, 0, size);\r
- }\r
- }\r
- else {\r
- newElements = Arrays.copyOf(elements, (elements.length*3)/2 + 1); \r
- }\r
- newElements[size] = element;\r
- return new ShareableList<T>(newElements, size+1, true);\r
- }\r
- \r
- @SuppressWarnings("unchecked")\r
- public ShareableList<T> appendAll(List<T> xs) {\r
- int count = xs.size();\r
- int size = this.size;\r
- int newSize = size + count;\r
- \r
- T[] newElements;\r
- if(newSize <= elements.length) { \r
- if(head) {\r
- head = false;\r
- newElements = elements;\r
- }\r
- else {\r
- newElements = (T[])new Object[elements.length];\r
- System.arraycopy(elements, 0, newElements, 0, size);\r
- }\r
- }\r
- else {\r
- newElements = Arrays.copyOf(elements, Math.max((elements.length*3)/2 + 1, newSize)); \r
- }\r
- for(int i=0;i<count;++i)\r
- newElements[i+size] = xs.get(i);\r
- return new ShareableList<T>(newElements, newSize, true);\r
- }\r
- \r
- @SuppressWarnings("unchecked")\r
- public static <T> List<T> add(List<T> list, T element) {\r
- List<T> result;\r
- if(list instanceof ShareableList)\r
- result = ((ShareableList<T>)list).append(element);\r
- else {\r
- int size = list.size();\r
- T[] newElements = (T[])new Object[(size*3)/2 + 1];\r
- for(int i=0;i<size;++i)\r
- newElements[i] = list.get(i);\r
- newElements[size] = element;\r
- result = new ShareableList<T>(newElements, size+1, true);\r
- }\r
- //System.out.println(list + " + " + element + " = " + result);\r
- return result;\r
- }\r
- \r
- @SuppressWarnings("unchecked")\r
- public static <T> List<T> concat(List<T> a, List<T> b) {\r
- List<T> result;\r
- if(a instanceof ShareableList)\r
- result = ((ShareableList<T>)a).appendAll(b);\r
- else {\r
- int aSize = a.size();\r
- int bSize = b.size();\r
- int size = aSize + bSize;\r
- T[] newElements = (T[])new Object[(size*3)/2 + 1];\r
- for(int i=0;i<aSize;++i)\r
- newElements[i] = a.get(i);\r
- for(int i=0;i<bSize;++i)\r
- newElements[aSize + i] = b.get(i);\r
- result = new ShareableList<T>(newElements, size, true);\r
- }\r
- //System.out.println(a + " + " + b + " = " + result);\r
- return result;\r
- }\r
- \r
-}\r
+package org.simantics.scl.runtime.list;
+
+import java.util.AbstractList;
+import java.util.Arrays;
+import java.util.List;
+
+public class ShareableList<T> extends AbstractList<T> {
+
+ public static final int INITIAL_CAPACITY = 4;
+
+ T[] elements;
+ int size;
+ boolean head;
+
+ public ShareableList(T[] elements, int size, boolean head) {
+ this.elements = elements;
+ this.size = size;
+ this.head = head;
+ }
+
+ @SuppressWarnings("unchecked")
+ public ShareableList() {
+ this.elements = (T[])new Object[INITIAL_CAPACITY];
+ this.size = 0;
+ this.head = true;
+ }
+
+ @Override
+ public T get(int index) {
+ if(index < 0 || index >= size)
+ throw new IndexOutOfBoundsException();
+ return elements[index];
+ }
+
+ @Override
+ public int size() {
+ return size;
+ }
+
+ @SuppressWarnings("unchecked")
+ public ShareableList<T> append(T element) {
+ T[] newElements;
+ if(size < elements.length) {
+ if(head) {
+ head = false;
+ newElements = elements;
+ }
+ else {
+ newElements = (T[])new Object[elements.length];
+ System.arraycopy(elements, 0, newElements, 0, size);
+ }
+ }
+ else {
+ newElements = Arrays.copyOf(elements, (elements.length*3)/2 + 1);
+ }
+ newElements[size] = element;
+ return new ShareableList<T>(newElements, size+1, true);
+ }
+
+ @SuppressWarnings("unchecked")
+ public ShareableList<T> appendAll(List<T> xs) {
+ int count = xs.size();
+ int size = this.size;
+ int newSize = size + count;
+
+ T[] newElements;
+ if(newSize <= elements.length) {
+ if(head) {
+ head = false;
+ newElements = elements;
+ }
+ else {
+ newElements = (T[])new Object[elements.length];
+ System.arraycopy(elements, 0, newElements, 0, size);
+ }
+ }
+ else {
+ newElements = Arrays.copyOf(elements, Math.max((elements.length*3)/2 + 1, newSize));
+ }
+ for(int i=0;i<count;++i)
+ newElements[i+size] = xs.get(i);
+ return new ShareableList<T>(newElements, newSize, true);
+ }
+
+ @SuppressWarnings("unchecked")
+ public static <T> List<T> add(List<T> list, T element) {
+ List<T> result;
+ if(list instanceof ShareableList)
+ result = ((ShareableList<T>)list).append(element);
+ else {
+ int size = list.size();
+ T[] newElements = (T[])new Object[(size*3)/2 + 1];
+ for(int i=0;i<size;++i)
+ newElements[i] = list.get(i);
+ newElements[size] = element;
+ result = new ShareableList<T>(newElements, size+1, true);
+ }
+ //System.out.println(list + " + " + element + " = " + result);
+ return result;
+ }
+
+ @SuppressWarnings("unchecked")
+ public static <T> List<T> concat(List<T> a, List<T> b) {
+ List<T> result;
+ if(a instanceof ShareableList)
+ result = ((ShareableList<T>)a).appendAll(b);
+ else {
+ int aSize = a.size();
+ int bSize = b.size();
+ int size = aSize + bSize;
+ T[] newElements = (T[])new Object[(size*3)/2 + 1];
+ for(int i=0;i<aSize;++i)
+ newElements[i] = a.get(i);
+ for(int i=0;i<bSize;++i)
+ newElements[aSize + i] = b.get(i);
+ result = new ShareableList<T>(newElements, size, true);
+ }
+ //System.out.println(a + " + " + b + " = " + result);
+ return result;
+ }
+
+}