private final boolean tableFull( int reprobe_cnt, int len ) {
      return
        // Do the cheap check first: we allow some number of reprobes always
        reprobe_cnt >= REPROBE_LIMIT &&
        (reprobe_cnt >= reprobe_limit(len) ||
         // More expensive check: see if the table is > 1/2 full.
         _slots.estimate_get() >= (len>>1));
    }
Put, Remove, PutIfAbsent, etc.  Return the old value.  If the returned value is equal to expVal (or expVal is
{@link #NO_MATCH_OLD}) then the put can be assumed to work (although might have been immediately overwritten).
Only the path through copy_slot passes in an expected value of null, and putIfMatch only returns a null if passed
in an expected null.

@param topmap the map to act on
@param kvs the KV table snapshot we act on
@param key not null (will result in {@link NullPointerException})
@param putval the new value to use. Not null. {@link #TOMBSTONE} will result in deleting the entry.
@param expVal expected old value. Can be null. {@link #NO_MATCH_OLD} for an unconditional put/remove.
             {@link #TOMBSTONE} if we expect old entry to not exist(null/{@link #TOMBSTONE} value).
             {@link #MATCH_ANY} will ignore the current value, but only if an entry exists. A null expVal is used
              internally to perform a strict insert-if-never-been-seen-before operation.
@return {@link #TOMBSTONE} if key does not exist or match has failed. null if expVal is
null AND old value was null. Otherwise the old entry value (not null).
jctools-core/src/main/java/org/jctools/maps/NonBlockingHashMap.java