Skip to content

Commit a68ee88

Browse files
committed
Coverage
1 parent 6a8d0ee commit a68ee88

File tree

3 files changed

+385
-372
lines changed

3 files changed

+385
-372
lines changed

core/src/main/java/ai/timefold/solver/core/impl/bavet/common/ExistsCounterHandle.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ final class ExistsCounterHandle<LeftTuple_ extends AbstractTuple> {
2929
}
3030

3131
public void removeByLeft() {
32-
rightHandleSet.remove(this);
32+
rightHandleSet.remove(this); // The counter will be removed from the left handle set by the caller.
3333
}
3434

3535
public void removeByRight() {
36-
counter.leftHandleSet.remove(this);
36+
counter.leftHandleSet.remove(this); // The counter will be removed from the right handle set by the caller.
3737
}
3838

3939
}

core/src/main/java/ai/timefold/solver/core/impl/bavet/common/index/IndexedSet.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
package ai.timefold.solver.core.impl.bavet.common.index;
22

3-
import ai.timefold.solver.core.impl.util.ElementAwareList;
4-
import org.jspecify.annotations.NullMarked;
5-
import org.jspecify.annotations.Nullable;
6-
73
import java.util.ArrayList;
84
import java.util.Collections;
95
import java.util.List;
106
import java.util.Objects;
117
import java.util.function.Consumer;
128
import java.util.function.Predicate;
139

10+
import ai.timefold.solver.core.impl.util.ElementAwareList;
11+
12+
import org.jspecify.annotations.NullMarked;
13+
import org.jspecify.annotations.Nullable;
14+
1415
/**
1516
* {@link ArrayList}-backed set which allows to {@link #remove(Object)} an element
1617
* without knowing its position and without an expensive lookup.
@@ -161,10 +162,14 @@ private void forEachNonCompacting(Consumer<T> elementConsumer) {
161162
}
162163

163164
private void forEachNonCompacting(Consumer<T> elementConsumer, int startingIndex) {
164-
for (var i = startingIndex; i <= lastElementPosition; i++) {
165+
var oldLastElementPosition = lastElementPosition;
166+
for (var i = startingIndex; i <= oldLastElementPosition; i++) {
165167
var element = elementList.get(i);
166168
if (element != null) {
167169
elementConsumer.accept(element);
170+
if (lastElementPosition != oldLastElementPosition) {
171+
throw new IllegalStateException("Impossible state: the IndexedSet was modified while being iterated.");
172+
}
168173
}
169174
}
170175
}
@@ -239,11 +244,15 @@ private void forEachCompacting(Consumer<T> elementConsumer) {
239244
}
240245

241246
private @Nullable T findFirstNonCompacting(Predicate<T> elementPredicate, int startingIndex) {
242-
for (var i = startingIndex; i <= lastElementPosition; i++) {
247+
var oldLastElementPosition = lastElementPosition;
248+
for (var i = startingIndex; i <= oldLastElementPosition; i++) {
243249
var element = elementList.get(i);
244250
if (element != null && elementPredicate.test(element)) {
245251
return element;
246252
}
253+
if (lastElementPosition != oldLastElementPosition) {
254+
throw new IllegalStateException("Impossible state: the IndexedSet was modified while being searched.");
255+
}
247256
}
248257
return null;
249258
}

0 commit comments

Comments
 (0)