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