protected override bool keyEqual(TKey key, Boxed <TKey> entryKey)
 {
     //NOTE: slots are claimed in two stages - claim a hash, then set a key
     //      it is possible to observe a slot with a null key, but with hash already set
     //      that is not a match since the key is not yet in the table
     return(entryKey != null && _keyComparer.Equals(key, entryKey.Value));
 }
        protected override bool TryClaimSlotForCopy(ref Boxed <TKey> entryKey, Boxed <TKey> key)
        {
            var entryKeyValue = entryKey;

            if (entryKeyValue == null)
            {
                entryKeyValue = Interlocked.CompareExchange(ref entryKey, key, null);
                if (entryKeyValue == null)
                {
                    // claimed a new slot
                    this.allocatedSlotCount.Increment();
                    return(true);
                }
            }

            return(_keyComparer.Equals(key.Value, entryKey.Value));
        }
 protected override TKey keyFromEntry(Boxed <TKey> entryKey)
 {
     return(entryKey.Value);
 }