forked from External/mage
performance: improved CPU/memory usage with copy of cost's targets (related to #11285), added runtime check for wrong targets usage
This commit is contained in:
parent
d6c858ecaf
commit
ddc1ec8ef8
32 changed files with 173 additions and 107 deletions
|
|
@ -4,17 +4,17 @@ import mage.abilities.Ability;
|
|||
import mage.constants.Outcome;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.util.Copyable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author BetaSteward_at_googlemail.com
|
||||
*/
|
||||
public class Targets extends ArrayList<Target> {
|
||||
public class Targets extends ArrayList<Target> implements Copyable<Targets> {
|
||||
|
||||
private boolean isReadOnly = false; // runtime protect from not working targets modification, e.g. in composite costs
|
||||
|
||||
public Targets() {
|
||||
// fast constructor
|
||||
|
|
@ -25,12 +25,18 @@ public class Targets extends ArrayList<Target> {
|
|||
}
|
||||
|
||||
protected Targets(final Targets targets) {
|
||||
this.isReadOnly = targets.isReadOnly;
|
||||
this.ensureCapacity(targets.size());
|
||||
for (Target target : targets) {
|
||||
this.add(target.copy());
|
||||
}
|
||||
}
|
||||
|
||||
public Targets withReadOnly() {
|
||||
this.isReadOnly = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
public List<Target> getUnchosen() {
|
||||
return stream().filter(target -> !target.isChosen()).collect(Collectors.toList());
|
||||
}
|
||||
|
|
@ -147,7 +153,44 @@ public class Targets extends ArrayList<Target> {
|
|||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Targets copy() {
|
||||
return new Targets(this);
|
||||
}
|
||||
|
||||
private void checkReadOnlyModification() {
|
||||
if (this.isReadOnly) {
|
||||
throw new IllegalArgumentException("Wrong code usage: you can't modify read only targets list, e.g. from composite costs");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean add(Target target) {
|
||||
checkReadOnlyModification();
|
||||
return super.add(target);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add(int index, Target element) {
|
||||
checkReadOnlyModification();
|
||||
super.add(index, element);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addAll(Collection<? extends Target> c) {
|
||||
checkReadOnlyModification();
|
||||
return super.addAll(c);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addAll(int index, Collection<? extends Target> c) {
|
||||
checkReadOnlyModification();
|
||||
return super.addAll(index, c);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
checkReadOnlyModification();
|
||||
super.clear();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue