// File: attractivechaos[P]udb2/tsl_hopscotch_map/./hopscotch_hash.h
// Function: std::pair<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>>>>::hopscotch_iterator<false>, bool> 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>>>>::insert_value<std::pair<unsigned int const, unsigned int>>(unsigned long, unsigned long, std::pair<unsigned int const, unsigned int>&&)
std::pair<iterator, bool> insert_value(std::size_t ibucket_for_hash, std::size_t hash, Args&&... value_type_args) {
        if((m_nb_elements - m_overflow_elements.size()) >= m_max_load_threshold_rehash) {
            rehash(GrowthPolicy::next_bucket_count());
            ibucket_for_hash = bucket_for_hash(hash);
        }
        
        std::size_t ibucket_empty = find_empty_bucket(ibucket_for_hash);
        if(ibucket_empty < m_buckets_data.size()) {
            do {
                tsl_hh_assert(ibucket_empty >= ibucket_for_hash);
                
                // Empty bucket is in range of NeighborhoodSize, use it
                if(ibucket_empty - ibucket_for_hash < NeighborhoodSize) {
                    auto it = insert_in_bucket(ibucket_empty, ibucket_for_hash, 
                                               hash, std::forward<Args>(value_type_args)...);
                    return std::make_pair(iterator(it, m_buckets_data.end(), m_overflow_elements.begin()), true);
                }
            }
            // else, try to swap values to get a closer empty bucket
            while(swap_empty_bucket_closer(ibucket_empty));
        }
            
        // Load factor is too low or a rehash will not change the neighborhood, put the value in overflow list
        if(size() < m_min_load_threshold_rehash || !will_neighborhood_change_on_rehash(ibucket_for_hash)) {
            auto it = insert_in_overflow(ibucket_for_hash, std::forward<Args>(value_type_args)...);
            return std::make_pair(iterator(m_buckets_data.end(), m_buckets_data.end(), it), true);
        }
    
        rehash(GrowthPolicy::next_bucket_count());
        ibucket_for_hash = bucket_for_hash(hash);
        
        return insert_value(ibucket_for_hash, hash, std::forward<Args>(value_type_args)...);
    }

// Assembly:
subq $0xd8, %rsp
movq %rdi, 0x10(%rsp)
movq %rdi, 0x18(%rsp)
movq %rsi, 0xd0(%rsp)
movq %rdx, 0xc8(%rsp)
movq %rcx, 0xc0(%rsp)
movq %r8, 0xb8(%rsp)
movq 0xd0(%rsp), %rdi
movq %rdi, 0x20(%rsp)
movq 0x58(%rdi), %rax
movq %rax, 0x28(%rsp)
addq $0x20, %rdi
callq 0x54c0
movq 0x20(%rsp), %rcx
movq %rax, %rdx
movq 0x28(%rsp), %rax
subq %rdx, %rax
cmpq 0x68(%rcx), %rax
jb 0x4a97
movq 0x20(%rsp), %rdi
callq 0x55b0
movq 0x20(%rsp), %rdi
movq %rax, %rsi
callq 0x54d0
movq 0x20(%rsp), %rdi
movq 0xc0(%rsp), %rsi
callq 0x47a0
movq %rax, 0xc8(%rsp)
movq 0x20(%rsp), %rdi
movq 0xc8(%rsp), %rsi
callq 0x5660
movq 0x20(%rsp), %rdi
movq %rax, 0xb0(%rsp)
movq 0xb0(%rsp), %rax
movq %rax, 0x8(%rsp)
addq $0x8, %rdi
callq 0x3ab0
movq %rax, %rcx
movq 0x8(%rsp), %rax
cmpq %rcx, %rax
jae 0x4bc5
jmp 0x4adf
movq 0xb0(%rsp), %rax
subq 0xc8(%rsp), %rax
cmpq $0x3e, %rax
jae 0x4ba7
movq 0x20(%rsp), %rdi
movq 0xb0(%rsp), %rsi
movq 0xc8(%rsp), %rdx
movq 0xc0(%rsp), %rcx
movq 0xb8(%rsp), %r8
callq 0x5720
movq 0x20(%rsp), %rdi
movq %rax, 0xa8(%rsp)
movq 0xa8(%rsp), %rax
movq %rax, 0x88(%rsp)
addq $0x8, %rdi
callq 0x4e10
movq 0x20(%rsp), %rdi
movq %rax, 0x80(%rsp)
addq $0x20, %rdi
callq 0x4e40
movq %rax, 0x78(%rsp)
movq 0x88(%rsp), %rsi
movq 0x80(%rsp), %rdx
movq 0x78(%rsp), %rcx
leaq 0x90(%rsp), %rdi
callq 0x4e70
movq 0x10(%rsp), %rdi
movb $0x1, 0x77(%rsp)
leaq 0x90(%rsp), %rsi
leaq 0x77(%rsp), %rdx
callq 0x57e0
jmp 0x4ccf
jmp 0x4ba9
movq 0x20(%rsp), %rdi
leaq 0xb0(%rsp), %rsi
callq 0x5810
testb $0x1, %al
jne 0x4adf
jmp 0x4bc5
movq 0x20(%rsp), %rdi
callq 0x59a0
movq 0x20(%rsp), %rcx
cmpq 0x70(%rcx), %rax
jb 0x4bf4
movq 0x20(%rsp), %rdi
movq 0xc8(%rsp), %rsi
callq 0x59b0
testb $0x1, %al
jne 0x4c77
movq 0x20(%rsp), %rdi
movq 0xc8(%rsp), %rsi
movq 0xb8(%rsp), %rdx
callq 0x5b20
movq 0x20(%rsp), %rdi
movq %rax, 0x68(%rsp)
addq $0x8, %rdi
callq 0x4e10
movq 0x20(%rsp), %rdi
movq %rax, 0x48(%rsp)
addq $0x8, %rdi
callq 0x4e10
movq %rax, 0x40(%rsp)
movq 0x68(%rsp), %rax
movq %rax, 0x38(%rsp)
movq 0x48(%rsp), %rsi
movq 0x40(%rsp), %rdx
movq 0x38(%rsp), %rcx
leaq 0x50(%rsp), %rdi
callq 0x4e70
movq 0x10(%rsp), %rdi
movb $0x1, 0x37(%rsp)
leaq 0x50(%rsp), %rsi
leaq 0x37(%rsp), %rdx
callq 0x57e0
jmp 0x4ccf
movq 0x20(%rsp), %rdi
callq 0x55b0
movq 0x20(%rsp), %rdi
movq %rax, %rsi
callq 0x54d0
movq 0x20(%rsp), %rdi
movq 0xc0(%rsp), %rsi
callq 0x47a0
movq 0x10(%rsp), %rdi
movq 0x20(%rsp), %rsi
movq %rax, 0xc8(%rsp)
movq 0xc8(%rsp), %rdx
movq 0xc0(%rsp), %rcx
movq 0xb8(%rsp), %r8
callq 0x4a00
movq 0x18(%rsp), %rax
addq $0xd8, %rsp
retq
nopl (%rax)