// File: /workspace/github_c_makefile_star2_O1/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 %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
movq %rsi, %rbx
movq %rdi, %r15
movl (%r15), %r12d
cmpl $0x4, %r12d
jle 0x5c0e
movl $0x1, %edi
movl $0x68, %esi
callq 0x2160
movq %rax, %r14
movq 0x8(%r15), %rax
movq %rax, 0x8(%r14)
shrl %r12d
cmpq $0x0, 0x10(%r15)
je 0x5aa4
leaq 0x1(%r12), %rax
movslq (%r14), %rcx
leaq 0x1(%rcx), %rdx
xorl %esi, %esi
leaq (%rsi,%rax), %rdi
movq 0x10(%r15,%rdi,8), %rdi
movq %r14, 0x8(%rdi)
cmpq %rcx, %rsi
jg 0x5a97
movq %rdx, %r8
movq 0x8(%r14,%r8,8), %r9
movq %r9, 0x10(%r14,%r8,8)
decq %r8
cmpq %rsi, %r8
jg 0x5a85
movq %rdi, 0x10(%r14,%rsi,8)
incq %rsi
cmpq %rax, %rsi
jne 0x5a70
leal 0x1(%r12), %edx
movslq (%r14), %rcx
movl (%r15), %eax
cmpl $0x1, %r12d
adcl $0x0, %r12d
xorl %esi, %esi
leaq (%rsi,%rdx), %rdi
movq 0x40(%r15,%rdi,8), %rdi
movq %r14, 0x8(%rdi)
cmpq %rsi, %rcx
jle 0x5ae4
movq %rcx, %r8
movq 0x38(%r14,%r8,8), %r9
movq %r9, 0x40(%r14,%r8,8)
leaq -0x1(%r8), %r9
movq %r9, %r8
cmpq %rsi, %r9
jg 0x5ace
movq %rdi, 0x40(%r14,%rsi,8)
incq %rcx
incq %rsi
cmpq %r12, %rsi
jne 0x5ab9
subl %r12d, %eax
movl %ecx, (%r14)
movl %eax, (%r15)
movslq %eax, %rcx
decl %eax
movq 0x38(%r15,%rcx,8), %r12
movl %eax, (%r15)
movq 0x8(%r15), %r13
testq %r13, %r13
je 0x5bb3
cmpl $0x0, (%r13)
jle 0x5b41
xorl %r15d, %r15d
movq (%r12), %rdi
movq 0x40(%r13,%r15,8), %rax
movq (%rax), %rsi
callq *%rbx
testl %eax, %eax
js 0x5b44
incq %r15
movslq (%r13), %rax
cmpq %rax, %r15
jl 0x5b21
jmp 0x5b44
xorl %r15d, %r15d
leal 0x1(%r15), %ecx
movq %r13, 0x8(%r14)
movslq (%r13), %rax
movl %ecx, %ecx
cmpl %r15d, %eax
jle 0x5b6d
leaq 0x1(%rax), %rdx
movq 0x8(%r13,%rdx,8), %rsi
movq %rsi, 0x10(%r13,%rdx,8)
decq %rdx
cmpq %rcx, %rdx
jg 0x5b5b
movq %r14, 0x10(%r13,%rcx,8)
movq %r13, 0x8(%r12)
movl %r15d, %ecx
cmpl %r15d, %eax
jle 0x5b98
movq %rax, %rdx
movq 0x38(%r13,%rdx,8), %rsi
movq %rsi, 0x40(%r13,%rdx,8)
leaq -0x1(%rdx), %rsi
movq %rsi, %rdx
cmpq %rcx, %rsi
jg 0x5b82
movq %r12, 0x40(%r13,%rcx,8)
movl %eax, %ecx
incl %ecx
movl %ecx, (%r13)
movq %r13, %r15
cmpl $0x3, %eax
jg 0x5a31
jmp 0x5c04
movl $0x1, %edi
movl $0x68, %esi
callq 0x2160
movq %rax, %rbx
movq %rax, 0x8(%r12)
movslq (%rax), %r13
testq %r13, %r13
jle 0x5bea
leaq 0x40(%rbx), %rsi
movq %rbx, %rdi
addq $0x48, %rdi
leaq (,%r13,8), %rdx
callq 0x21e0
movq %r12, 0x40(%rbx)
incl %r13d
movl %r13d, (%rbx)
movq %rbx, 0x8(%r15)
movq %rbx, 0x8(%r14)
movq %r15, 0x10(%rbx)
movq %r14, 0x18(%rbx)
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
retq
leaq 0x145e(%rip), %rdi      # 0x7073
leaq 0x140f(%rip), %rsi      # 0x702b
leaq 0x1469(%rip), %rcx      # 0x708c
movl $0x14b, %edx            # imm = 0x14B
callq 0x2110