// File: DimitriDaSilva[P]42_ft_containers/containers/utils/red_black_tree.hpp
// Function: ft::red_black_tree<int, int, ft::less<int>, std::allocator<ft::red_black_tree_node<int>>>::swap_nodes(ft::red_black_tree_node<int>*, ft::red_black_tree_node<int>*)
void
		swap_nodes(node_pointer a, node_pointer b)
		{
			node_type		tmp = *b;
			node_pointer	old_root = _root;

			// Update parentage
			// a's parent points to b
			if (_root == a)
				_root = b;
			else if (a->parent->left == a)
				a->parent->left = b;
			else if (a->parent->right == a)
				a->parent->right = b;
			// and b points at a's parent
			b->parent = a->parent;

			// b's parent (via tmp) points to a
			// If root changed it means that _root was originally a and
			// was changed to b
			if (old_root == _root && _root == b)
				_root = a;
			else if (tmp.parent->left == b)
				tmp.parent->left = a;
			else if (tmp.parent->right == b)
				tmp.parent->right = a;
			// and a points back at b's parent
			a->parent = tmp.parent;

			// Update children
			b->left = a->left;
			if (b->left != _nil)
				b->left->parent = b;
			b->right = a->right;
			if (b->right != _nil)
				b->right->parent = b;

			a->left = tmp.left;
			if (a->left != _nil)
				a->left->parent = a;
			a->right = tmp.right;
			if (a->right != _nil)
				a->right->parent = a;

			// Update colors
			swap_color(a, b);
		}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x18(%rbp), %rsi
leaq -0x40(%rbp), %rdi
movl $0x28, %edx
callq 0x6170
movq -0x50(%rbp), %rax
movq 0x8(%rax), %rcx
movq %rcx, -0x48(%rbp)
movq 0x8(%rax), %rax
cmpq -0x10(%rbp), %rax
jne 0x16372
movq -0x50(%rbp), %rax
movq -0x18(%rbp), %rcx
movq %rcx, 0x8(%rax)
jmp 0x163bc
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rax
cmpq -0x10(%rbp), %rax
jne 0x16396
movq -0x18(%rbp), %rcx
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq %rcx, 0x10(%rax)
jmp 0x163ba
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x18(%rax), %rax
cmpq -0x10(%rbp), %rax
jne 0x163b8
movq -0x18(%rbp), %rcx
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq %rcx, 0x18(%rax)
jmp 0x163ba
jmp 0x163bc
movq -0x50(%rbp), %rcx
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdx
movq -0x18(%rbp), %rax
movq %rdx, 0x8(%rax)
movq -0x48(%rbp), %rax
cmpq 0x8(%rcx), %rax
jne 0x163f6
movq -0x50(%rbp), %rax
movq 0x8(%rax), %rax
cmpq -0x18(%rbp), %rax
jne 0x163f6
movq -0x50(%rbp), %rax
movq -0x10(%rbp), %rcx
movq %rcx, 0x8(%rax)
jmp 0x16430
movq -0x38(%rbp), %rax
movq 0x10(%rax), %rax
cmpq -0x18(%rbp), %rax
jne 0x16412
movq -0x10(%rbp), %rcx
movq -0x38(%rbp), %rax
movq %rcx, 0x10(%rax)
jmp 0x1642e
movq -0x38(%rbp), %rax
movq 0x18(%rax), %rax
cmpq -0x18(%rbp), %rax
jne 0x1642c
movq -0x10(%rbp), %rcx
movq -0x38(%rbp), %rax
movq %rcx, 0x18(%rax)
jmp 0x1642e
jmp 0x16430
movq -0x50(%rbp), %rcx
movq -0x38(%rbp), %rdx
movq -0x10(%rbp), %rax
movq %rdx, 0x8(%rax)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rdx
movq -0x18(%rbp), %rax
movq %rdx, 0x10(%rax)
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
cmpq 0x10(%rcx), %rax
je 0x1646e
movq -0x18(%rbp), %rcx
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, 0x8(%rax)
movq -0x50(%rbp), %rcx
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdx
movq -0x18(%rbp), %rax
movq %rdx, 0x18(%rax)
movq -0x18(%rbp), %rax
movq 0x18(%rax), %rax
cmpq 0x10(%rcx), %rax
je 0x164a0
movq -0x18(%rbp), %rcx
movq -0x18(%rbp), %rax
movq 0x18(%rax), %rax
movq %rcx, 0x8(%rax)
movq -0x50(%rbp), %rcx
movq -0x30(%rbp), %rdx
movq -0x10(%rbp), %rax
movq %rdx, 0x10(%rax)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
cmpq 0x10(%rcx), %rax
je 0x164ce
movq -0x10(%rbp), %rcx
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, 0x8(%rax)
movq -0x50(%rbp), %rcx
movq -0x28(%rbp), %rdx
movq -0x10(%rbp), %rax
movq %rdx, 0x18(%rax)
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpq 0x10(%rcx), %rax
je 0x164fc
movq -0x10(%rbp), %rcx
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq %rcx, 0x8(%rax)
movq -0x50(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
callq 0x16520
addq $0x50, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)
nopl (%rax)