// File: attractivechaos[P]udb2/tsl_hopscotch_map/./hopscotch_hash.h
// Function: void tsl::detail_hopscotch_hash::hopscotch_hash<std::pair<unsigned int const, unsigned int>, tsl::bhopscotch_map<unsigned int, unsigned int, Hash32, std::equal_to<unsigned int>, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, unsigned int>>, 62u, false, tsl::hh::power_of_two_growth_policy<2ul>>::KeySelect, tsl::bhopscotch_map<unsigned int, unsigned int, Hash32, std::equal_to<unsigned int>, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, unsigned int>>, 62u, false, tsl::hh::power_of_two_growth_policy<2ul>>::ValueSelect, Hash32, std::equal_to<unsigned int>, std::allocator<std::pair<unsigned int const, unsigned int>>, 62u, false, tsl::hh::power_of_two_growth_policy<2ul>, std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, unsigned int>>>>::rehash_impl<std::pair<unsigned int const, unsigned int>, (void*)0>(unsigned long)
void rehash_impl(size_type count_) {
        hopscotch_hash new_map = new_hopscotch_hash(count_);
        
        if(!m_overflow_elements.empty()) {
            new_map.m_overflow_elements.swap(m_overflow_elements);
            new_map.m_nb_elements += new_map.m_overflow_elements.size();
            
            for(const value_type& value : new_map.m_overflow_elements) {
                const std::size_t ibucket_for_hash = new_map.bucket_for_hash(new_map.hash_key(KeySelect()(value)));
                new_map.m_buckets[ibucket_for_hash].set_overflow(true);
            }
        }
        
        try {
            const bool use_stored_hash = USE_STORED_HASH_ON_REHASH(new_map.bucket_count());
            for(auto it_bucket = m_buckets_data.begin(); it_bucket != m_buckets_data.end(); ++it_bucket) {
                if(it_bucket->empty()) {
                    continue;
                }
                
                const std::size_t hash = use_stored_hash?
                                            it_bucket->truncated_bucket_hash():
                                            new_map.hash_key(KeySelect()(it_bucket->value()));
                const std::size_t ibucket_for_hash = new_map.bucket_for_hash(hash);
                
                new_map.insert_value(ibucket_for_hash, hash, std::move(it_bucket->value()));
                
                
                erase_from_bucket(*it_bucket, bucket_for_hash(hash));
            }
        } 
        /*
         * The call to insert_value may throw an exception if an element is added to the overflow
         * list. Rollback the elements in this case.
         */
        catch(...) {
            m_overflow_elements.swap(new_map.m_overflow_elements);
            
            const bool use_stored_hash = USE_STORED_HASH_ON_REHASH(new_map.bucket_count());
            for(auto it_bucket = new_map.m_buckets_data.begin(); it_bucket != new_map.m_buckets_data.end(); ++it_bucket) {
                if(it_bucket->empty()) {
                    continue;
                }
                
                const std::size_t hash = use_stored_hash?
                                            it_bucket->truncated_bucket_hash():
                                            hash_key(KeySelect()(it_bucket->value()));
                const std::size_t ibucket_for_hash = bucket_for_hash(hash);
                
                // The elements we insert were not in the overflow list before the switch.
                // They will not be go in the overflow list if we rollback the switch.
                insert_value(ibucket_for_hash, hash, std::move(it_bucket->value()));
            }
            
            throw;
        }
        
        new_map.swap(*this);
    }

