bitary 0.1.8 → 0.1.9

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: 293fa51d8a5a4b4cda3a7a283737d0695b84cfcb55414afde3b9c5bb6f9688aa
4
- data.tar.gz: 6d6541faa0fed549f62a3a1b99a293ca4422511c34527a7278ea7459683f506a
3
+ metadata.gz: e00e1deaf6796f8875294cb61799bc4ee1ae956c681489cee8243c9cad532224
4
+ data.tar.gz: 74088437d85300f562cb47011f17f9242329a0522a95878dfadce0a54803fffe
5
5
  SHA512:
6
- metadata.gz: 0a81bd80568d6b5fcb20d951f0b193f98941adafd448a896f0a68ae8c97eabecca07a34a2db1d48f4e630a64d1be165ed4efe5f370bc1aabd36f78de4a5b0e7d
7
- data.tar.gz: 94f16667978d9d9be2ccf141c6539834d7f3502397db12feee83424eb0586ace151be1ca7bee960b5bc40ba0ec6e9e12c0879c74f700d1cd86c35e21f85337bb
6
+ metadata.gz: 71b02ce18e1ad4decb42b8680fbcbb44cf44b9a4edb3637300aa40e1ef90825279b9b4c76e3eef24cf08b8b084cf248129f49e55dd98a191ac2223f185c3e7fb
7
+ data.tar.gz: a55ae4d18bd812a9d3a3ff1d6eafa263a5eb362978ed8dd47cfed2c0638927c6491f286f70f767a2cc0eeafea85704583cbee085ad450c8d533d5c086f9d8e1f
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## [0.1.8] - 2024-04-01
2
+
3
+ - inline bit operations to regain original perf
4
+
1
5
  ## [0.1.7] - 2024-04-01
2
6
 
3
7
  - loads of refactoring and perf improvements
@@ -7,9 +7,7 @@ class Bitary
7
7
  def initialize(initial_data, bpi: Bitary::LONG)
8
8
  @bitsize = init_bitsize(initial_data, bpi)
9
9
  @array = init_array(initial_data, @bitsize, bpi)
10
- @bpi = init_bpi(initial_data, bpi)
11
-
12
- self.bpi = bpi
10
+ @bpi = bpi
13
11
  end
14
12
 
15
13
  def [](bit_index) = @array[item_index(bit_index)]
@@ -50,17 +48,17 @@ class Bitary
50
48
 
51
49
  private
52
50
 
53
- def init_bpi(initial_data, bpi)
54
- initial_data.is_a?(Array) ? Bitary::BYTE : bpi
55
- end
56
-
57
51
  def init_bitsize(initial_data, bpi)
58
52
  initial_data.is_a?(Array) ? bpi * initial_data.length : initial_data
59
53
  end
60
54
 
61
55
  def init_array(initial_data, bitsize, bpi)
62
56
  if initial_data.is_a?(Array)
63
- initial_data.clone
57
+ if bpi == Bitary::BYTE
58
+ initial_data.clone
59
+ else
60
+ increase_items_size(initial_data, bpi, Bitary::BYTE)
61
+ end
64
62
  else
65
63
  [0] * (bitsize / bpi.to_f).ceil
66
64
  end
@@ -74,21 +72,16 @@ class Bitary
74
72
  format("%0#{@bpi}d", item.to_s(2))
75
73
  end
76
74
 
77
- def operate_bit_at(operation, index)
78
- Factory
79
- .make("Handler::#{operation.capitalize}", self[index])
80
- .execute(
81
- index: index % @bpi,
82
- size: @bpi
83
- )
84
- end
85
-
86
- def operate_bit_at!(operation, index)
87
- self[index] = operate_bit_at(operation, index)
75
+ def update_items_size!(new_size)
76
+ @array = update_items_size(@array, new_size, @bpi)
88
77
  end
89
78
 
90
- def update_items_size!(value)
91
- value > @bpi ? increase_items_size!(value) : decrease_items_size!(value)
79
+ def update_items_size(array, new_size, bpi)
80
+ if new_size > bpi
81
+ increase_items_size(array, new_size, bpi)
82
+ else
83
+ decrease_items_size(array, new_size, bpi)
84
+ end
92
85
  end
93
86
 
94
87
  def append_bits(item, bpi, addend)
@@ -115,10 +108,6 @@ class Bitary
115
108
  res
116
109
  end
117
110
 
118
- def increase_items_size!(value)
119
- @array = increase_items_size(@array, value, @bpi)
120
- end
121
-
122
111
  def decrease_items_size(array, new_size, bpi)
123
112
  array.each_with_object([]) do |item, acc|
124
113
  explode_item(item, new_size, bpi) do |new_item|
@@ -127,10 +116,6 @@ class Bitary
127
116
  end
128
117
  end
129
118
 
130
- def decrease_items_size!(value)
131
- @array = decrease_items_size(@array, value, @bpi)
132
- end
133
-
134
119
  def explode_item(item, new_size, bpi)
135
120
  mask = (2**new_size) - 1
136
121
  (bpi / new_size).times do |i|
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Bitary
4
- VERSION = '0.1.8'
4
+ VERSION = '0.1.9'
5
5
  end
data/lib/bitary.rb CHANGED
@@ -2,10 +2,7 @@
2
2
 
3
3
  require_relative 'bitary/size'
4
4
  require_relative 'bitary/version'
5
- require_relative 'bitary/factory'
6
5
  require_relative 'bitary/bitwarr'
7
- require_relative 'bitary/decorator'
8
- require_relative 'bitary/mapper'
9
6
 
10
7
  class Bitary
11
8
  include Size
@@ -14,7 +11,7 @@ class Bitary
14
11
  check_initial_data(initial_data)
