void IntervalMap::remove(pcNode*node, int interval) { // Ein Blatt //TODO: FIX BUG if (!node->left && !node->right) { *get_parent_ptr(node, interval) = 0; delete node; } // Nur ein Kind else if (node->left && !node->right) { *get_parent_ptr(node, interval) = node->left; node->left->parent = node->parent; delete node; } else if (!node->left && node->right) { *get_parent_ptr(node, interval) = node->right; node->right->parent = node->parent; delete node; } // Zwei Kinder else { std::cout << "swap" << std::endl; pcNode*other = get_prev_node(node); std::cout << other->y << std::endl; swap_nodes(node, other, interval); std::cout << "after swap" << std::endl; // Löschen des Knoten durch Benutzen von einer // der beiden anderen Methoden remove(node, interval); } }
void empty_window_handler(struct window *win, struct event *ev, int fwd) { struct window *n; struct ewd *ewd = win->data; int x, y; void (*fn)(void *) = ewd->fn; void *data = ewd->data; if (ewd->b) return; switch ((int)ev->ev) { case EV_INIT: case EV_RESIZE: case EV_REDRAW: get_parent_ptr(win, &x, &y); set_window_ptr(win, x, y); return; case EV_ABORT: fn(data); return; } ewd->b = 1; n = win->next; delete_window(win); fn(data); if (n->next != n) n->handler(n, ev, fwd); }
//helper methods for removing elements from pcNode void IntervalMap::swap_near_nodes(pcNode*child, pcNode*parent, int interval) { // Als erstes passen wir den unbeteiligten Großelternknoten an. *get_parent_ptr(parent, interval) = child; // Anschließend werden die Kind- und Elternzeiger ausgetauscht. std::swap(parent->left, child->left); std::swap(parent->right, child->right); std::swap(parent->parent, child->parent); // Da eines der Kinder getauscht wird benötigt es eine // sonder Behandlung. if (child->left == child) child->left = parent; else child->right = parent; // Nun sind alle Kindzeiger richtig und die Elternzeiger können // dem angepasst werden. if (child->left) child->left->parent = child; if (child->right) child->right->parent = child; if (parent->left) parent->left->parent = parent; if (parent->right) parent->right->parent = parent; // Na wer ist sich noch sicher ob wir nicht // bereits Zeigersalat haben? Besser testen! }
void IntervalMap::swap_far_nodes(pcNode*a, pcNode*b, int interval) { // Zuerst updaten wir die Zeiger der Eltern *get_parent_ptr(a, interval) = b; *get_parent_ptr(b, interval) = a; // Danach der Kinder if (a->left) a->left->parent = b; if (a->right) a->right->parent = b; if (b->left) b->left->parent = a; if (b->right) b->right->parent = a; // Und als letztes die der beiden Knoten std::swap(a->left, b->left); std::swap(a->right, b->right); std::swap(a->parent, b->parent); }