bitary 0.1.6 → 0.1.7

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bed2641b2bb380989c96dcc95710be56b64711c28723f3ca5f3f82fd7119bc7e
4
- data.tar.gz: 8b7aaf05d552014d77d42707453c5c4c6d84aefb2bd5d382376cdb152ce52068
3
+ metadata.gz: 537a58c702f90bfeade22439d4134d921df709d4d474279f29adae869ff08b0d
4
+ data.tar.gz: 90910632d7a7f40f89774a8d0ba2b1a6bbf04f5b281454ab18313359151f58b0
5
5
  SHA512:
6
- metadata.gz: fb6ad75f7e41ef52bdd71a78ac341381671264eb86e9b90cea66d36cbdbf751ff28e0a072a1479a9474bb68e111c983bcf093936ce08b1fac60b584ec2b7e5d0
7
- data.tar.gz: bb66c485748c97732da3def70727dbc822704d21e1f2aad31cf810179db6e4154e3aa0c079a3a96a203c6e7e332865e8302428fada04b30f0671f314cbd8d772
6
+ metadata.gz: 3c65d9bcd2b757bf0a3e2d8b25b51b6a50b239e589efba142eb3c1c7539d42ac88c311361aa934f6ecf5be06c18da53c4e3c138dda801f0c89330da7c030a745
7
+ data.tar.gz: 10169aa8520c4d2dc4ddc92e419b77b745688c14bc08214770f9da25ed35b66d66655db37ef32daa7967119514ad3cacb618d06be5bd3c69df45e2ed435e9fb1
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## [0.1.6] - 2024-03-31
2
+
3
+ - enhance global perf by remove useless and heavy error handling
4
+
1
5
  ## [0.1.5] - 2024-03-31
2
6
 
3
7
  - enhance performance of #each_byte (4 seconds faster on average)
@@ -5,101 +5,68 @@ class Bitary
5
5
  attr_reader :bpi, :bitsize
6
6
 
7
7
  def initialize(initial_data, bpi: Bitary::LONG)
8
- check_initial_data(initial_data)
9
- check_bpi(bpi)
8
+ @bitsize = init_bitsize(initial_data, bpi)
9
+ @array = init_array(initial_data, @bitsize, bpi)
10
+ @bpi = init_bpi(initial_data, bpi)
10
11
 
11
- @bpi = bpi
12
- @bitsize = init_bitsize(initial_data)
13
- @array = init_array(initial_data)
12
+ self.bpi = bpi
14
13
  end
15
14
 
16
- def method_missing(method, *, &)
17
- @array.respond_to?(method) ? @array.send(method, *, &) : super
18
- end
19
-
20
- def respond_to_missing?(method, include_all = false)
21
- @array.respond_to?(method, include_all) || super
22
- end
23
-
24
- def [](bit_index)
25
- @array[item_index(bit_index)]
26
- end
15
+ def [](bit_index) = @array[item_index(bit_index)]
16
+ def bit_at(index) = operate_bit_at(:get, index)
17
+ def bit_at!(index) = operate_bit_at!(:set, index)
18
+ def unbit_at!(index) = operate_bit_at!(:unset, index)
19
+ def to_s = @array.map { |item| to_binstr(item) }.join(' ')
27
20
 
28
21
  def []=(bit_index, value)
29
- raise ArgumentError unless value.is_a?(Integer)
30
-
31
22
  @array[item_index(bit_index)] = value
32
23
  end
33
24
 
34
- def item_index(bit_index)
35
- check_bit_index(bit_index)
36
-
37
- bit_index / @bpi
38
- end
39
-
40
- def bit_at(index)
41
- operate_bit_at(:get, index)
42
- end
43
-
44
- def bit_at!(index)
45
- operate_bit_at!(:set, index)
46
- end
47
-
48
- def unbit_at!(index)
49
- operate_bit_at!(:unset, index)
50
- end
51
-
52
- def each_byte
25
+ def each_byte(&proc)
53
26
  @array.each do |item|
