예제 #1
0
        /// <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.
                }
            }
        }
예제 #2
0
        /// <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]);
            }
        }