package rocks.inspectit.shared.all.instrumentation.classcache.util; import java.util.Comparator; import java.util.Iterator; import java.util.List; import rocks.inspectit.shared.all.instrumentation.classcache.MethodType; /** * Set for the {@link MethodType}s that inserts element in set based on method name, return type and * parameters. * * @author Ivan Senic */ public class MethodTypeSet extends SortedArraySet<MethodType> { /** * {@link MethodType} comparator that defines elements as being equal by the method. */ public static final Comparator<MethodType> METHOD_COMPARATOR = new Comparator<MethodType>() { /** * {@inheritDoc} */ @Override public int compare(MethodType o1, MethodType o2) { // first name int result = o1.getName().compareTo(o2.getName()); if (result != 0) { return result; } result = o1.getReturnType().compareTo(o2.getReturnType()); if (result != 0) { return result; } List<String> parameters1 = o1.getParameters(); List<String> parameters2 = o2.getParameters(); // then parameter size result = compareInts(parameters1.size(), parameters2.size()); if (result != 0) { return result; } // then parameter by parameter for (Iterator<String> it1 = parameters1.iterator(), it2 = parameters2.iterator(); it1.hasNext() && it2.hasNext();) { result = it1.next().compareTo(it2.next()); if (result != 0) { return result; } } return 0; } /** * Compares two int values. * * @param x * first * @param y * second * @return result based on the compare interface */ public int compareInts(int x, int y) { return (x < y) ? -1 : ((x == y) ? 0 : 1); } }; /** * Default constructor. */ public MethodTypeSet() { super(METHOD_COMPARATOR); } }