1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpackage ANTLR::Runtime::BitSet; 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse Carp; 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse Readonly; 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse List::Util qw( max ); 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse Moose; 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse Moose::Util::TypeConstraints; 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse overload 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '|=' => \&or_in_place, 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '""' => \&str; 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# number of bits / long 15324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverReadonly my $BITS => 64; 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub BITS { return $BITS } 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# 2^6 == 64 19324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverReadonly my $LOG_BITS => 6; 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub LOG_BITS { return $LOG_BITS } 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# We will often need to do a mod operator (i mod nbits). Its 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# turns out that, for powers of two, this mod operation is 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# same as (i & (nbits-1)). Since mod is slow, we use a 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# precomputed mod mask to do the mod instead. 26324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverReadonly my $MOD_MASK => BITS - 1; 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub MOD_MASK { return $MOD_MASK } 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# The actual data bit 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'bits' => ( 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver is => 'rw', 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver isa => subtype 'Str' => where { /^(?:0|1)*$/xms }, 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver); 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub trim_hex { 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($number) = @_; 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $number =~ s/^0x//xms; 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return $number; 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub BUILD { 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self, $args) = @_; 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $bits; 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (!%$args) { ## no critic (ControlStructures::ProhibitCascadingIfElse) 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # Construct a bitset of size one word (64 bits) 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $bits = '0' x BITS; 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver elsif (exists $args->{bits}) { 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $bits = $args->{bits}; 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver elsif (exists $args->{number}) { 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $bits = reverse unpack('B*', pack('N', $args->{number})); 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver elsif (exists $args->{words64}) { 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # Construction from a static array of longs 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $words64 = $args->{words64}; 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # $number is in hex format 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $number = join '', 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver map { trim_hex($_) } 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver reverse @$words64; 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $bits = ''; 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver foreach my $h (split //xms, reverse $number) { 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $bits .= reverse substr(unpack('B*', pack('h', hex $h)), 4); 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver elsif (exists $args->{''}) { 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # Construction from a list of integers 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver elsif (exists $args->{size}) { 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # Construct a bitset given the size 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $bits = '0' x $args->{size}; 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver croak 'Invalid argument'; 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->bits($bits); 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub of { 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($class, $el) = @_; 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $bs = ANTLR::Runtime::BitSet->new({ size => $el + 1 }); 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $bs->add($el); 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return $bs; 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub or : method { ## no critic (Subroutines::ProhibitBuiltinHomonyms) 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self, $a) = @_; 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (!defined $a) { 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return $self; 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $s = $self->clone(); 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $s->or_in_place($a); 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return $s; 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub add : method { 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self, $el) = @_; 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->grow_to_include($el); 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $bits = $self->bits; 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver substr($bits, $el, 1, '1'); 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->bits($bits); 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub grow_to_include : method { 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self, $bit) = @_; 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ($bit > length $self->bits) { 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->bits .= '0' x ($bit - (length $self->bits) + 1); 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub or_in_place : method { 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self, $a) = @_; 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $i = 0; 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver foreach my $b (split //xms, $a->bits) { 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ($b) { 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->add($i); 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } continue { 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ++$i; 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return $self; 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub clone : method { 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self) = @_; 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ANTLR::Runtime::BitSet->new(bits => $self->bits); 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub size : method { 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self) = @_; 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return scalar $self->bits =~ /1/xms; 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub equals : method { 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self, $other) = @_; 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return $self->bits eq $other->bits; 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub member : method { 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self, $el) = @_; 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return (substr $self->bits, $el, 1) eq '1'; 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub remove : method { 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self, $el) = @_; 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $bits = $self->bits; 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver substr($bits, $el, 1, '0'); 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->bits($bits); 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub is_nil : method { 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self) = @_; 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return $self->bits =~ /1/xms ? 1 : 0; 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub num_bits : method { 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self) = @_; 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return length $self->bits; 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub length_in_long_words : method { 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self) = @_; 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return $self->num_bits() / $self->BITS; 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub to_array : method { 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self) = @_; 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $elems = []; 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while ($self->bits =~ /1/gxms) { 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver push @$elems, $-[0]; 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return $elems; 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub to_packed_array : method { 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self) = @_; 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return [ 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->bits =~ /.{BITS}/gxms 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ]; 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub str : method { 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self) = @_; 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return $self->to_string(); 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub to_string : method { 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self, $args) = @_; 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $token_names; 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (defined $args && exists $args->{token_names}) { 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $token_names = $args->{token_names}; 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my @str; 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $i = 0; 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver foreach my $b (split //xms, $self->bits) { 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ($b) { 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (defined $token_names) { 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver push @str, $token_names->[$i]; 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else { 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver push @str, $i; 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } continue { 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ++$i; 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return '{' . (join ',', @str) . '}'; 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverno Moose; 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver__PACKAGE__->meta->make_immutable(); 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver1; 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver__END__ 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=head1 NAME 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 252324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR::Runtime::BitSet - A bit set 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=head1 SYNOPSIS 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver use <Module::Name>; 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # Brief but working code example(s) here showing the most common usage(s) 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # This section will be as far as many users bother reading 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # so make it as educational and exemplary as possible. 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=head1 DESCRIPTION 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 266324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverA stripped-down version of org.antlr.misc.BitSet that is just good enough to 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhandle runtime requirements such as FOLLOW sets for automatic error recovery. 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=head1 SUBROUTINES/METHODS 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=over 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=item C<of> 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver... 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=item C<or> 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 280324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverReturn this | a in a new set. 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=item C<add> 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 284324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverOr this element into this set (grow as necessary to accommodate). 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=item C<grow_to_include> 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 288324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverGrows the set to a larger number of bits. 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=item C<set_size> 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 292324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverSets the size of a set. 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=item C<remove> 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 296324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverRemove this element from this set. 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=item C<length_in_long_words> 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 300324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverReturn how much space is being used by the bits array not how many actually 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhave member bits on. 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=back 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 305324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverA separate section listing the public components of the module's interface. 306324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverThese normally consist of either subroutines that may be exported, or methods 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverthat may be called on objects belonging to the classes that the module provides. 308324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverName the section accordingly. 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 310324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIn an object-oriented module, this section should begin with a sentence of the 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverform "An object of this class represents...", to give the reader a high-level 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvercontext to help them understand the methods that are subsequently described. 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=head1 DIAGNOSTICS 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 317324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverA list of every error and warning message that the module can generate 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(even the ones that will "never happen"), with a full explanation of each 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverproblem, one or more likely causes, and any suggested remedies. 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(See also "Documenting Errors" in Chapter 13.) 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=head1 CONFIGURATION AND ENVIRONMENT 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 325324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverA full explanation of any configuration system(s) used by the module, 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverincluding the names and locations of any configuration files, and the 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermeaning of any environment variables or properties that can be set. These 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdescriptions must also include details of any configuration language used. 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(See also "Configuration Files" in Chapter 19.) 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=head1 DEPENDENCIES 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 334324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverA list of all the other modules that this module relies upon, including any 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrestrictions on versions, and an indication whether these required modules are 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpart of the standard Perl distribution, part of the module's distribution, 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveror must be installed separately. 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=head1 INCOMPATIBILITIES 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 342324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverA list of any modules that this module cannot be used in conjunction with. 343324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverThis may be due to name conflicts in the interface, or competition for 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversystem or program resources, or due to internal limitations of Perl 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(for example, many modules that use source code filters are mutually 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverincompatible). 347