X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FScalar%2FVec%2FUtil.pm;h=b5a8080e7f235a1cde6ca7693f59dd9547d92af0;hb=c36fbc2566b9aeb0642e7a1b2fb8fc843faff3e9;hp=c80d6424c1c4dc920c4b9729053a7fd271b00a81;hpb=0062dbd2da53db62346382e729b84097131c61ee;p=perl%2Fmodules%2FScalar-Vec-Util.git diff --git a/lib/Scalar/Vec/Util.pm b/lib/Scalar/Vec/Util.pm index c80d642..b5a8080 100644 --- a/lib/Scalar/Vec/Util.pm +++ b/lib/Scalar/Vec/Util.pm @@ -81,8 +81,17 @@ sub vfill_pp { (undef, my $s, my $l, my $x) = @_; croak "Invalid argument" unless _alldef @_; return unless $l; - $x = 1 if $x; - vec($_[0], $_, 1) = $x for $s .. $s + $l - 1; + $x = ~0 if $x; + my $SIZE = 32; + my $t = int($s / $SIZE) + 1; + my $u = int(($s + $l) / $SIZE); + if ($SIZE * $t < $s + $l and $t <= $u) { + vec($_[0], $_, 1) = $x for $s .. $SIZE * $t - 1; + vec($_[0], $_, $SIZE) = $x for $t .. $u - 1; + vec($_[0], $_, 1) = $x for $SIZE * $u .. $s + $l - 1; + } else { + vec($_[0], $_, 1) = $x for $s .. $s + $l - 1; + } } =head2 C<< vcopy $from => $from_start, $to => $to_start, $length >> @@ -123,14 +132,17 @@ sub vshift { $left = 0; $bits = -$bits; } - $bits = $length if $bits > $length; - $length -= $bits; - if ($left) { - vcopy($_[0], $start, $_[0], $start + $bits, $length); - vfill($_[0], $start, $bits, $insert) if defined $insert; + if ($bits < $length) { + $length -= $bits; + if ($left) { + vcopy($_[0], $start, $_[0], $start + $bits, $length); + vfill($_[0], $start, $bits, $insert) if defined $insert; + } else { + vcopy($_[0], $start + $bits, $_[0], $start, $length); + vfill($_[0], $start + $length, $bits, $insert) if defined $insert; + } } else { - vcopy($_[0], $start + $bits, $_[0], $start, $length); - vfill($_[0], $start + $length, $bits, $insert) if defined $insert; + vfill($_[0], $start, $length, $insert) if defined $insert; } }