ewah-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/CHANGELOG CHANGED
@@ -1 +1,3 @@
1
- v0.0.1. First version.
1
+ v0.0.2. A few additional library functions exposed.
2
+
3
+ v0.0.1. First version.
data/README.md CHANGED
@@ -6,6 +6,12 @@ This library wraps the original C++ implementation written by one of the origina
6
6
 
7
7
  https://github.com/lemire/EWAHBoolArray
8
8
 
9
+ The gem is built and tested against ruby 1.8.7. If anyone wants to modify it to also run in ruby 1.9.x I'd gladly accept the pull requests.
10
+
11
+ To install simply run
12
+
13
+ gem install ewah-bitset
14
+
9
15
  Examples are in the spec but the general idea goes something like this:
10
16
 
11
17
  require 'ewahbitset'
data/ewah-bitset.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "ewah-bitset"
5
- s.version = "0.0.1"
5
+ s.version = "0.0.2"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Josh Ferguson"]
9
- s.date = "2012-04-21"
9
+ s.date = "2012-04-23"
10
10
  s.description = "A wrapper around Lemire's EWAHBoolArray from https://github.com/lemire/EWAHBoolArray"
11
11
  s.email = "josh@besquared.net"
12
12
  s.extensions = ["ext/extconf.rb"]
data/ext/ewah-bitset.cpp CHANGED
@@ -47,6 +47,32 @@ extern "C" VALUE ewah_each(VALUE self) {
47
47
  return Qnil;
48
48
  }
49
49
 
50
+ extern "C" VALUE ewah_each_word(VALUE self) {
51
+ EWAH *bitset;
52
+ Data_Get_Struct(self, EWAH, bitset);
53
+
54
+ EWAHBoolArrayIterator<uword64> i = bitset->bits->uncompress();
55
+
56
+ while(i.hasNext()) {
57
+ rb_yield(INT2FIX(i.next()));
58
+ }
59
+
60
+ return Qnil;
61
+ }
62
+
63
+ extern "C" VALUE ewah_each_word_sparse(VALUE self) {
64
+ EWAH *bitset;
65
+ Data_Get_Struct(self, EWAH, bitset);
66
+
67
+ EWAHBoolArraySparseIterator<uword64> i = bitset->bits->sparse_uncompress();
68
+
69
+ while(i.hasNext()) {
70
+ rb_yield(INT2FIX(i.next()));
71
+ }
72
+
73
+ return Qnil;
74
+ }
75
+
50
76
  extern "C" VALUE ewah_swap(VALUE self, VALUE other) {
51
77
  EWAH *bitset;
52
78
  EWAH *obitset;
@@ -96,7 +122,20 @@ extern "C" VALUE ewah_logical_and(VALUE self, VALUE other) {
96
122
  return newBitset;
97
123
  }
98
124
 
99
- extern "C" VALUE ewah_equals(VALUE self, VALUE other) {
125
+ extern "C" VALUE ewah_logical_not(VALUE self) {
126
+ EWAH *bitset;
127
+ Data_Get_Struct(self, EWAH, bitset);
128
+
129
+ VALUE newBitset = ewah_new(rb_path2class("EwahBitset"));
130
+
131
+ EWAH *newBits;
132
+ Data_Get_Struct(newBitset, EWAH, newBits);
133
+ bitset->bits->logicalnot(*(newBits->bits));
134
+
135
+ return newBitset;
136
+ }
137
+
138
+ extern "C" VALUE ewah_eq(VALUE self, VALUE other) {
100
139
  EWAH *bitset;
101
140
  EWAH *obitset;
102
141
  Data_Get_Struct(self, EWAH, bitset);
@@ -109,6 +148,19 @@ extern "C" VALUE ewah_equals(VALUE self, VALUE other) {
109
148
  }
110
149
  }
111
150
 
151
+ extern "C" VALUE ewah_neq(VALUE self, VALUE other) {
152
+ EWAH *bitset;
153
+ EWAH *obitset;
154
+ Data_Get_Struct(self, EWAH, bitset);
155
+ Data_Get_Struct(other, EWAH, obitset);
156
+
157
+ if(*(bitset->bits) != *(obitset->bits)) {
158
+ return Qtrue;
159
+ } else {
160
+ return Qfalse;
161
+ }
162
+ }
163
+
112
164
  /* Information & Serialization */
113
165
  extern "C" VALUE ewah_size_in_bits(VALUE self) {
114
166
  EWAH *bitset;
@@ -164,9 +216,15 @@ extern "C" void Init_ewahbitset() {
164
216
  rb_define_method(rb_cC, "swap", (ruby_method*) &ewah_swap, 1);
165
217
  rb_define_method(rb_cC, "reset", (ruby_method*) &ewah_reset, 0);
166
218
 
167
- rb_define_method(rb_cC, "==", (ruby_method*) &ewah_equals, 1);
219
+ rb_define_method(rb_cC, "each_word64", (ruby_method*) &ewah_each_word, 0);
220
+ rb_define_method(rb_cC, "each_word64_sparse", (ruby_method*) &ewah_each_word_sparse, 0);
221
+
222
+ rb_define_method(rb_cC, "==", (ruby_method*) &ewah_eq, 1);
223
+ rb_define_method(rb_cC, "!=", (ruby_method*) &ewah_neq, 1);
224
+
168
225
  rb_define_method(rb_cC, "logical_or", (ruby_method*) &ewah_logical_or, 1);
169
226
  rb_define_method(rb_cC, "logical_and", (ruby_method*) &ewah_logical_and, 1);
227
+ rb_define_method(rb_cC, "logical_not", (ruby_method*) &ewah_logical_not, 1);
170
228
 
171
229
  rb_define_method(rb_cC, "to_binary_s", (ruby_method*) &ewah_to_binary_s, 0);
172
230
  rb_define_method(rb_cC, "serialize", (ruby_method*) &ewah_serialize, 0);
@@ -99,4 +99,36 @@ describe "An EwahBitset" do
99
99
 
100
100
  @bitset.should == newbits
101
101
  end
102
+
103
+ it "should iterate over each 64 bit word" do
104
+ 0.upto(10) do |i|
105
+ @bitset.set(i)
106
+ end
107
+
108
+ output = []
109
+ @bitset.each_word64 do |word|
110
+ 0.upto(64) do |i|
111
+ output << ((word >> i) & 0x01)
112
+ end
113
+ end
114
+
115
+ output[0,11].uniq.should == [1]
116
+ output[11,53].uniq.should == [0]
117
+ end
118
+
119
+ it "should iterate over each 64 bit word sparsely" do
120
+ 0.upto(10) do |i|
121
+ @bitset.set(i)
122
+ end
123
+
124
+ output = []
125
+ @bitset.each_word64_sparse do |word|
126
+ 0.upto(64) do |i|
127
+ output << ((word >> i) & 0x01)
128
+ end
129
+ end
130
+
131
+ output[0,11].uniq.should == [1]
132
+ output[11,53].uniq.should == [0]
133
+ end
102
134
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ewah-bitset
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 2
10
+ version: 0.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Josh Ferguson
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-04-21 00:00:00 Z
18
+ date: 2012-04-23 00:00:00 Z
19
19
  dependencies: []
20
20
 
21
21
  description: A wrapper around Lemire's EWAHBoolArray from https://github.com/lemire/EWAHBoolArray