use strict; use warnings; my $buffer = new (); print "Buffer has ", $buffer->count (), " values\n"; $buffer->push ($_) for 1 .. 200; print "Buffer has ", $buffer->count (), " values\n"; $buffer->pop () for 1 .. 100; print "Buffer has ", $buffer->count (), " values\n"; $buffer->push ($_ + 200) for 1 .. 150; print "Buffer has ", $buffer->count (), " values\n"; sub new { my @bufferArray; my $buffSize = 256; $#bufferArray = 256; # set buffer size return $buffer = bless { buffer => \@bufferArray, in => 0, out => 0, buffSize => $buffSize, }; } sub count { my ($self) = @_; my $used = $self->{in} - $self->{out}; $used += $self->{buffSize} if $used < 0; return $used; } sub pop { my ($self) = @_; die "Buffer underflow" if $self->{in} == $self->{out}; my $value = $self->{buffer}[$self->{out}]; $self->{out} = ($self->{out} + 1) % $self->{buffSize}; return $value; } sub push { my ($self, $value) = @_; die "Buffer overflow" if $self->count () + 1 == $self->{buffSize}; $self->{buffer}[$self->{in}] = $value; $self->{in} = ($self->{in} + 1) % $self->{buffSize}; }