#!/usr/bin/perl
use strict;
use warnings;
use FindBin; use lib "$FindBin::Bin/../lib";
use Moo::Role qw/apply_roles_to_object/;
use Data::BitStream;
use Data::BitStream::Code::Escape;
sub new_stream {
my $stream = Data::BitStream->new();
Moo::Role->apply_roles_to_object($stream, qw/Data::BitStream::Code::Escape/);
return $stream;
}
sub string_of {
my $encoding = lc shift;
my $p; $p = $1 if $encoding =~ s/\((.+)\)$//;
my $d = shift;
my $stream = new_stream;
if ($encoding eq 'unary') { $stream->put_unary($d); }
elsif ($encoding eq 'gamma') { $stream->put_gamma($d); }
elsif ($encoding eq 'delta') { $stream->put_delta($d); }
elsif ($encoding eq 'omega') { $stream->put_omega($d); }
elsif ($encoding eq 'fib') { $stream->put_fib($d); }
elsif ($encoding eq 'fibc2') { $stream->put_fib_c2($d); }
elsif ($encoding eq 'lev') { $stream->put_levenstein($d); }
elsif ($encoding =~ /bvzeta/) { $stream->put_boldivigna($p, $d); }
elsif ($encoding =~ /baer/) { $stream->put_baer($p, $d); }
elsif ($encoding =~ /ber/) { $stream->put_BER($p, $d); }
elsif ($encoding =~ /escape/) { $stream->put_escape([split('-',$p)],$d); }
elsif ($encoding =~ /sss/) {$stream->put_startstepstop([split('-',$p)],$d)}
elsif ($encoding =~ /ss/) { $stream->put_startstop([split('-',$p)],$d); }
elsif ($encoding =~ /eg/) { $stream->put_expgolomb($p, $d); }
elsif ($encoding =~ /gol/) { $stream->put_golomb($p, $d); }
elsif ($encoding =~ /rice/) { $stream->put_rice($p, $d); }
elsif ($encoding =~ /varint/) { $stream->put_varint($p, $d); }
else { die "Unknown encoding: $encoding"; }
my $str = $stream->to_string();
$str;
}
#foreach my $n (0 .. 1000000) { die "$n" unless (1+length(string_of('omega',$n))) == length(string_of('lev',$n+1)); }
if (1) {
#my @encodings = qw|Baer(-2) Baer(-1) Baer(0) Baer(1) Baer(2)|;
#my @encodings = qw|Gamma Escape(3-7) ss(7-25)|;
my @encodings = qw|Gamma Delta Omega Fib Lev|;
printf "%5s " . (" %-11s" x scalar @encodings) . "\n", 'N', @encodings;
printf "%5s ", '-' x 5;
printf " %-11s", '-' x 11 for (@encodings);
print "\n";
foreach my $n (0 .. 20) {
#foreach my $n (0..16, 99, 999, 999_999) {
printf "%5d ", $n;
foreach my $encoding (@encodings) {
my $str = string_of($encoding, $n);
printf " %-11s", $str;
}
print "\n";
}
}