bis 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 61336b18bc5e7fd8daa89f0cee4a5d47b5c66859
4
- data.tar.gz: 22444418a3a00b1a78caf0d370f429643e0b09e8
3
+ metadata.gz: 77a393ad380bbdc924d6c8421d4afc0a6573e4de
4
+ data.tar.gz: 56cc67115897fb0e197639e4e9176142596e0ac5
5
5
  SHA512:
6
- metadata.gz: 26a5973b6e2376bad37eb55462442123eec989701cf0ce69bf63301938c1d5062747eb9898b96b01a167c564d971f2623e29ba189d591c314d2ad5a4835d322c
7
- data.tar.gz: a5d6122cc1cde1e84952266449693a7e3c386db2f4a79b4c92746d634f3f6810a1308f36c09b09ab81f150ec9c286a8f4845e328a41096f09ae17ede598fd680
6
+ metadata.gz: fd7bcd70ca222cb942773cc7eb9efbb9cc10c0a75681993a6593bd2c1231fbc25d8894c0be4d03d2055fa83805bc24b71c47101f1fb20142cd0ba3843326aa18
7
+ data.tar.gz: 7ec004c8dac647d18bd7131dd27c9fafab0c41a8910b12dedec51439db1960da4791932f76786a5c293a491407c4b3552b2a2dae2df8ca85b1d6aeb68e1fc9bd
data/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
  (https://codeclimate.com/github/fuadsaud/bis)
8
8
 
9
9
 
10
- A pure ruby bitset implementation.
10
+ A pure ruby immutable bitset implementation.
11
11
 
12
12
  ## Installation
13
13
 
@@ -16,14 +16,13 @@ A pure ruby bitset implementation.
16
16
  ## Usage
17
17
 
18
18
  ```ruby
19
- bis = Bis.new(8) #=> <<00000000>> 0
20
-
21
- bis.set(3) #=> <<00001000>> 8
22
- bis.set(3).set(2) #=> <<00001010>> 10
23
- bis2 = bis.set(3).set(2).clear(3) #=> <<00000010>> 2
24
-
25
- bis3 = bis2 << 4 #=> <<00100000>> 32
26
- bis3 + 1 #=> <<0010000001>> 65
19
+ bis = Bis.new(8) #=> <<00000000>> 0
20
+ bis.set(3) #=> <<00001000>> 8
21
+ bis.set(3).set(2) #=> <<00001100>> 12
22
+ bis2 = bis.set(3).set(2).clear(3) #=> <<00000100>> 4
23
+ bis3 = bis2 << 4 #=> <<01000000>> 64
24
+ bis3 + 1 #=> <<1000001>> 65
25
+ bis3.concat(10) #=> <<010000001010>> 1034
27
26
  ```
28
27
 
29
28
  ## Contributing
data/lib/bis.rb CHANGED
@@ -2,21 +2,28 @@ require 'bis/conversion'
2
2
  require 'bis/version'
3
3
 
4
4
  class Bis
5
+ include Comparable
5
6
  include Enumerable
6
7
 
7
8
  def self.from_enum(enum)
8
- Bis.new(enum.size, value: enum.join.to_i(2))
9
+ from_string(enum.join)
10
+ end
11
+
12
+ def self.from_string(string)
13
+ Bis.new(string.size, value: string.to_i(2))
9
14
  end
10
15
 
11
16
  attr_reader :size
12
17
  alias_method :length, :size
13
- alias_method :bitlength, :size # Ruby 2.1 Integer interoperability
18
+
19
+ # Future versions of Ruby may have Fixnum#bitlength
20
+ alias_method :bitlength, :size
14
21
 
15
22
  def initialize(size, value: 0)
16
23
  fail ArgumentError, 'size must be >= 0' if size < 0
17
24
 
18
25
  @size = size.to_i
19
- @store = value & ((1 << size) - 1)
26
+ @store = (value & ((1 << size) - 1)).to_i
20
27
  end
21
28
 
22
29
  def set(index)
@@ -34,14 +41,14 @@ class Bis
34
41
  end
35
42
 
36
43
  # Not sure if it's a good idead to implement this.
37
- def []=(index, value)
38
- with_valid_bit value do |bit|
39
- case bit
40
- when 1 then set index
41
- when 0 then clear index
42
- end
43
- end
44
- end
44
+ # def []=(index, value)
45
+ # with_valid_bit value do |bit|
46
+ # case bit
47
+ # when 1 then set index
48
+ # when 0 then clear index
49
+ # end
50
+ # end
51
+ # end
45
52
 
46
53
  def concat(other)
47
54
  size_and_value_for(other) do |other_size, other_value|
@@ -86,8 +93,15 @@ class Bis
86
93
  def each_byte
87
94
  return enum_for :each_byte unless block_given?
88
95
 
89
- (size / 8).times.reverse_each do |offset|
90
- yield Bis.new(8, value: (to_i >> offset * 8) & ((1 << 8) - 1))
96
+ full_bitset = if size % 8 != 0
97
+ concat((1 << (8 - (size % 8))) - 1)
98
+ else
99
+ self
100
+ end
101
+
102
+
103
+ (full_bitset.size / 8).times.reverse_each do |offset|
104
+ yield Bis.new(8, value: (full_bitset >> offset * 8) & ((1 << 8) - 1))
91
105
  end
92
106
  end
93
107
 
@@ -107,14 +121,6 @@ class Bis
107
121
  to_a.join
108
122
  end
109
123
 
110
- def ==(other)
111
- other == to_i
112
- end
113
-
114
- def ===(other)
115
- to_i === other
116
- end
117
-
118
124
  def <=>(other)
119
125
  to_i <=> Bis(other).to_i
120
126
  end
@@ -172,13 +178,13 @@ class Bis
172
178
 
173
179
  def bitlenght_for(bitset_or_integer)
174
180
  case bitset_or_integer
181
+ when Bis then bitset_or_integer.size
175
182
  when 0..1 then 1
176
183
  when 2 then 2
177
184
  when Integer then Math.log2(bitset_or_integer).ceil
178
- when Bis then bitset_or_integer.size
179
- else fail ArgumentError, 'cannot resolve a bitlength'
180
- "#{ bitset_or_integer }. Must be either Integer"
181
- 'or Bis'
185
+ else fail ArgumentError, 'cannot resolve a bitlength' +
186
+ "#{ bitset_or_integer }. Must be either Integer" +
187
+ 'or Bis'
182
188
  end
183
189
  end
184
190
  end
@@ -1,3 +1,3 @@
1
1
  class Bis
2
- VERSION = '0.1.2'
2
+ VERSION = '0.1.3'
3
3
  end
@@ -423,21 +423,23 @@ describe Bis do
423
423
 
424
424
  context 'bitset has less than 8 bits' do
425
425
  let(:size) { 4 }
426
- let(:value) { 0 }
426
+ let(:value) { 10 }
427
427
 
428
- it "doesn't yield" do
429
- expect { |b| subject.(b) }.to_not yield_control
428
+ it "yields many 1's as needed to fill a byte" do
429
+ expect { |b| subject.(b) }.to yield_with_args(0b10101111)
430
430
  end
431
431
  end
432
432
 
433
- context 'bitset has at least pne byte' do
433
+ context 'bitset has at least one byte' do
434
434
  let(:size) { 16 }
435
- let(:first_byte) { 38 }
436
- let(:second_byte) { 213 }
435
+ let(:first_byte) { 0b00100110 }
436
+ let(:second_byte) { 0b11010101 }
437
437
  let(:value) { (first_byte << 8) | second_byte }
438
438
 
439
439
  it 'yields all the bytes' do
440
- expect { |b| subject.(b) }.to yield_successive_args 38, 213
440
+ p Bis.new(size, value: value).each_byte.to_a
441
+ expect { |b| subject.(b) }.to yield_successive_args first_byte,
442
+ second_byte
441
443
  end
442
444
  end
443
445
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bis
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fuad Saud
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-24 00:00:00.000000000 Z
11
+ date: 2013-10-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake