示例#1
0
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);
	}
}
示例#2
0
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);
}
示例#3
0
//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!
}
示例#4
0
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);
}