Skip to content

Commit 3469c83

Browse files
committed
refactor: Split ParetoSet and ParetoSetWithListener
1 parent 8d817f8 commit 3469c83

File tree

2 files changed

+63
-47
lines changed

2 files changed

+63
-47
lines changed

raptor/src/main/java/org/opentripplanner/raptor/util/paretoset/ParetoSet.java

Lines changed: 26 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,10 @@
2424
*
2525
* @param <T> the element type
2626
*/
27-
public final class ParetoSet<T> extends AbstractCollection<T> {
27+
public sealed class ParetoSet<T> extends AbstractCollection<T> permits ParetoSetWithListener {
2828

2929
private final ParetoComparator<T> comparator;
3030

31-
@Nullable
32-
private final ParetoSetEventListener<? super T> eventListener;
33-
3431
@SuppressWarnings("unchecked")
3532
private T[] elements = (T[]) new Object[16];
3633

@@ -40,23 +37,15 @@ public final class ParetoSet<T> extends AbstractCollection<T> {
4037

4138
private int marker = 0;
4239

43-
private ParetoSet(
44-
ParetoComparator<T> comparator,
45-
@Nullable ParetoSetEventListener<? super T> eventListener
46-
) {
40+
protected ParetoSet(ParetoComparator<T> comparator) {
4741
this.comparator = comparator;
48-
this.eventListener = eventListener;
49-
}
50-
51-
private ParetoSet(ParetoComparator<T> comparator) {
52-
this(comparator, null);
5342
}
5443

5544
/**
5645
* Create a new ParetoSet with a comparator.
5746
*/
5847
public static <T> ParetoSet<T> of(ParetoComparator<T> comparator) {
59-
return of(comparator, null);
48+
return new ParetoSet<>(comparator);
6049
}
6150

6251
/**
@@ -69,10 +58,12 @@ public static <T> ParetoSet<T> of(
6958
ParetoComparator<T> comparator,
7059
@Nullable ParetoSetEventListener<? super T> eventListener
7160
) {
72-
return new ParetoSet<>(comparator, eventListener);
61+
return eventListener == null
62+
? of(comparator)
63+
: new ParetoSetWithListener<>(comparator, eventListener);
7364
}
7465

75-
public T get(int index) {
66+
public final T get(int index) {
7667
return elements[index];
7768
}
7869

@@ -97,11 +88,11 @@ public Iterator iterator() {
9788
}
9889
*/
9990

100-
public int size() {
91+
public final int size() {
10192
return size;
10293
}
10394

104-
public boolean isEmpty() {
95+
public final boolean isEmpty() {
10596
return size == 0;
10697
}
10798

@@ -111,7 +102,7 @@ public Stream<T> stream() {
111102
}
112103
*/
113104

114-
public boolean add(T newValue) {
105+
public final boolean add(T newValue) {
115106
if (size == 0) {
116107
acceptAndAppendValue(newValue);
117108
return true;
@@ -164,7 +155,7 @@ public void addAll(Collection<T> elements) {
164155
}
165156
}*/
166157

167-
public void clear() {
158+
public final void clear() {
168159
size = 0;
169160
goodElement = null;
170161
marker = 0;
@@ -181,7 +172,7 @@ public String toString() {
181172
* <p/>
182173
* Both methods are optimized for performance; hence the add method does not use this method.
183174
*/
184-
public boolean qualify(T newValue) {
175+
public final boolean qualify(T newValue) {
185176
if (size == 0) {
186177
return true;
187178
}
@@ -243,7 +234,7 @@ public String toString(Function<? super T, String> toStringMapper) {
243234
* Notify subclasses about reindexing. This method is empty, and only exist for subclasses to
244235
* override it.
245236
*/
246-
private void notifyElementMoved(int fromIndex, int toIndex) {
237+
private final void notifyElementMoved(int fromIndex, int toIndex) {
247238
if (fromIndex == marker) {
248239
marker = toIndex;
249240
}
@@ -272,7 +263,7 @@ final Iterable<T> tail(final int startIndexInclusive) {
272263
* is changed the returned values of the iterator also changes. Do not update on this collection
273264
* while using this iterator.
274265
*/
275-
private Iterator<T> tailIterator(final int startInclusive) {
266+
private final Iterator<T> tailIterator(final int startInclusive) {
276267
return new Iterator<>() {
277268
int i = startInclusive;
278269

@@ -292,7 +283,7 @@ public T next() {
292283
* Remove all elements dominated by the {@code newValue} starting from {@code index + 1}. The
293284
* element at {@code index} is dropped.
294285
*/
295-
private void removeDominatedElementsFromRestOfSetAndAddNewElement(
286+
private final void removeDominatedElementsFromRestOfSetAndAddNewElement(
296287
final T newValue,
297288
final int index
298289
) {
@@ -321,62 +312,50 @@ private void removeDominatedElementsFromRestOfSetAndAddNewElement(
321312
size = i + 1;
322313
}
323314

324-
private boolean leftVectorDominatesRightVector(T left, T right) {
315+
private final boolean leftVectorDominatesRightVector(T left, T right) {
325316
return leftDominanceExist(left, right) && !rightDominanceExist(left, right);
326317
}
327318

328-
private void acceptAndAppendValue(T newValue) {
319+
private final void acceptAndAppendValue(T newValue) {
329320
notifyElementAccepted(newValue);
330321
elements[size++] = newValue;
331322
}
332323

333-
private void assertEnoughSpaceInSet() {
324+
private final void assertEnoughSpaceInSet() {
334325
if (size == elements.length) {
335326
elements = Arrays.copyOf(elements, elements.length * 2);
336327
}
337328
}
338329

339-
private boolean leftDominanceExist(T left, T right) {
330+
private final boolean leftDominanceExist(T left, T right) {
340331
return comparator.leftDominanceExist(left, right);
341332
}
342333

343-
private boolean rightDominanceExist(T left, T right) {
334+
private final boolean rightDominanceExist(T left, T right) {
344335
return comparator.leftDominanceExist(right, left);
345336
}
346337

347-
private void notifyElementAccepted(T newElement) {
348-
if (eventListener != null) {
349-
eventListener.notifyElementAccepted(newElement);
350-
}
351-
}
338+
protected void notifyElementAccepted(T newElement) {}
352339

353-
private void notifyElementDropped(T element, T droppedByElement) {
354-
if (eventListener != null) {
355-
eventListener.notifyElementDropped(element, droppedByElement);
356-
}
357-
}
340+
protected void notifyElementDropped(T element, T droppedByElement) {}
358341

359-
private void notifyElementRejected(T element, T rejectByElement) {
360-
if (eventListener != null) {
361-
eventListener.notifyElementRejected(element, rejectByElement);
362-
}
363-
}
342+
protected void notifyElementRejected(T element, T rejectByElement) {}
364343

365-
public boolean hasElementsAfterMarker() {
344+
public final boolean hasElementsAfterMarker() {
366345
return marker != size();
367346
}
368347

369348
/**
370349
* List all elements added after the marker.
371350
*/
372-
public Iterable<T> elementsAfterMarker() {
351+
public final Iterable<T> elementsAfterMarker() {
373352
return tail(marker);
374353
}
375354

376355
/**
377356
* Move the marker after the last element in the set.
378357
*/
379-
public void markAtEndOfSet() {
358+
public final void markAtEndOfSet() {
380359
marker = size();
381360
}
382361
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package org.opentripplanner.raptor.util.paretoset;
2+
3+
import java.util.Objects;
4+
5+
public final class ParetoSetWithListener<T> extends ParetoSet<T> {
6+
7+
private final ParetoSetEventListener<? super T> eventListener;
8+
9+
public ParetoSetWithListener(
10+
ParetoComparator<T> comparator,
11+
ParetoSetEventListener<? super T> eventListener
12+
) {
13+
super(comparator);
14+
this.eventListener = Objects.requireNonNull(eventListener);
15+
}
16+
17+
@Override
18+
protected final void notifyElementAccepted(T newElement) {
19+
if (eventListener != null) {
20+
eventListener.notifyElementAccepted(newElement);
21+
}
22+
}
23+
24+
@Override
25+
protected final void notifyElementDropped(T element, T droppedByElement) {
26+
if (eventListener != null) {
27+
eventListener.notifyElementDropped(element, droppedByElement);
28+
}
29+
}
30+
31+
@Override
32+
protected final void notifyElementRejected(T element, T rejectByElement) {
33+
if (eventListener != null) {
34+
eventListener.notifyElementRejected(element, rejectByElement);
35+
}
36+
}
37+
}

0 commit comments

Comments
 (0)