Class HamtPMap<K,V>

java.lang.Object
com.google.javascript.rhino.HamtPMap<K,V>
All Implemented Interfaces:
PMap<K,V>, Serializable

public final class HamtPMap<K,V> extends Object implements PMap<K,V>, Serializable
An immutable sorted map with efficient (persistent) updates.

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.

See Also:
  • Method Details

    • empty

      @CheckReturnValue public static <K, V> HamtPMap<K,V> empty()
      Returns an empty map.
    • toString

      @CheckReturnValue public String toString()
      Overrides:
      toString in class Object
    • isEmpty

      @CheckReturnValue public boolean isEmpty()
      Returns whether this map is empty.
      Specified by:
      isEmpty in interface PMap<K,V>
    • values

      @CheckReturnValue public Iterable<V> values()
      Returns an iterable for a (possibly null) tree.
      Specified by:
      values in interface PMap<K,V>
    • keys

      @CheckReturnValue public Iterable<K> keys()
      Returns an iterable for a (possibly null) tree.
      Specified by:
      keys in interface PMap<K,V>
    • get

      @CheckReturnValue public V get(K key)
      Retrieves the value associated with the given key from the map, or returns null if it is not present.
      Specified by:
      get in interface PMap<K,V>
    • plus

      @CheckReturnValue public HamtPMap<K,V> plus(K key, V value)
      Returns a new map with the given key-value pair added. If the value is already present, then this same map will be returned.
      Specified by:
      plus in interface PMap<K,V>
    • minus

      @CheckReturnValue public HamtPMap<K,V> minus(K key)
      Returns a new map with the given key removed. If the key was not present in the first place, then this same map will be returned.
      Specified by:
      minus in interface PMap<K,V>
    • reconcile

      @CheckReturnValue public HamtPMap<K,V> reconcile(PMap<K,V> that, PMap.Reconciler<K,V> joiner)
      Description copied from interface: PMap
      Performs a reconcile operation to merge 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.

      Specified by:
      reconcile in interface PMap<K,V>
    • equivalent

      public boolean equivalent(PMap<K,V> that, BiPredicate<V,V> equivalence)
      Checks equality recursively based on the given equivalence. Short-circuits as soon as a 'false' result is found.
      Specified by:
      equivalent in interface PMap<K,V>