1 package org.simantics.scl.runtime.list;
3 import java.util.AbstractList;
4 import java.util.Arrays;
7 public class ShareableList<T> extends AbstractList<T> {
9 public static final int INITIAL_CAPACITY = 4;
15 public ShareableList(T[] elements, int size, boolean head) {
16 this.elements = elements;
21 @SuppressWarnings("unchecked")
22 public ShareableList() {
23 this.elements = (T[])new Object[INITIAL_CAPACITY];
29 public T get(int index) {
30 if(index < 0 || index >= size)
31 throw new IndexOutOfBoundsException();
32 return elements[index];
40 @SuppressWarnings("unchecked")
41 public ShareableList<T> append(T element) {
43 if(size < elements.length) {
46 newElements = elements;
49 newElements = (T[])new Object[elements.length];
50 System.arraycopy(elements, 0, newElements, 0, size);
54 newElements = Arrays.copyOf(elements, (elements.length*3)/2 + 1);
56 newElements[size] = element;
57 return new ShareableList<T>(newElements, size+1, true);
60 @SuppressWarnings("unchecked")
61 public ShareableList<T> appendAll(List<T> xs) {
62 int count = xs.size();
64 int newSize = size + count;
67 if(newSize <= elements.length) {
70 newElements = elements;
73 newElements = (T[])new Object[elements.length];
74 System.arraycopy(elements, 0, newElements, 0, size);
78 newElements = Arrays.copyOf(elements, Math.max((elements.length*3)/2 + 1, newSize));
80 for(int i=0;i<count;++i)
81 newElements[i+size] = xs.get(i);
82 return new ShareableList<T>(newElements, newSize, true);
85 @SuppressWarnings("unchecked")
86 public static <T> List<T> add(List<T> list, T element) {
88 if(list instanceof ShareableList)
89 result = ((ShareableList<T>)list).append(element);
91 int size = list.size();
92 T[] newElements = (T[])new Object[(size*3)/2 + 1];
93 for(int i=0;i<size;++i)
94 newElements[i] = list.get(i);
95 newElements[size] = element;
96 result = new ShareableList<T>(newElements, size+1, true);
98 //System.out.println(list + " + " + element + " = " + result);
102 @SuppressWarnings("unchecked")
103 public static <T> List<T> concat(List<T> a, List<T> b) {
105 if(a instanceof ShareableList)
106 result = ((ShareableList<T>)a).appendAll(b);
108 int aSize = a.size();
109 int bSize = b.size();
110 int size = aSize + bSize;
111 T[] newElements = (T[])new Object[(size*3)/2 + 1];
112 for(int i=0;i<aSize;++i)
113 newElements[i] = a.get(i);
114 for(int i=0;i<bSize;++i)
115 newElements[aSize + i] = b.get(i);
116 result = new ShareableList<T>(newElements, size, true);
118 //System.out.println(a + " + " + b + " = " + result);