// File: attractivechaos[P]udb2/tsl_hopscotch_map/./hopscotch_hash.h
// Function: 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_hash<std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, unsigned int>>>, (void*)0>(unsigned long, Hash32 const&, std::equal_to<unsigned int> const&, std::allocator<std::pair<unsigned int const, unsigned int>> const&, float, std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, unsigned int>>>::key_compare const&)
hopscotch_hash(size_type bucket_count, 
                  const Hash& hash,
                  const KeyEqual& equal,
                  const Allocator& alloc,
                  float max_load_factor,
                  const typename OC::key_compare& comp) : Hash(hash),
                                                          KeyEqual(equal),
                                                          GrowthPolicy(bucket_count),
                                                          m_buckets_data(alloc), 
                                                          m_overflow_elements(comp, alloc),
                                                          m_buckets(static_empty_bucket_ptr()),
                                                          m_nb_elements(0)
    {
        
        if(bucket_count > max_bucket_count()) {
            throw std::length_error("The map exceeds its maxmimum size.");
        }
        
        if(bucket_count > 0) {
            static_assert(NeighborhoodSize - 1 > 0, "");
            
            // Can't directly construct with the appropriate size in the initializer 
            // as m_buckets_data(bucket_count, alloc) is not supported by GCC 4.8
            m_buckets_data.resize(bucket_count + NeighborhoodSize - 1);
            m_buckets = m_buckets_data.data();
        }
        
        
        this->max_load_factor(max_load_factor);
        
        
        // Check in the constructor instead of outside of a function to avoi compilation issues
        // when value_type is not complete.
        static_assert(std::is_nothrow_move_constructible<value_type>::value || 
                      std::is_copy_constructible<value_type>::value, 
                      "value_type must be either copy constructible or nothrow move constructible.");
    }

// Assembly:
subq $0x98, %rsp
movq %rdi, 0x90(%rsp)
movq %rsi, 0x88(%rsp)
movq %rdx, 0x80(%rsp)
movq %rcx, 0x78(%rsp)
movq %r8, 0x70(%rsp)
movss %xmm0, 0x6c(%rsp)
movq %r9, 0x60(%rsp)
movq 0x90(%rsp), %rdi
movq %rdi, 0x38(%rsp)
leaq 0x88(%rsp), %rsi
callq 0x6ee0
movq 0x38(%rsp), %rax
addq $0x8, %rax
movq %rax, 0x28(%rsp)
movq 0x70(%rsp), %rsi
leaq 0x5f(%rsp), %rdi
movq %rdi, 0x30(%rsp)
callq 0x3260
movq 0x28(%rsp), %rdi
movq 0x30(%rsp), %rsi
callq 0x3280
movq 0x30(%rsp), %rdi
callq 0x32b0
movq 0x38(%rsp), %rdi
addq $0x20, %rdi
movq %rdi, 0x40(%rsp)
movq 0x60(%rsp), %rsi
movq 0x70(%rsp), %rdx
callq 0x32c0
jmp 0x3108
movq 0x38(%rsp), %rdi
movq %rdi, %rax
addq $0x50, %rax
movq %rax, 0x18(%rsp)
callq 0x3340
movq %rax, 0x20(%rsp)
jmp 0x3125
movq 0x38(%rsp), %rdi
movq 0x18(%rsp), %rax
movq 0x20(%rsp), %rcx
movq %rcx, (%rax)
movq $0x0, 0x58(%rdi)
movq 0x88(%rsp), %rax
movq %rax, 0x8(%rsp)
callq 0x33a0
movq %rax, 0x10(%rsp)
jmp 0x3158
movq 0x8(%rsp), %rax
movq 0x10(%rsp), %rcx
cmpq %rcx, %rax
jbe 0x31e1
movl $0x10, %edi
callq 0x2090
movq %rax, %rdi
movq %rdi, %rax
movq %rax, (%rsp)
leaq 0x5f21(%rip), %rsi      # 0x90a3
callq 0x2170
jmp 0x3189
movq (%rsp), %rdi
movq 0x9e4c(%rip), %rsi      # 0xcfe0
movq 0x9e35(%rip), %rdx      # 0xcfd0
callq 0x21d0
jmp 0x325a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x50(%rsp)
movl %eax, 0x4c(%rsp)
jmp 0x3246
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x50(%rsp)
movl %eax, 0x4c(%rsp)
jmp 0x323c
movq (%rsp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x50(%rsp)
movl %eax, 0x4c(%rsp)
callq 0x2100
jmp 0x323c
cmpq $0x0, 0x88(%rsp)
jbe 0x3222
movq 0x38(%rsp), %rdi
addq $0x8, %rdi
movq 0x88(%rsp), %rsi
addq $0x3d, %rsi
callq 0x3400
jmp 0x3208
movq 0x38(%rsp), %rdi
addq $0x8, %rdi
callq 0x34a0
movq %rax, %rcx
movq 0x38(%rsp), %rax
movq %rcx, 0x50(%rax)
movq 0x38(%rsp), %rdi
movss 0x6c(%rsp), %xmm0
callq 0x34c0
jmp 0x3234
addq $0x98, %rsp
retq
movq 0x40(%rsp), %rdi
callq 0x2a50
movq 0x28(%rsp), %rdi
callq 0x2a60
movq 0x50(%rsp), %rdi
callq 0x21e0
nopw (%rax,%rax)