/* * Javolution - Java(TM) Solution for Real-Time and Embedded Systems * Copyright (C) 2012 - Javolution (http://javolution.org/) * All rights reserved. * * Permission to use, copy, modify, and distribute this software is * freely granted, provided that this notice is preserved. */ package javolution.util.internal.comparator; import javolution.util.function.Equality; /** * The case insensitive lexical comparator implementation. */ public class LexicalCaseInsensitiveComparatorImpl implements Equality<CharSequence> { private static final long serialVersionUID = 0x600L; // Version. // Converts to upper case. private static char up(char c) { return Character.toUpperCase(c); } @Override public boolean equal(CharSequence csq1, CharSequence csq2) { if (csq1 == csq2) return true; if ((csq1 == null) || (csq2 == null)) return false; if ((csq1 instanceof String) && (csq2 instanceof String)) // Optimization. return ((String) csq1).equalsIgnoreCase((String) csq2); int n = csq1.length(); if (csq2.length() != n) return false; for (int i = 0; i < n;) { if (up(csq1.charAt(i)) != up(csq2.charAt(i++))) return false; } return true; } @Override public int compare(CharSequence left, CharSequence right) { if (left == null) return -1; if (right == null) return 1; if ((left instanceof String) && (right instanceof String)) // Optimization. return ((String) left).compareToIgnoreCase((String) right); int i = 0; int n = Math.min(left.length(), right.length()); while (n-- != 0) { char c1 = up(left.charAt(i)); char c2 = up(right.charAt(i++)); if (c1 != c2) return c1 - c2; } return left.length() - right.length(); } @Override public int hashOf(CharSequence csq) { if (csq == null) return 0; int h = 0; for (int i = 0, n = csq.length(); i < n;) { h = 31 * h + up(csq.charAt(i++)); } return h; } @Override public boolean equals(Object obj) { return obj instanceof LexicalCaseInsensitiveComparatorImpl; } @Override public int hashCode() { return LexicalCaseInsensitiveComparatorImpl.class.hashCode(); } }