/*******************************************************************************
* Copyright (c) 2015 Jeff Martin.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser General Public
* License v3.0 which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl.html
*
* Contributors:
* Jeff Martin - initial API and implementation
******************************************************************************/
package cuchaz.enigma.convert;
import com.google.common.collect.*;
import java.util.Collection;
import java.util.Set;
import cuchaz.enigma.mapping.ClassEntry;
import cuchaz.enigma.mapping.FieldEntry;
public class FieldMatches {
private BiMap m_matches;
private Multimap m_matchedSourceFields;
private Multimap m_unmatchedSourceFields;
private Multimap m_unmatchedDestFields;
private Multimap m_unmatchableSourceFields;
public FieldMatches() {
m_matches = HashBiMap.create();
m_matchedSourceFields = HashMultimap.create();
m_unmatchedSourceFields = HashMultimap.create();
m_unmatchedDestFields = HashMultimap.create();
m_unmatchableSourceFields = HashMultimap.create();
}
public void addMatch(FieldEntry srcField, FieldEntry destField) {
boolean wasAdded = m_matches.put(srcField, destField) == null;
assert (wasAdded);
wasAdded = m_matchedSourceFields.put(srcField.getClassEntry(), srcField);
assert (wasAdded);
}
public void addUnmatchedSourceField(FieldEntry fieldEntry) {
boolean wasAdded = m_unmatchedSourceFields.put(fieldEntry.getClassEntry(), fieldEntry);
assert (wasAdded);
}
public void addUnmatchedSourceFields(Iterable fieldEntries) {
for (FieldEntry fieldEntry : fieldEntries) {
addUnmatchedSourceField(fieldEntry);
}
}
public void addUnmatchedDestField(FieldEntry fieldEntry) {
boolean wasAdded = m_unmatchedDestFields.put(fieldEntry.getClassEntry(), fieldEntry);
assert (wasAdded);
}
public void addUnmatchedDestFields(Iterable fieldEntries) {
for (FieldEntry fieldEntry : fieldEntries) {
addUnmatchedDestField(fieldEntry);
}
}
public void addUnmatchableSourceField(FieldEntry sourceField) {
boolean wasAdded = m_unmatchableSourceFields.put(sourceField.getClassEntry(), sourceField);
assert (wasAdded);
}
public Set getSourceClassesWithUnmatchedFields() {
return m_unmatchedSourceFields.keySet();
}
public Collection getSourceClassesWithoutUnmatchedFields() {
Set out = Sets.newHashSet();
out.addAll(m_matchedSourceFields.keySet());
out.removeAll(m_unmatchedSourceFields.keySet());
return out;
}
public Collection getUnmatchedSourceFields() {
return m_unmatchedSourceFields.values();
}
public Collection getUnmatchedSourceFields(ClassEntry sourceClass) {
return m_unmatchedSourceFields.get(sourceClass);
}
public Collection getUnmatchedDestFields() {
return m_unmatchedDestFields.values();
}
public Collection getUnmatchedDestFields(ClassEntry destClass) {
return m_unmatchedDestFields.get(destClass);
}
public Collection getUnmatchableSourceFields() {
return m_unmatchableSourceFields.values();
}
public boolean hasSource(FieldEntry fieldEntry) {
return m_matches.containsKey(fieldEntry) || m_unmatchedSourceFields.containsValue(fieldEntry);
}
public boolean hasDest(FieldEntry fieldEntry) {
return m_matches.containsValue(fieldEntry) || m_unmatchedDestFields.containsValue(fieldEntry);
}
public BiMap matches() {
return m_matches;
}
public boolean isMatchedSourceField(FieldEntry sourceField) {
return m_matches.containsKey(sourceField);
}
public boolean isMatchedDestField(FieldEntry destField) {
return m_matches.containsValue(destField);
}
public void makeMatch(FieldEntry sourceField, FieldEntry destField) {
boolean wasRemoved = m_unmatchedSourceFields.remove(sourceField.getClassEntry(), sourceField);
assert (wasRemoved);
wasRemoved = m_unmatchedDestFields.remove(destField.getClassEntry(), destField);
assert (wasRemoved);
addMatch(sourceField, destField);
}
public boolean isMatched(FieldEntry sourceField, FieldEntry destField) {
FieldEntry match = m_matches.get(sourceField);
return match != null && match.equals(destField);
}
public void unmakeMatch(FieldEntry sourceField, FieldEntry destField) {
boolean wasRemoved = m_matches.remove(sourceField) != null;
assert (wasRemoved);
wasRemoved = m_matchedSourceFields.remove(sourceField.getClassEntry(), sourceField);
assert (wasRemoved);
addUnmatchedSourceField(sourceField);
addUnmatchedDestField(destField);
}
public void makeSourceUnmatchable(FieldEntry sourceField) {
assert (!isMatchedSourceField(sourceField));
boolean wasRemoved = m_unmatchedSourceFields.remove(sourceField.getClassEntry(), sourceField);
assert (wasRemoved);
addUnmatchableSourceField(sourceField);
}
}