AdaptiveHuffmanTree() : free_linkers(nullptr) {
		for (int i = 0; i <= SYMBOL_NUM; ++i) {
			location[i] = nullptr;
		}
		tree_root = list_head = location[NYT_SYMBOL] = get_node(NYT_SYMBOL);
		list_head->block_head = get_linker(list_head);
	}
Exemplo n.º 2
0
void linking(void) {
    switch( get_linker() ) {
        case OPT_VALX:	valx(); break;
        case OPT_TLINK: tlink(); break;
        case OPT_LINK:	link(); break;
        case OPT_WLINK: wlink(); break;
        case OPT_OLINK: olink(); break;
        default:
            fprintf( stderr, "Unknown linker, use VALX...\n");
            valx();
            break;
    }
    
    if ( !get_option(OPT_KEEPGEN) )
        del_obj_tmpfiles();

}
void AdaptiveHuffmanTree<type>::increse_weight(Node * node) {
	assert(node != nullptr);

	if (node->next != nullptr && node->next->weight == node->weight) {
		Linker head = *node->block_head;
		assert(head != node && head->parent != node && head->weight == node->weight);
		if (head != node->parent) {
			swap_in_tree(head, node);
		} else {
			assert(node->next == head);
		}
		swap_in_list(head, node);
	}

	if (node->prev != nullptr && node->weight == node->prev->weight) {
		*node->block_head = node->prev;
	} else {
		put_linker(node->block_head);
		node->block_head = nullptr;
	}

	++node->weight;

	if (node->next != nullptr && node->weight == node->next->weight) {
		node->block_head = node->next->block_head;
	} else {
		node->block_head = get_linker(node);
	}

	if (node->parent != nullptr) {
		increse_weight(node->parent);
		if (node->prev == node->parent) {
			swap_in_list(node, node->parent);
			if (*node->block_head == node) {
				*node->block_head = node->parent;
			}
		}
	}
}