// File: /workspace/github_cpp_makefile_star2_O2/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 0x1ccb
movq %r14, %rdi
callq 0x1e90
movq %r14, %rdi
movq %rax, %rsi
callq 0x1e22
movq (%r14), %r13
andq %r12, %r13
movq %r14, %rdi
movq %r13, %rsi
callq 0x1f00
movq %rax, (%rsp)
movq 0x10(%r14), %rcx
subq 0x8(%r14), %rcx
sarq $0x4, %rcx
cmpq %rcx, %rax
jae 0x1d0d
movq %rsp, %rbp
movq (%rsp), %rsi
movq %rsi, %rax
subq %r13, %rax
movq %r14, %rdi
cmpq $0x3d, %rax
jbe 0x1d71
movq %rbp, %rsi
callq 0x1f74
testb %al, %al
jne 0x1cee
movq 0x58(%r14), %rax
cmpq 0x70(%r14), %rax
jb 0x1d52
movq %r14, %rdi
movq %r13, %rsi
callq 0x2030
testb %al, %al
je 0x1d52
movq %r14, %rdi
callq 0x1e90
movq %r14, %rdi
movq %rax, %rsi
callq 0x1e22
movq (%r14), %rdx
andq %r12, %rdx
movq %rbx, %rdi
movq %r14, %rsi
movq %r12, %rcx
movq %r15, %r8
callq 0x1c8a
jmp 0x1d96
movq %r14, %rdi
movq %r13, %rsi
movq %r15, %rdx
callq 0x20b0
movq 0x10(%r14), %rcx
movq %rcx, (%rbx)
movq %rcx, 0x8(%rbx)
movq %rax, 0x10(%rbx)
jmp 0x1d92
movq %r13, %rdx
movq %r12, %rcx
movq %r15, %r8
callq 0x1f3c
movq 0x10(%r14), %rcx
movq 0x38(%r14), %rdx
movq %rax, (%rbx)
movq %rcx, 0x8(%rbx)
movq %rdx, 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