// File: /workspace/github_cpp_makefile_star2_O2/dragazo[P]cpp-gc/./GarbageCollection.h
// Function: GC::ptr<std::unordered_set<float, std::hash<float>, std::equal_to<float>, std::allocator<float>>> GC::make<std::unordered_set<float, std::hash<float>, std::equal_to<float>, std::allocator<float>>, std::_Rb_tree_const_iterator<float>, std::_Rb_tree_const_iterator<float>, 0>(std::_Rb_tree_const_iterator<float>&&, std::_Rb_tree_const_iterator<float>&&)
[[nodiscard]]
	static ptr<T> make(Args &&...args)
	{
		// -- normalize T -- //

		// strip cv qualifiers
		typedef std::remove_cv_t<T> element_type;
		
		// get the allocator
		typedef checked_aligned_allocator_for<element_type, info> allocator_t;

		// -- create the vtable -- //

		// use lambda to conveniently create the set of all router functions for type T
		auto router_set = [](info &handle, auto func) { GC::route(*reinterpret_cast<element_type*>(handle.obj), func); };

		static const info_vtable _vtable(
			[](info &handle) { reinterpret_cast<element_type*>(handle.obj)->~element_type(); },
			[](info &handle) { allocator_t::dealloc(handle.obj); },
			router_set,
			router_set
		);

		// -- create the buffer for both the object and its info object -- //

		// alias the pad size type
		typedef pad_size_for_info<element_type, 1> pad_size;

		// allocate the buffer space
		void *const buf = allocator_t::alloc(pad_size::value + sizeof(info));

		// alias the buffer partitions
		element_type *const obj = reinterpret_cast<element_type*>(buf);
		info         *const handle = reinterpret_cast<info*>(reinterpret_cast<char*>(buf) + pad_size::value);

		// -- construct the object -- //

		// try to construct the object
		try { new (obj) element_type(std::forward<Args>(args)...); }
		// if that fails, deallocate buf and rethrow
		catch (...) { allocator_t::dealloc(buf); throw; }

		// construct the info object
		new (handle) info(obj, 1, &_vtable);

		// -- do the garbage collection aspects -- //

		// claim its children
		handle->route(GC::router_unroot);

		// create the ptr first - this roots obj
		ptr<T> res(obj, handle, GC::bind_new_obj);

		// begin timed collection (if it's not already)
		GC::start_timed_collect();

		// return the now-initialized ptr
		return res;
	}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x18, %rsp
movq %rdx, %r15
movq %rsi, %r12
movq %rdi, %rbx
movb 0x2323e(%rip), %al      # 0x348a0
testb %al, %al
je 0x116f4
pushq $0x78
popq %rdi
callq 0x15e54
movq %rax, %r14
movq (%r12), %rsi
movq (%r15), %rdx
leaq 0x15(%rsp), %rax
movq %rax, (%rsp)
leaq 0x17(%rsp), %r8
leaq 0x16(%rsp), %r9
movq %r14, %rdi
xorl %ecx, %ecx
callq 0x18a46
movq %r14, %r15
addq $0x38, %r15
movq %r14, 0x38(%r14)
movq $0x1, 0x40(%r14)
leaq 0x231cd(%rip), %rax     # 0x34880
movq %rax, 0x48(%r14)
callq 0x6860
movq %rax, 0x50(%r14)
movq 0x48(%r14), %rax
leaq -0xa79d(%rip), %rsi     # 0x6f2e
movq %r15, %rdi
callq *0x10(%rax)
movq %r14, (%rbx)
leaq 0x8(%rbx), %rdi
movq %r15, %rsi
callq 0x15f72
callq 0x6f5a
movq %rbx, %rax
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
leaq 0x231a5(%rip), %rdi     # 0x348a0
callq 0x5470
testl %eax, %eax
je 0x1166a
leaq 0x727b(%rip), %rax      # 0x1898a
movq %rax, 0x2316a(%rip)     # 0x34880
leaq 0x731d(%rip), %rax      # 0x18a3a
movq %rax, 0x23164(%rip)     # 0x34888
leaq 0x7317(%rip), %rax      # 0x18a42
movq %rax, 0x2315e(%rip)     # 0x34890
leaq 0x730b(%rip), %rax      # 0x18a44
movq %rax, 0x23158(%rip)     # 0x34898
leaq 0x23159(%rip), %rdi     # 0x348a0
callq 0x51a0
jmp 0x1166a
movq %rax, %r14
movq %rbx, %rdi
callq 0x1437a
jmp 0x1177b
movq %rax, %rdi
callq 0x50f0
movq %r14, %rdi
callq 0x5320
callq 0x5390
movq %rax, %r14
callq 0x53f0
movq %r14, %rdi
callq 0x5450
movq %rax, %rdi
callq 0x70ea
nop