bitfield 0.9.1 → 0.9.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.
Files changed (4) hide show
  1. data/README.rdoc +4 -4
  2. data/Rakefile +3 -3
  3. data/ext/bitfield/bitfield.cpp +161 -131
  4. metadata +4 -6
@@ -1,6 +1,6 @@
1
1
  = BitField
2
2
 
3
- This C extensions wraps boost::dynamic_bitset and makes it available
3
+ This C extension wraps boost::dynamic_bitset and makes it available
4
4
  as a native Ruby class. The bitset behaves like an an array allowing
5
5
  only values of 0 and 1. Using this extension is easy:
6
6
 
@@ -8,8 +8,8 @@ only values of 0 and 1. Using this extension is easy:
8
8
  puts b # Prints '0000000000' where the last bit is b[0]
9
9
  b[0..3] = Array.new(4) {1} # Sets bits 0 to 3 to 1
10
10
 
11
- Enjoy :)
12
-
11
+ Note that in contrast to the Ruby Array behaviour the BitField does not
12
+ automatically grow in size.
13
13
 
14
14
  = Licence
15
- Copyright(c) 2011 Fabian Becker, released under 3-clause BSD licence.
15
+ Copyright(c) 2011 Fabian Becker, released under 2-clause BSD licence.
data/Rakefile CHANGED
@@ -4,15 +4,15 @@ spec = Gem::Specification.new do |s|
4
4
  s.name = 'bitfield'
5
5
  s.platform = Gem::Platform::RUBY
6
6
  s.extensions = FileList["ext/**/extconf.rb"]
7
- s.version = '0.9.1'
8
- s.date = "2011-10-25"
7
+ s.version = '0.9.2'
8
+ s.date = "2011-10-26"
9
9
  s.author = 'Fabian Becker'
10
10
  s.email = 'halfdan@xnorfz.de'
11
11
  s.homepage = 'https://github.com/halfdan/ruby-bitfield/'
12
12
  s.summary = "Wraps boost::dynamic_bitset and makes it available as a Ruby class
13
13
  for fast operations on a bitset"
14
14
 
15
- s.description = 'This C extensions wraps boost::dynamic_bitset and makes it available
15
+ s.description = 'This C extension wraps boost::dynamic_bitset and makes it available
16
16
  as a native Ruby class. The bitset behaves like an an array allowing
17
17
  only values of 0 and 1.'
18
18
 
@@ -32,17 +32,17 @@ static VALUE bf_init(VALUE self, VALUE size)
32
32
  BitField *ptr;
33
33
  Data_Get_Struct(self, BitField, ptr);
34
34
  ptr->data.resize(FIX2INT(size));
35
- return self;
35
+ return self;
36
36
  }
37
37
 
38
38
  static VALUE bf_new(VALUE self, VALUE size)
39
39
  {
40
40
  VALUE *argv;
41
- Check_Type(size, T_FIXNUM);
41
+ Check_Type(size, T_FIXNUM);
42
42
  BitField *ptr;
43
43
  argv[0] = size;
44
- rb_obj_call_init(self, 1, argv);
45
- return self;
44
+ rb_obj_call_init(self, 1, argv);
45
+ return self;
46
46
  }
47
47
 
48
48
  /**
@@ -51,27 +51,32 @@ static VALUE bf_new(VALUE self, VALUE size)
51
51
  */
52
52
  static VALUE bf_size(VALUE self)
53
53
  {
54
- BitField *ptr;
55
- Data_Get_Struct(self, BitField, ptr);
56
- return INT2NUM(ptr->data.size());
54
+ BitField *ptr;
55
+ Data_Get_Struct(self, BitField, ptr);
56
+ return INT2NUM(ptr->data.size());
57
57
  }
58
58
 
59
59
 
60
60
  /**
61
- * Flips the n-th bit if position is given
61
+ * Flips the n-th bit if position is given
62
62
  * flips all bits otherwise (TODO)
63
63
  */
64
64
  static VALUE bf_flip(int argc, VALUE *argv, VALUE self)
