You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							108 lines
						
					
					
						
							1.7 KiB
						
					
					
				
			
		
		
	
	
							108 lines
						
					
					
						
							1.7 KiB
						
					
					
				/* eslint no-constant-condition: 0 */
 | 
						|
/**
 | 
						|
 * Mnemonist Hashtable Helpers
 | 
						|
 * ============================
 | 
						|
 *
 | 
						|
 * Miscellaneous helpers helper function dealing with hashtables.
 | 
						|
 */
 | 
						|
function jenkinsInt32(a) {
 | 
						|
 | 
						|
  a = (a + 0x7ed55d16) + (a << 12);
 | 
						|
  a = (a ^ 0xc761c23c) ^ (a >> 19);
 | 
						|
  a = (a + 0x165667b1) + (a << 5);
 | 
						|
  a = (a + 0xd3a2646c) ^ (a << 9);
 | 
						|
  a = (a + 0xfd7046c5) + (a << 3);
 | 
						|
  a = (a ^ 0xb55a4f09) ^ (a >> 16);
 | 
						|
 | 
						|
  return a;
 | 
						|
}
 | 
						|
 | 
						|
function linearProbingGet(hash, keys, values, key) {
 | 
						|
  var n = keys.length,
 | 
						|
      j = hash(key) & (n - 1),
 | 
						|
      i = j;
 | 
						|
 | 
						|
  var c;
 | 
						|
 | 
						|
  while (true) {
 | 
						|
    c = keys[i];
 | 
						|
 | 
						|
    if (c === key)
 | 
						|
      return values[i];
 | 
						|
 | 
						|
    else if (c === 0)
 | 
						|
      return;
 | 
						|
 | 
						|
    // Handling wrapping around
 | 
						|
    i += 1;
 | 
						|
    i %= n;
 | 
						|
 | 
						|
    // Full turn
 | 
						|
    if (i === j)
 | 
						|
      return;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function linearProbingHas(hash, keys, key) {
 | 
						|
  var n = keys.length,
 | 
						|
      j = hash(key) & (n - 1),
 | 
						|
      i = j;
 | 
						|
 | 
						|
  var c;
 | 
						|
 | 
						|
  while (true) {
 | 
						|
    c = keys[i];
 | 
						|
 | 
						|
    if (c === key)
 | 
						|
      return true;
 | 
						|
 | 
						|
    else if (c === 0)
 | 
						|
      return false;
 | 
						|
 | 
						|
    // Handling wrapping around
 | 
						|
    i += 1;
 | 
						|
    i %= n;
 | 
						|
 | 
						|
    // Full turn
 | 
						|
    if (i === j)
 | 
						|
      return false;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function linearProbingSet(hash, keys, values, key, value) {
 | 
						|
  var n = keys.length,
 | 
						|
      j = hash(key) & (n - 1),
 | 
						|
      i = j;
 | 
						|
 | 
						|
  var c;
 | 
						|
 | 
						|
  while (true) {
 | 
						|
    c = keys[i];
 | 
						|
 | 
						|
    if (c === 0 || c === key)
 | 
						|
      break;
 | 
						|
 | 
						|
    // Handling wrapping around
 | 
						|
    i += 1;
 | 
						|
    i %= n;
 | 
						|
 | 
						|
    // Full turn
 | 
						|
    if (i === j)
 | 
						|
      throw new Error('mnemonist/utils/hash-tables.linearProbingSet: table is full.');
 | 
						|
  }
 | 
						|
 | 
						|
  keys[i] = key;
 | 
						|
  values[i] = value;
 | 
						|
}
 | 
						|
 | 
						|
module.exports = {
 | 
						|
  hashes: {
 | 
						|
    jenkinsInt32: jenkinsInt32
 | 
						|
  },
 | 
						|
  linearProbing: {
 | 
						|
    get: linearProbingGet,
 | 
						|
    has: linearProbingHas,
 | 
						|
    set: linearProbingSet
 | 
						|
  }
 | 
						|
};
 |