public final class HamtPMap<K,V> extends java.lang.Object implements PMap<K,V>, java.io.Serializable
Uses a hash array mapped trie: http://en.wikipedia.org/wiki/Hash_array_mapped_trie.
This implementation stores the bare minimum in each node: a key (with its hash), value, mask,
and children. It is also optimized to take maximum advantage of binary operations on shared
trees. Specifically, reconcile(com.google.javascript.rhino.PMap<K, V>, com.google.javascript.rhino.PMap.Reconciler<K, V>)
avoids recursing into entire subtrees if they are
identical objects. Null keys and values are not allowed. The implementation special-cases away
the EMPTY map as soon as possible, using 'null' instead for all the logic (since EMPTY violates
the invariant that key and value are non-null). Finally, we maintain an invariant that the
entry with the smallest hash code is always at the root of the tree, which avoids almost all
extra tree rebuilding during binary operations.
PMap.Reconciler<K,V>
Modifier and Type | Method and Description |
---|---|
static <K,V> HamtPMap<K,V> |
empty()
Returns an empty map.
|
boolean |
equivalent(PMap<K,V> that,
java.util.function.BiPredicate<V,V> equivalence)
Checks equality recursively based on the given equivalence.
|
V |
get(K key)
Retrieves the value associated with the given key from the map, or returns null if it is not
present.
|
boolean |
isEmpty()
Returns whether this map is empty.
|
java.lang.Iterable<K> |
keys()
Returns an iterable for a (possibly null) tree.
|
HamtPMap<K,V> |
minus(K key)
Returns a new map with the given key removed.
|
HamtPMap<K,V> |
plus(K key,
V value)
Returns a new map with the given key-value pair added.
|
HamtPMap<K,V> |
reconcile(PMap<K,V> that,
PMap.Reconciler<K,V> joiner)
Performs a reconcile operation to merge
this and that . |
java.lang.String |
toString() |
java.lang.Iterable<V> |
values()
Returns an iterable for a (possibly null) tree.
|
public static <K,V> HamtPMap<K,V> empty()
public java.lang.String toString()
toString
in class java.lang.Object
public boolean isEmpty()
public java.lang.Iterable<V> values()
public java.lang.Iterable<K> keys()
public V get(K key)
public HamtPMap<K,V> plus(K key, V value)
public HamtPMap<K,V> minus(K key)
public HamtPMap<K,V> reconcile(PMap<K,V> that, PMap.Reconciler<K,V> joiner)
PMap
this
and that
.
joiner
is called for each pair of entries, one from each map, which share the same
key and whose values are not Object.equals(java.lang.Object)
. This includes entries that are absent from
one of the maps, for which null
is passed as the absent value.
The return of calling joiner
will appear in the merged map at the key of the
original entry pair. The return may not be null. If the values in a pair of entries are Object.equals(java.lang.Object)
, that value will be used directly in the result without calling joiner
.
The first value passed to joiner
comes from this
, and the second value comes
from that
. There are no guarantees on the source of key
. Note that that
map must be the same implementation.
Copyright © 2009-2020 Google. All Rights Reserved.