bitary 0.1.4 → 0.1.6

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: bf08e150b62f660fa24f19420e8f9ec2b4c44a0ff88bc8466a1bc13339de1ee0
4
- data.tar.gz: 5837fb427a2332f8518b8ed247edd4ea750dd63a651a3e546c8efcf783dd9daa
3
+ metadata.gz: bed2641b2bb380989c96dcc95710be56b64711c28723f3ca5f3f82fd7119bc7e
4
+ data.tar.gz: 8b7aaf05d552014d77d42707453c5c4c6d84aefb2bd5d382376cdb152ce52068
5
5
  SHA512:
6
- metadata.gz: 564e33ae146b3590d8f41540cde48d3a15dc7536b1dd3592fc0601fc2a85010710a370a1082c0a1134a249f6102526d6b2a859950c179b1b5c59d27ad4111e50
7
- data.tar.gz: 6eeeb1fd6d855b0c87cb8330ea383f3b4136701d028d2996130215a8f5f4edea632a3ca6047bac3fba0a0079d9b83818a3cc0e7fb083ab883a6257a46d3e2e83
6
+ metadata.gz: fb6ad75f7e41ef52bdd71a78ac341381671264eb86e9b90cea66d36cbdbf751ff28e0a072a1479a9474bb68e111c983bcf093936ce08b1fac60b584ec2b7e5d0
7
+ data.tar.gz: bb66c485748c97732da3def70727dbc822704d21e1f2aad31cf810179db6e4154e3aa0c079a3a96a203c6e7e332865e8302428fada04b30f0671f314cbd8d772
data/.rubocop.yml CHANGED
@@ -1,5 +1,7 @@
1
1
  AllCops:
2
2
  NewCops: enable
3
+ Exclude:
4
+ - 'bin/**/*'
3
5
 
4
6
  Style/Documentation:
5
7
  Enabled: false
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## [0.1.5] - 2024-03-31
2
+
3
+ - enhance performance of #each_byte (4 seconds faster on average)
4
+
5
+ ## [0.1.4] - 2024-03-31
6
+
7
+ - more refactoring of Bitary class
8
+ - fix issue in getting/setting bits when size is not % 8
9
+
1
10
  ## [0.1.3] - 2024-03-29
2
11
 
3
12
  - fix some missing require statements
data/README.md CHANGED
@@ -29,11 +29,11 @@ require 'bitary'
29
29
  bit_array_sz = Bitary.new(128) # give an explicit size. Defaults to 64 bits used per item
30
30
  bit_array_ar = Bitary.new(
31
31
  [255, 10, 20],
32
- bits_per_item: Bitary::BYTE # 8 bits
32
+ bpi: Bitary::BYTE # 8 bits
33
33
  ) # create based on some integer array
34
34
 
35
- bit_array_sz.bits_per_item # 64
36
- bit_array_ar.bits_per_item # 8
35
+ bit_array_sz.bpi # 64
36
+ bit_array_ar.bpi # 8
37
37
 
38
38
  bit_array_ar.size # 128
39
39
  bit_array_ar.size # 24
@@ -57,13 +57,13 @@ bit_array_ar.to_a # [127, 10, 20]
57
57
  bit_array_ar.to_s # "01111111 00001010 00010100"
58
58
 
59
59
  # increase/decrease bits used per item
60
- bit_array_ar.bits_per_item = Bitary::LONG # 64 bits
60
+ bit_array_ar.bpi = Bitary::LONG # 64 bits
61
61
  bit_array_ar.to_a # [8_325_652]
62
62
  bit_array_ar.to_s # "0000000000000000000000000000000000000000011111110000101000010100"
63
63
 
64
- bit_array_sz.bits_per_item # 64
64
+ bit_array_sz.bpi # 64
65
65
  bit_array_sz.to_a # [1_099_511_627_776, 0]
66
- bit_array_sz.bits_per_item = Bitary::INT # 32 bits
66
+ bit_array_sz.bpi = Bitary::INT # 32 bits
67
67
  bit_array_sz.to_a # [256, 0, 0, 0]
