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