/******************************************************************************* * 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 java.util.Collection; import java.util.Set; import com.google.common.collect.Sets; import cuchaz.enigma.Util; import cuchaz.enigma.mapping.ClassEntry; public class ClassMatch { public Set<ClassEntry> sourceClasses; public Set<ClassEntry> destClasses; public ClassMatch(Collection<ClassEntry> sourceClasses, Collection<ClassEntry> destClasses) { this.sourceClasses = Sets.newHashSet(sourceClasses); this.destClasses = Sets.newHashSet(destClasses); } public ClassMatch(ClassEntry sourceClass, ClassEntry destClass) { sourceClasses = Sets.newHashSet(); if(sourceClass != null) sourceClasses.add(sourceClass); destClasses = Sets.newHashSet(); if(destClass != null) destClasses.add(destClass); } public boolean isMatched() { return sourceClasses.size() > 0 && destClasses.size() > 0; } public boolean isAmbiguous() { return sourceClasses.size() > 1 || destClasses.size() > 1; } public ClassEntry getUniqueSource() { if(sourceClasses.size() != 1) throw new IllegalStateException("Match has ambiguous source!"); return sourceClasses.iterator().next(); } public ClassEntry getUniqueDest() { if(destClasses.size() != 1) throw new IllegalStateException("Match has ambiguous source!"); return destClasses.iterator().next(); } public Set<ClassEntry> intersectSourceClasses(Set<ClassEntry> classes) { Set<ClassEntry> intersection = Sets.newHashSet(sourceClasses); intersection.retainAll(classes); return intersection; } @Override public int hashCode() { return Util.combineHashesOrdered(sourceClasses, destClasses); } @Override public boolean equals(Object other) { if(other instanceof ClassMatch) return equals((ClassMatch)other); return false; } public boolean equals(ClassMatch other) { return sourceClasses.equals(other.sourceClasses) && destClasses.equals(other.destClasses); } }