68
68
  ```
69
69
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  class Bitary
4
4
  class Bitwarr
5
- attr_reader :bpi
5
+ attr_reader :bpi, :bitsize
6
6
 
7
7
  def initialize(initial_data, bpi: Bitary::LONG)
8
8
  check_initial_data(initial_data)
@@ -21,21 +21,6 @@ class Bitary
21
21
  @array.respond_to?(method, include_all) || super
22
22
  end
23
23
 
24
- def bitsize(bit_index = nil)
25
- if bit_index.nil?
26
- @bitsize
27
- else
28
- check_bit_index(bit_index)
29
-
30
- last_index = @array.length - 1
31
- if item_index(bit_index) == last_index
32
- @bitsize - (last_index * @bpi)
33
- else
34
- @bpi
35
- end
36
- end
37
- end
38
-
39
24
  def [](bit_index)
40
25
  @array[item_index(bit_index)]
41
26
  end
@@ -46,12 +31,6 @@ class Bitary
46
31
  @array[item_index(bit_index)] = value
47
32
  end
48
33
 
49
- def relative_bit_index(bit_index)
50
- check_bit_index(bit_index)
51
-
52
- bit_index % @bpi
53
- end
54
-
55
34
  def item_index(bit_index)
56
35
  check_bit_index(bit_index)
57
36
 
@@ -70,8 +49,13 @@ class Bitary
70
49
  operate_bit_at!(:unset, index)
71
50
  end
72
51
 
73
- def each_byte(&)
74
- decrease_items_size(@array, Bitary::BYTE, @bpi).each(&)
52
+ def each_byte
53
+ @array.each do |item|
54
+ (@bpi / Bitary::BYTE).times do |i|
55
+ byte = (item >> (@bpi - (Bitary::BYTE * (i + 1))))
56
+ yield byte
57
+ end
58
+ end
75
59
  end
76
60
 
77
61
  def to_s
@@ -122,7 +106,7 @@ class Bitary
122
106
  Factory
123
107
  .make("Handler::#{operation.capitalize}", self[index])
124
108
  .execute(
125
- index: relative_bit_index(index),
109
+ index: index % @bpi,
126
110
  size: @bpi
127
111
  )
128
112
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'single_method/non_nil_enforcer'
4
- require_relative 'single_method/truthy_enforcer'
5
4
 
6
5
  class Bitary
7
6
  class Decorator
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'decorator/kwargs_validator'
4
3
  require_relative 'decorator/single_method'
5
4
 
6
5
  class Bitary
@@ -3,17 +3,6 @@
3
3
  class Bitary
4
4
  class Handler
5
5
  class Append < Bitary::Handler
6
- SPEC = {
7
- offset: {
8
- required: true,
9
- type: Integer
10
- },
11
- value: {
12
- required: true,
13
- type: Integer
14
- }
15
- }.freeze
16
-
17
6
  def execute(**kwargs)
18
7
  (@value << kwargs[:offset]) | kwargs[:value]
19
8
  end
@@ -3,23 +3,6 @@
3
3
  class Bitary
4
4
  class Handler
5
5
  class Get < Bitary::Handler
6
- SPEC = {
7
- index: {
8
- required: true,
9
- type: Integer,
10
- predicate: {
11
- callback: lambda do |**kwargs|
12
- kwargs[:index] >= 0 && kwargs[:index] < kwargs[:size]
13
- end,
14
- error: IndexError
15
- }
16
- },
17
- size: {
18
- required: true,
19
- type: Integer
20
- }
21
- }.freeze
22
-
23
6
  def execute(**kwargs)
24
7
  (@value >> (kwargs[:size] - kwargs[:index] - 1)) & 0x1
25
8
  end
@@ -3,23 +3,6 @@
3
3
  class Bitary
4
4
  class Handler
5
5
  class Set < Bitary::Handler
6
- SPEC = {
7
- index: {
8
- required: true,
9
- type: Integer,
10
- predicate: {
11
- callback: lambda do |**kwargs|
12
- kwargs[:index] >= 0 && kwargs[:index] < kwargs[:size]
13
- end,
14
- error: IndexError
15
- }
16
- },
17
- size: {
18
- required: true,
19
- type: Integer
20
- }
21
- }.freeze
22
-
23
6
  def execute(**kwargs)
24
7
  @value | (2**(kwargs[:size] - kwargs[:index] - 1))
25
8
  end
@@ -3,28 +3,10 @@
3
3
  class Bitary
4
4
  class Handler
5
5
  class Unset < Bitary::Handler
6
- SPEC = {
7
- index: {
8
- required: true,
9
- type: Integer,
10
- predicate: {
11
- callback: lambda do |**kwargs|
12
- kwargs[:index] >= 0 && kwargs[:index] < kwargs[:size]
13
- end,
14
- error: IndexError
15
- }
16
- },
17
- size: {
18
- required: true,
19
- type: Integer
20
- }
21
- }.freeze
22
-
23
6
  def execute(**kwargs)
24
- mask =
25
- (2**kwargs[:size]) - 1 - (2**(kwargs[:size] - kwargs[:index] - 1))
26
-
27
- @value & mask
7
+ size = kwargs[:size]
8
+ index = kwargs[:index]
9
+ @value & ((2**size) - 1 - (2**(size - index - 1)))
28
10
  end
29
11
  end
30
12
  end
@@ -7,20 +7,9 @@ require_relative 'handler/append'
7
7
 
8
8
  class Bitary
9
9
  class Handler
10
- SPEC = {}.freeze
11
-
12
10
  attr_reader :value
13
11
 
14
- def self.new(*arg, **kwargs)
15
- Decorator::SingleMethod::KwargsValidator.new(
16
- super,
17
- { execute: self::SPEC }
18
- )
19
- end
20
-
21
12
  def initialize(value)
22
- raise ArgumentError unless value.is_a?(Integer)
23
-
24
13
  @value = value
25
14
  end
26
15
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Bitary
4
- VERSION = '0.1.4'
4
+ VERSION = '0.1.6'
5
5
  end
data/lib/bitary.rb CHANGED
@@ -12,7 +12,7 @@ class Bitary
12
12
  include Size
13
13
 
14
14
  def initialize(initial_data, bpi: LONG)
15
- @internal_array = Bitwarr.new(initial_data, bpi:)
15
+ @internal_array = Factory.make('Bitwarr', initial_data, bpi:)
16
16
  end
17
17
 
18
18
  def [](index)
@@ -20,7 +20,7 @@ class Bitary
20
20
  end
21
21
 
22
22
  def []=(index, value)
23
- case Mapper::ObjToBit.new.map(value)
23
+ case Factory.make('Mapper::ObjToBit').map(value)
24
24
  when 0 then @internal_array.unbit_at!(index)
25
25
  else @internal_array.bit_at!(index)
26
26
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bitary
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maximilien Ballesteros
@@ -26,10 +26,8 @@ files:
26
26
  - lib/bitary.rb
27
27
  - lib/bitary/bitwarr.rb
28
28
  - lib/bitary/decorator.rb
29
- - lib/bitary/decorator/kwargs_validator.rb
30
29
  - lib/bitary/decorator/single_method.rb
31
30
  - lib/bitary/decorator/single_method/non_nil_enforcer.rb
32
- - lib/bitary/decorator/single_method/truthy_enforcer.rb
33
31
  - lib/bitary/factory.rb
34
32
  - lib/bitary/handler.rb
35
33
  - lib/bitary/handler/append.rb
@@ -1,174 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Bitary
4
- class Decorator
5
- class KwargsValidator < Bitary::Decorator
6
- SPEC_KEYS = %i[required default type predicate].freeze
7
-
8
- def initialize(wrappee, spec)
9
- super(wrappee) { |method| spec.key?(method) }
10
- @spec = check_spec(@wrappee, spec)
11
- end
12
-
13
- protected
14
-
15
- def precall(method, *, **)
16
- super(method, *, **check_kwargs(@spec, method, **))
17
- end
18
-
19
- private
20
-
21
- def check_spec(wrappee, spec)
22
- raise ArgumentError unless spec.is_a?(Hash)
23
-
24
- spec.each do |method, method_spec|
25
- check_spec_method(wrappee, method)
26
- check_spec_method_value(method_spec)
27
- end
28
- end
29
-
30
- def check_kwargs(spec, method, **kwargs)
31
- check_unexpected_user_kwargs(kwargs, spec[method])
32
- check_kwargs_against_spec(kwargs, spec[method])
33
- end
34
-
35
- def check_spec_method(wrappee, method)
36
- raise ArgumentError unless wrappee.respond_to?(method)
37
- end
38
-
39
- def check_spec_method_value(method_spec)
40
- raise ArgumentError unless method_spec.is_a?(Hash)
41
-
42
- method_spec.each_value do |arg_spec|
43
- raise ArgumentError unless arg_spec.is_a?(Hash)
44
-
45
- check_arg_spec(arg_spec)
46
- end
47
- end
48
-
49
- def check_arg_spec(arg_spec)
50
- raise ArgumentError unless arg_spec.keys.all? do |spec_key|
51
- SPEC_KEYS.include?(spec_key)
52
- end
53
-
54
- arg_spec.each do |spec_key, spec_value|
55
- check_arg_spec_entry(spec_key, spec_value)
56
- end
57
-
58
- return unless arg_spec.key?(:required) && arg_spec[:required]
59
- raise ArgumentError if arg_spec.key?(:default)
60
- end
61
-
62
- def check_arg_spec_entry(key, value)
63
- case key
64
- when :required then check_required(value)
65
- when :default then check_default(value)
66
- when :type then check_type(value)
67
- when :predicate then check_predicate(value)
68
- end
69
- end
70
-
71
- def check_required(value)
72
- raise ArgumentError unless [true, false].include?(value)
73
- end
74
-
75
- def check_default(value)
76
- # NOTHING TODO
77
- end
78
-
79
- def check_type(value)
80
- raise ArgumentError unless value.is_a?(Class)
81
- end
82
-
83
- def check_predicate(value)
84
- raise ArgumentError unless value.is_a?(Hash)
85
-
86
- check_predicate_keys(value)
87
- check_predicate_values(value)
88
- end
89
-
90
- def check_predicate_keys(value)
91
- available_keys = %i[callback error]
92
-
93
- raise ArgumentError unless value.keys.all? do |key|
94
- available_keys.include?(key)
95
- end
96
-
97
- raise KeyError unless value.key?(:callback) && value.key?(:error)
98
- end
99
-
100
- def check_predicate_values(value)
101
- raise ArgumentError unless value[:callback].is_a?(Proc)
102
- raise ArgumentError unless value[:error].is_a?(Class)
103
- raise ArgumentError unless value[:error] < Exception
104
- end
105
-
106
- def check_unexpected_user_kwargs(user_kwargs, method_spec)
107
- raise ArgumentError unless user_kwargs.keys.all? do |key|
108
- method_spec.include?(key)
109
- end
110
- end
111
-
112
- def check_kwargs_against_spec(user_kwargs, method_spec)
113
- predicates = []
114
-
115
- parsed_kwargs = method_spec.reduce({}) do |acc, entry|
116
- kwarg_name, kwarg_spec = entry
117
- loaded_spec = load_spec(kwarg_spec)
118
-
119
- validate_required(user_kwargs, loaded_spec, kwarg_name)
120
- validate_type(user_kwargs, loaded_spec, kwarg_name)
121
- predicates << loaded_spec[:predicate]
122
-
123
- acc.merge(
124
- kwarg_name => compute_value(user_kwargs, loaded_spec, kwarg_name)
125
- )
126
- end
127
-
128
- predicates.each do |predicate|
129
- validate_predicate(parsed_kwargs, predicate)
130
- end
131
-
132
- parsed_kwargs
133
- end
134
-
135
- def load_spec(kwarg_spec)
136
- {
137
- required: kwarg_spec[:required] || false,
138
- default: kwarg_spec[:default],
139
- type: kwarg_spec[:type] || Object,
140
- predicate: kwarg_spec[:predicate] || {
141
- callback: ->(_value) { true },
142
- error: ArgumentError
143
- }
144
- }
145
- end
146
-
147
- def validate_required(user_kwargs, spec, expected_key)
148
- return unless spec[:required]
149
-
150
- raise KeyError unless user_kwargs.key?(expected_key)
151
- end
152
-
153
- def validate_type(user_kwargs, spec, expected_key)
154
- return unless user_kwargs.key?(expected_key)
155
-
156
- raise ArgumentError unless user_kwargs[expected_key].is_a?(spec[:type])
157
- end
158
-
159
- def validate_predicate(parsed_kwargs, predicate)
160
- return if predicate[:callback].call(**parsed_kwargs)
161
-
162
- raise predicate[:error]
163
- end
164
-
165
- def compute_value(user_kwargs, spec, expected_key)
166
- if user_kwargs.key?(expected_key)
167
- user_kwargs[expected_key]
168
- else
169
- spec[:default]
170
- end
171
- end
172
- end
173
- end
174
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Bitary
4
- class Decorator
5
- class SingleMethod < Bitary::Decorator
6
- class TruthyEnforcer < Bitary::Decorator::SingleMethod
7
- protected
8
-
9
- def postcall(resp)
10
- resp or raise TypeError
11
- end
12
- end
13
- end
14
- end
15
- end