1 package org.opentrafficsim.core.perception.collections;
2
3 import java.util.Collection;
4 import java.util.Collections;
5 import java.util.HashSet;
6 import java.util.Iterator;
7 import java.util.Set;
8
9 import org.djunits.value.vdouble.scalar.Time;
10 import org.opentrafficsim.core.perception.AbstractHistorical;
11 import org.opentrafficsim.core.perception.HistoryManager;
12 import org.opentrafficsim.core.perception.collections.AbstractHistoricalCollection.EventCollection;
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 public abstract class AbstractHistoricalCollection<E, C extends Collection<E>>
34 extends AbstractHistorical<E, EventCollection<E, C>> implements HistoricalCollection<E>
35 {
36
37
38 private final C current;
39
40
41
42
43
44
45 protected AbstractHistoricalCollection(final HistoryManager historyManager, final C collection)
46 {
47 super(historyManager);
48 this.current = collection;
49 }
50
51
52
53
54
55 protected final C getCollection()
56 {
57 return this.current;
58 }
59
60
61
62
63
64
65 protected final C fill(final C collection)
66 {
67 collection.addAll(this.current);
68 return collection;
69 }
70
71
72
73
74
75
76
77 protected final C fill(final Time time, final C collection)
78 {
79
80 collection.addAll(this.current);
81 for (EventCollection<E, C> event : getEvents(time))
82 {
83 event.restore(collection);
84 }
85 return collection;
86 }
87
88
89
90
91 @Override
92 public boolean add(final E value)
93 {
94 boolean added = getCollection().add(value);
95 if (added)
96 {
97 addEvent(new AddEvent<>(now().si, value));
98 }
99 return added;
100 }
101
102
103 @Override
104 public boolean addAll(final Collection<? extends E> c)
105 {
106 boolean changed = false;
107 for (E value : c)
108 {
109 changed |= add(value);
110 }
111 return changed;
112 }
113
114
115 @Override
116 public void clear()
117 {
118 new HashSet<>(this.current).forEach(this::remove);
119 }
120
121
122 @Override
123 @SuppressWarnings("unchecked")
124 public boolean remove(final Object value)
125 {
126 boolean removed = getCollection().remove(value);
127 if (removed)
128 {
129 addEvent(new RemoveEvent<>(now().si, (E) value));
130 }
131 return removed;
132 }
133
134
135 @Override
136 public boolean removeAll(final Collection<?> c)
137 {
138 boolean changed = false;
139 for (Object value : c)
140 {
141 changed |= remove(value);
142 }
143 return changed;
144 }
145
146
147 @Override
148 public boolean retainAll(final Collection<?> c)
149 {
150 boolean changed = false;
151 Set<E> values = new HashSet<>(this.current);
152 for (E value : values)
153 {
154 if (!c.contains(value))
155 {
156 changed |= remove(value);
157 }
158 }
159 return changed;
160 }
161
162
163
164
165 @Override
166 public int size()
167 {
168 return this.current.size();
169 }
170
171
172 @Override
173 public boolean isEmpty()
174 {
175 return this.current.isEmpty();
176 }
177
178
179 @Override
180 public boolean contains(final Object o)
181 {
182 return this.current.contains(o);
183 }
184
185
186 @Override
187 public Iterator<E> iterator()
188 {
189 return Collections.unmodifiableCollection(this.current).iterator();
190 }
191
192
193 @Override
194 public Object[] toArray()
195 {
196 return this.current.toArray();
197 }
198
199
200 @Override
201 public <T> T[] toArray(final T[] a)
202 {
203 return this.current.toArray(a);
204 }
205
206
207 @Override
208 public boolean containsAll(final Collection<?> c)
209 {
210 return this.current.containsAll(c);
211 }
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229 public abstract static class EventCollection<E, C extends Collection<E>> extends AbstractHistorical.EventValue<E>
230 {
231
232
233
234
235
236
237 public EventCollection(final double time, final E value)
238 {
239 super(time, value);
240 }
241
242
243
244
245
246 public abstract void restore(C collection);
247
248
249 @Override
250 public String toString()
251 {
252 return "EventCollection []";
253 }
254
255 }
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271 public static class AddEvent<E, C extends Collection<E>> extends EventCollection<E, C>
272 {
273
274
275
276
277
278
279 public AddEvent(final double time, final E value)
280 {
281 super(time, value);
282 }
283
284
285 @Override
286 public void restore(final C collection)
287 {
288 collection.remove(getValue());
289 }
290
291
292 @Override
293 public String toString()
294 {
295 return "AddEvent []";
296 }
297
298 }
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314 public static class RemoveEvent<E, C extends Collection<E>> extends EventCollection<E, C>
315 {
316
317
318
319
320
321
322 public RemoveEvent(final double time, final E value)
323 {
324 super(time, value);
325 }
326
327
328 @Override
329 public void restore(final C collection)
330 {
331 collection.add(getValue());
332 }
333
334
335 @Override
336 public String toString()
337 {
338 return "RemoveEvent []";
339 }
340
341 }
342
343 }