package games.strategy.engine.data;
import java.util.ArrayList;
import java.util.List;
/**
* A Change made of several changes.
*/
public class CompositeChange extends Change {
private static final long serialVersionUID = 8152962976769419486L;
private final List<Change> m_changes;
public CompositeChange(final Change... changes) {
this();
add(changes);
}
public CompositeChange() {
m_changes = new ArrayList<>();
}
public CompositeChange(final List<Change> changes) {
m_changes = new ArrayList<>(changes);
}
public void add(final Change... changes) {
for (final Change aChange : changes) {
if (!aChange.isEmpty()) {
m_changes.add(aChange);
}
}
}
@Override
public Change invert() {
final List<Change> newChanges = new ArrayList<>();
// to invert a list of changes, process the opposite of
// each change in the reverse order of the original list
for (int i = m_changes.size() - 1; i >= 0; i--) {
final Change current = m_changes.get(i);
newChanges.add(current.invert());
}
return new CompositeChange(newChanges);
}
@Override
protected void perform(final GameData data) {
for (final Change current : m_changes) {
current.perform(data);
}
}
/**
* @return true if this change is empty, or composed of empty changes.
*/
@Override
public boolean isEmpty() {
for (final Change c : m_changes) {
if (!c.isEmpty()) {
return false;
}
}
return true;
}
public List<Change> getChanges() {
return new ArrayList<>(m_changes);
}
@Override
public String toString() {
return "CompositeChange <" + (m_changes == null ? "null" : m_changes.toString()) + ">";
}
}