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