bitary 0.1.4 → 0.1.6

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
  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