/// <summary> /// Writes the table out to the provided delegates. This is primarily for validation purposes of the algorithm. /// Functions are called based on the order nodes are encountered in the tree. /// The first value written is the number of unique symbols. /// Internal nodes write two values, the left child index and the right child index. /// </summary> public void WriteTable(WriteSymbolDelegate <TSymbolType> symbolWriter, WriteUInt32Delegate valueWriter, WriteNotYetTransmittedDelegate notYetTransmittedWriter) { valueWriter((uint)_map.Count); for (uint i = 0; i < _entries.Length; ++i) { if (_entries[i].IsLeaf) { if (_entries[i].Symbol.IsValid) { symbolWriter(_entries[i].Symbol.Symbol); } else { notYetTransmittedWriter(); } } else { valueWriter(_entries[i].LeftChild); valueWriter(_entries[i].RightChild); // Technically unneeded, but consistent with static implementation. } } }
/// <summary> /// Writes the Huffman tree for future decoding use. /// </summary> public void WriteTable(WriteSymbolDelegate <TSymbolType> symbolWriter, WriteUInt32Delegate valueWriter) { valueWriter(SymbolCount); for (uint i = 0; i < SymbolCount; ++i) { symbolWriter(_entries[i].Symbol); } for (var i = SymbolCount; i < _entries.Length; ++i) { valueWriter(_entries[i].ChildIndex[0]); valueWriter(_entries[i].ChildIndex[1]); } }