bitset 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Tyler McMullen
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,19 @@
1
+ = bitset
2
+
3
+ Description goes here.
4
+
5
+ == Contributing to bitset
6
+
7
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
8
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
9
+ * Fork the project
10
+ * Start a feature/bugfix branch
11
+ * Commit and push until you are happy with your contribution
12
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
13
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
14
+
15
+ == Copyright
16
+
17
+ Copyright (c) 2011 Tyler McMullen. See LICENSE.txt for
18
+ further details.
19
+
@@ -0,0 +1,32 @@
1
+ require 'rake'
2
+ require 'rubygems'
3
+
4
+ require 'rspec/core/rake_task'
5
+ RSpec::Core::RakeTask.new(:spec) do |t|
6
+ t.rspec_opts = ["--color"]
7
+ t.fail_on_error = false
8
+ end
9
+
10
+ task :default => :spec
11
+
12
+ require 'jeweler'
13
+ Jeweler::Tasks.new do |gem|
14
+ gem.name = "bitset"
15
+ gem.homepage = "http://github.com/tyler/bitset"
16
+ gem.license = "MIT"
17
+ gem.summary = 'Bitset implementation.'
18
+ gem.description = 'A fast C-based Bitset. It supports the standard set operations as well as operations you may expect on bit arrays. (popcount, for instance)'
19
+ gem.email = "tbmcmullen@gmail.com"
20
+ gem.authors = ["Tyler McMullen"]
21
+ end
22
+ Jeweler::RubygemsDotOrgTasks.new
23
+
24
+ require 'rake/rdoctask'
25
+ Rake::RDocTask.new do |rdoc|
26
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
27
+
28
+ rdoc.rdoc_dir = 'rdoc'
29
+ rdoc.title = "bitset #{version}"
30
+ rdoc.rdoc_files.include('README*')
31
+ rdoc.rdoc_files.include('ext/**/*.c')
32
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.0
@@ -0,0 +1,48 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{bitset}
8
+ s.version = "0.0.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Tyler McMullen"]
12
+ s.date = %q{2011-02-17}
13
+ s.description = %q{A fast C-based Bitset. It supports the standard set operations as well as operations you may expect on bit arrays. (popcount, for instance)}
14
+ s.email = %q{tbmcmullen@gmail.com}
15
+ s.extensions = ["ext/bitset/extconf.rb"]
16
+ s.extra_rdoc_files = [
17
+ "LICENSE.txt",
18
+ "README.rdoc"
19
+ ]
20
+ s.files = [
21
+ "LICENSE.txt",
22
+ "README.rdoc",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "ext/bitset/bitset.c",
26
+ "ext/bitset/extconf.rb",
27
+ "spec/bitset_spec.rb"
28
+ ]
29
+ s.homepage = %q{http://github.com/tyler/bitset}
30
+ s.licenses = ["MIT"]
31
+ s.require_paths = ["lib"]
32
+ s.rubygems_version = %q{1.3.7}
33
+ s.summary = %q{Bitset implementation.}
34
+ s.test_files = [
35
+ "spec/bitset_spec.rb"
36
+ ]
37
+
38
+ if s.respond_to? :specification_version then
39
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
40
+ s.specification_version = 3
41
+
42
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
43
+ else
44
+ end
45
+ else
46
+ end
47
+ end
48
+
@@ -0,0 +1,275 @@
1
+ #include "ruby.h"
2
+
3
+ #include <stdint.h>
4
+ #include <string.h>
5
+ #include <stdio.h>
6
+
7
+ VALUE cBitset;
8
+
9
+ typedef struct {
10
+ int len;
11
+ uint64_t * data;
12
+ } Bitset;
13
+
14
+ Bitset * bitset_new() {
15
+ return (Bitset *) malloc(sizeof(Bitset));
16
+ }
17
+
18
+ void bitset_setup(Bitset * bs, int len) {
19
+ bs->len = len;
20
+ bs->data = (uint64_t *) calloc((((bs->len-1) >> 6) + 1), sizeof(uint64_t)); // 2^6=64
21
+ }
22
+
23
+ void bitset_free(Bitset * bs) {
24
+ if(bs->data)
25
+ free(bs->data);
26
+ free(bs);
27
+ }
28
+
29
+
30
+ Bitset * get_bitset(VALUE obj) {
31
+ Bitset * bs;
32
+ Data_Get_Struct(obj, Bitset, bs);
33
+ return bs;
34
+ }
35
+
36
+ static VALUE rb_bitset_alloc(VALUE klass) {
37
+ VALUE obj;
38
+ obj = Data_Wrap_Struct(klass, 0, bitset_free, bitset_new());
39
+ return obj;
40
+ }
41
+
42
+ static VALUE rb_bitset_initialize(VALUE self, VALUE len) {
43
+ Bitset * bs = get_bitset(self);
44
+ bitset_setup(bs, NUM2INT(len));
45
+ return self;
46
+ }
47
+
48
+ static VALUE rb_bitset_size(VALUE self, VALUE len) {
49
+ Bitset * bs = get_bitset(self);
50
+ return INT2NUM(bs->len);
51
+ }
52
+
53
+ void raise_index_error() {
54
+ VALUE rb_eIndexError = rb_const_get(rb_cObject, rb_intern("IndexError"));
55
+ rb_raise(rb_eIndexError, "Index out of bounds");
56
+ }
57
+
58
+ #define _bit_segment(bit) ((bit) >> 6)
59
+ #define _bit_mask(bit) (1 << ((bit) & 0x3f))
60
+
61
+ void validate_index(Bitset * bs, int idx) {
62
+ if(idx < 0 || idx >= bs->len)
63
+ raise_index_error();
64
+ }
65
+
66
+ uint64_t get_bit(Bitset * bs, int idx) {
67
+ uint64_t segment = bs->data[_bit_segment(idx)];
68
+ return segment & _bit_mask(idx);
69
+ }
70
+
71
+ void set_bit(Bitset * bs, int idx) {
72
+ bs->data[_bit_segment(idx)] |= _bit_mask(idx);
73
+ }
74
+
75
+ void clear_bit(Bitset * bs, int idx) {
76
+ bs->data[_bit_segment(idx)] &= ~_bit_mask(idx);
77
+ }
78
+
79
+ void assign_bit(Bitset * bs, int idx, VALUE value) {
80
+ if(NIL_P(value) || value == Qfalse)
81
+ clear_bit(bs, idx);
82
+ else
83
+ set_bit(bs, idx);
84
+ }
85
+
86
+ static VALUE rb_bitset_aref(VALUE self, VALUE index) {
87
+ Bitset * bs = get_bitset(self);
88
+ int idx = NUM2INT(index);
89
+ validate_index(bs, idx);
90
+ return get_bit(bs, idx) > 0 ? Qtrue : Qfalse;
91
+ }
92
+
93
+ static VALUE rb_bitset_aset(VALUE self, VALUE index, VALUE value) {
94
+ Bitset * bs = get_bitset(self);
95
+ int idx = NUM2INT(index);
96
+ validate_index(bs, idx);
97
+ assign_bit(bs, idx, value);
98
+ return Qtrue;
99
+ }
100
+
101
+ static VALUE rb_bitset_set(int argc, VALUE * argv, VALUE self) {
102
+ int i;
103
+ Bitset * bs = get_bitset(self);
104
+ for(i = 0; i < argc; i++) {
105
+ VALUE index = argv[i];
106
+ int idx = NUM2INT(index);
107
+ validate_index(bs, idx);
108
+ set_bit(bs, idx);
109
+ }
110
+ return Qtrue;
111
+ }
112
+
113
+ static VALUE rb_bitset_clear(int argc, VALUE * argv, VALUE self) {
114
+ int i;
115
+ Bitset * bs = get_bitset(self);
116
+ for(i = 0; i < argc; i++) {
117
+ VALUE index = argv[i];
118
+ int idx = NUM2INT(index);
119
+ validate_index(bs, idx);
120
+ clear_bit(bs, idx);
121
+ }
122
+ return Qtrue;
123
+ }
124
+
125
+ static VALUE rb_bitset_clear_p(int argc, VALUE * argv, VALUE self) {
126
+ int i;
127
+ Bitset * bs = get_bitset(self);
128
+ for(i = 0; i < argc; i++) {
129
+ VALUE index = argv[i];
130
+ int idx = NUM2INT(index);
131
+ validate_index(bs, idx);
132
+ if(get_bit(bs, idx) > 0)
133
+ return Qfalse;
134
+ }
135
+ return Qtrue;
136
+ }
137
+
138
+ static VALUE rb_bitset_set_p(int argc, VALUE * argv, VALUE self) {
139
+ int i;
140
+ Bitset * bs = get_bitset(self);
141
+ for(i = 0; i < argc; i++) {
142
+ VALUE index = argv[i];
143
+ int idx = NUM2INT(index);
144
+ validate_index(bs, idx);
145
+ if(get_bit(bs, idx) == 0)
146
+ return Qfalse;
147
+ }
148
+ return Qtrue;
149
+ }
150
+
151
+ static VALUE rb_bitset_cardinality(VALUE self) {
152
+ Bitset * bs = get_bitset(self);
153
+ int i;
154
+ int max = ((bs->len-1) >> 6) + 1;
155
+ int count = 0;
156
+ for(i = 0; i < max; i++) {
157
+ uint64_t segment = bs->data[i];
158
+ if(i+1 == max)
159
+ segment &= ((1 << (bs->len & 0x3F)) - 1);
160
+ count += __builtin_popcountll(segment);
161
+ }
162
+ return INT2NUM(count);
163
+ }
164
+
165
+ static VALUE rb_bitset_intersect(VALUE self, VALUE other) {
166
+ Bitset * bs = get_bitset(self);
167
+ Bitset * other_bs = get_bitset(other);
168
+
169
+ Bitset * new_bs = bitset_new();
170
+ bitset_setup(new_bs, bs->len);
171
+
172
+ int max = ((bs->len-1) >> 6) + 1;
173
+ int i;
174
+ for(i = 0; i < max; i++) {
175
+ uint64_t segment = bs->data[i];
176
+ uint64_t other_segment = other_bs->data[i];
177
+ new_bs->data[i] = segment & other_segment;
178
+ }
179
+
180
+ return Data_Wrap_Struct(cBitset, 0, bitset_free, new_bs);
181
+ }
182
+
183
+ static VALUE rb_bitset_union(VALUE self, VALUE other) {
184
+ Bitset * bs = get_bitset(self);
185
+ Bitset * other_bs = get_bitset(other);
186
+
187
+ Bitset * new_bs = bitset_new();
188
+ bitset_setup(new_bs, bs->len);
189
+
190
+ int max = ((bs->len-1) >> 6) + 1;
191
+ int i;
192
+ for(i = 0; i < max; i++) {
193
+ uint64_t segment = bs->data[i];
194
+ uint64_t other_segment = other_bs->data[i];
195
+ new_bs->data[i] = segment | other_segment;
196
+ }
197
+
198
+ return Data_Wrap_Struct(cBitset, 0, bitset_free, new_bs);
199
+ }
200
+
201
+ static VALUE rb_bitset_difference(VALUE self, VALUE other) {
202
+ Bitset * bs = get_bitset(self);
203
+ Bitset * other_bs = get_bitset(other);
204
+
205
+ Bitset * new_bs = bitset_new();
206
+ bitset_setup(new_bs, bs->len);
207
+
208
+ int max = ((bs->len-1) >> 6) + 1;
209
+ int i;
210
+ for(i = 0; i < max; i++) {
211
+ uint64_t segment = bs->data[i];
212
+ uint64_t other_segment = other_bs->data[i];
213
+ new_bs->data[i] = segment & ~other_segment;
214
+ }
215
+
216
+ return Data_Wrap_Struct(cBitset, 0, bitset_free, new_bs);
217
+ }
218
+
219
+ static VALUE rb_bitset_xor(VALUE self, VALUE other) {
220
+ Bitset * bs = get_bitset(self);
221
+ Bitset * other_bs = get_bitset(other);
222
+
223
+ Bitset * new_bs = bitset_new();
224
+ bitset_setup(new_bs, bs->len);
225
+
226
+ int max = ((bs->len-1) >> 6) + 1;
227
+ int i;
228
+ for(i = 0; i < max; i++) {
229
+ uint64_t segment = bs->data[i];
230
+ uint64_t other_segment = other_bs->data[i];
231
+ new_bs->data[i] = segment ^ other_segment;
232
+ }
233
+
234
+ return Data_Wrap_Struct(cBitset, 0, bitset_free, new_bs);
235
+ }
236
+
237
+ static VALUE rb_bitset_hamming(VALUE self, VALUE other) {
238
+ Bitset * bs = get_bitset(self);
239
+ Bitset * other_bs = get_bitset(other);
240
+
241
+ int max = ((bs->len-1) >> 6) + 1;
242
+ int count = 0;
243
+ int i;
244
+ for(i = 0; i < max; i++) {
245
+ uint64_t segment = bs->data[i];
246
+ uint64_t other_segment = other_bs->data[i];
247
+ count += __builtin_popcountll(segment ^ other_segment);
248
+ }
249
+
250
+ return INT2NUM(count);
251
+ }
252
+
253
+ void Init_bitset() {
254
+ cBitset = rb_define_class("Bitset", rb_cObject);
255
+ rb_define_alloc_func(cBitset, rb_bitset_alloc);
256
+ rb_define_method(cBitset, "initialize", rb_bitset_initialize, 1);
257
+ rb_define_method(cBitset, "size", rb_bitset_size, 0);
258
+ rb_define_method(cBitset, "[]", rb_bitset_aref, 1);
259
+ rb_define_method(cBitset, "[]=", rb_bitset_aset, 2);
260
+ rb_define_method(cBitset, "set", rb_bitset_set, -1);
261
+ rb_define_method(cBitset, "clear", rb_bitset_clear, -1);
262
+ rb_define_method(cBitset, "set?", rb_bitset_set_p, -1);
263
+ rb_define_method(cBitset, "clear?", rb_bitset_clear_p, -1);
264
+ rb_define_method(cBitset, "cardinality", rb_bitset_cardinality, 0);
265
+ rb_define_method(cBitset, "intersect", rb_bitset_intersect, 1);
266
+ rb_define_alias(cBitset, "&", "intersect");
267
+ rb_define_method(cBitset, "union", rb_bitset_union, 1);
268
+ rb_define_alias(cBitset, "|", "union");
269
+ rb_define_method(cBitset, "difference", rb_bitset_difference, 1);
270
+ rb_define_alias(cBitset, "-", "difference");
271
+ rb_define_method(cBitset, "xor", rb_bitset_xor, 1);
272
+ rb_define_alias(cBitset, "^", "xor");
273
+ rb_define_alias(cBitset, "symmetric_difference", "xor");
274
+ rb_define_method(cBitset, "hamming", rb_bitset_hamming, 1);
275
+ }
@@ -0,0 +1,2 @@
1
+ require 'mkmf'
2
+ create_makefile 'bitset'
@@ -0,0 +1,203 @@
1
+ require './bitset'
2
+
3
+ describe Bitset do
4
+ it 'can be initialized' do
5
+ Bitset.new(64)
6
+ end
7
+
8
+ describe :size do
9
+ it 'returns the correct size' do
10
+ Bitset.new(64).size.should == 64
11
+ Bitset.new(73).size.should == 73
12
+ end
13
+ end
14
+
15
+ describe :[] do
16
+ it 'returns True for set bits' do
17
+ bs = Bitset.new(8)
18
+ bs[0] = true
19
+ bs[0].should == true
20
+ end
21
+
22
+ it 'returns False for unset bits' do
23
+ bs = Bitset.new(8)
24
+ bs[0].should == false
25
+ end
26
+
27
+ it 'raises an error when accessing out of bound indexes' do
28
+ bs = Bitset.new(8)
29
+ expect { bs[8] }.to raise_error(IndexError)
30
+ end
31
+ end
32
+
33
+ describe :[]= do
34
+ it 'sets True for truthy values' do
35
+ bs = Bitset.new(8)
36
+
37
+ bs[0] = true
38
+ bs[0].should == true
39
+
40
+ bs[1] = 123
41
+ bs[1].should == true
42
+
43
+ bs[2] = "woo"
44
+ bs[2].should == true
45
+ end
46
+
47
+ it 'sets False for falsey values' do
48
+ bs = Bitset.new(8)
49
+
50
+ bs[0] = false
51
+ bs[0].should == false
52
+
53
+ bs[1] = nil
54
+ bs[1].should == false
55
+ end
56
+
57
+ it 'raises an error when setting out of bound indexes' do
58
+ bs = Bitset.new(8)
59
+ expect { bs[8] = true }.to raise_error(IndexError)
60
+ end
61
+ end
62
+
63
+ describe :set do
64
+ it 'sets True for all given indexes' do
65
+ bs = Bitset.new(8)
66
+ bs.set 1,2,3
67
+
68
+ bs[1].should == true
69
+ bs[2].should == true
70
+ bs[3].should == true
71
+ end
72
+ end
73
+
74
+ describe :clear do
75
+ it 'sets False for all given indexes' do
76
+ bs = Bitset.new(8)
77
+ bs.set 1,2,3
78
+ bs.clear 1,3
79
+
80
+ bs[1].should == false
81
+ bs[2].should == true
82
+ bs[3].should == false
83
+ end
84
+ end
85
+
86
+ describe :set? do
87
+ it 'returns True if all bits indexed are set' do
88
+ bs = Bitset.new(8)
89
+ bs.set 1, 4, 5
90
+ bs.set?(1,4,5).should == true
91
+ end
92
+
93
+ it 'returns False if not all bits indexed are set' do
94
+ bs = Bitset.new(8)
95
+ bs.set 1, 4
96
+ bs.set?(1,4,5).should == false
97
+ end
98
+ end
99
+
100
+ describe :clear? do
101
+ it 'returns True if all bits indexed are clear' do
102
+ bs = Bitset.new(8)
103
+ bs.set 1, 4, 5
104
+ bs.clear?(0,2,3,6).should == true
105
+ end
106
+
107
+ it 'returns False if not all bits indexed are clear' do
108
+ bs = Bitset.new(8)
109
+ bs.set 1, 4
110
+ bs.clear?(1,2,6).should == false
111
+ end
112
+ end
113
+
114
+ describe :cardinality do
115
+ it 'returns the number of bits set' do
116
+ bs = Bitset.new(8)
117
+ bs.cardinality.should == 0
118
+
119
+ bs[0] = true
120
+ bs.cardinality.should == 1
121
+
122
+ bs[1] = true
123
+ bs.cardinality.should == 2
124
+
125
+ bs[2] = true
126
+ bs.cardinality.should == 3
127
+ end
128
+
129
+ it '... even for large numbers of bits' do
130
+ bs = Bitset.new(10_000)
131
+ bs.set(*(0...5000).to_a)
132
+ bs.cardinality.should == 5000
133
+ end
134
+ end
135
+
136
+ describe :& do
137
+ it 'returns a new Bitset which is the intersection of two Bitsets' do
138
+ bs1 = Bitset.new(8)
139
+ bs1.set 1, 4, 7
140
+
141
+ bs2 = Bitset.new(8)
142
+ bs2.set 1, 2, 4, 6
143
+
144
+ bs3 = bs1 & bs2
145
+ bs3.set?(1,4).should == true
146
+ bs3.clear?(0,2,3,5,6,7).should == true
147
+ end
148
+ end
149
+
150
+ describe :| do
151
+ it 'returns a new Bitset which is the union of two Bitsets' do
152
+ bs1 = Bitset.new(8)
153
+ bs1.set 1, 4, 7
154
+
155
+ bs2 = Bitset.new(8)
156
+ bs2.set 1, 2, 4, 6
157
+
158
+ bs3 = bs1 | bs2
159
+ bs3.set?(1,2,4,6,7).should == true
160
+ bs3.clear?(0,3,5).should == true
161
+ end
162
+ end
163
+
164
+ describe :- do
165
+ it 'returns a new Bitset which is the difference of two Bitsets' do
166
+ bs1 = Bitset.new(8)
167
+ bs1.set 1, 4, 7
168
+
169
+ bs2 = Bitset.new(8)
170
+ bs2.set 1, 2, 4, 6
171
+
172
+ bs3 = bs1 - bs2
173
+ bs3.set?(7).should == true
174
+ bs3.clear?(0,1,2,3,4,5,6).should == true
175
+ end
176
+ end
177
+
178
+ describe :^ do
179
+ it 'returns a new Bitset which is the xor of two Bitsets' do
180
+ bs1 = Bitset.new(8)
181
+ bs1.set 1, 4, 7
182
+
183
+ bs2 = Bitset.new(8)
184
+ bs2.set 1, 2, 4, 6
185
+
186
+ bs3 = bs1 ^ bs2
187
+ bs3.set?(2,6,7).should == true
188
+ bs3.clear?(0,1,3,4,5).should == true
189
+ end
190
+ end
191
+
192
+ describe :hamming do
193
+ it 'returns the hamming distance of two Bitsets' do
194
+ bs1 = Bitset.new(8)
195
+ bs1.set 1, 4, 7
196
+
197
+ bs2 = Bitset.new(8)
198
+ bs2.set 1, 2, 4, 6
199
+
200
+ bs1.hamming(bs2).should == 3
201
+ end
202
+ end
203
+ end
metadata ADDED
@@ -0,0 +1,72 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bitset
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 0
9
+ version: 0.0.0
10
+ platform: ruby
11
+ authors:
12
+ - Tyler McMullen
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-02-17 00:00:00 -08:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: A fast C-based Bitset. It supports the standard set operations as well as operations you may expect on bit arrays. (popcount, for instance)
22
+ email: tbmcmullen@gmail.com
23
+ executables: []
24
+
25
+ extensions:
26
+ - ext/bitset/extconf.rb
27
+ extra_rdoc_files:
28
+ - LICENSE.txt
29
+ - README.rdoc
30
+ files:
31
+ - LICENSE.txt
32
+ - README.rdoc
33
+ - Rakefile
34
+ - VERSION
35
+ - bitset.gemspec
36
+ - ext/bitset/bitset.c
37
+ - ext/bitset/extconf.rb
38
+ - spec/bitset_spec.rb
39
+ has_rdoc: true
40
+ homepage: http://github.com/tyler/bitset
41
+ licenses:
42
+ - MIT
43
+ post_install_message:
44
+ rdoc_options: []
45
+
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ segments:
54
+ - 0
55
+ version: "0"
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ segments:
62
+ - 0
63
+ version: "0"
64
+ requirements: []
65
+
66
+ rubyforge_project:
67
+ rubygems_version: 1.3.7
68
+ signing_key:
69
+ specification_version: 3
70
+ summary: Bitset implementation.
71
+ test_files:
72
+ - spec/bitset_spec.rb