// File: attractivechaos[P]udb2/tsl_robin_map/./robin_hash.h
// Function: std::pair<tsl::detail_robin_hash::robin_hash<std::pair<unsigned int, unsigned int>, tsl::robin_map<unsigned int, unsigned int, Hash32, std::equal_to<unsigned int>, std::allocator<std::pair<unsigned int, unsigned int>>, false, tsl::rh::power_of_two_growth_policy<2ul>>::KeySelect, tsl::robin_map<unsigned int, unsigned int, Hash32, std::equal_to<unsigned int>, std::allocator<std::pair<unsigned int, unsigned int>>, false, tsl::rh::power_of_two_growth_policy<2ul>>::ValueSelect, Hash32, std::equal_to<unsigned int>, std::allocator<std::pair<unsigned int, unsigned int>>, false, tsl::rh::power_of_two_growth_policy<2ul>>::robin_iterator<false>, bool> tsl::detail_robin_hash::robin_hash<std::pair<unsigned int, unsigned int>, tsl::robin_map<unsigned int, unsigned int, Hash32, std::equal_to<unsigned int>, std::allocator<std::pair<unsigned int, unsigned int>>, false, tsl::rh::power_of_two_growth_policy<2ul>>::KeySelect, tsl::robin_map<unsigned int, unsigned int, Hash32, std::equal_to<unsigned int>, std::allocator<std::pair<unsigned int, unsigned int>>, false, tsl::rh::power_of_two_growth_policy<2ul>>::ValueSelect, Hash32, std::equal_to<unsigned int>, std::allocator<std::pair<unsigned int, unsigned int>>, false, tsl::rh::power_of_two_growth_policy<2ul>>::insert_impl<unsigned int, std::pair<unsigned int, unsigned int>>(unsigned int const&, std::pair<unsigned int, unsigned int>&&)
std::pair<iterator, bool> insert_impl(const K& key, Args&&... value_type_args) {
        const std::size_t hash = hash_key(key);
        
        std::size_t ibucket = bucket_for_hash(hash); 
        distance_type dist_from_ideal_bucket = 0;
        
        while(dist_from_ideal_bucket <= m_buckets[ibucket].dist_from_ideal_bucket()) {
            if((!USE_STORED_HASH_ON_LOOKUP || m_buckets[ibucket].bucket_hash_equal(hash)) &&
               compare_keys(KeySelect()(m_buckets[ibucket].value()), key)) 
            {
                return std::make_pair(iterator(m_buckets + ibucket), false);
            }
            
            ibucket = next_bucket(ibucket);
            dist_from_ideal_bucket++;
        }
        
        if(rehash_on_extreme_load()) {
            ibucket = bucket_for_hash(hash);
            dist_from_ideal_bucket = 0;
            
            while(dist_from_ideal_bucket <= m_buckets[ibucket].dist_from_ideal_bucket()) {
                ibucket = next_bucket(ibucket);
                dist_from_ideal_bucket++;
            }
        }
 
        
        if(m_buckets[ibucket].empty()) {
            m_buckets[ibucket].set_value_of_empty_bucket(dist_from_ideal_bucket, bucket_entry::truncate_hash(hash),
                                                         std::forward<Args>(value_type_args)...);
        }
        else {
            insert_value(ibucket, dist_from_ideal_bucket, bucket_entry::truncate_hash(hash), 
                         std::forward<Args>(value_type_args)...);
        }
        
        
        m_nb_elements++;
        /*
         * The value will be inserted in ibucket in any case, either because it was
         * empty or by stealing the bucket (robin hood). 
         */
        return std::make_pair(iterator(m_buckets + ibucket), true);
    }

