@Override public V get(Object key) { return getWithIntKey((Integer)key); }
@Override public void putAll(java.util.Map<? extends Integer, ? extends V> m) { if(immutable) { throw new IllegalStateException("object is immutable"); } for (Entry<? extends Integer, ? extends V> e : m.entrySet()) { put(e.getKey(), e.getValue()); } };
@Override public int size() { return intMap.size(); }
public void shouldRemoveStuff() { SimpleIntKeyMap<Integer> map = new SimpleIntKeyMap<>(); for(int i=0; i< 200; i++) { map.put(i, i); } for(int i=0; i< 200; i=i+2) { map.remove(i); } assertThat(map.size()).isEqualTo(100); for(Entry<Integer, Integer> e: map.entrySet()) { assertThat(e.getValue() % 2).as("all even versions were removed").isEqualTo(1); } }
public void shouldRemove() { SimpleIntKeyMap<JsonElement> m = new SimpleIntKeyMap<>(); for(int i=0;i<42;i++) { m.put(i, primitive(i)); } Iterator<Entry<Integer, JsonElement>> iterator = m.entrySet().iterator(); while (iterator.hasNext()) { Entry<Integer, JsonElement> entry = iterator.next(); Integer key = entry.getKey(); iterator.remove(); assertThat(m.get(key), nullValue()); } }
public void shouldRemoveElements() { SimpleIntKeyMap<JsonElement> m = new SimpleIntKeyMap<>(); m.put(1, primitive(1)); m.put(2, primitive(2)); m.put(3, primitive(3)); m.put(4, primitive(4)); m.put(5, primitive(5)); m.remove(2); m.remove(4); assertThat(m.getWithIntKey(1)).isEqualTo(primitive(1)); assertThat(m.getWithIntKey(2)).isNull(); assertThat(m.getWithIntKey(3)).isEqualTo(primitive(3)); assertThat(m.getWithIntKey(4)).isNull(); assertThat(m.getWithIntKey(5)).isEqualTo(primitive(5)); } }
public void shouldPutGetStuff() { SimpleIntKeyMap<String> map = new SimpleIntKeyMap<>(); for(int i=100; i< 200; i++) { map.put(i, "str"+i); } for(int i=100; i< 200; i++) { assertThat(map.get(i)).isEqualTo("str"+i); } }
@Test(expectedExceptions=ConcurrentModificationException.class) public void shouldNotAllowConcurrentModification() { SimpleIntKeyMap<JsonElement> m = new SimpleIntKeyMap<>(); for(int i=0;i<42;i++) { m.put(i, primitive(i)); } for(@SuppressWarnings("unused") Entry<Integer, JsonElement> e: m.entrySet()) { m.put(1234, primitive("y")); } }
@Override public Set<Entry<String, JsonElement>> entrySet() { final Set<Entry<Integer, JsonElement>> entrySet = intMap.entrySet(); return new Set<Map.Entry<String, JsonElement>>() {
void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { // when deserializing, parse the json string try { int length = in.readInt(); byte[] buf = new byte[length]; in.readFully(buf); if (parser == null) { // create it lazily, static so won't increase object size parser = new JsonParser(); } JsonElement o = parser.parse(new String(buf, StandardCharsets.UTF_8)); Field f = getClass().getDeclaredField("intMap"); f.setAccessible(true); f.set(this, new SimpleIntKeyMap<>()); for (Entry<String, JsonElement> e : o.asObject().entrySet()) { put(e.getKey(), e.getValue()); } } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { throw new IllegalStateException(e); } } }
@Override public JsonElement remove(Object key) { if (key != null && key instanceof String) { return intMap.remove(EfficientString.fromString(key.toString()).index()); } else { throw new IllegalArgumentException(); } }
@Override public JsonElement get(Object key) { if (key != null && key instanceof String) { return intMap.get(EfficientString.fromString(key.toString()).index()); } else { throw new IllegalArgumentException(); } }
@Override public void clear() { intMap.clear(); }
@Override public boolean containsValue(Object value) { return intMap.containsValue(value); }
@Override public boolean containsKey(Object key) { return containsIntKey((Integer)key); }
public void shouldIterate() { SimpleIntKeyMap<JsonElement> m = new SimpleIntKeyMap<>(); for(int i=0;i<42;i++) { m.put(i, primitive(i)); } int i=0; for(Entry<Integer, JsonElement> e: m.entrySet()) { assertThat(e.getKey(), is(i)); assertThat(e.getValue(), is((JsonElement)primitive(i))); i++; } assertThat(i, is(m.size())); }
public void shouldRemoveFromEntrySet() { SimpleIntKeyMap<JsonElement> m = new SimpleIntKeyMap<>(); m.put(42, primitive(42)); m.put(43, primitive(43)); Set<Entry<Integer, JsonElement>> set = m.entrySet(); Iterator<Entry<Integer, JsonElement>> iterator = set.iterator(); iterator.next(); iterator.remove(); assertThat(m.get(42)).isNull(); }
@Override public void serialize(Writer w) throws IOException { w.append(JsonSerializer.OPEN_BRACE); Iterator<Entry<Integer, JsonElement>> iterator = intMap.entrySet().iterator(); while (iterator.hasNext()) { Entry<Integer, JsonElement> entry = iterator.next(); EfficientString key = EfficientString.get(entry.getKey()); JsonElement value = entry.getValue(); w.append(JsonSerializer.QUOTE); w.append(JsonSerializer.jsonEscape(key.toString())); w.append(JsonSerializer.QUOTE); w.append(JsonSerializer.COLON); value.serialize(w); if (iterator.hasNext()) { w.append(JsonSerializer.COMMA); } } w.append(JsonSerializer.CLOSE_BRACE); }
@Override void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { // when deserializing, parse the json string try { int length = in.readInt(); byte[] buf = new byte[length]; in.readFully(buf); if (parser == null) { // create it lazily, static so won't increase object size parser = new JsonParser(); } JsonElement o = parser.parse(new String(buf, StandardCharsets.UTF_8)); Field f = getClass().getDeclaredField("intMap"); f.setAccessible(true); f.set(this, new SimpleIntKeyMap<>()); for (Entry<String, JsonElement> e : o.asObject().entrySet()) { put(e.getKey(), e.getValue()); } } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { throw new IllegalStateException(e); } } }
@Override public JsonElement put(String key, JsonElement value) { Validate.notNull(key); if (value == null) { value = nullValue(); } return intMap.put(EfficientString.fromString(key).index(), value); }