bitary 0.1.8 → 0.1.9

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