/**
* Copyright (C) Zhang,Yuexiang (xfeep)
*
*/
package nginx.clojure;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
/**
* Only use this for small and stable map
*
*/
public class CaseInsensitiveMap<V> extends TreeMap<String, V> {
public static final Comparator<String> IGNORE_CASE_COMPARATOR = new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
int n1 = s1.length();
int n2 = s2.length();
int min = n1 > n2 ? n2 : n1;
for (int i = 0; i < min; i++) {
int c1 = s1.charAt(i);
int c2 = s2.charAt(i);
if (c1 != c2) {
c1 = c1 >= 'A' && c1 <= 'Z' ? (c1 | 0x20) : c1;
c2 = c2 >= 'A' && c2 <= 'Z' ? (c2 | 0x20) : c2;
if (c1 != c2) {
return c1 - c2;
}
}
}
return n1 - n2;
}
};
/**
*
*/
private static final long serialVersionUID = 1L;
private HashMap<String, V> fastMap = new HashMap<String, V>();
public CaseInsensitiveMap() {
super(IGNORE_CASE_COMPARATOR);
}
@Override
public V get(Object key) {
V v = fastMap.get(key);
return v == null ? super.get(key) : v;
}
@Override
public V put(String key, V value) {
fastMap.put(key, value);
return super.put(key, value);
}
@Override
public void putAll(Map<? extends String, ? extends V> map) {
super.putAll(map);
fastMap.putAll(map);
}
}