]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/IntSet.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.impl / src / org / simantics / db / impl / query / IntSet.java
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
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.db.impl.query;\r
13 \r
14 import gnu.trove.procedure.TIntProcedure;\r
15 \r
16 import java.util.Arrays;\r
17 import java.util.Collection;\r
18 import java.util.Iterator;\r
19 import java.util.Set;\r
20 \r
21 import org.simantics.db.Resource;\r
22 import org.simantics.db.ResourceSet;\r
23 import org.simantics.db.impl.ResourceImpl;\r
24 import org.simantics.db.impl.support.ResourceSupport;\r
25 \r
26 \r
27 final public class IntSet implements ResourceSet {\r
28 \r
29     final private ResourceSupport support;\r
30 \r
31     public int[] data;\r
32 \r
33     /** the index after the last entry in the list */\r
34     public int sizeOrData;\r
35 \r
36     /** the default capacity for new lists */\r
37     protected static final int DEFAULT_CAPACITY = 3;\r
38 \r
39     public static final int NO_DATA = -1;\r
40 \r
41     public IntSet() {\r
42         support = null;\r
43         data = null;\r
44         sizeOrData = NO_DATA;\r
45     }\r
46 \r
47     public IntSet(QuerySupport support) {\r
48         this.support = support.getSupport();\r
49         data = null;\r
50         sizeOrData = NO_DATA;\r
51     }\r
52 \r
53     public IntSet(QuerySupport support, int value) {\r
54         this.support = support.getSupport();\r
55         data = null;\r
56         sizeOrData = value;\r
57     }\r
58 \r
59     @Override\r
60     public int hashCode() {\r
61         return 31 * sizeOrData + 41 * Arrays.hashCode(data);\r
62     }\r
63     \r
64     @Override\r
65     public boolean equals(Object object) {\r
66         if (this == object)\r
67             return true;\r
68         else if (object == null)\r
69             return false;\r
70         else if (IntSet.class != object.getClass())\r
71             return false;\r
72         IntSet r = (IntSet)object;\r
73 //        System.out.println("equals " + this + " vs. " + r);\r
74         return sizeOrData == r.sizeOrData && Arrays.equals(data, r.data);\r
75     }\r
76 \r
77 \r
78     /**\r
79      * Returns the number of values in the list.\r
80      *\r
81      * @return the number of values in the list.\r
82      */\r
83     public int size() {\r
84         return data != null ? sizeOrData : (sizeOrData != NO_DATA ? 1 : 0);\r
85     }\r
86 \r
87     /**\r
88      * Tests whether this list contains any values.\r
89      *\r
90      * @return true if the list is empty.\r
91      */\r
92     public boolean isEmpty() {\r
93         return sizeOrData == NO_DATA;\r
94     }\r
95 \r
96     // modifying\r
97 \r
98     /**\r
99      * Adds <tt>val</tt> to the end of the list, growing as needed.\r
100      *\r
101      * @param val an <code>int</code> value\r
102      */\r
103     public boolean add(int val) {\r
104         if(data == null) {\r
105             if(sizeOrData == val) return false;\r
106             if(sizeOrData == NO_DATA) {\r
107                 sizeOrData = val;\r
108                 return true;\r
109             } else {\r
110                 data = new int[DEFAULT_CAPACITY];\r
111                 data[0] = sizeOrData;\r
112                 data[1] = val;\r
113                 sizeOrData = 2;\r
114                 return true;\r
115             }\r
116         } else {\r
117             for(int i=0;i<sizeOrData;i++) if(data[i] == val) return false;\r
118             if(data.length == sizeOrData) {\r
119                 int newCap = data.length << 1;\r
120                 int[] tmp = new int[newCap];\r
121                 System.arraycopy(data, 0, tmp, 0, data.length);\r
122                 data = tmp;\r
123                 data[sizeOrData++] = val;\r
124             } else {\r
125                 data[sizeOrData++] = val;\r
126             }\r
127             return true;\r
128         }\r
129     }\r
130 \r
131     public void forEach(TIntProcedure proc) {\r
132         if(data == null) {\r
133             if(sizeOrData != NO_DATA) proc.execute(sizeOrData);\r
134         } else {\r
135             for(int i = 0;i < sizeOrData ; i++) proc.execute(data[i]);\r
136         }\r
137     }\r
138     \r
139     public boolean contains(int val) {\r
140         if(data == null) {\r
141             return sizeOrData == val;\r
142         } else {\r
143             for(int i = 0;i < sizeOrData ; i++) if(data[i] == val) return true;\r
144         }\r
145         return false;\r
146     }\r
147 \r
148     public void trim() {\r
149         if(data != null && sizeOrData < data.length) {\r
150             int newCap = sizeOrData;\r
151             int[] tmp = new int[newCap];\r
152             System.arraycopy(data, 0, tmp, 0, newCap);\r
153             data = tmp;\r
154             sizeOrData = newCap;\r
155         }\r
156     }\r
157 \r
158     @Override\r
159     public boolean add(Resource e) {\r
160         return add(((ResourceImpl)e).id);\r
161     }\r
162 \r
163     @Override\r
164     public boolean addAll(Collection<? extends Resource> c) {\r
165         boolean ret = false;\r
166         for (Resource r : c) {\r
167                 if (add(r))\r
168                         ret = true;\r
169         }\r
170         return ret;\r
171     }\r
172 \r
173     @Override\r
174     public void clear() {\r
175         sizeOrData = NO_DATA;\r
176         data = null;\r
177     }\r
178 \r
179     @Override\r
180     public boolean contains(Object o) {\r
181         assert(o != null);\r
182         return contains(((ResourceImpl)o).id);\r
183     }\r
184 \r
185     @Override\r
186     public boolean containsAll(Collection<?> c) {\r
187         for (Object o : c) {\r
188                 if (!contains(o))\r
189                         return false;\r
190         }\r
191         return true;\r
192     }\r
193 \r
194     @Override\r
195     public Iterator<Resource> iterator() {\r
196 \r
197         class ArraySetIterator implements Iterator<Resource> {\r
198 \r
199             int next = 0;\r
200 \r
201             @Override\r
202             public boolean hasNext() {\r
203                 return next < size();\r
204             }\r
205 \r
206             @Override\r
207             public Resource next() {\r
208                 if(size() == 1) {\r
209                     next++;\r
210                     return new ResourceImpl(support, sizeOrData);\r
211                 } else {\r
212                     return new ResourceImpl(support, data[next++]);\r
213                 }\r
214             }\r
215 \r
216             @Override\r
217             public void remove() {\r
218                 throw new UnsupportedOperationException();\r
219             }\r
220 \r
221         }\r
222 \r
223         return new ArraySetIterator();\r
224 \r
225     }\r
226 \r
227     @Override\r
228     public boolean remove(Object o) {\r
229         throw new UnsupportedOperationException();\r
230     }\r
231 \r
232     @Override\r
233     public boolean removeAll(Collection<?> c) {\r
234         throw new UnsupportedOperationException();\r
235     }\r
236 \r
237     @Override\r
238     public boolean retainAll(Collection<?> c) {\r
239         throw new UnsupportedOperationException();\r
240     }\r
241 \r
242     @Override\r
243     public Object[] toArray() {\r
244         throw new UnsupportedOperationException();\r
245     }\r
246 \r
247     @Override\r
248     public <T> T[] toArray(T[] a) {\r
249         throw new UnsupportedOperationException();\r
250     }\r
251 \r
252     @Override\r
253     public String toString() {\r
254         return "IntSet " + sizeOrData + " " + Arrays.toString(data);\r
255     }\r
256     \r
257     @Override\r
258     public boolean disjoint(Set<Resource> other) {\r
259         if(other instanceof ResourceSet) {\r
260             ResourceSet rs = (ResourceSet)other;\r
261             if(data == null) {\r
262                 return !rs.contains(sizeOrData);\r
263             } else {\r
264                 for(int i = 0;i < sizeOrData ; i++) \r
265                     if(rs.contains(data[i])) return false;\r
266                 return true;\r
267             }\r
268         } else {\r
269             if(data == null) {\r
270                 return !other.contains(sizeOrData);\r
271             } else {\r
272                 for(int i = 0;i < sizeOrData ; i++) \r
273                     if(other.contains(data[i])) return false;\r
274                 return true;\r
275             }\r
276         }\r
277     }\r
278 \r
279 }