]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/list/ShareableList.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.scl.runtime / src / org / simantics / scl / runtime / list / ShareableList.java
1 package org.simantics.scl.runtime.list;
2
3 import java.util.AbstractList;
4 import java.util.Arrays;
5 import java.util.List;
6
7 public class ShareableList<T> extends AbstractList<T> {
8
9     public static final int INITIAL_CAPACITY = 4;
10     
11     T[] elements;
12     int size;
13     boolean head;
14     
15     public ShareableList(T[] elements, int size, boolean head) {
16         this.elements = elements;
17         this.size = size;
18         this.head = head;
19     }
20     
21     @SuppressWarnings("unchecked")
22     public ShareableList() {
23         this.elements = (T[])new Object[INITIAL_CAPACITY];
24         this.size = 0;
25         this.head = true;
26     }
27
28     @Override
29     public T get(int index) {
30         if(index < 0 || index >= size)
31             throw new IndexOutOfBoundsException();
32         return elements[index];
33     }
34
35     @Override
36     public int size() {
37         return size;
38     }
39
40     @SuppressWarnings("unchecked")
41     public ShareableList<T> append(T element) {
42         T[] newElements;
43         if(size < elements.length) {            
44             if(head) {
45                 head = false;
46                 newElements = elements;
47             }
48             else {
49                 newElements = (T[])new Object[elements.length];
50                 System.arraycopy(elements, 0, newElements, 0, size);
51             }
52         }
53         else {
54             newElements = Arrays.copyOf(elements, (elements.length*3)/2 + 1);            
55         }
56         newElements[size] = element;
57         return new ShareableList<T>(newElements, size+1, true);
58     }
59     
60     @SuppressWarnings("unchecked")
61     public ShareableList<T> appendAll(List<T> xs) {
62         int count = xs.size();
63         int size = this.size;
64         int newSize = size + count;
65         
66         T[] newElements;
67         if(newSize <= elements.length) {            
68             if(head) {
69                 head = false;
70                 newElements = elements;
71             }
72             else {
73                 newElements = (T[])new Object[elements.length];
74                 System.arraycopy(elements, 0, newElements, 0, size);
75             }
76         }
77         else {
78             newElements = Arrays.copyOf(elements, Math.max((elements.length*3)/2 + 1, newSize));            
79         }
80         for(int i=0;i<count;++i)
81             newElements[i+size] = xs.get(i);
82         return new ShareableList<T>(newElements, newSize, true);
83     }
84     
85     @SuppressWarnings("unchecked")
86     public static <T> List<T> add(List<T> list, T element) {
87         List<T> result;
88         if(list instanceof ShareableList)
89             result = ((ShareableList<T>)list).append(element);
90         else {
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);
97         }
98         //System.out.println(list + " + " + element + " = " + result);
99         return result;
100     }
101     
102     @SuppressWarnings("unchecked")
103     public static <T> List<T> concat(List<T> a, List<T> b) {
104         List<T> result;
105         if(a instanceof ShareableList)
106             result = ((ShareableList<T>)a).appendAll(b);
107         else {
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);
117         }
118         //System.out.println(a + " + " + b + " = " + result);
119         return result;
120     }
121     
122 }