// Assembly:
subq $0x1c8, %rsp            # imm = 0x1C8
movq %rdi, 0x1c0(%rsp)
movq %rsi, 0x1b8(%rsp)
movq 0x1c0(%rsp), %rsi
movq %rsi, 0x60(%rsp)
movq 0x1b8(%rsp), %rdx
leaq 0x140(%rsp), %rdi
callq 0x6190
movq 0x60(%rsp), %rdi
addq $0x20, %rdi
callq 0x6250
testb $0x1, %al
jne 0x5d7f
movq 0x60(%rsp), %rsi
leaq 0x140(%rsp), %rdi
addq $0x20, %rdi
addq $0x20, %rsi
callq 0x6270
leaq 0x140(%rsp), %rdi
addq $0x20, %rdi
callq 0x54c0
addq 0x198(%rsp), %rax
movq %rax, 0x198(%rsp)
leaq 0x140(%rsp), %rax
addq $0x20, %rax
movq %rax, 0x138(%rsp)
movq 0x138(%rsp), %rdi
callq 0x4e40
movq %rax, 0x130(%rsp)
movq 0x138(%rsp), %rdi
callq 0x5450
movq %rax, 0x128(%rsp)
leaq 0x130(%rsp), %rdi
leaq 0x128(%rsp), %rsi
callq 0x62a0
testb $0x1, %al
jne 0x5cd6
jmp 0x5d7d
leaq 0x130(%rsp), %rdi
callq 0x62c0
movq %rax, 0x120(%rsp)
movq 0x120(%rsp), %rsi
leaq 0x117(%rsp), %rdi
callq 0x5010
movq %rax, %rsi
leaq 0x140(%rsp), %rdi
callq 0x4760
movq %rax, 0x58(%rsp)
jmp 0x5d17
movq 0x58(%rsp), %rsi
leaq 0x140(%rsp), %rdi
callq 0x47a0
movq %rax, 0x118(%rsp)
movq 0x190(%rsp), %rdi
movq 0x118(%rsp), %rax
shlq $0x4, %rax
addq %rax, %rdi
movl $0x1, %esi
callq 0x62e0
leaq 0x130(%rsp), %rdi
callq 0x6320
jmp 0x5cb8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x108(%rsp)
movl %eax, 0x104(%rsp)
jmp 0x6165
jmp 0x5d7f
leaq 0x140(%rsp), %rdi
callq 0x4460
movq %rax, %rdi
callq 0x6350
movb %al, 0x57(%rsp)
jmp 0x5d9a
movq 0x60(%rsp), %rdi
movb 0x57(%rsp), %al
andb $0x1, %al
movb %al, 0x103(%rsp)
addq $0x8, %rdi
callq 0x4d60
movq %rax, 0xf8(%rsp)
movq 0x60(%rsp), %rdi
addq $0x8, %rdi
callq 0x4e10
movq %rax, 0xf0(%rsp)
leaq 0xf8(%rsp), %rdi
leaq 0xf0(%rsp), %rsi
callq 0x6360
testb $0x1, %al
jne 0x5df1
jmp 0x601d
leaq 0xf8(%rsp), %rdi
callq 0x63a0
movq %rax, %rdi
callq 0x2ed0
testb $0x1, %al
jne 0x5e0f
jmp 0x5ee6
jmp 0x600b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x108(%rsp)
movl %eax, 0x104(%rsp)
movq 0x108(%rsp), %rdi
callq 0x2080
movq 0x60(%rsp), %rdi
addq $0x20, %rdi
leaq 0x160(%rsp), %rsi
callq 0x6270
leaq 0x140(%rsp), %rdi
callq 0x4460
movq %rax, %rdi
callq 0x6350
movb %al, 0x56(%rsp)
jmp 0x5e66
movb 0x56(%rsp), %al
andb $0x1, %al
movb %al, 0xb7(%rsp)
leaq 0x140(%rsp), %rdi
addq $0x8, %rdi
callq 0x4d60
movq %rax, 0xa8(%rsp)
leaq 0x140(%rsp), %rdi
addq $0x8, %rdi
callq 0x4e10
movq %rax, 0xa0(%rsp)
leaq 0xa8(%rsp), %rdi
leaq 0xa0(%rsp), %rsi
callq 0x6360
testb $0x1, %al
jne 0x5ec3
jmp 0x6133
leaq 0xa8(%rsp), %rdi
callq 0x63a0
movq %rax, %rdi
callq 0x2ed0
testb $0x1, %al
jne 0x5ee1
jmp 0x6040
jmp 0x6121
testb $0x1, 0x103(%rsp)
je 0x5f0e
leaq 0xf8(%rsp), %rdi
callq 0x63a0
movq %rax, %rdi
callq 0x63b0
movl %eax, %eax
movq %rax, 0x48(%rsp)
jmp 0x5f56
leaq 0xf8(%rsp), %rdi
callq 0x63a0
movq %rax, %rdi
callq 0x2f00
movq %rax, %rsi
leaq 0xe7(%rsp), %rdi
callq 0x4790
movq %rax, %rsi
leaq 0x140(%rsp), %rdi
callq 0x4760
movq %rax, 0x40(%rsp)
jmp 0x5f4a
movq 0x40(%rsp), %rax
movq %rax, 0x48(%rsp)
jmp 0x5f56
movq 0x48(%rsp), %rax
movq %rax, 0xe8(%rsp)
movq 0xe8(%rsp), %rsi
leaq 0x140(%rsp), %rdi
movq %rdi, 0x28(%rsp)
callq 0x47a0
movq %rax, 0xd8(%rsp)
movq 0xd8(%rsp), %rax
movq %rax, 0x30(%rsp)
movq 0xe8(%rsp), %rax
movq %rax, 0x38(%rsp)
leaq 0xf8(%rsp), %rdi
callq 0x63a0
movq %rax, %rdi
callq 0x2f00
movq 0x28(%rsp), %rsi
movq 0x30(%rsp), %rdx
movq 0x38(%rsp), %rcx
movq %rax, %r8
leaq 0xb8(%rsp), %rdi
callq 0x4a00
jmp 0x5fd5
leaq 0xf8(%rsp), %rdi
callq 0x6450
movq 0x60(%rsp), %rdi
movq %rax, 0x20(%rsp)
movq 0xe8(%rsp), %rsi
callq 0x47a0
movq 0x60(%rsp), %rdi
movq 0x20(%rsp), %rsi
movq %rax, %rdx
callq 0x63c0
leaq 0xf8(%rsp), %rdi
callq 0x6460
jmp 0x5dbd
jmp 0x613c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x108(%rsp)
movl %eax, 0x104(%rsp)
callq 0x21c0
jmp 0x613a
testb $0x1, 0xb7(%rsp)
je 0x6068
leaq 0xa8(%rsp), %rdi
callq 0x63a0
movq %rax, %rdi
callq 0x63b0
movl %eax, %eax
movq %rax, 0x18(%rsp)
jmp 0x60ad
leaq 0xa8(%rsp), %rdi
callq 0x63a0
movq %rax, %rdi
callq 0x2f00
movq %rax, %rsi
leaq 0x97(%rsp), %rdi
callq 0x4790
movq 0x60(%rsp), %rdi
movq %rax, %rsi
callq 0x4760
movq %rax, 0x10(%rsp)
jmp 0x60a1
movq 0x10(%rsp), %rax
movq %rax, 0x18(%rsp)
jmp 0x60ad
movq 0x60(%rsp), %rdi
movq 0x18(%rsp), %rax
movq %rax, 0x98(%rsp)
movq 0x98(%rsp), %rsi
callq 0x47a0
movq %rax, 0x88(%rsp)
movq 0x88(%rsp), %rax
movq %rax, (%rsp)
movq 0x98(%rsp), %rax
movq %rax, 0x8(%rsp)
leaq 0xa8(%rsp), %rdi
callq 0x63a0
movq %rax, %rdi
callq 0x2f00
movq 0x60(%rsp), %rsi
movq (%rsp), %rdx
movq 0x8(%rsp), %rcx
movq %rax, %r8
leaq 0x68(%rsp), %rdi
callq 0x4a00
jmp 0x611f
jmp 0x6121
leaq 0xa8(%rsp), %rdi
callq 0x6460
jmp 0x5e8c
callq 0x21a0
jmp 0x6187
jmp 0x6165
movq 0x60(%rsp), %rsi
leaq 0x140(%rsp), %rdi
callq 0x6480
jmp 0x6150
leaq 0x140(%rsp), %rdi
callq 0x2a20
addq $0x1c8, %rsp            # imm = 0x1C8
retq
leaq 0x140(%rsp), %rdi
callq 0x2a20
movq 0x108(%rsp), %rdi
callq 0x21e0
movq %rax, %rdi
callq 0x2b80
nopw (%rax,%rax)