// Assembly:
subq $0xc8, %rsp
movq %rdi, 0xb0(%rsp)
movq %rsi, 0xa8(%rsp)
movq %rdx, 0xa0(%rsp)
movq 0xb0(%rsp), %rdi
movq %rdi, 0x40(%rsp)
movq 0xa8(%rsp), %rsi
callq 0x3490
movq 0x40(%rsp), %rdi
movq %rax, 0x98(%rsp)
movq 0x98(%rsp), %rsi
callq 0x34c0
movq %rax, 0x90(%rsp)
movw $0x0, 0x8e(%rsp)
movq 0x40(%rsp), %rax
movswl 0x8e(%rsp), %ecx
movl %ecx, 0x3c(%rsp)
movq 0x20(%rax), %rdi
imulq $0xc, 0x90(%rsp), %rax
addq %rax, %rdi
callq 0x34f0
movw %ax, %cx
movl 0x3c(%rsp), %eax
movswl %cx, %ecx
cmpl %ecx, %eax
jg 0x32aa
movq 0x40(%rsp), %rax
movq 0x20(%rax), %rdi
imulq $0xc, 0x90(%rsp), %rax
addq %rax, %rdi
callq 0x1be0
movq %rax, %rsi
leaq 0x8d(%rsp), %rdi
callq 0x3480
movq 0x40(%rsp), %rdi
movq %rax, %rsi
movq 0xa8(%rsp), %rdx
callq 0x3500
testb $0x1, %al
jne 0x3212
jmp 0x3277
movq 0x40(%rsp), %rax
movq 0x20(%rax), %rax
movq 0x90(%rsp), %rcx
leaq (%rcx,%rcx,2), %rcx
leaq (%rax,%rcx,4), %rsi
leaq 0x80(%rsp), %rdi
movq %rdi, 0x30(%rsp)
callq 0x3560
movq 0x30(%rsp), %rdi
movb $0x0, 0x7f(%rsp)
leaq 0x7f(%rsp), %rsi
callq 0x3530
movb %dl, 0x70(%rsp)
movq %rax, 0x68(%rsp)
movq 0x68(%rsp), %rax
movq %rax, 0xb8(%rsp)
movb 0x70(%rsp), %al
movb %al, 0xc0(%rsp)
jmp 0x3469
movq 0x40(%rsp), %rdi
movq 0x90(%rsp), %rsi
callq 0x3580
movq %rax, 0x90(%rsp)
movw 0x8e(%rsp), %ax
addw $0x1, %ax
movw %ax, 0x8e(%rsp)
jmp 0x3195
movq 0x40(%rsp), %rdi
callq 0x35a0
testb $0x1, %al
jne 0x32bd
jmp 0x3347
movq 0x40(%rsp), %rdi
movq 0x98(%rsp), %rsi
callq 0x34c0
movq %rax, 0x90(%rsp)
movw $0x0, 0x8e(%rsp)
movq 0x40(%rsp), %rax
movswl 0x8e(%rsp), %ecx
movl %ecx, 0x2c(%rsp)
movq 0x20(%rax), %rdi
imulq $0xc, 0x90(%rsp), %rax
addq %rax, %rdi
callq 0x34f0
movw %ax, %cx
movl 0x2c(%rsp), %eax
movswl %cx, %ecx
cmpl %ecx, %eax
jg 0x3345
movq 0x40(%rsp), %rdi
movq 0x90(%rsp), %rsi
callq 0x3580
movq %rax, 0x90(%rsp)
movw 0x8e(%rsp), %ax
addw $0x1, %ax
movw %ax, 0x8e(%rsp)
jmp 0x32e1
jmp 0x3347
movq 0x40(%rsp), %rax
movq 0x20(%rax), %rdi
imulq $0xc, 0x90(%rsp), %rax
addq %rax, %rdi
callq 0x1bb0
testb $0x1, %al
jne 0x3367
jmp 0x33b9
movq 0x40(%rsp), %rax
movq 0x20(%rax), %rax
imulq $0xc, 0x90(%rsp), %rcx
addq %rcx, %rax
movq %rax, 0x20(%rsp)
movw 0x8e(%rsp), %ax
movw %ax, 0x2a(%rsp)
movq 0x98(%rsp), %rdi
callq 0x36b0
movq 0x20(%rsp), %rdi
movl %eax, %edx
movw 0x2a(%rsp), %ax
movq 0xa0(%rsp), %rcx
movswl %ax, %esi
callq 0x3660
jmp 0x3401
movq 0x90(%rsp), %rax
movq %rax, 0x10(%rsp)
movw 0x8e(%rsp), %ax
movw %ax, 0x1e(%rsp)
movq 0x98(%rsp), %rdi
callq 0x36b0
movq 0x40(%rsp), %rdi
movq 0x10(%rsp), %rsi
movl %eax, %ecx
movw 0x1e(%rsp), %ax
movq 0xa0(%rsp), %r8
movswl %ax, %edx
callq 0x36c0
movq 0x40(%rsp), %rax
movq 0x30(%rax), %rcx
incq %rcx
movq %rcx, 0x30(%rax)
movq 0x20(%rax), %rax
movq 0x90(%rsp), %rcx
leaq (%rcx,%rcx,2), %rcx
leaq (%rax,%rcx,4), %rsi
leaq 0x60(%rsp), %rdi
movq %rdi, 0x8(%rsp)
callq 0x3560
movq 0x8(%rsp), %rdi
movb $0x1, 0x5f(%rsp)
leaq 0x5f(%rsp), %rsi
callq 0x3530
movb %dl, 0x50(%rsp)
movq %rax, 0x48(%rsp)
movq 0x48(%rsp), %rax
movq %rax, 0xb8(%rsp)
movb 0x50(%rsp), %al
movb %al, 0xc0(%rsp)
movq 0xb8(%rsp), %rax
movb 0xc0(%rsp), %dl
addq $0xc8, %rsp
retq