// File: /workspace/github_cpp_makefile_star2_O3/HQarroum[P]thread-pool/examples/one-producer-many-consumers/./../../includes/concurrent_queue.hpp
// Function: bool moodycamel::ConcurrentQueue<std::function<void ()>, moodycamel::ConcurrentQueueDefaultTraits>::ImplicitProducer::enqueue<(moodycamel::ConcurrentQueue<std::function<void ()>, moodycamel::ConcurrentQueueDefaultTraits>::AllocationMode)0, std::function<void ()>>(std::function<void ()>&&)
inline bool enqueue(U&& element)
		{
			index_t currentTailIndex = this->tailIndex.load(std::memory_order_relaxed);
			index_t newTailIndex = 1 + currentTailIndex;
			if ((currentTailIndex & static_cast<index_t>(BLOCK_SIZE - 1)) == 0) {
				// We reached the end of a block, start a new one
				auto head = this->headIndex.load(std::memory_order_relaxed);
				assert(!details::circular_less_than<index_t>(currentTailIndex, head));
				if (!details::circular_less_than<index_t>(head, currentTailIndex + BLOCK_SIZE) || (MAX_SUBQUEUE_SIZE != details::const_numeric_max<size_t>::value && (MAX_SUBQUEUE_SIZE == 0 || MAX_SUBQUEUE_SIZE - BLOCK_SIZE < currentTailIndex - head))) {
					return false;
				}
#ifdef MCDBGQ_NOLOCKFREE_IMPLICITPRODBLOCKINDEX
				debug::DebugLock lock(mutex);
#endif
				// Find out where we'll be inserting this block in the block index
				BlockIndexEntry* idxEntry;
				if (!insert_block_index_entry<allocMode>(idxEntry, currentTailIndex)) {
					return false;
				}
				
				// Get ahold of a new block
				auto newBlock = this->parent->ConcurrentQueue::template requisition_block<allocMode>();
				if (newBlock == nullptr) {
					rewind_block_index_tail();
					idxEntry->value.store(nullptr, std::memory_order_relaxed);
					return false;
				}
#ifdef MCDBGQ_TRACKMEM
				newBlock->owner = this;
#endif
				newBlock->ConcurrentQueue::Block::template reset_empty<implicit_context>();

				MOODYCAMEL_CONSTEXPR_IF (!MOODYCAMEL_NOEXCEPT_CTOR(T, U, new (static_cast<T*>(nullptr)) T(std::forward<U>(element)))) {
					// May throw, try to insert now before we publish the fact that we have this new block
					MOODYCAMEL_TRY {
						new ((*newBlock)[currentTailIndex]) T(std::forward<U>(element));
					}
					MOODYCAMEL_CATCH (...) {
						rewind_block_index_tail();
						idxEntry->value.store(nullptr, std::memory_order_relaxed);
						this->parent->add_block_to_free_list(newBlock);
						MOODYCAMEL_RETHROW;
					}
				}
				
				// Insert the new block into the index
				idxEntry->value.store(newBlock, std::memory_order_relaxed);
				
				this->tailBlock = newBlock;
				
				MOODYCAMEL_CONSTEXPR_IF (!MOODYCAMEL_NOEXCEPT_CTOR(T, U, new (static_cast<T*>(nullptr)) T(std::forward<U>(element)))) {
					this->tailIndex.store(newTailIndex, std::memory_order_release);
					return true;
				}
			}

// Assembly:
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
movq %rsi, %r14
movq %rdi, %rbx
movq 0x20(%rdi), %r15
movq %r15, %r12
andq $0x1f, %r12
je 0x6288
movq 0x40(%rbx), %rax
incq %r15
shll $0x5, %r12d
xorps %xmm0, %xmm0
movups %xmm0, (%rax,%r12)
movq $0x0, 0x10(%rax,%r12)
movq 0x18(%r14), %rcx
movq %rcx, 0x18(%rax,%r12)
cmpq $0x0, 0x10(%r14)
je 0x627d
addq %r12, %rax
leaq 0x10(%r14), %rcx
movups (%r14), %xmm1
movups %xmm1, (%rax)
movq 0x10(%r14), %rdx
movq %rdx, 0x10(%rax)
movups %xmm0, (%rcx)
movq %r15, 0x20(%rbx)
movb $0x1, %al
jmp 0x6376
movabsq $0x7fffffffffffffdf, %rax # imm = 0x7FFFFFFFFFFFFFDF
movq 0x28(%rbx), %rcx
movq %r15, %rdx
subq %rcx, %rdx
leaq 0x21(%rax), %rsi
cmpq %rsi, %rdx
ja 0x6380
subq %r15, %rcx
addq %rax, %rcx
addq $0x20, %rax
cmpq %rax, %rcx
jae 0x6374
movq 0x60(%rbx), %rax
testq %rax, %rax
je 0x6374
movq 0x8(%rax), %rdx
incq %rdx
movq (%rax), %rcx
movq 0x18(%rax), %rsi
decq %rcx
andq %rdx, %rcx
movq (%rsi,%rcx,8), %r13
movq (%r13), %rdx
cmpq $0x1, %rdx
je 0x6326
movq 0x8(%r13), %rdx
testq %rdx, %rdx
je 0x6326
movq %rbx, %rdi
callq 0x6804
testb %al, %al
je 0x6374
movq 0x60(%rbx), %rax
movq 0x8(%rax), %rdx
incq %rdx
movq (%rax), %rcx
movq 0x18(%rax), %rsi
decq %rcx
andq %rdx, %rcx
movq (%rsi,%rcx,8), %r13
movq (%r13), %rdx
cmpq $0x1, %rdx
jne 0x639f
movq %r15, (%r13)
movq %rcx, 0x8(%rax)
movq 0x50(%rbx), %rdi
callq 0x6b54
testq %rax, %rax
je 0x6354
movq $0x0, 0x408(%rax)
movq %rax, 0x8(%r13)
movq %rax, 0x40(%rbx)
jmp 0x623c
movq 0x60(%rbx), %rax
movq 0x8(%rax), %rcx
decq %rcx
movq (%rax), %rdx
decq %rdx
andq %rcx, %rdx
movq %rdx, 0x8(%rax)
movq $0x0, 0x8(%r13)
xorl %eax, %eax
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
retq
leaq 0x180f(%rip), %rdi      # 0x7b96
leaq 0xd50(%rip), %rsi       # 0x70de
leaq 0x183f(%rip), %rcx      # 0x7bd4
movl $0x9af, %edx            # imm = 0x9AF
callq 0x3150
leaq 0x193f(%rip), %rdi      # 0x7ce5
leaq 0xd31(%rip), %rsi       # 0x70de
leaq 0x1975(%rip), %rcx      # 0x7d29
movl $0xb60, %edx            # imm = 0xB60
callq 0x3150