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