// File: dvjdjvu[P]bntree/./src/bntree.cpp
// Function: bntree::erase_simple(node_s*)
bool bntree::erase_simple(node_t *search_node) {

    node_t *prev_node = search_node->parent;

    if (!search_node->left && !search_node->right) {
        // Удаляемый узел является листом.

        // Обнуляем соответствующую ссылку родителя.
        if (prev_node == NULL) {
            // Удаляемый узел корень.
            this->tree->root = NULL;
        } else if (prev_node->left == search_node) {
            prev_node->left = NULL;
        } else if (prev_node->right == search_node) {
            prev_node->right = NULL;
        }

    } else if (search_node->left && !search_node->right) {
        // Удаляемый узел имеет только левого ребенка.

        // Перекомпануем ссылки родителя на левого внука.
        if (prev_node == NULL) {
            // Удаляемый узел корень.
            this->tree->root = search_node->left;
            this->tree->root->parent = NULL;
        } else if (prev_node->left == search_node) {
            prev_node->left = search_node->left;
            search_node->left->parent = prev_node;
        } else if (prev_node->right == search_node) {
            prev_node->right = search_node->left;
            search_node->left->parent = prev_node;
        }

    } else if (!search_node->left && search_node->right) {
        // Удаляемый узел имеет только правого ребенка.

        // Перекомпануем ссылки родителя на правого внука.
        if (prev_node == NULL) {
            // Удаляемый узел корень.
            this->tree->root = search_node->right;
            this->tree->root->parent = NULL;
        } else if (prev_node->left == search_node) {
            prev_node->left = search_node->right;
            search_node->right->parent = prev_node;
        } else if (prev_node->right == search_node) {
            prev_node->right = search_node->right;
            search_node->right->parent = prev_node;
        }

    } else {
        // Удаляемый узел имеет двух детей. Здесь не обрабатываем.

        return false;
    }

    return true;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x18(%rbp), %rax
movq 0x58(%rax), %rax
movq %rax, -0x20(%rbp)
movq -0x18(%rbp), %rax
cmpq $0x0, 0x48(%rax)
jne 0x2d0c
movq -0x18(%rbp), %rax
cmpq $0x0, 0x50(%rax)
jne 0x2d0c
cmpq $0x0, -0x20(%rbp)
jne 0x2ccd
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq $0x0, (%rax)
jmp 0x2d07
movq -0x20(%rbp), %rax
movq 0x48(%rax), %rax
cmpq -0x18(%rbp), %rax
jne 0x2ce9
movq -0x20(%rbp), %rax
movq $0x0, 0x48(%rax)
jmp 0x2d05
movq -0x20(%rbp), %rax
movq 0x50(%rax), %rax
cmpq -0x18(%rbp), %rax
jne 0x2d03
movq -0x20(%rbp), %rax
movq $0x0, 0x50(%rax)
jmp 0x2d05
jmp 0x2d07
jmp 0x2e6f
movq -0x18(%rbp), %rax
cmpq $0x0, 0x48(%rax)
je 0x2dba
movq -0x18(%rbp), %rax
cmpq $0x0, 0x50(%rax)
jne 0x2dba
cmpq $0x0, -0x20(%rbp)
jne 0x2d53
movq -0x28(%rbp), %rax
movq -0x18(%rbp), %rcx
movq 0x48(%rcx), %rdx
movq (%rax), %rcx
movq %rdx, (%rcx)
movq (%rax), %rax
movq (%rax), %rax
movq $0x0, 0x58(%rax)
jmp 0x2db5
movq -0x20(%rbp), %rax
movq 0x48(%rax), %rax
cmpq -0x18(%rbp), %rax
jne 0x2d83
movq -0x18(%rbp), %rax
movq 0x48(%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x48(%rax)
movq -0x20(%rbp), %rcx
movq -0x18(%rbp), %rax
movq 0x48(%rax), %rax
movq %rcx, 0x58(%rax)
jmp 0x2db3
movq -0x20(%rbp), %rax
movq 0x50(%rax), %rax
cmpq -0x18(%rbp), %rax
jne 0x2db1
movq -0x18(%rbp), %rax
movq 0x48(%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x50(%rax)
movq -0x20(%rbp), %rcx
movq -0x18(%rbp), %rax
movq 0x48(%rax), %rax
movq %rcx, 0x58(%rax)
jmp 0x2db3
jmp 0x2db5
jmp 0x2e6d
movq -0x18(%rbp), %rax
cmpq $0x0, 0x48(%rax)
jne 0x2e65
movq -0x18(%rbp), %rax
cmpq $0x0, 0x50(%rax)
je 0x2e65
cmpq $0x0, -0x20(%rbp)
jne 0x2e01
movq -0x28(%rbp), %rax
movq -0x18(%rbp), %rcx
movq 0x50(%rcx), %rdx
movq (%rax), %rcx
movq %rdx, (%rcx)
movq (%rax), %rax
movq (%rax), %rax
movq $0x0, 0x58(%rax)
jmp 0x2e63
movq -0x20(%rbp), %rax
movq 0x48(%rax), %rax
cmpq -0x18(%rbp), %rax
jne 0x2e31
movq -0x18(%rbp), %rax
movq 0x50(%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x48(%rax)
movq -0x20(%rbp), %rcx
movq -0x18(%rbp), %rax
movq 0x50(%rax), %rax
movq %rcx, 0x58(%rax)
jmp 0x2e61
movq -0x20(%rbp), %rax
movq 0x50(%rax), %rax
cmpq -0x18(%rbp), %rax
jne 0x2e5f
movq -0x18(%rbp), %rax
movq 0x50(%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x50(%rax)
movq -0x20(%rbp), %rcx
movq -0x18(%rbp), %rax
movq 0x50(%rax), %rax
movq %rcx, 0x58(%rax)
jmp 0x2e61
jmp 0x2e63
jmp 0x2e6b
movb $0x0, -0x1(%rbp)
jmp 0x2e73
jmp 0x2e6d
jmp 0x2e6f
movb $0x1, -0x1(%rbp)
movb -0x1(%rbp), %al
andb $0x1, %al
popq %rbp
retq
nopw (%rax,%rax)