Class ObjectIdOwnerMap<V extends ObjectIdOwnerMap.Entry>

  • Type Parameters:
    V - type of subclass of ObjectId that will be stored in the map.
    All Implemented Interfaces:
    java.lang.Iterable<V>, ObjectIdSet

    public class ObjectIdOwnerMap<V extends ObjectIdOwnerMap.Entry>
    extends java.lang.Object
    implements java.lang.Iterable<V>, ObjectIdSet
    Fast, efficient map for ObjectId subclasses in only one map.

    To use this map type, applications must have their entry value type extend from ObjectIdOwnerMap.Entry, which itself extends from ObjectId.

    Object instances may only be stored in ONE ObjectIdOwnerMap. This restriction exists because the map stores internal map state within each object instance. If an instance is be placed in another ObjectIdOwnerMap it could corrupt one or both map's internal state.

    If an object instance must be in more than one map, applications may use ObjectIdOwnerMap for one of the maps, and ObjectIdSubclassMap for the other map(s). It is encouraged to use ObjectIdOwnerMap for the map that is accessed most often, as this implementation runs faster than the more general ObjectIdSubclassMap implementation.

    • Field Summary

      Fields 
      Modifier and Type Field Description
      (package private) int bits
      Number of low bits used to form the index into directory.
      (package private) V[][] directory
      Top level directory of the segments.
      private int grow
      The map doubles in capacity when size reaches this target.
      private static int INITIAL_DIRECTORY
      Size of the initial directory, will grow as necessary.
      private int mask
      Low bit mask to index into directory, 2^bits-1.
      private static int SEGMENT_BITS
      Number of bits in a segment's index.
      private static int SEGMENT_SHIFT  
      (package private) int size
      Total number of objects in this map.
    • Constructor Summary

      Constructors 
      Constructor Description
      ObjectIdOwnerMap()
      Create an empty map.
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      <Q extends V>
      void
      add​(Q newValue)
      Store an object for future lookup.
      <Q extends V>
      V
      addIfAbsent​(Q newValue)
      Store an object for future lookup.
      void clear()
      Remove all entries from this map.
      private static int computeGrowAt​(int bits)  
      boolean contains​(AnyObjectId toFind)
      Returns true if the objectId is contained within the collection.
      private static boolean equals​(AnyObjectId firstObjectId, AnyObjectId secondObjectId)  
      V get​(AnyObjectId toFind)
      Lookup an existing mapping.
      private void grow()  
      boolean isEmpty()
      Whether this map is empty
      java.util.Iterator<V> iterator()
      private V[] newSegment()  
      int size()
      Get number of objects in this map.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • Methods inherited from interface java.lang.Iterable

        forEach, spliterator
    • Field Detail

      • INITIAL_DIRECTORY

        private static final int INITIAL_DIRECTORY
        Size of the initial directory, will grow as necessary.
        See Also:
        Constant Field Values
      • SEGMENT_BITS

        private static final int SEGMENT_BITS
        Number of bits in a segment's index. Segments are 2^11 in size.
        See Also:
        Constant Field Values
      • directory

        V extends ObjectIdOwnerMap.Entry[][] directory
        Top level directory of the segments.

        The low bits of the SHA-1 are used to select the segment from this directory. Each segment is constant sized at 2^SEGMENT_BITS.

      • size

        int size
        Total number of objects in this map.
      • grow

        private int grow
        The map doubles in capacity when size reaches this target.
      • bits

        int bits
        Number of low bits used to form the index into directory.
      • mask

        private int mask
        Low bit mask to index into directory, 2^bits-1.
    • Constructor Detail

      • ObjectIdOwnerMap

        public ObjectIdOwnerMap()
        Create an empty map.
    • Method Detail

      • clear

        public void clear()
        Remove all entries from this map.
      • get

        public V get​(AnyObjectId toFind)
        Lookup an existing mapping.
        Parameters:
        toFind - the object identifier to find.
        Returns:
        the instance mapped to toFind, or null if no mapping exists.
      • contains

        public boolean contains​(AnyObjectId toFind)
        Returns true if the objectId is contained within the collection.

        Returns true if this map contains the specified object.

        Specified by:
        contains in interface ObjectIdSet
        Parameters:
        toFind - the objectId to find
        Returns:
        whether the collection contains the objectId.
      • add

        public <Q extends V> void add​(Q newValue)
        Store an object for future lookup.

        An existing mapping for must not be in this map. Callers must first call get(AnyObjectId) to verify there is no current mapping prior to adding a new mapping, or use addIfAbsent(Entry).

        Parameters:
        newValue - the object to store.
      • addIfAbsent

        public <Q extends VV addIfAbsent​(Q newValue)
        Store an object for future lookup.

        Stores newValue, but only if there is not already an object for the same object name. Callers can tell if the value is new by checking the return value with reference equality:

         V obj = ...;
         boolean wasNew = map.addIfAbsent(obj) == obj;
         
        Parameters:
        newValue - the object to store.
        Returns:
        newValue if stored, or the prior value already stored and that would have been returned had the caller used get(newValue) first.
      • size

        public int size()
        Get number of objects in this map.
        Returns:
        number of objects in this map.
      • isEmpty

        public boolean isEmpty()
        Whether this map is empty
        Returns:
        true if size() is 0.
      • iterator

        public java.util.Iterator<V> iterator()
        Specified by:
        iterator in interface java.lang.Iterable<V extends ObjectIdOwnerMap.Entry>
      • grow

        private void grow()
      • newSegment

        private final V[] newSegment()
      • computeGrowAt

        private static final int computeGrowAt​(int bits)