package games.strategy.engine.data;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import games.strategy.triplea.delegate.TechAdvance;
import games.strategy.util.Util;
public class TechnologyFrontier extends GameDataComponent implements Iterable<TechAdvance> {
private static final long serialVersionUID = -5245743727479551766L;
private final List<TechAdvance> m_techs = new ArrayList<>();
private List<TechAdvance> m_cachedTechs;
private final String m_name;
public TechnologyFrontier(final String name, final GameData data) {
super(data);
m_name = name;
}
public TechnologyFrontier(final TechnologyFrontier other) {
super(other.getData());
m_name = other.m_name;
m_techs.addAll(other.m_techs);
}
public void addAdvance(final TechAdvance t) {
m_cachedTechs = null;
m_techs.add(t);
Util.reorder(m_techs, getData().getTechnologyFrontier().getTechs());
}
public void addAdvance(final List<TechAdvance> list) {
for (final TechAdvance t : list) {
addAdvance(t);
}
}
public void removeAdvance(final TechAdvance t) {
if (!m_techs.contains(t)) {
throw new IllegalStateException("Advance not present:" + t);
}
m_cachedTechs = null;
m_techs.remove(t);
}
public TechAdvance getAdvanceByProperty(final String property) {
for (final TechAdvance ta : m_techs) {
if (ta.getProperty().equals(property)) {
return ta;
}
}
return null;
}
public TechAdvance getAdvanceByName(final String name) {
for (final TechAdvance ta : m_techs) {
if (ta.getName().equals(name)) {
return ta;
}
}
return null;
}
public List<TechAdvance> getTechs() {
if (m_cachedTechs == null) {
m_cachedTechs = Collections.unmodifiableList(m_techs);
}
return m_cachedTechs;
}
@Override
public Iterator<TechAdvance> iterator() {
return getTechs().iterator();
}
public String getName() {
return m_name;
}
public boolean isEmpty() {
return m_techs.isEmpty();
}
@Override
public String toString() {
return m_name;
}
@Override
public int hashCode() {
return m_name.hashCode();
}
@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null || !(o instanceof TechnologyFrontier)) {
return false;
}
final TechnologyFrontier other = (TechnologyFrontier) o;
return this.m_name.equals(other.getName());
}
}