void HuffmanCodec::generateCodeTable() { heap_.clear(); for (int i = 0; i < codeTableFill_; ++i) heap_.push(SymbolRef(codeTable_ + i)); while (heap_.fill() > 1) { SymbolRef leftChild = heap_.pop(); SymbolRef rightChild = heap_.pop(); leftChild.symbol->parent = codeTable_ + codeTableFill_; rightChild.symbol->parent = codeTable_ + codeTableFill_; codeTable_[codeTableFill_].parent = 0; codeTable_[codeTableFill_].leftChild = leftChild.symbol; codeTable_[codeTableFill_].rightChild = rightChild.symbol; codeTable_[codeTableFill_].count = leftChild.symbol->count + rightChild.symbol->count; codeTable_[codeTableFill_].value = -1; heap_.push(SymbolRef(codeTable_ + codeTableFill_)); ++codeTableFill_; } if (heap_.fill() > 0) codeTableRoot_ = heap_.pop().symbol; else codeTableRoot_ = 0; }
ObjectFile::symbol_iterator MachOObjectFile::begin_symbols() const { // DRI.d.a = segment number; DRI.d.b = symbol index. DataRefImpl DRI; DRI.d.a = DRI.d.b = 0; moveToNextSymbol(DRI); return symbol_iterator(SymbolRef(DRI, this)); }
ObjectFile::symbol_iterator MachOObjectFile::end_symbols() const { DataRefImpl DRI; DRI.d.a = MachOObj->getHeader().NumLoadCommands; DRI.d.b = 0; return symbol_iterator(SymbolRef(DRI, this)); }
SymbolRef MachOObjectFile::getSymbolNext(DataRefImpl DRI) const { DRI.d.b++; moveToNextSymbol(DRI); return SymbolRef(DRI, this); }