package prefuse.util.collections; import java.util.Comparator; import java.util.Date; import prefuse.data.DataTypeException; /** * Factory class that generates the appropriate IntSortedMap implementation * given a key data type. * * @author <a href="http://jheer.org">jeffrey heer</a> */ public class SortedMapFactory { public static IntSortedMap getMap( Class type, Comparator cmp, boolean unique) throws IncompatibleComparatorException { if ( !comparatorCheck(type, cmp) ) { throw new IncompatibleComparatorException(); } if ( type.equals(int.class) || type.equals(byte.class) ) { return new IntIntTreeMap((LiteralComparator)cmp, !unique); } else if ( type.equals(long.class) || type.isAssignableFrom(Date.class) ) { return new LongIntTreeMap((LiteralComparator)cmp, !unique); } else if ( type.equals(float.class) ) { return new FloatIntTreeMap((LiteralComparator)cmp, !unique); } else if ( type.equals(double.class) ) { return new DoubleIntTreeMap((LiteralComparator)cmp, !unique); } else if ( type.equals(boolean.class) ) { return new BooleanIntBitSetMap(); } else if ( Object.class.isAssignableFrom(type) ) { return new ObjectIntTreeMap(cmp, !unique); } else { throw new DataTypeException( "No map available for the provided type"); } } public static boolean comparatorCheck(Class type, Comparator cmp) { if ( cmp == null ) { return true; } else if ( type.equals(int.class) ) { if ( !(cmp instanceof LiteralIterator) ) return false; try { ((LiteralComparator)cmp).compare(0,0); return true; } catch ( Exception e ) { return false; } } else if ( type.equals(long.class) ) { if ( !(cmp instanceof LiteralIterator) ) return false; try { ((LiteralComparator)cmp).compare(0L,0L); return true; } catch ( Exception e ) { return false; } } else if ( type.equals(float.class) ) { if ( !(cmp instanceof LiteralIterator) ) return false; try { ((LiteralComparator)cmp).compare(0.f,0.f); return true; } catch ( Exception e ) { return false; } } else if ( type.equals(double.class) ) { if ( !(cmp instanceof LiteralIterator) ) return false; try { ((LiteralComparator)cmp).compare(0.0,0.0); return true; } catch ( Exception e ) { return false; } } else if ( type.equals(boolean.class) ) { if ( !(cmp instanceof LiteralIterator) ) return false; try { ((LiteralComparator)cmp).compare(false,false); return true; } catch ( Exception e ) { return false; } } else if ( Object.class.isAssignableFrom(type) ) { return true; } else { throw new DataTypeException( "No comparator available for the provided type"); } } } // end of class SortedMapFactory