1 package org.opentrafficsim.core.perception.collections;
2
3 import java.util.Collection;
4 import java.util.Collections;
5 import java.util.Iterator;
6 import java.util.LinkedList;
7 import java.util.List;
8 import java.util.Objects;
9
10 import org.djunits.value.vdouble.scalar.Time;
11 import org.opentrafficsim.core.perception.HistoryManager;
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 public class HistoricalLinkedList<E> extends AbstractHistoricalList<E, LinkedList<E>> implements HistoricalDeque<E>
30 {
31
32
33
34
35
36 public HistoricalLinkedList(final HistoryManager historyManager)
37 {
38 super(historyManager, new LinkedList<>());
39 }
40
41
42
43
44
45
46 public HistoricalLinkedList(final HistoryManager historyManager, final Collection<? extends E> c)
47 {
48 super(historyManager, new LinkedList<>(c));
49 }
50
51
52 @Override
53 public LinkedList<E> get()
54 {
55 return getCollection();
56 }
57
58
59 @Override
60 public LinkedList<E> get(final Time time)
61 {
62 if (isLastState(time))
63 {
64 return getCollection();
65 }
66 return fill(time, new LinkedList<>());
67 }
68
69
70 @Override
71 public String toString()
72 {
73 return "HistoricalLinkedList [current=" + getCollection() + "]";
74 }
75
76
77
78
79
80
81 @Override
82 public boolean offer(final E e)
83 {
84 return offerLast(e);
85 }
86
87
88 @Override
89 public boolean offerLast(final E e)
90 {
91 boolean added = getCollection().offer(e);
92 if (added)
93 {
94 addEvent(new AddEvent<>(now().si, e, size() - 1));
95 }
96 return added;
97 }
98
99
100 @Override
101 public void addLast(final E e)
102 {
103 add(e);
104 }
105
106
107
108
109 @Override
110 public E remove()
111 {
112 return removeFirst();
113 }
114
115
116 @Override
117 public E removeFirst()
118 {
119 if (isEmpty())
120 {
121 return getCollection().remove();
122 }
123 E element = peek();
124 remove(element);
125 return element;
126 }
127
128
129 @Override
130 public E pop()
131 {
132 return removeFirst();
133 }
134
135
136 @Override
137 public E pollFirst()
138 {
139 if (isEmpty())
140 {
141 return null;
142 }
143 E element = peek();
144 remove(element);
145 return element;
146 }
147
148
149 @Override
150 public E poll()
151 {
152 return pollFirst();
153 }
154
155
156
157
158 @Override
159 public void addFirst(final E e)
160 {
161 add(0, e);
162 }
163
164
165 @Override
166 public void push(final E e)
167 {
168 addFirst(e);
169 }
170
171
172 @Override
173 public boolean offerFirst(final E e)
174 {
175 boolean added = getCollection().offerFirst(e);
176 if (added)
177 {
178 addEvent(new AddEvent<>(now().si, e, 0));
179 }
180 return added;
181 }
182
183
184
185
186 @Override
187 public E removeLast()
188 {
189 if (isEmpty())
190 {
191 getCollection().removeLast();
192 }
193 return remove(size() - 1);
194 }
195
196
197 @Override
198 public E pollLast()
199 {
200 if (isEmpty())
201 {
202 return null;
203 }
204 return remove(size() - 1);
205 }
206
207
208
209
210 @Override
211 public boolean removeFirstOccurrence(final Object o)
212 {
213 for (int i = 0; i < size(); i++)
214 {
215 if (Objects.equals(get(i), o))
216 {
217 remove(i);
218 return true;
219 }
220 }
221 return false;
222 }
223
224
225 @Override
226 public boolean removeLastOccurrence(final Object o)
227 {
228 for (int i = size() - 1; i >= 0; i--)
229 {
230 if (Objects.equals(get(i), o))
231 {
232 remove(i);
233 return true;
234 }
235 }
236 return false;
237 }
238
239
240
241
242 @Override
243 public E element()
244 {
245 return getCollection().element();
246 }
247
248
249 @Override
250 public E peek()
251 {
252 return getCollection().peek();
253 }
254
255
256 @Override
257 public E getFirst()
258 {
259 return getCollection().getFirst();
260 }
261
262
263 @Override
264 public E getLast()
265 {
266 return getCollection().getLast();
267 }
268
269
270 @Override
271 public E peekFirst()
272 {
273 return getCollection().peekFirst();
274 }
275
276
277 @Override
278 public E peekLast()
279 {
280 return getCollection().peekLast();
281 }
282
283
284
285
286
287
288
289 @Override
290 public Iterator<E> descendingIterator()
291 {
292 List<E> list = new LinkedList<>(getCollection());
293 Collections.reverse(list);
294 return Collections.unmodifiableList(list).iterator();
295 }
296
297 }