package com.lastcalc.engines;
import java.util.*;
import com.lastcalc.parsers.*;
import com.lastcalc.parsers.UserDefinedParserParser.UserDefinedParser;
/**
* A set for parsers where the UserDefinedParser that shortens the token
* list most comes first. For use in ParserPickerFactories.
*
* @author Ian Clarke <ian.clarke@gmail.com>
*
*/
public class ParserSet extends TreeSet<Parser> {
private static final long serialVersionUID = -6285593762627218550L;
public ParserSet() {
super(new Comparator<Parser>() {
@Override
public int compare(final Parser o1, final Parser o2) {
if (o1 instanceof UserDefinedParser && !(o2 instanceof UserDefinedParser))
return -1;
else if (o2 instanceof UserDefinedParser && !(o1 instanceof UserDefinedParser))
return 1;
else if (o1 instanceof UserDefinedParser && o2 instanceof UserDefinedParser) {
final UserDefinedParser udp1 = (UserDefinedParser) o1;
final UserDefinedParser udp2 = (UserDefinedParser) o2;
final int sizeRed1 = udp1.after.size() - udp1.getTemplate().size();
final int sizeRed2 = udp2.after.size() - udp2.getTemplate().size();
return compareInts(sizeRed1, sizeRed2, compareInts(o1.hashCode(), o2.hashCode(), 0));
}
else
return compareInts(o1.hashCode(), o2.hashCode(), 0);
}
});
}
private static int compareInts(final int a, final int b, final int otherwise) {
if (a<b) return -1;
else if (a>b) return 1;
else return otherwise;
}
}