65
65
  {
66
66
  BitField *ptr;
67
67
  Data_Get_Struct(self, BitField, ptr);
68
- if(argc == 1) {
69
- Check_Type(argv[0], T_FIXNUM);
70
- ptr->data[FIX2INT(argv[0])].flip();
71
- } else if(argc == 0) {
72
- ptr->data.flip();
73
- } else {
74
- rb_raise(rb_eArgError, "wrong number of arguments(%d for 1 or 0)", argc);
68
+ if(argc == 1)
69
+ {
70
+ Check_Type(argv[0], T_FIXNUM);
71
+ ptr->data[FIX2INT(argv[0])].flip();
72
+ }
73
+ else if(argc == 0)
74
+ {
75
+ ptr->data.flip();
76
+ }
77
+ else
78
+ {
79
+ rb_raise(rb_eArgError, "wrong number of arguments(%d for 1 or 0)", argc);
75
80
  }
76
81
  return Qnil;
77
82
  }
@@ -89,75 +94,99 @@ static VALUE bf_count(VALUE self)
89
94
 
90
95
  static VALUE bf_bit_set(VALUE self, VALUE position, VALUE value)
91
96
  {
92
- BitField *ptr;
93
- Data_Get_Struct(self, BitField, ptr);
97
+ BitField *ptr;
98
+ Data_Get_Struct(self, BitField, ptr);
94
99
 
95
- if(rb_obj_is_kind_of(position, rb_cRange)
96
- && rb_obj_is_kind_of(value, rb_cArray)) {
97
- long beg, len;
98
- VALUE tmp;
99
- switch(rb_range_beg_len(position, &beg, &len, (long int)ptr->data.size()-1, 2)) {
100
- case Qfalse:
101
- case Qnil:
102
- return Qfalse;
103
- default:
104
- for(long i = beg+len-1; i >= beg; i--) {
105
- tmp = rb_ary_pop(value);
106
- if(tmp != Qnil) {
107
- ptr->data[i] = FIX2INT(tmp) % 2;
108
- } else {
109
- rb_raise(rb_eRangeError, "Array is smaller than given range.");
110
- }
111
- }
112
- }
113
- } else {
114
- /* Sanity checks for position and value */
115
- Check_Type(position, T_FIXNUM);
116
- Check_Type(value, T_FIXNUM);
100
+ if(rb_obj_is_kind_of(position, rb_cRange)
101
+ && rb_obj_is_kind_of(value, rb_cArray))
102
+ {
103
+ long beg, len;
104
+ VALUE tmp;
105
+ switch(rb_range_beg_len(position, &beg, &len, (long int)ptr->data.size()-1, 2))
106
+ {
107
+ case Qfalse:
108
+ case Qnil:
109
+ return Qfalse;
110
+ default:
111
+ for(long i = beg+len-1; i >= beg; i--)
112
+ {
113
+ tmp = rb_ary_pop(value);
114
+ if(tmp != Qnil)
115
+ {
116
+ /* Is the array value a number? */
117
+ Check_Type(tmp, T_FIXNUM);
118
+ ptr->data[i] = FIX2INT(tmp) % 2;
119
+ }
120
+ else
121
+ {
122
+ rb_raise(rb_eRangeError, "Array is smaller than given range.");
123
+ }
124
+ }
125
+ }
126
+ }
127
+ else
128
+ {
129
+ /* Sanity checks for position and value */
130
+ Check_Type(position, T_FIXNUM);
131
+ Check_Type(value, T_FIXNUM);
117
132
 
118
- int pos = FIX2INT(position);
119
- if(pos < 0 || pos >= ptr->data.size()) {
120
- rb_raise(rb_eRangeError, "BitField out of range with value %d.", pos);
121
- }
122
- ptr->data[pos] = FIX2INT(value) % 2;
123
- }
124
- return Qnil;
133
+ int pos = FIX2INT(position);
134
+ if(pos < 0 || pos >= ptr->data.size())
135
+ {
136
+ rb_raise(rb_eRangeError, "BitField out of range with value %d.", pos);
137
+ }
138
+ ptr->data[pos] = FIX2INT(value) % 2;
139
+ }
140
+ return Qnil;
125
141
  }
126
142
 
127
143
  static VALUE bf_bit_get(VALUE self, VALUE position)
128
144
  {
129
- BitField *ptr;
130
- Data_Get_Struct(self, BitField, ptr);
145
+ BitField *ptr;
146
+ Data_Get_Struct(self, BitField, ptr);
131
147
 
132
- /* Is position a range? */
133
- if(rb_obj_is_kind_of(position, rb_cRange)) {
148
+ /* Is position a range? */
149
+ if(rb_obj_is_kind_of(position, rb_cRange))
150
+ {
134
151
  long beg, len;
135
152
  VALUE range_ary = rb_ary_new();
136
- switch(rb_range_beg_len(position, &beg, &len, (long int)ptr->data.size()-1, 2)) {
153
+ switch(rb_range_beg_len(position, &beg, &len, (long int)ptr->data.size()-1, 2))
154
+ {
137
155
  case Qfalse:
138
156
  case Qnil:
139
157
  return Qnil;
140
158
  default:
141
- for(long i = beg; i < beg+len; i++) {
142
- rb_ary_push(range_ary, INT2NUM(ptr->data[i]));
159
+ for(long i = beg; i < beg+len; i++)
160
+ {
161
+ if(i < 0 || i >= ptr->data.size()) {
162
+ rb_ary_push(range_ary, Qnil);
163
+ } else {
164
+ rb_ary_push(range_ary, INT2NUM(ptr->data[i]));
165
+ }
143
166
  }
144
167
  }
145
- return range_ary;
146
- } else {
147
- /* Sanity checks for position and value */
148
- Check_Type(position, T_FIXNUM);
149
- int pos = FIX2INT(position);
150
- return INT2NUM(ptr->data[pos]);
151
- }
168
+ return range_ary;
169
+ }
170
+ else
171
+ {
172
+ /* Sanity checks for position and value */
173
+ Check_Type(position, T_FIXNUM);
174
+ long pos = FIX2INT(position);
175
+ if(pos < 0 || pos >= ptr->data.size()) {
176
+ return Qnil;
177
+ } else {
178
+ return INT2NUM(ptr->data[pos]);
179
+ }
180
+ }
152
181
  }
153
182
 
154
183
  static VALUE bf_to_s(VALUE self)
155
184
  {
156
- BitField *ptr;
157
- Data_Get_Struct(self, BitField, ptr);
158
- std::string buffer;
159
- to_string(ptr->data, buffer);
160
- return rb_str_new2(buffer.c_str());
185
+ BitField *ptr;
186
+ Data_Get_Struct(self, BitField, ptr);
187
+ std::string buffer;
188
+ to_string(ptr->data, buffer);
189
+ return rb_str_new2(buffer.c_str());
161
190
  }
162
191
 
163
192
  static VALUE bf_initialize_clone(VALUE self, VALUE orig)
@@ -170,8 +199,8 @@ static VALUE bf_initialize_clone(VALUE self, VALUE orig)
170
199
  return self;
171
200
  }
172
201
 
173
- /*
174
- *Correctly free the struct
202
+ /*
203
+ *Correctly free the struct
175
204
  */
176
205
  void bf_free(BitField *ptr)
177
206
  {
@@ -181,86 +210,87 @@ void bf_free(BitField *ptr)
181
210
  static VALUE BitField_allocate(VALUE klass)
182
211
  {
183
212
  BitField *bf;
184
- bf = ALLOC(BitField);
185
- new(bf) BitField();
213
+ bf = ALLOC(BitField);
214
+ new(bf) BitField();
186
215
  VALUE tdata = Data_Wrap_Struct(klass, 0, bf_free, bf);
187
- return tdata;
216
+ return tdata;
188
217
  }
189
218
 
190
219
  VALUE rb_cBitField;
191
220
 
192
221
  extern "C" {
193
- void Init_bitfield() {
194
- rb_cBitField = rb_define_class("BitField", rb_cObject);
222
+ void Init_bitfield()
223
+ {
224
+ rb_cBitField = rb_define_class("BitField", rb_cObject);
195
225
 
196
226
  rb_define_alloc_func(rb_cBitField, BitField_allocate);
197
227
 
198
228
  /* We do the same for .clone and .dup */
199
- rb_define_method(
200
- rb_cBitField,
201
- "initialize_clone",
202
- reinterpret_cast<VALUE(*)(...)>(bf_initialize_clone),
203
- 1
204
- );
205
229
  rb_define_method(
206
- rb_cBitField,
207
- "initialize_dup",
208
- reinterpret_cast<VALUE(*)(...)>(bf_initialize_clone),
209
- 1
210
- );
230
+ rb_cBitField,
231
+ "initialize_clone",
232
+ reinterpret_cast<VALUE(*)(...)>(bf_initialize_clone),
233
+ 1
234
+ );
235
+ rb_define_method(
236
+ rb_cBitField,
237
+ "initialize_dup",
238
+ reinterpret_cast<VALUE(*)(...)>(bf_initialize_clone),
239
+ 1
240
+ );
211
241
 
212
242
  /* Returns the size of the bitset */
213
- rb_define_method(
214
- rb_cBitField,
215
- "size",
216
- reinterpret_cast<VALUE(*)(...)>(bf_size),
217
- 0
218
- );
219
- rb_define_method(
220
- rb_cBitField,
221
- "initialize",
222
- reinterpret_cast<VALUE(*)(...)>(bf_init),
223
- 1
224
- );
225
- rb_define_method(
226
- rb_cBitField,
227
- "[]=",
228
- reinterpret_cast<VALUE(*)(...)>(bf_bit_set),
229
- 2
230
- );
231
- rb_define_method(
232
- rb_cBitField,
233
- "[]",
234
- reinterpret_cast<VALUE(*)(...)>(bf_bit_get),
235
- 1
236
- );
237
- rb_define_method(
238
- rb_cBitField,
239
- "to_s",
240
- reinterpret_cast<VALUE(*)(...)>(bf_to_s),
241
- 0
242
- );
243
- rb_define_method(
244
- rb_cBitField,
245
- "flip",
246
- reinterpret_cast<VALUE(*)(...)>(bf_flip),
247
- -1
248
- );
249
- rb_define_method(
250
- rb_cBitField,
251
- "count",
252
- reinterpret_cast<VALUE(*)(...)>(bf_count),
253
- 0
254
- );
255
- }
243
+ rb_define_method(
244
+ rb_cBitField,
245
+ "size",
246
+ reinterpret_cast<VALUE(*)(...)>(bf_size),
247
+ 0
248
+ );
249
+ rb_define_method(
250
+ rb_cBitField,
251
+ "initialize",
252
+ reinterpret_cast<VALUE(*)(...)>(bf_init),
253
+ 1
254
+ );
255
+ rb_define_method(
256
+ rb_cBitField,
257
+ "[]=",
258
+ reinterpret_cast<VALUE(*)(...)>(bf_bit_set),
259
+ 2
260
+ );
261
+ rb_define_method(
262
+ rb_cBitField,
263
+ "[]",
264
+ reinterpret_cast<VALUE(*)(...)>(bf_bit_get),
265
+ 1
266
+ );
267
+ rb_define_method(
268
+ rb_cBitField,
269
+ "to_s",
270
+ reinterpret_cast<VALUE(*)(...)>(bf_to_s),
271
+ 0
272
+ );
273
+ rb_define_method(
274
+ rb_cBitField,
275
+ "flip",
276
+ reinterpret_cast<VALUE(*)(...)>(bf_flip),
277
+ -1
278
+ );
279
+ rb_define_method(
280
+ rb_cBitField,
281
+ "count",
282
+ reinterpret_cast<VALUE(*)(...)>(bf_count),
283
+ 0
284
+ );
285
+ }
256
286
  }
257
287
 
258
288
  /* Library Code */
259
289
  BitField *BitFieldNew(int size)
260
290
  {
261
- BitField *bf;
262
- bf = ALLOC(BitField);
263
- new(bf) BitField();
264
- bf->data.resize(size);
265
- return bf;
291
+ BitField *bf;
292
+ bf = ALLOC(BitField);
293
+ new(bf) BitField();
294
+ bf->data.resize(size);
295
+ return bf;
266
296
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bitfield
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,10 +9,9 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-10-25 00:00:00.000000000 +02:00
13
- default_executable:
12
+ date: 2011-10-26 00:00:00.000000000Z
14
13
  dependencies: []
15
- description: ! "This C extensions wraps boost::dynamic_bitset and makes it available\n
14
+ description: ! "This C extension wraps boost::dynamic_bitset and makes it available\n
16
15
  \ as a native Ruby class. The bitset behaves like an an array
17
16
  allowing\n only values of 0 and 1."
18
17
  email: halfdan@xnorfz.de
@@ -27,7 +26,6 @@ files:
27
26
  - ext/bitfield/bitfield.cpp
28
27
  - ext/bitfield/bitfield.hpp
29
28
  - ext/bitfield/extconf.rb
30
- has_rdoc: true
31
29
  homepage: https://github.com/halfdan/ruby-bitfield/
32
30
  licenses: []
33
31
  post_install_message:
@@ -48,7 +46,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
48
46
  version: '0'
49
47
  requirements: []
50
48
  rubyforge_project:
51
- rubygems_version: 1.6.2
49
+ rubygems_version: 1.8.10
52
50
  signing_key:
53
51
  specification_version: 3
54
52
  summary: Wraps boost::dynamic_bitset and makes it available as a Ruby class for fast