@Override public boolean contains(final Object e) { if(!(e instanceof Entry)) return false; V value = get(((Entry<?,?>)e).getKey()); return value!=null && value.equals(((Entry<?,?>)e).getValue()); } };
public HashPMap<K,V> plusAll(final Map<? extends K, ? extends V> map) { HashPMap<K,V> result = this; for(Entry<? extends K,? extends V> entry : map.entrySet()) result = result.plus(entry.getKey(), entry.getValue()); return result; }
public HashPMap<K,V> minusAll(final Collection<?> keys) { HashPMap<K,V> result = this; for(Object key : keys) result = result.minus(key); return result; }
@Override public boolean containsKey(final Object key) { return keyIndexIn(getEntries(key.hashCode()), key) != -1; }
public HashPMap<K,V> minus(final Object key) { PSequence<Entry<K,V>> entries = getEntries(key.hashCode()); int i = keyIndexIn(entries, key); if(i==-1) // key not in this return this; entries = entries.minus(i); if(entries.size()==0) // get rid of the entire hash entry return new HashPMap<K,V>(intMap.minus(key.hashCode()), size-1); // otherwise replace hash entry with new smaller one: return new HashPMap<K,V>(intMap.plus(key.hashCode(), entries), size-1); }
public void testSerializationForHashPMapWithEntrySet() { /* regression test because entry set cache is unserializable, but wasn't marked as transient */ final HashPMap<String, Long> initialHashPMap = HashTreePMap.<String, Long> empty() .plus("key001", 23L) .plus("key002", 29L) .plus("key003", 31L); initialHashPMap.entrySet(); serializeToByteArray(initialHashPMap); // used to throw an exception }
/** * @param map Collection. * @param evt Event. * @return Cloned map. */ @Nullable protected static <E> Map<E, Integer> removeFromMap(@Nullable Map<E, Integer> map, E evt) { if (map == null) return null; HashPMap<E, Integer> res = (HashPMap<E, Integer>)map; Integer cnt = res.get(evt); return cnt == null ? res : cnt == 1 ? res.minus(evt) : res.minus(evt).plus(evt, cnt - 1); }
public void testSerializationForHashPMap() { final HashPMap<String, Long> initialHashPMap = HashTreePMap.<String, Long> empty() .plus("key001", 23L) .plus("key002", 29L) .plus("key003", 31L); final byte[] serializedThirdPHashPMap = serializeToByteArray(initialHashPMap); assertNotNull(serializedThirdPHashPMap); assertTrue(serializedThirdPHashPMap.length > 0); @SuppressWarnings("unchecked") final HashPMap<String, Long> deserializedHashPMap = (HashPMap<String, Long>) deserializeFromByteArray(serializedThirdPHashPMap, HashPMap.class); assertNotNull(deserializedHashPMap); assertEquals(Long.valueOf(23L), deserializedHashPMap.get("key001")); assertEquals(Long.valueOf(29L), deserializedHashPMap.get("key002")); assertEquals(Long.valueOf(31L), deserializedHashPMap.get("key003")); assertNotSame(initialHashPMap, deserializedHashPMap); assertEquals(initialHashPMap, deserializedHashPMap); }
@Override public V get(final Object key) { PSequence<Entry<K,V>> entries = getEntries(key.hashCode()); for(Entry<K,V> entry : entries) if(entry.getKey().equals(key)) return entry.getValue(); return null; }
/** * @param <K> * @param <V> * @param intMap * @return a map backed by an empty version of intMap, * i.e. backed by intMap.minusAll(intMap.keySet()) */ public static <K,V> HashPMap<K,V> empty(final PMap<Integer,PSequence<Entry<K,V>>> intMap) { return new HashPMap<K,V>(intMap.minusAll(intMap.keySet()), 0); }
/** * @param <K> * @param <V> * @param map * @return empty().plusAll(map) */ public static <K,V> HashPMap<K,V> from(final Map<? extends K, ? extends V> map) { return HashTreePMap.<K,V>empty().plusAll(map); } }
@Override public Set<Entry<K, V>> entrySet() { return entries.entrySet(); }
public HashPMap<K,V> minus(final Object key) { PSequence<Entry<K,V>> entries = getEntries(key.hashCode()); int i = keyIndexIn(entries, key); if(i==-1) // key not in this return this; entries = entries.minus(i); if(entries.size()==0) // get rid of the entire hash entry return new HashPMap<K,V>(intMap.minus(key.hashCode()), size-1); // otherwise replace hash entry with new smaller one: return new HashPMap<K,V>(intMap.plus(key.hashCode(), entries), size-1); }
/** * @param map Collection. * @param evt Event. * @return Cloned map. */ protected static <E> Map<E, Integer> addToMap(@Nullable Map<E, Integer> map, E evt) { HashPMap<E, Integer> res = map == null ? HashTreePMap.<E, Integer>empty() : (HashPMap<E, Integer>)map; Integer cnt = res.get(evt); return cnt != null ? res.minus(evt).plus(evt, cnt + 1) : res.plus(evt, 1); }
@Override public boolean containsKey(final Object key) { return keyIndexIn(getEntries(key.hashCode()), key) != -1; }
@Override @SuppressWarnings("unchecked") public ImmutableMapSubstitution<K, V> evaluate(TermContext context) { HashPMap<K, V> evaluatedEntries = HashTreePMap.empty(); for (Entry<K, V> entry : entries.entrySet()) { evaluatedEntries = evaluatedEntries.plus( entry.getKey(), (V) entry.getValue().evaluate(context)); } return new ImmutableMapSubstitution<>(evaluatedEntries); }
@Override public V get(final Object key) { PSequence<Entry<K,V>> entries = getEntries(key.hashCode()); for(Entry<K,V> entry : entries) if(entry.getKey().equals(key)) return entry.getValue(); return null; }
/** * @param <K> * @param <V> * @param intMap * @return a map backed by an empty version of intMap, * i.e. backed by intMap.minusAll(intMap.keySet()) */ public static <K,V> HashPMap<K,V> empty(final PMap<Integer,PSequence<Entry<K,V>>> intMap) { return new HashPMap<K,V>(intMap.minusAll(intMap.keySet()), 0); }
/** * @param <K> * @param <V> * @param map * @return empty().plusAll(map) */ public static <K,V> HashPMap<K,V> from(final Map<? extends K, ? extends V> map) { return HashTreePMap.<K,V>empty().plusAll(map); } }