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.db.impl.query;
14 import gnu.trove.procedure.TIntProcedure;
16 import java.util.Arrays;
17 import java.util.Collection;
18 import java.util.Iterator;
21 import org.simantics.db.Resource;
22 import org.simantics.db.ResourceSet;
23 import org.simantics.db.impl.ResourceImpl;
24 import org.simantics.db.impl.support.ResourceSupport;
27 final public class IntSet implements ResourceSet {
29 final private ResourceSupport support;
33 /** the index after the last entry in the list */
34 public int sizeOrData;
36 /** the default capacity for new lists */
37 protected static final int DEFAULT_CAPACITY = 3;
39 public static final int NO_DATA = -1;
41 private static final Object[] EMPTY_ARRAY = new Object[0];
49 public IntSet(QuerySupport support) {
50 this.support = support.getSupport();
55 public IntSet(QuerySupport support, int value) {
56 this.support = support.getSupport();
62 public int hashCode() {
63 return 31 * sizeOrData + 41 * Arrays.hashCode(data);
67 public boolean equals(Object object) {
70 else if (object == null)
72 else if (IntSet.class != object.getClass())
74 IntSet r = (IntSet)object;
75 // System.out.println("equals " + this + " vs. " + r);
76 return sizeOrData == r.sizeOrData && Arrays.equals(data, r.data);
81 * Returns the number of values in the list.
83 * @return the number of values in the list.
86 return data != null ? sizeOrData : (sizeOrData != NO_DATA ? 1 : 0);
90 * Tests whether this list contains any values.
92 * @return true if the list is empty.
94 public boolean isEmpty() {
95 return sizeOrData == NO_DATA;
101 * Adds <tt>val</tt> to the end of the list, growing as needed.
103 * @param val an <code>int</code> value
105 public boolean add(int val) {
107 if(sizeOrData == val) return false;
108 if(sizeOrData == NO_DATA) {
112 data = new int[DEFAULT_CAPACITY];
113 data[0] = sizeOrData;
119 for(int i=0;i<sizeOrData;i++) if(data[i] == val) return false;
120 if(data.length == sizeOrData) {
121 int newCap = data.length << 1;
122 int[] tmp = new int[newCap];
123 System.arraycopy(data, 0, tmp, 0, data.length);
125 data[sizeOrData++] = val;
127 data[sizeOrData++] = val;
133 public void forEach(TIntProcedure proc) {
135 if(sizeOrData != NO_DATA) proc.execute(sizeOrData);
137 for(int i = 0;i < sizeOrData ; i++) proc.execute(data[i]);
141 public boolean contains(int val) {
143 return sizeOrData == val;
145 for(int i = 0;i < sizeOrData ; i++) if(data[i] == val) return true;
151 if(data != null && sizeOrData < data.length) {
152 int newCap = sizeOrData;
153 int[] tmp = new int[newCap];
154 System.arraycopy(data, 0, tmp, 0, newCap);
161 public boolean add(Resource e) {
162 return add(((ResourceImpl)e).id);
166 public boolean addAll(Collection<? extends Resource> c) {
168 for (Resource r : c) {
176 public void clear() {
177 sizeOrData = NO_DATA;
182 public boolean contains(Object o) {
184 return contains(((ResourceImpl)o).id);
188 public boolean containsAll(Collection<?> c) {
197 public Iterator<Resource> iterator() {
199 class ArraySetIterator implements Iterator<Resource> {
204 public boolean hasNext() {
205 return next < size();
209 public Resource next() {
212 return new ResourceImpl(support, sizeOrData);
214 return new ResourceImpl(support, data[next++]);
219 public void remove() {
220 throw new UnsupportedOperationException();
225 return new ArraySetIterator();
230 public boolean remove(Object o) {
231 throw new UnsupportedOperationException();
235 public boolean removeAll(Collection<?> c) {
236 throw new UnsupportedOperationException();
240 public boolean retainAll(Collection<?> c) {
241 throw new UnsupportedOperationException();
245 public Object[] toArray() {
247 Object[] result = new Object[sizeOrData];
248 for(int i=0;i<sizeOrData;++i)
249 result[i] = new ResourceImpl(support, data[i]);
252 else if(sizeOrData == NO_DATA)
255 return new Object[] { new ResourceImpl(support, sizeOrData) };
259 public <T> T[] toArray(T[] a) {
260 throw new UnsupportedOperationException();
264 public String toString() {
265 return "IntSet " + sizeOrData + " " + Arrays.toString(data);
269 public boolean disjoint(Set<Resource> other) {
270 if(other instanceof ResourceSet) {
271 ResourceSet rs = (ResourceSet)other;
273 return !rs.contains(sizeOrData);
275 for(int i = 0;i < sizeOrData ; i++)
276 if(rs.contains(data[i])) return false;
281 return !other.contains(sizeOrData);
283 for(int i = 0;i < sizeOrData ; i++)
284 if(other.contains(data[i])) return false;