15
12
  check_bpi(bpi)
16
13
 
17
- @bitwarr = Factory.make('Bitwarr', initial_data, bpi:)
14
+ @bitwarr = Bitwarr.new(initial_data, bpi:)
18
15
  end
19
16
 
20
17
  def [](index)
@@ -26,7 +23,7 @@ class Bitary
26
23
  def []=(index, value)
27
24
  check_bit_index(index)
28
25
 
29
- case Factory.make('Mapper::ObjToBit').map(value)
26
+ case obj_to_bit(value)
30
27
  when 0 then @bitwarr.unbit_at!(index)
31
28
  else @bitwarr.bit_at!(index)
32
29
  end
@@ -81,5 +78,20 @@ class Bitary
81
78
  raise IndexError if bit_index.negative? || bit_index >= @bitwarr.bitsize
82
79
  end
83
80
 
81
+ def obj_to_bit(value)
82
+ case !!value
83
+ when true then truthy_to_bit(value)
84
+ when false then 0
85
+ end
86
+ end
87
+
88
+ def truthy_to_bit(value)
89
+ value.is_a?(Integer) ? int_to_bit(value) : 1
90
+ end
91
+
92
+ def int_to_bit(value)
93
+ value.zero? ? 0 : 1
94
+ end
95
+
84
96
  alias at []
85
97
  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.8
4
+ version: 0.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maximilien Ballesteros
@@ -25,13 +25,6 @@ files:
25
25
  - Rakefile
26
26
  - lib/bitary.rb
27
27
  - lib/bitary/bitwarr.rb
28
- - lib/bitary/decorator.rb
29
- - lib/bitary/decorator/single_method.rb
30
- - lib/bitary/decorator/single_method/non_nil_enforcer.rb
31
- - lib/bitary/factory.rb
32
- - lib/bitary/mapper.rb
33
- - lib/bitary/mapper/int_to_bit.rb
34
- - lib/bitary/mapper/obj_to_bit.rb
35
28
  - lib/bitary/size.rb
36
29
  - lib/bitary/version.rb
37
30
  - sig/bitary.rbs
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Bitary
4
- class Decorator
5
- class SingleMethod < Bitary::Decorator
6
- class NonNilEnforcer < Bitary::Decorator::SingleMethod
7
- protected
8
-
9
- def postcall(resp)
10
- (resp.nil? and raise TypeError) || resp
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'single_method/non_nil_enforcer'
4
-
5
- class Bitary
6
- class Decorator
7
- class SingleMethod < Bitary::Decorator
8
- def initialize(wrappee, method)
9
- super(wrappee) { |meth| meth == method }
10
- check_method(wrappee, method)
11
- end
12
-
13
- private
14
-
15
- def check_method(wrappee, method)
16
- raise ArgumentError unless method.is_a?(Symbol)
17
- raise NoMethodError unless wrappee.respond_to?(method)
18
- end
19
- end
20
- end
21
- end
@@ -1,46 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'decorator/single_method'
4
-
5
- class Bitary
6
- class Decorator
7
- def initialize(wrappee, &proc)
8
- @wrappee = wrappee
9
- @predicate = proc || ->(_method) { true }
10
- end
11
-
12
- def method_missing(method, *, **, &)
13
- if @wrappee.respond_to?(method)
14
- if @predicate.call(method)
15
- args, kwargs = precall(method, *, **)
16
- resp = @wrappee.send(method, *args, **kwargs, &)
17
- postcall(resp)
18
- else
19
- @wrappee.send(method, *, **, &)
20
- end
21
- else
22
- super
23
- end
24
- end
25
-
26
- def respond_to_missing?(method, include_all = false)
27
- @wrappee.respond_to?(method, include_all) || super
28
- end
29
-
30
- def wrappee
31
- res = @wrappee
32
- res = res.wrappee while res.respond_to?(:wrappee)
33
- res
34
- end
35
-
36
- protected
37
-
38
- def precall(_method, *args, **kwargs)
39
- [args, kwargs]
40
- end
41
-
42
- def postcall(resp)
43
- resp
44
- end
45
- end
46
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Bitary
4
- class Factory
5
- private_class_method :new
6
- @memo = {}
7
-
8
- def self.make(name, *, **)
9
- raise ArgumentError unless name.is_a?(String)
10
-
11
- name.split('::').reduce(Bitary) do |cls, str|
12
- cls.const_get(str)
13
- end.new(*, **)
14
- end
15
-
16
- def self.make_memo(name, *args, **kwargs)
17
- raise ArgumentError unless name.is_a?(String)
18
- if @memo.key?(name.to_sym) && !args.empty? && !kwargs.empty?
19
- raise ArgumentError
20
- end
21
-
22
- @memo[name.to_sym] ||= make(name, *args, **kwargs)
23
- end
24
- end
25
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Bitary
4
- class Mapper
5
- class IntToBit < Bitary::Mapper
6
- def map(value)
7
- if value.is_a?(Integer)
8
- value.zero? ? 0 : 1
9
- else
10
- 1
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Bitary
4
- class Mapper
5
- class ObjToBit < Bitary::Mapper
6
- def map(value)
7
- case !!value
8
- when true then IntToBit.new.map(value)
9
- when false then 0
10
- end
11
- end
12
- end
13
- end
14
- end
data/lib/bitary/mapper.rb DELETED
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'mapper/int_to_bit'
4
- require_relative 'mapper/obj_to_bit'
5
-
6
- class Bitary
7
- class Mapper
8
- def self.new(*arg, **kwargs)
9
- Decorator::SingleMethod::NonNilEnforcer.new(super, :map)
10
- end
11
-
12
- def map(value)
13
- raise NotImplementedError
14
- end
15
- end
16
- end