Algorithm-SlidingWindow

 view release on metacpan or  search on metacpan

lib/Algorithm/SlidingWindow.pm  view on Meta::CPAN

    # --- optional arguments ---
    my $on_evict = $args{on_evict};
    if (defined $on_evict) {
        ref($on_evict) eq 'CODE' or croak "on_evict must be a CODE reference";
    }

    # --- initialize backing store ---
    my @buf;
    $#buf = $capacity - 1;   # preallocate fixed storage

    my $self = bless {
        _cap      => 0 + $capacity,
        _buf      => \@buf,
        _head     => 0,
        _size     => 0,
        _on_evict => $on_evict,
    }, $class;

    return $self;
}

t/refs.t  view on Meta::CPAN

use Scalar::Util qw(weaken);

use lib 'lib';
use Algorithm::SlidingWindow;

# This test ensures references are released promptly when evicted or cleared.

{
    my $w = Algorithm::SlidingWindow->new(capacity => 2);

    my $obj1 = bless({}, 'T::Obj');
    my $weak1 = $obj1;
    weaken($weak1);

    my $obj2 = bless({}, 'T::Obj');
    my $weak2 = $obj2;
    weaken($weak2);

    $w->add($obj1, $obj2);

    # Both should still be alive (held by window + our strong refs)
    ok(defined $weak1, "obj1 alive before eviction");
    ok(defined $weak2, "obj2 alive before eviction");

    # Drop our strong reference to obj1; window should be the only owner now
    undef $obj1;
    ok(defined $weak1, "obj1 still alive (held by window)");

    # Add another item; obj1 should be evicted and slot cleared -> weak should drop
    $w->add(bless({}, 'T::Obj'));
    ok(!defined $weak1, "obj1 freed after eviction (slot cleared)");

    # Now test clear() releases remaining references
    undef $obj2; # leave window holding obj2
    ok(defined $weak2, "obj2 still alive (held by window)");

    $w->clear;
    ok(!defined $weak2, "obj2 freed after clear (slots cleared)");
}



( run in 0.728 second using v1.01-cache-2.11-cpan-39bf76dae61 )