// File: /workspace/github_cpp_makefile_star2_O2/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 0x2420
movq %rdi, %rbx
movq 0x38(%rdi), %rdx
leaq -0x1(%rdx), %rcx
testq %rcx, %rdx
jne 0x243f
cmpq $0x3, %rdx
jbe 0x245e
cmpq 0x8(%rbx), %rax
setb %cl
cmpq $0x21, %rdx
setae %bpl
andb %cl, %bpl
cmpb $0x1, %bpl
jne 0x2411
testq %rax, %rax
js 0x23ba
cvtsi2ss %rax, %xmm0
jmp 0x23cf
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 0x23ee
cvtsi2ss %rdx, %xmm2
mulss %xmm1, %xmm2
ucomiss %xmm0, %xmm2
ja 0x23d4
movq %rsp, %r14
movq %r14, %rdi
movq %rbx, %rsi
callq 0x1934
movq %rbx, %rdi
movq %r14, %rsi
callq 0x19dc
movq 0x48(%rsp), %rdi
callq 0x10a0
movb $0x0, 0x18(%rbx)
movl %ebp, %eax
addq $0x50, %rsp
popq %rbx
popq %r14
popq %rbp
retq
leaq 0x3a81(%rip), %rdi      # 0x5ea8
leaq 0xccd(%rip), %rsi       # 0x30fb
leaq 0x3a8f(%rip), %rcx      # 0x5ec4
movl $0x21c, %edx            # imm = 0x21C
callq 0x1070
leaq 0x19fd(%rip), %rdi      # 0x3e43
leaq 0xcae(%rip), %rsi       # 0x30fb
leaq 0x3a70(%rip), %rcx      # 0x5ec4
movl $0x21d, %edx            # imm = 0x21D
callq 0x1070
leaq 0x3d48(%rip), %rdi      # 0x61ad
leaq 0xc8f(%rip), %rsi       # 0x30fb
leaq 0x3a51(%rip), %rcx      # 0x5ec4
movl $0x21e, %edx            # imm = 0x21E
callq 0x1070
movq %rax, %rbx
movq 0x48(%rsp), %rdi
callq 0x10a0
movq %rbx, %rdi
callq 0x1120