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