Algorithm-SlidingWindow-Dynamic
view release on metacpan or search on metacpan
lib/Algorithm/SlidingWindow/Dynamic.pm view on Meta::CPAN
package Algorithm::SlidingWindow::Dynamic;
use strict;
use warnings;
use Carp qw(croak);
our $VERSION = '0.900';
sub new {
my ($class, %args) = @_;
my $alloc = exists $args{alloc} ? $args{alloc} : 8;
_check_alloc($alloc);
$alloc = int($alloc);
my $self = bless {
buf => [ (undef) x $alloc ],
head => 0,
size => 0,
}, $class;
if (exists $args{values}) {
croak "values must be an arrayref" if ref($args{values}) ne 'ARRAY';
$self->push(@{ $args{values} });
}
return $self;
}
sub size { $_[0]->{size} }
sub is_empty { $_[0]->{size} == 0 ? 1 : 0 }
sub oldest {
my ($self) = @_;
return undef if $self->{size} == 0;
return $self->{buf}[ $self->{head} ];
}
sub newest {
my ($self) = @_;
return undef if $self->{size} == 0;
my $cap = _cap($self);
my $idx = ($self->{head} + $self->{size} - 1) % $cap;
return $self->{buf}[$idx];
}
sub get {
my ($self, $index) = @_;
return undef if !defined $index;
return undef if $index !~ /\A\d+\z/;
return undef if $index >= $self->{size};
my $idx = ($self->{head} + $index) % _cap($self);
return $self->{buf}[$idx];
}
sub values {
my ($self) = @_;
my $n = $self->{size};
return () if $n == 0;
my $cap = _cap($self);
my $head = $self->{head};
my $buf = $self->{buf};
return map { $buf->[ ($head + $_) % $cap ] } (0 .. $n - 1);
}
sub clear {
my ($self) = @_;
my $cap = _cap($self);
for (my $i = 0; $i < $cap; $i++) {
$self->{buf}[$i] = undef;
( run in 0.706 second using v1.01-cache-2.11-cpan-39bf76dae61 )