package test.java.performance.getField; public abstract class CrazyMapOnlyIF { public CrazyMapOnlyIF addKey(String key) { String[] keys = this.getKeys(); int h = this.code(key); if (keys[h] == null) { keys[h] = key; return this; } else if (keys[h].equals(key)) { return this; } else { return this.upgrade(this); } } static public CrazyMapOnlyIF newMap() { return new RawCrazyMap(new String[16], new String[16]); } static public CrazyMapOnlyIF newMap(String... keys) { CrazyMapOnlyIF map = new RawCrazyMap(new String[16], new String[16]); for (String key : keys) { map = map.addKey(key); } return map; } public abstract void put(String key, String value); public abstract String get(String key); public abstract CrazyMapOnlyIF shadow(); protected abstract int code(String key); protected abstract String[] getKeys(); protected abstract String[] getValues(); protected abstract CrazyMapOnlyIF upgrade(CrazyMapOnlyIF map); static class RawCrazyMap extends CrazyMapOnlyIF { @Override public int code(String key) { return (key.charAt(0) - 'a') & MASK; } @Override protected CrazyMapOnlyIF upgrade(CrazyMapOnlyIF map) { return new AdvCrazyMap(map.getKeys(), map.getValues()); } @Override public CrazyMapOnlyIF shadow() { return new RawCrazyMap(keys, new String[keys.length]); } private int MASK; private String[] keys; private String[] values; public RawCrazyMap(String[] keys, String[] values) { this.keys = keys; this.values = values; this.MASK = keys.length-1; } public void put(String key, String value) { values[(key.charAt(0) + key.charAt(1) - 'a') & MASK] = value; } public String get(String key) { return values[(key.charAt(0) + key.charAt(1) - 'a') & MASK]; } @Override protected String[] getKeys() { return this.keys; } @Override protected String[] getValues() { return this.values; } }; static class AdvCrazyMap extends CrazyMapOnlyIF { @Override public final int code(String key) { return (key.charAt(0) + key.charAt(1) - 'a') & MASK; } @Override protected CrazyMapOnlyIF upgrade(CrazyMapOnlyIF map) { return new AdvCrazyMap(map.getKeys(), map.getValues()); } @Override public CrazyMapOnlyIF shadow() { return new AdvCrazyMap(keys, new String[keys.length]); } protected final int MASK; protected final String[] keys; protected final String[] values; public AdvCrazyMap(String[] keys, String[] values) { this.keys = keys; this.values = values; this.MASK = keys.length-1; } public void put(String key, String value) { values[(key.charAt(0) + key.charAt(1) - 'a') & MASK] = value; } public String get(String key) { return values[(key.charAt(0) + key.charAt(1) - 'a') & MASK]; } @Override protected String[] getKeys() { return this.keys; } @Override protected String[] getValues() { return this.values; } }; }