bitset 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/bitset.gemspec +3 -2
- data/ext/bitset/bitset.c +50 -0
- data/spec/bitset_spec.rb +27 -1
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.2
|
data/bitset.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{bitset}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Tyler McMullen"]
|
12
|
-
s.date = %q{2011-02-
|
12
|
+
s.date = %q{2011-02-19}
|
13
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
14
|
s.email = %q{tbmcmullen@gmail.com}
|
15
15
|
s.extensions = ["ext/bitset/extconf.rb"]
|
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
|
|
22
22
|
"README.rdoc",
|
23
23
|
"Rakefile",
|
24
24
|
"VERSION",
|
25
|
+
"bitset.gemspec",
|
25
26
|
"ext/bitset/bitset.c",
|
26
27
|
"ext/bitset/extconf.rb",
|
27
28
|
"spec/bitset_spec.rb"
|
data/ext/bitset/bitset.c
CHANGED
@@ -234,6 +234,52 @@ static VALUE rb_bitset_xor(VALUE self, VALUE other) {
|
|
234
234
|
return Data_Wrap_Struct(cBitset, 0, bitset_free, new_bs);
|
235
235
|
}
|
236
236
|
|
237
|
+
static VALUE rb_bitset_not(VALUE self) {
|
238
|
+
Bitset * bs = get_bitset(self);
|
239
|
+
|
240
|
+
Bitset * new_bs = bitset_new();
|
241
|
+
bitset_setup(new_bs, bs->len);
|
242
|
+
|
243
|
+
int max = ((bs->len-1) >> 6) + 1;
|
244
|
+
int i;
|
245
|
+
for(i = 0; i < max; i++) {
|
246
|
+
uint64_t segment = bs->data[i];
|
247
|
+
new_bs->data[i] = ~segment;
|
248
|
+
}
|
249
|
+
|
250
|
+
return Data_Wrap_Struct(cBitset, 0, bitset_free, new_bs);
|
251
|
+
}
|
252
|
+
|
253
|
+
static VALUE rb_bitset_to_s(VALUE self) {
|
254
|
+
Bitset * bs = get_bitset(self);
|
255
|
+
|
256
|
+
int i;
|
257
|
+
char * data = malloc(bs->len + 1);
|
258
|
+
for(i = 0; i < bs->len; i++) {
|
259
|
+
data[i] = get_bit(bs, i) ? '1' : '0';
|
260
|
+
}
|
261
|
+
data[bs->len] = 0;
|
262
|
+
|
263
|
+
return rb_str_new2(data);
|
264
|
+
}
|
265
|
+
|
266
|
+
static VALUE rb_bitset_from_s(VALUE self, VALUE s) {
|
267
|
+
int length = RSTRING_LEN(s);
|
268
|
+
char* data = StringValuePtr(s);
|
269
|
+
|
270
|
+
Bitset * new_bs = bitset_new();
|
271
|
+
bitset_setup(new_bs, length);
|
272
|
+
|
273
|
+
int i;
|
274
|
+
for (i = 0; i < length; i++) {
|
275
|
+
if (data[i] == '1') {
|
276
|
+
set_bit(new_bs, i);
|
277
|
+
}
|
278
|
+
}
|
279
|
+
|
280
|
+
return Data_Wrap_Struct(cBitset, 0, bitset_free, new_bs);
|
281
|
+
}
|
282
|
+
|
237
283
|
static VALUE rb_bitset_hamming(VALUE self, VALUE other) {
|
238
284
|
Bitset * bs = get_bitset(self);
|
239
285
|
Bitset * other_bs = get_bitset(other);
|
@@ -283,6 +329,10 @@ void Init_bitset() {
|
|
283
329
|
rb_define_method(cBitset, "xor", rb_bitset_xor, 1);
|
284
330
|
rb_define_alias(cBitset, "^", "xor");
|
285
331
|
rb_define_alias(cBitset, "symmetric_difference", "xor");
|
332
|
+
rb_define_method(cBitset, "not", rb_bitset_not, 0);
|
333
|
+
rb_define_alias(cBitset, "!", "not");
|
286
334
|
rb_define_method(cBitset, "hamming", rb_bitset_hamming, 1);
|
287
335
|
rb_define_method(cBitset, "each", rb_bitset_each, 0);
|
336
|
+
rb_define_method(cBitset, "to_s", rb_bitset_to_s, 0);
|
337
|
+
rb_define_singleton_method(cBitset, "from_s", rb_bitset_from_s, 1);
|
288
338
|
}
|
data/spec/bitset_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'bitset'
|
2
2
|
|
3
3
|
describe Bitset do
|
4
4
|
it 'can be initialized' do
|
@@ -189,6 +189,17 @@ describe Bitset do
|
|
189
189
|
end
|
190
190
|
end
|
191
191
|
|
192
|
+
describe :not do
|
193
|
+
it "returns a new Bitset with is the not of one Bitset" do
|
194
|
+
bs1 = Bitset.new(8)
|
195
|
+
bs1.set 1, 4, 7
|
196
|
+
|
197
|
+
bs2 = bs1.not
|
198
|
+
bs2.set?(0, 2, 3, 5, 6).should == true
|
199
|
+
bs2.clear?(1, 4, 7).should == true
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
192
203
|
describe :hamming do
|
193
204
|
it 'returns the hamming distance of two Bitsets' do
|
194
205
|
bs1 = Bitset.new(8)
|
@@ -214,4 +225,19 @@ describe Bitset do
|
|
214
225
|
i.should == 4
|
215
226
|
end
|
216
227
|
end
|
228
|
+
|
229
|
+
describe :to_s do
|
230
|
+
it 'correctly prints out a binary string' do
|
231
|
+
bs = Bitset.new(4)
|
232
|
+
bs.set 0, 2
|
233
|
+
bs.to_s.should == "1010"
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
describe :from_s do
|
238
|
+
it 'correctly creates a bitmap from a binary string' do
|
239
|
+
bs = Bitset.from_s("10101")
|
240
|
+
bs.set?(0, 2, 4).should == true
|
241
|
+
end
|
242
|
+
end
|
217
243
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Tyler McMullen
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-02-
|
17
|
+
date: 2011-02-19 00:00:00 -08:00
|
18
18
|
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|