// File: attractivechaos[P]udb2/sparsehash/./sparsehash/internal/densehashtable.h
// Function: google::dense_hashtable<std::pair<unsigned int const, unsigned int>, unsigned int, Hash32, google::dense_hash_map<unsigned int, unsigned int, Hash32, std::equal_to<unsigned int>, google::libc_allocator_with_realloc<std::pair<unsigned int const, unsigned int>>>::SelectKey, google::dense_hash_map<unsigned int, unsigned int, Hash32, std::equal_to<unsigned int>, google::libc_allocator_with_realloc<std::pair<unsigned int const, unsigned int>>>::SetKey, std::equal_to<unsigned int>, google::libc_allocator_with_realloc<std::pair<unsigned int const, unsigned int>>>::find_position(unsigned int const&) const
std::pair<size_type, size_type> find_position(const key_type &key) const {
    size_type num_probes = 0;              // how many times we've probed
    const size_type bucket_count_minus_one = bucket_count() - 1;
    size_type bucknum = hash(key) & bucket_count_minus_one;
    size_type insert_pos = ILLEGAL_BUCKET; // where we would insert
    while ( 1 ) {                          // probe until something happens
      if ( test_empty(bucknum) ) {         // bucket is empty
        if ( insert_pos == ILLEGAL_BUCKET )   // found no prior place to insert
          return std::pair<size_type,size_type>(ILLEGAL_BUCKET, bucknum);
        else
          return std::pair<size_type,size_type>(ILLEGAL_BUCKET, insert_pos);

      } else if ( test_deleted(bucknum) ) {// keep searching, but mark to insert
        if ( insert_pos == ILLEGAL_BUCKET )
          insert_pos = bucknum;

      } else if ( equals(key, get_key(table[bucknum])) ) {
        return std::pair<size_type,size_type>(bucknum, ILLEGAL_BUCKET);
      }
      ++num_probes;                        // we're doing another probe
      bucknum = (bucknum + JUMP_(key, num_probes)) & bucket_count_minus_one;
      assert(num_probes < bucket_count()
             && "Hashtable is full: an error in key_equal<> or hash<>");
    }
  }

// Assembly:
subq $0x68, %rsp
movq %rdi, 0x50(%rsp)
movq %rsi, 0x48(%rsp)
movq 0x50(%rsp), %rdi
movq %rdi, 0x20(%rsp)
movq $0x0, 0x40(%rsp)
callq 0x1ed0
movq 0x20(%rsp), %rdi
subq $0x1, %rax
movq %rax, 0x38(%rsp)
movq 0x48(%rsp), %rsi
callq 0x2f10
andq 0x38(%rsp), %rax
movq %rax, 0x30(%rsp)
movq $-0x1, 0x28(%rsp)
movq 0x20(%rsp), %rdi
movq 0x30(%rsp), %rsi
callq 0x2f50
testb $0x1, %al
jne 0x37d6
jmp 0x3814
cmpq $-0x1, 0x28(%rsp)
jne 0x37f9
leaq 0x58(%rsp), %rdi
leaq 0x5ad6(%rip), %rsi      # 0x92c0
leaq 0x30(%rsp), %rdx
callq 0x4020
jmp 0x3919
leaq 0x58(%rsp), %rdi
leaq 0x5abb(%rip), %rsi      # 0x92c0
leaq 0x28(%rsp), %rdx
callq 0x4020
jmp 0x3919
movq 0x20(%rsp), %rdi
movq 0x30(%rsp), %rsi
callq 0x4050
testb $0x1, %al
jne 0x3829
jmp 0x383d
cmpq $-0x1, 0x28(%rsp)
jne 0x383b
movq 0x30(%rsp), %rax
movq %rax, 0x28(%rsp)
jmp 0x3896
movq 0x20(%rsp), %rdi
movq 0x48(%rsp), %rax
movq %rax, 0x18(%rsp)
movq 0x48(%rdi), %rsi
movq 0x30(%rsp), %rax
shlq $0x3, %rax
addq %rax, %rsi
callq 0x23a0
movq 0x20(%rsp), %rdi
movq 0x18(%rsp), %rsi
movq %rax, %rdx
callq 0x2370
testb $0x1, %al
jne 0x3879
jmp 0x3894
leaq 0x58(%rsp), %rdi
leaq 0x30(%rsp), %rsi
leaq 0x5a36(%rip), %rdx      # 0x92c0
callq 0x4100
jmp 0x3919
jmp 0x3896
jmp 0x3898
movq 0x20(%rsp), %rdi
movq 0x40(%rsp), %rax
addq $0x1, %rax
movq %rax, 0x40(%rsp)
movq 0x30(%rsp), %rax
addq 0x40(%rsp), %rax
andq 0x38(%rsp), %rax
movq %rax, 0x30(%rsp)
movq 0x40(%rsp), %rax
movq %rax, 0x8(%rsp)
callq 0x1ed0
movq 0x8(%rsp), %rcx
movq %rax, %rdx
xorl %eax, %eax
cmpq %rdx, %rcx
movb %al, 0x17(%rsp)
jae 0x38e9
movb $0x1, %al
movb %al, 0x17(%rsp)
jmp 0x38e9
movb 0x17(%rsp), %al
testb $0x1, %al
jne 0x38f3
jmp 0x38f5
jmp 0x3914
leaq 0x2960(%rip), %rdi      # 0x625c
leaq 0x1815(%rip), %rsi      # 0x5118
movl $0x354, %edx            # imm = 0x354
leaq 0x4064(%rip), %rcx      # 0x7973
callq 0x1090
jmp 0x37c1
movq 0x58(%rsp), %rax
movq 0x60(%rsp), %rdx
addq $0x68, %rsp
retq
nopl (%rax,%rax)