1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
\r
3 * in Industry THTH ry.
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.utils.datastructures.collections;
\r
14 import java.util.Arrays;
\r
17 public class LightweightList {
\r
19 public static final Object EMPTY = new LL0();
\r
21 public static Object add(Object list, Object value) {
\r
22 if(list instanceof LL)
\r
23 return ((LL)list).add(value);
\r
25 return new LL2(list, value);
\r
28 public static Object remove(Object list, Object value) {
\r
29 if(list instanceof LL)
\r
30 return ((LL)list).remove(value);
\r
32 return value.equals(list) ? EMPTY : list;
\r
35 public static int size(Object list) {
\r
36 if(list instanceof LL)
\r
37 return ((LL)list).size();
\r
42 public static boolean isEmpty(Object list) {
\r
46 public static Object[] toArray(Object list) {
\r
49 else if(list instanceof LL)
\r
50 return ((LL)list).toArray();
\r
52 return new Object[] { list };
\r
55 public static interface IProcedure {
\r
56 void exec(Object obj);
\r
59 public static void forEach(Object list, IProcedure proc) {
\r
62 else if(list instanceof LL)
\r
63 ((LL)list).forEach(proc);
\r
68 private static interface LL {
\r
69 Object add(Object value);
\r
70 Object remove(Object value);
\r
73 void forEach(IProcedure proc);
\r
76 static final Object[] EMPTY_ARRAY = new Object[0];
\r
77 private static class LL0 implements LL {
\r
80 public Object add(Object value) {
\r
85 public Object remove(Object value) {
\r
95 public Object[] toArray() {
\r
100 public void forEach(IProcedure proc) {
\r
105 private static class LL2 implements LL {
\r
109 public LL2(Object v0, Object v1) {
\r
115 public Object add(Object value) {
\r
116 return new LL3(v0, v1, value);
\r
120 public Object remove(Object value) {
\r
121 if(value.equals(v0))
\r
123 else if(value.equals(v1))
\r
130 public int size() {
\r
135 public Object[] toArray() {
\r
136 return new Object[] { v0, v1 };
\r
140 public void forEach(IProcedure proc) {
\r
147 private static class LL3 implements LL {
\r
149 Object v0, v1, v2;
\r
151 public LL3(Object v0, Object v1, Object v2) {
\r
158 public Object add(Object value) {
\r
159 return new LLN(v0, v1, v2, value);
\r
163 public Object remove(Object value) {
\r
164 if(value.equals(v0))
\r
165 return new LL2(v1, v2);
\r
166 else if(value.equals(v1))
\r
167 return new LL2(v0, v2);
\r
168 else if(value.equals(v2))
\r
169 return new LL2(v0, v1);
\r
175 public int size() {
\r
180 public Object[] toArray() {
\r
181 return new Object[] { v0, v1, v2 };
\r
185 public void forEach(IProcedure proc) {
\r
192 private static class LLN implements LL {
\r
197 public LLN(Object v0, Object v1, Object v2, Object v3) {
\r
198 array = new Object[] { v0, v1, v2, v3, null, null };
\r
203 public Object add(Object value) {
\r
204 if(size==array.length)
\r
205 array = Arrays.copyOf(array, (size*3)/2+1);
\r
206 array[size++] = value;
\r
211 public Object remove(Object value) {
\r
212 for(int i=0;i<size;++i) {
\r
213 if(value.equals(array[i])) {
\r
214 while(i < size-1) {
\r
215 array[i] = array[i+1];
\r
218 array[--size] = null;
\r
220 return new LL3(array[0], array[1], array[2]);
\r
229 public int size() {
\r
234 public Object[] toArray() {
\r
235 return Arrays.copyOf(array, size);
\r
239 public void forEach(IProcedure proc) {
\r
240 for(int i=0;i<size;++i)
\r
241 proc.exec(array[i]);
\r