// File: /workspace/github_cpp_makefile_star2_O3/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>>>::maybe_shrink()
bool maybe_shrink() {
    assert(num_elements >= num_deleted);
    assert((bucket_count() & (bucket_count()-1)) == 0); // is a power of two
    assert(bucket_count() >= HT_MIN_BUCKETS);
    bool retval = false;

    // If you construct a hashtable with < HT_DEFAULT_STARTING_BUCKETS,
    // we'll never shrink until you get relatively big, and we'll never
    // shrink below HT_DEFAULT_STARTING_BUCKETS.  Otherwise, something
    // like "dense_hash_set<int> x; x.insert(4); x.erase(4);" will
    // shrink us down to HT_MIN_BUCKETS buckets, which is too small.
    const size_type num_remain = num_elements - num_deleted;
    const size_type shrink_threshold = settings.shrink_threshold();
    if (shrink_threshold > 0 && num_remain < shrink_threshold &&
        bucket_count() > HT_DEFAULT_STARTING_BUCKETS) {
      const float shrink_factor = settings.shrink_factor();
      size_type sz = bucket_count() / 2;    // find how much we should shrink
      while (sz > HT_DEFAULT_STARTING_BUCKETS &&
             num_remain < sz * shrink_factor) {
        sz /= 2;                            // stay a power of 2
      }
      dense_hashtable tmp(*this, sz);       // Do the actual resizing
      swap(tmp);                            // now we are tmp
      retval = true;
    }
    settings.set_consider_shrink(false);    // because we just considered it
    return retval;
  }

// Assembly:
pushq %rbp
pushq %r14
pushq %rbx
subq $0x50, %rsp
movq 0x30(%rdi), %rax
subq 0x28(%rdi), %rax
jb 0x2768
movq %rdi, %rbx
movq 0x38(%rdi), %rdx
leaq -0x1(%rdx), %rcx
testq %rcx, %rdx
jne 0x2787
cmpq $0x3, %rdx
jbe 0x27a6
cmpq 0x8(%rbx), %rax
setb %cl
cmpq $0x21, %rdx
setae %bpl
andb %cl, %bpl
cmpb $0x1, %bpl
jne 0x2759
testq %rax, %rax
js 0x26fa
cvtsi2ss %rax, %xmm0
jmp 0x270f
movq %rax, %rcx
shrq %rcx
andl $0x1, %eax
orq %rcx, %rax
cvtsi2ss %rax, %xmm0
addss %xmm0, %xmm0
movss 0x14(%rbx), %xmm1
movq %rdx, %rax
shrq %rdx
cmpq $0x42, %rax
jb 0x2731
xorps %xmm2, %xmm2
cvtsi2ss %rdx, %xmm2
mulss %xmm1, %xmm2
ucomiss %xmm0, %xmm2
ja 0x2714
movq %rsp, %r14
movq %r14, %rdi
movq %rbx, %rsi
callq 0x1a8a
movq %rbx, %rdi
movq %r14, %rsi
callq 0x1be0
movq 0x48(%rsp), %rdi
testq %rdi, %rdi
je 0x2759
callq 0x10a0
movb $0x0, 0x18(%rbx)
movl %ebp, %eax
addq $0x50, %rsp
popq %rbx
popq %r14
popq %rbp
retq
leaq 0x3456(%rip), %rdi      # 0x5bc5
leaq 0x9a5(%rip), %rsi       # 0x311b
leaq 0x3464(%rip), %rcx      # 0x5be1
movl $0x21c, %edx            # imm = 0x21C
callq 0x1070
leaq 0x16d5(%rip), %rdi      # 0x3e63
leaq 0x986(%rip), %rsi       # 0x311b
leaq 0x3445(%rip), %rcx      # 0x5be1
movl $0x21d, %edx            # imm = 0x21D
callq 0x1070
leaq 0x371d(%rip), %rdi      # 0x5eca
leaq 0x967(%rip), %rsi       # 0x311b
leaq 0x3426(%rip), %rcx      # 0x5be1
movl $0x21e, %edx            # imm = 0x21E
callq 0x1070
movq %rax, %rbx
movq 0x48(%rsp), %rdi
testq %rdi, %rdi
je 0x27d7
callq 0x10a0
movq %rbx, %rdi
callq 0x1120
nop