package bin_matrix; use strict; use warnings; my %types=( c => 1, C => 1, s => 2, S => 2, l => 4, L => 4, f => 4, d => 8, ); sub new { my $class=shift; my $size_x=shift; my $size_y=shift; my $type=shift // 'l'; return undef unless($size_x and $size_y); return undef unless($type and exists($types{$type})); my $self = bless({ matrix => '', sx => $size_x, sy => $size_y, type => $type, },$class); $self->init(); return $self; } sub init { my $self=shift; my $val=shift // 0; $self->{matrix}=pack($self->{type},$val) x ($self->{sx}*$self->{sy}); } sub get { my $self=shift; my $px=shift // 0; my $py=shift // 0; $px-= $self->{sx} while($px >= $self->{sx}); $py-= $self->{sy} while($py >= $self->{sy}); $px = $self->{sx}-$px while($px < 0); $py = $self->{sy}-$py while($py < 0); my $s=$types{$self->{type}}; my $pos=($px*$s*$self->{sx})+($py*$s); my $v=substr($self->{matrix},$pos,$s); return unpack($self->{type},$v); } sub set { my $self=shift; my $px=shift // 0; my $py=shift // 0; my $val=shift // return undef; $px-= $self->{sx} while($px >= $self->{sx}); $py-= $self->{sy} while($py >= $self->{sy}); $px = $self->{sx}-$px while($px < 0); $py = $self->{sy}-$py while($py < 0); $val=pack($self->{type},$val); my $s=length($val); my $pos=($px*$s*$self->{sx})+($py*$s); substr($self->{matrix},$pos,$s,$val); return 1; } 1;