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); }
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; } } } }