function hashInstanceMethod()

in src/plugins/equality.ts [916:958]


function hashInstanceMethod(
  generatedTypeEqualityInformation: GeneratedTypeEqualityInformation[],
): ObjC.Method {
  const hashEqualityValues: TypeEqualityValue[] =
    generatedTypeEqualityInformation.reduce(buildHashValues, []);
  const hashValues: string[] = hashEqualityValues.map(selectValue);
  const hashValuesGroup: string = hashValues.join(', ');

  return {
    preprocessors: [],
    belongsToProtocol: 'NSObject',
    keywords: [
      {
        name: 'hash',
        argument: null,
      },
    ],
    code: [
      'NSUInteger subhashes[] = {' + hashValuesGroup + '};',
      'NSUInteger result = subhashes[0];',
      'for (int ii = 1; ii < ' + hashValues.length + '; ++ii) {',
      '  unsigned long long base = (((unsigned long long)result) << 32 | subhashes[ii]);',
      '  base = (~base) + (base << 18);',
      '  base ^= (base >> 31);',
      '  base *=  21;',
      '  base ^= (base >> 11);',
      '  base += (base << 6);',
      '  base ^= (base >> 22);',
      '  result = base;',
      '}',
      'return result;',
    ],
    comments: [],
    compilerAttributes: [],
    returnType: {
      type: {
        name: 'NSUInteger',
        reference: 'NSUInteger',
      },
      modifiers: [],
    },
  };
}