// File: /workspace/github_c_makefile_star2_O0/chatziko-k08[P]lecture-code/tests/../modules/UsingBTree/ADTSet.c
// Function: split
static void split(BTreeNode node, CompareFunc compare) {
	assert(node->count > MAX_VALUES);	// ο κόμβος έχει ξεπεράσει το μέγιστο όριο τιμών.

	// Χωρίζουμε τον κόμβο node σε 2 κόμβους, με τον καθένα να έχει από MAX_CHILDREN/2 (=2) τιμές.
	BTreeNode right = node_create();
	right->parent = node->parent;     // Οι 2 κόμβοι έχουν τον ίδιο πατέρα.

	// Μετακίνησε τις μισές τιμές και παιδιά από τον αριστερό κόμβο στον δεξιό.
	int half = node->count/2;
	if (!is_leaf(node))
		for (int i = 0; i <= half; i++)
			node_add_child(right, node->children[i + half + 1], i);

	for (int i = 0; i < half; i++) {
		node_add_value(right, node->set_nodes[i + half + 1], i);
		node->count--;
	}

	// Αφαίρεση μεσαίας τιμής
	SetNode median = node->set_nodes[node->count-1];
	node->count--;

	// Προσθέρουμε το median στον πατέρα του κόμβου node.
	BTreeNode parent = node->parent;
	if (parent == NULL) {						// Ο node είναι η ρίζα
		BTreeNode new_root = node_create();		// Δημιούργησε καινούργια ρίζα η οποία θα έχει για παιδιά τους node, right.

		node_add_value(new_root, median, 0);

		right->parent = node->parent = new_root;
		new_root->children[0] = node;
		new_root->children[1] = right;

	} else {
		int index;  // Βρες τη θέση εισαγωγής της τιμής στον πατέρα.
		for (index = 0; index < parent->count; index++)
			if (compare(median->value, parent->set_nodes[index]->value) < 0)
				break;

		node_add_child(parent, right, index+1);		// Πρόσθεσε τον δεξιό κόμβο που δημιουργήθηκε ως δεξιό παιδί της (νέας) διαχωριστικής τιμής
		node_add_value(parent, median, index);

		if (parent->count > MAX_VALUES)  // Έλεγξε εαν υπερχείλησε ο πατέρας λόγω της προσθήκης.
			split(parent, compare);
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x8(%rbp), %rax
cmpl $0x4, (%rax)
jle 0x740b
jmp 0x742a
leaq 0x1c40(%rip), %rdi      # 0x9052
leaq 0x1bf1(%rip), %rsi      # 0x900a
movl $0x14b, %edx            # imm = 0x14B
leaq 0x1c46(%rip), %rcx      # 0x906b
callq 0x20f0
callq 0x75f0
movq %rax, -0x18(%rbp)
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x8(%rbp), %rax
movl (%rax), %eax
movl $0x2, %ecx
cltd
idivl %ecx
movl %eax, -0x1c(%rbp)
movq -0x8(%rbp), %rdi
callq 0x6d20
testb $0x1, %al
jne 0x749e
movl $0x0, -0x20(%rbp)
movl -0x20(%rbp), %eax
cmpl -0x1c(%rbp), %eax
jg 0x749c
movq -0x18(%rbp), %rdi
movq -0x8(%rbp), %rax
movl -0x20(%rbp), %ecx
addl -0x1c(%rbp), %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
movq 0x10(%rax,%rcx,8), %rsi
movl -0x20(%rbp), %edx
callq 0x7350
movl -0x20(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x20(%rbp)
jmp 0x7468
jmp 0x749e
movl $0x0, -0x24(%rbp)
movl -0x24(%rbp), %eax
cmpl -0x1c(%rbp), %eax
jge 0x74e4
movq -0x18(%rbp), %rdi
movq -0x8(%rbp), %rax
movl -0x24(%rbp), %ecx
addl -0x1c(%rbp), %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
movq 0x40(%rax,%rcx,8), %rsi
movl -0x24(%rbp), %edx
callq 0x72d0
movq -0x8(%rbp), %rax
movl (%rax), %ecx
addl $-0x1, %ecx
movl %ecx, (%rax)
movl -0x24(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x24(%rbp)
jmp 0x74a5
movq -0x8(%rbp), %rax
movq -0x8(%rbp), %rcx
movl (%rcx), %ecx
subl $0x1, %ecx
movslq %ecx, %rcx
movq 0x40(%rax,%rcx,8), %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rax
movl (%rax), %ecx
addl $-0x1, %ecx
movl %ecx, (%rax)
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x38(%rbp)
cmpq $0x0, -0x38(%rbp)
jne 0x7561
callq 0x75f0
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rdi
movq -0x30(%rbp), %rsi
xorl %edx, %edx
callq 0x72d0
movq -0x40(%rbp), %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x18(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x8(%rbp), %rcx
movq -0x40(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x18(%rbp), %rcx
movq -0x40(%rbp), %rax
movq %rcx, 0x18(%rax)
jmp 0x75df
movl $0x0, -0x44(%rbp)
movl -0x44(%rbp), %eax
movq -0x38(%rbp), %rcx
cmpl (%rcx), %eax
jge 0x75a4
movq -0x10(%rbp), %rax
movq -0x30(%rbp), %rcx
movq (%rcx), %rdi
movq -0x38(%rbp), %rcx
movslq -0x44(%rbp), %rdx
movq 0x40(%rcx,%rdx,8), %rcx
movq (%rcx), %rsi
callq *%rax
cmpl $0x0, %eax
jge 0x7597
jmp 0x75a4
jmp 0x7599
movl -0x44(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x44(%rbp)
jmp 0x7568
movq -0x38(%rbp), %rdi
movq -0x18(%rbp), %rsi
movl -0x44(%rbp), %edx
addl $0x1, %edx
callq 0x7350
movq -0x38(%rbp), %rdi
movq -0x30(%rbp), %rsi
movl -0x44(%rbp), %edx
callq 0x72d0
movq -0x38(%rbp), %rax
cmpl $0x4, (%rax)
jle 0x75dd
movq -0x38(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x73f0
jmp 0x75df
addq $0x50, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)