54
- (@bpi / Bitary::BYTE).times do |i|
55
- byte = (item >> (@bpi - (Bitary::BYTE * (i + 1))))
56
- yield byte
57
- end
27
+ explode_item(item, Bitary::BYTE, @bpi, &proc)
58
28
  end
59
29
  end
60
30
 
61
- def to_s
62
- @array.map { |item| format("%0#{@bpi}d", item.to_s(2)) }.join(' ')
63
- end
64
-
65
31
  def bpi=(value)
66
- check_bpi(value)
32
+ return if value == @bpi
67
33
 
68
34
  update_items_size!(value)
69
-
70
35
  @bpi = value
71
36
  end
72
37
 
38
+ def method_missing(method, *, &)
39
+ @array.respond_to?(method) ? @array.send(method, *, &) : super
40
+ end
41
+
42
+ def respond_to_missing?(method, include_all = false)
43
+ @array.respond_to?(method, include_all) || super
44
+ end
45
+
73
46
  private
74
47
 
75
- def init_bitsize(initial_data)
76
- initial_data.is_a?(Array) ? @bpi * initial_data.length : initial_data
48
+ def init_bpi(initial_data, bpi)
49
+ initial_data.is_a?(Array) ? Bitary::BYTE : bpi
77
50
  end
78
51
 
79
- def init_array(initial_data)
52
+ def init_bitsize(initial_data, bpi)
53
+ initial_data.is_a?(Array) ? bpi * initial_data.length : initial_data
54
+ end
55
+
56
+ def init_array(initial_data, bitsize, bpi)
80
57
  if initial_data.is_a?(Array)
81
58
  initial_data.clone
82
59
  else
83
- [0] * (@bitsize / @bpi.to_f).ceil
60
+ [0] * (bitsize / bpi.to_f).ceil
84
61
  end
85
62
  end
86
63
 
87
- def check_initial_data(initial_data)
88
- raise ArgumentError unless [Array, Integer].include?(initial_data.class)
89
- end
90
-
91
- def check_bit_index(bit_index)
92
- raise ArgumentError unless bit_index.is_a?(Integer)
93
- raise IndexError if bit_index.negative? || bit_index >= @bitsize
64
+ def item_index(bit_index)
65
+ bit_index / @bpi
94
66
  end
95
67
 
96
- def check_bpi(bpi)
97
- raise ArgumentError unless [
98
- Bitary::BYTE,
99
- Bitary::SHORT,
100
- Bitary::INT,
101
- Bitary::LONG
102
- ].include?(bpi)
68
+ def to_binstr(item)
69
+ format("%0#{@bpi}d", item.to_s(2))
103
70
  end
104
71
 
105
72
  def operate_bit_at(operation, index)
@@ -116,29 +83,34 @@ class Bitary
116
83
  end
117
84
 
118
85
  def update_items_size!(value)
119
- if value > @bpi
120
- increase_items_size!(value)
121
- else
122
- decrease_items_size!(value)
123
- end
86
+ value > @bpi ? increase_items_size!(value) : decrease_items_size!(value)
87
+ end
88
+
89
+ def append_bits(item, bpi, addend)
90
+ Factory.make('Handler::Append', item).execute(
91
+ offset: bpi,
92
+ value: addend
93
+ )
124
94
  end
125
95
 
126
96
  def increase_items_size(array, new_size, bpi)
127
97
  processed_bits = 0
128
- array.each_with_object([0]) do |value, acc|
129
- offset = bpi
130
- if processed_bits >= new_size
131
- offset = 0
98
+ res = array.each_with_object([0]) do |item, acc|
99
+ if processed_bits == new_size
132
100
  acc << 0
133
101
  processed_bits = 0
134
102
  end
135
103
 
136
- acc[-1] = Factory.make('Handler::Append', acc[-1]).execute(
137
- offset:,
138
- value:
139
- )
104
+ acc[-1] = append_bits(acc[-1], bpi, item)
105
+ processed_bits += bpi
106
+ end
107
+
108
+ while processed_bits < new_size
109
+ res[-1] = append_bits(res[-1], bpi, 0)
140
110
  processed_bits += bpi
141
111
  end
