// File: /workspace/github_cpp_makefile_star2_O1/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
pushq %rax
movq %r8, %r15
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 0x1e21
movq %r14, %rdi
callq 0x1fea
movq %r14, %rdi
movq %rax, %rsi
callq 0x1f7c
movq (%r14), %r13
andq %r12, %r13
leaq 0x2e8(%r13), %rdx
movq 0x8(%r14), %rcx
movq 0x10(%r14), %rax
subq %rcx, %rax
sarq $0x4, %rax
cmpq %rdx, %rax
cmovbq %rax, %rdx
cmpq %r13, %rdx
jbe 0x1e67
movq %r13, %rsi
shlq $0x4, %rsi
addq 0x50(%r14), %rsi
movq %r13, %rdi
testb $0x1, (%rsi)
je 0x1e64
incq %rdi
addq $0x10, %rsi
cmpq %rdi, %rdx
jne 0x1e51
jmp 0x1e67
movq %rdi, %rax
movq %rax, (%rsp)
movq 0x10(%r14), %rdx
subq %rcx, %rdx
sarq $0x4, %rdx
cmpq %rdx, %rax
jae 0x1ea1
movq %rsp, %rbp
movq (%rsp), %rcx
movq %rcx, %rax
subq %r13, %rax
cmpq $0x3d, %rax
jbe 0x1f17
movq %r14, %rdi
movq %rbp, %rsi
callq 0x205c
testb %al, %al
jne 0x1e7e
movq 0x58(%r14), %rax
cmpq 0x70(%r14), %rax
jb 0x1ee9
movq %r14, %rdi
movq %r13, %rsi
callq 0x212e
testb %al, %al
je 0x1ee9
movq %r14, %rdi
callq 0x1fea
movq %r14, %rdi
movq %rax, %rsi
callq 0x1f7c
movq (%r14), %rdx
andq %r12, %rdx
movq %rbx, %rdi
movq %r14, %rsi
movq %r12, %rcx
movq %r15, %r8
callq 0x1de0
jmp 0x1f6a
leaq 0x20(%r14), %rdi
movq %r15, %rsi
callq 0x25ce
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)
jmp 0x1f66
movq 0x50(%r14), %rax
movq %rcx, %rdx
shlq $0x4, %rdx
movq (%r15), %rsi
movq %rsi, 0x8(%rax,%rdx)
orb $0x1, (%rax,%rdx)
movq 0x50(%r14), %rax
movq %r13, %rsi
subl %r13d, %ecx
addb $0x2, %cl
movl $0x1, %edi
shlq %cl, %rdi
shlq $0x4, %rsi
xorq %rdi, (%rax,%rsi)
incq 0x58(%r14)
addq 0x8(%r14), %rdx
movq 0x10(%r14), %rax
movq 0x38(%r14), %rcx
movq %rdx, (%rbx)
movq %rax, 0x8(%rbx)
movq %rcx, 0x10(%rbx)
movb $0x1, 0x18(%rbx)
movq %rbx, %rax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq