// File: /workspace/github_cpp_makefile_star2_O3/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:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x18, %rsp
movq %r8, 0x8(%rsp)
movq %rcx, %r12
movq %rdx, %r13
movq %rsi, %r14
movq %rdi, %rbx
movq 0x58(%rsi), %rax
subq 0x48(%rsi), %rax
cmpq 0x68(%rsi), %rax
jb 0x1e10
movq %r14, %rdi
callq 0x1fd4
movq %r14, %rdi
movq %rax, %rsi
callq 0x1f66
movq (%r14), %r13
andq %r12, %r13
leaq 0x2e8(%r13), %rcx
movq 0x10(%r14), %rax
subq 0x8(%r14), %rax
sarq $0x4, %rax
cmpq %rcx, %rax
cmovbq %rax, %rcx
cmpq %r13, %rcx
jbe 0x1e55
movq %r13, %r15
shlq $0x4, %r15
movq 0x50(%r14), %rdx
addq %r15, %rdx
movq %r13, %rsi
testb $0x1, (%rdx)
je 0x1ee5
incq %rsi
addq $0x10, %rdx
cmpq %rsi, %rcx
jne 0x1e40
movq %rax, 0x10(%rsp)
movq 0x58(%r14), %rax
cmpq 0x70(%r14), %rax
jb 0x1ea1
movq %r14, %rdi
movq %r13, %rsi
callq 0x2118
testb %al, %al
je 0x1ea1
movq %r14, %rdi
callq 0x1fd4
movq %r14, %rdi
movq %rax, %rsi
callq 0x1f66
movq (%r14), %rdx
andq %r12, %rdx
movq %rbx, %rdi
movq %r14, %rsi
movq %r12, %rcx
movq 0x8(%rsp), %r8
callq 0x1dca
jmp 0x1ed3
leaq 0x20(%r14), %rdi
movq 0x8(%rsp), %rsi
callq 0x25ae
movq 0x50(%r14), %rcx
shlq $0x4, %r13
orq $0x2, (%rcx,%r13)
incq 0x58(%r14)
movq 0x10(%r14), %rcx
movq %rcx, (%rbx)
movq %rcx, 0x8(%rbx)
movq %rax, 0x10(%rbx)
movb $0x1, 0x18(%rbx)
movq %rbx, %rax
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq %rsi, 0x10(%rsp)
cmpq %rax, %rsi
jae 0x1e5a
leaq 0x10(%rsp), %rbp
movq 0x10(%rsp), %rax
movq %rax, %rcx
subq %r13, %rcx
cmpq $0x3d, %rcx
jbe 0x1f1d
movq %r14, %rdi
movq %rbp, %rsi
callq 0x2046
testb %al, %al
jne 0x1ef8
jmp 0x1e5a
movq 0x50(%r14), %rdx
shlq $0x4, %rax
movq 0x8(%rsp), %rsi
movq (%rsi), %rsi
movq %rsi, 0x8(%rdx,%rax)
orb $0x1, (%rdx,%rax)
movl $0x4, %edx
shlq %cl, %rdx
movq 0x50(%r14), %rcx
xorq %rdx, (%rcx,%r15)
incq 0x58(%r14)
addq 0x8(%r14), %rax
movq 0x10(%r14), %rcx
movq 0x38(%r14), %rdx
movq %rax, (%rbx)
movq %rcx, 0x8(%rbx)
movq %rdx, 0x10(%rbx)
jmp 0x1ecf