Algorithm-BitVector
view release on metacpan or search on metacpan
lib/Algorithm/BitVector.pm view on Meta::CPAN
package Algorithm::BitVector;
#!/usr/bin/perl -w
#------------------------------------------------------------------------------------
# Copyright (c) 2018 Avinash Kak. All rights reserved. This program is free
# software. You may modify and/or distribute it under the same terms as Perl itself.
# This copyright notice must remain attached to the file.
#
# Algorithm::BitVector is a Perl module for creating a memory efficient packed
# representation of bit arrays and for logical and numerical operations on such
# arrays.
# -----------------------------------------------------------------------------------
#use 5.10.0;
use strict;
use warnings;
use Carp;
use List::Util qw(pairmap min max reduce any);
use Math::BigInt;
use Math::Random;
use Fcntl 'SEEK_CUR';
our $VERSION = '1.26';
use overload '+' => '_join',
'""' => '_str',
'0+' => '_int',
'~' => '_invert',
'|' => '_or',
'&' => '_and',
'^' => '_xor',
'<=>' => '_compare',
'<<' => '_lshift',
'>>' => '_rshift',
'<>' => '_iter',
'fallback' => 1;
sub _readblock {
my $blocksize = shift;
my $bitvector = shift;
my $block;
my $more_to_read;
my $i = 0;
my $byte_as_bits;
my $bitstring = '';
while ( $i < $blocksize / 8 ) {
$i++;
my $num_bytes_read = sysread($bitvector->{FILEIN}, my $byte, 1);
unless ($num_bytes_read) {
if (length($bitstring) < $blocksize) {
$bitvector->{more_to_read} = 0;
$more_to_read = 0;
}
return $bitstring;
} else {
my $bits_as_string = sprintf "%vb", $byte;
$bits_as_string = '0' x (8 - length($bits_as_string)) . $bits_as_string;
$bitstring .= $bits_as_string;
}
}
my $file_pos = tell $bitvector->{FILEIN};
# peek at the next byte; moves file position only if a
# byte is read
my $num_bytes_read = sysread($bitvector->{FILEIN}, my $next_byte, 1);
if ($num_bytes_read) {
# pretend we never read the byte
sysseek $bitvector->{FILEIN}, $file_pos - 1, SEEK_CUR;
( run in 1.535 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )