50 lines
1.5 KiB
Ada
50 lines
1.5 KiB
Ada
with Ada.Text_IO;
|
|
with Huffman;
|
|
procedure Main is
|
|
package Char_Natural_Huffman_Tree is new Huffman
|
|
(Symbol_Type => Character,
|
|
Put => Ada.Text_IO.Put,
|
|
Symbol_Sequence => String,
|
|
Frequency_Type => Natural);
|
|
Tree : Char_Natural_Huffman_Tree.Huffman_Tree;
|
|
Frequencies : Char_Natural_Huffman_Tree.Frequency_Maps.Map;
|
|
Input_String : constant String :=
|
|
"this is an example for huffman encoding";
|
|
begin
|
|
-- build frequency map
|
|
for I in Input_String'Range loop
|
|
declare
|
|
use Char_Natural_Huffman_Tree.Frequency_Maps;
|
|
Position : constant Cursor := Frequencies.Find (Input_String (I));
|
|
begin
|
|
if Position = No_Element then
|
|
Frequencies.Insert (Key => Input_String (I), New_Item => 1);
|
|
else
|
|
Frequencies.Replace_Element
|
|
(Position => Position,
|
|
New_Item => Element (Position) + 1);
|
|
end if;
|
|
end;
|
|
end loop;
|
|
|
|
-- create huffman tree
|
|
Char_Natural_Huffman_Tree.Create_Tree
|
|
(Tree => Tree,
|
|
Frequencies => Frequencies);
|
|
|
|
-- dump encodings
|
|
Char_Natural_Huffman_Tree.Dump_Encoding (Tree => Tree);
|
|
|
|
-- encode example string
|
|
declare
|
|
Code : constant Char_Natural_Huffman_Tree.Bit_Sequence :=
|
|
Char_Natural_Huffman_Tree.Encode
|
|
(Tree => Tree,
|
|
Symbols => Input_String);
|
|
begin
|
|
Char_Natural_Huffman_Tree.Put (Code);
|
|
Ada.Text_IO.Put_Line
|
|
(Char_Natural_Huffman_Tree.Decode (Tree => Tree, Code => Code));
|
|
end;
|
|
end Main;
|