112
+
113
+ res
142
114
  end
143
115
 
144
116
  def increase_items_size!(value)
@@ -147,7 +119,9 @@ class Bitary
147
119
 
148
120
  def decrease_items_size(array, new_size, bpi)
149
121
  array.each_with_object([]) do |item, acc|
150
- acc.concat(explode_item(item, new_size, bpi))
122
+ explode_item(item, new_size, bpi) do |new_item|
123
+ acc << new_item
124
+ end
151
125
  end
152
126
  end
153
127
 
@@ -156,16 +130,10 @@ class Bitary
156
130
  end
157
131
 
158
132
  def explode_item(item, new_size, bpi)
159
- res = []
160
- offset = bpi
161
133
  mask = (2**new_size) - 1
162
-
163
- while offset.positive?
164
- offset -= new_size
165
- res << ((item >> offset) & mask)
134
+ (bpi / new_size).times do |i|
135
+ yield ((item >> (bpi - (new_size * (i + 1)))) & mask)
166
136
  end
167
-
168
- res
169
137
  end
170
138
  end
171
139
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Bitary
4
- VERSION = '0.1.6'
4
+ VERSION = '0.1.7'
5
5
  end
data/lib/bitary.rb CHANGED
@@ -12,17 +12,24 @@ class Bitary
12
12
  include Size
13
13
 
14
14
  def initialize(initial_data, bpi: LONG)
15
- @internal_array = Factory.make('Bitwarr', initial_data, bpi:)
15
+ check_initial_data(initial_data)
16
+ check_bpi(bpi)
17
+
18
+ @bitwarr = Factory.make('Bitwarr', initial_data, bpi:)
16
19
  end
17
20
 
18
21
  def [](index)
19
- @internal_array.bit_at(index)
22
+ check_bit_index(index)
23
+
24
+ @bitwarr.bit_at(index)
20
25
  end
21
26
 
22
27
  def []=(index, value)
28
+ check_bit_index(index)
29
+
23
30
  case Factory.make('Mapper::ObjToBit').map(value)
24
- when 0 then @internal_array.unbit_at!(index)
25
- else @internal_array.bit_at!(index)
31
+ when 0 then @bitwarr.unbit_at!(index)
32
+ else @bitwarr.bit_at!(index)
26
33
  end
27
34
  end
28
35
 
@@ -35,27 +42,44 @@ class Bitary
35
42
  end
36
43
 
37
44
  def each_byte(&)
38
- @internal_array.each_byte(&)
45
+ @bitwarr.each_byte(&)
39
46
  end
40
47
 
41
48
  def to_a
42
- @internal_array.to_a
49
+ @bitwarr.to_a
43
50
  end
44
51
 
45
52
  def to_s
46
- @internal_array.to_s
53
+ @bitwarr.to_s
47
54
  end
48
55
 
49
56
  def bpi=(value)
50
- @internal_array.bpi = value
57
+ check_bpi(value)
58
+
59
+ @bitwarr.bpi = value
51
60
  end
52
61
 
53
62
  def size
54
- @internal_array.bitsize
63
+ @bitwarr.bitsize
55
64
  end
56
65
 
57
66
  def bpi
58
- @internal_array.bpi
67
+ @bitwarr.bpi
68
+ end
69
+
70
+ private
71
+
72
+ def check_initial_data(initial_data)
73
+ raise ArgumentError unless [Array, Integer].include?(initial_data.class)
74
+ end
75
+
76
+ def check_bpi(bpi)
77
+ raise ArgumentError unless [BYTE, SHORT, INT, LONG].include?(bpi)
78
+ end
79
+
80
+ def check_bit_index(bit_index)
81
+ raise ArgumentError unless bit_index.is_a?(Integer)
82
+ raise IndexError if bit_index.negative? || bit_index >= @bitwarr.bitsize
59
83
  end
60
84
 
61
85
  alias at []
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bitary
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maximilien Ballesteros
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-03-31 00:00:00.000000000 Z
11
+ date: 2024-04-01 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Ruby-based implementation of the bit array data structure
14
14
  email: