]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.utils.datastructures/src/org/simantics/utils/datastructures/SetUnion2.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.utils.datastructures / src / org / simantics / utils / datastructures / SetUnion2.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.utils.datastructures;\r
13 \r
14 import java.security.InvalidParameterException;\r
15 import java.util.Collection;\r
16 import java.util.Iterator;\r
17 import java.util.List;\r
18 import java.util.Set;\r
19 \r
20 public class SetUnion2<T> extends ImmutableCollection<T> {\r
21 \r
22     List<Set<T>> sets;\r
23 \r
24     @Override\r
25     public boolean contains(Object o) {\r
26         for(Set<T> set : sets)\r
27             if(set.contains(o))\r
28                 return true;\r
29         return false;\r
30     }\r
31 \r
32     @Override\r
33     public boolean containsAll(Collection<?> c) {\r
34         for(Object o : c)\r
35             if(!contains(o))\r
36                 return false;\r
37         return true;\r
38     }\r
39 \r
40     @Override\r
41     public boolean isEmpty() {\r
42         for(Set<T> set : sets)\r
43             if(!set.isEmpty())\r
44                 return false;\r
45         return true;\r
46     }\r
47 \r
48     @Override\r
49     public Iterator<T> iterator() {\r
50         return new ImmutableIterator<T>() {\r
51 \r
52             int setId = 0;\r
53             Iterator<T> it = sets.get(0).iterator();\r
54             T element = null;\r
55             \r
56             @Override\r
57             public boolean hasNext() {\r
58                 while(true) {\r
59                     if(element != null)\r
60                         return true;\r
61                     if(it.hasNext()) {\r
62                         element = it.next();\r
63                         for(int i=0;i<setId;++i)\r
64                             if(sets.get(i).contains(element)) {\r
65                                 element = null;\r
66                                 break;\r
67                             }\r
68                     }\r
69                     else {\r
70                         ++setId;\r
71                         if(setId < sets.size())\r
72                             it = sets.get(setId).iterator();\r
73                         else\r
74                             return false;\r
75                     }\r
76                 }\r
77             }\r
78 \r
79             @Override\r
80             public T next() {\r
81                 while(true) {\r
82                     if(element != null)\r
83                         return element;\r
84                     if(it.hasNext()) {\r
85                         element = it.next();\r
86                         for(int i=0;i<setId;++i)\r
87                             if(sets.get(i).contains(element)) {\r
88                                 element = null;\r
89                                 break;\r
90                             }\r
91                     }\r
92                     else {\r
93                         ++setId;\r
94                         if(setId < sets.size())\r
95                             it = sets.get(setId).iterator();\r
96                         else\r
97                             throw new InvalidParameterException();\r
98                     }\r
99                 }\r
100             }\r
101             \r
102         };\r
103     }\r
104 \r
105     @Override\r
106     public int size() {\r
107         int count = sets.get(0).size();\r
108         for(int i=1;i<sets.size();++i) {\r
109             floop:\r
110             for(T o : sets.get(i)) {\r
111                 for(int j=0;j<i;++j)\r
112                     if(sets.get(j).contains(o))\r
113                         break floop;\r
114                 ++count;\r
115             }\r
116         }\r
117         return count;\r
118     }       \r
119     \r
120 }\r