bitary 0.1.7 → 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: 537a58c702f90bfeade22439d4134d921df709d4d474279f29adae869ff08b0d
4
- data.tar.gz: 90910632d7a7f40f89774a8d0ba2b1a6bbf04f5b281454ab18313359151f58b0
3
+ metadata.gz: e00e1deaf6796f8875294cb61799bc4ee1ae956c681489cee8243c9cad532224
4
+ data.tar.gz: 74088437d85300f562cb47011f17f9242329a0522a95878dfadce0a54803fffe
5
5
  SHA512:
6
- metadata.gz: 3c65d9bcd2b757bf0a3e2d8b25b51b6a50b239e589efba142eb3c1c7539d42ac88c311361aa934f6ecf5be06c18da53c4e3c138dda801f0c89330da7c030a745
7
- data.tar.gz: 10169aa8520c4d2dc4ddc92e419b77b745688c14bc08214770f9da25ed35b66d66655db37ef32daa7967119514ad3cacb618d06be5bd3c69df45e2ed435e9fb1
6
+ metadata.gz: 71b02ce18e1ad4decb42b8680fbcbb44cf44b9a4edb3637300aa40e1ef90825279b9b4c76e3eef24cf08b8b084cf248129f49e55dd98a191ac2223f185c3e7fb
7
+ data.tar.gz: a55ae4d18bd812a9d3a3ff1d6eafa263a5eb362978ed8dd47cfed2c0638927c6491f286f70f767a2cc0eeafea85704583cbee085ad450c8d533d5c086f9d8e1f
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## [0.1.8] - 2024-04-01
2
+
3
+ - inline bit operations to regain original perf
4
+
5
+ ## [0.1.7] - 2024-04-01
6
+
7
+ - loads of refactoring and perf improvements
8
+ - Bitary now acts as the logical layer, whereas Bitwarr acts as the business layer
9
+
1
10
  ## [0.1.6] - 2024-03-31
2
11
 
3
12
  - enhance global perf by remove useless and heavy error handling
@@ -7,21 +7,24 @@ 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)]
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(' ')
20
14
 
21
15
  def []=(bit_index, value)
22
16
  @array[item_index(bit_index)] = value
23
17
  end
24
18
 
19
+ def bit_at(index) = (self[index] >> (@bpi - (index % @bpi) - 1)) & 0x1
20
+ def bit_at!(index) = self[index] |= 2**(@bpi - (index % @bpi) - 1)
21
+
22
+ def unbit_at!(index)
23
+ self[index] &= ((2**@bpi) - 1 - (2**(@bpi - (index % @bpi) - 1)))
24
+ end
25
+
26
+ def to_s = @array.map { |item| to_binstr(item) }.join(' ')
27
+
25
28
  def each_byte(&proc)
26
29
  @array.each do |item|
27
30
  explode_item(item, Bitary::BYTE, @bpi, &proc)
@@ -45,17 +48,17 @@ class Bitary
45
48
 
46
49
  private
47
50
 
48
- def init_bpi(initial_data, bpi)
49
- initial_data.is_a?(Array) ? Bitary::BYTE : bpi
50
- end
51
-
52
51
  def init_bitsize(initial_data, bpi)
53
52
  initial_data.is_a?(Array) ? bpi * initial_data.length : initial_data
54
53
  end
55
54
 
56
55
  def init_array(initial_data, bitsize, bpi)
57
56
  if initial_data.is_a?(Array)
58
- 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
59
62
  else
60
63
  [0] * (bitsize / bpi.to_f).ceil
61
64
  end
@@ -69,28 +72,20 @@ class Bitary
69
72
  format("%0#{@bpi}d", item.to_s(2))
70
73
  end
71
74
 
72
- def operate_bit_at(operation, index)
73
- Factory
74
- .make("Handler::#{operation.capitalize}", self[index])
75
- .execute(
76
- index: index % @bpi,
77
- size: @bpi
78
- )
79
- end
80
-
81
- def operate_bit_at!(operation, index)
82
- self[index] = operate_bit_at(operation, index)
75
+ def update_items_size!(new_size)
76
+ @array = update_items_size(@array, new_size, @bpi)
83
77
  end
84
78
 
85
- def update_items_size!(value)
86
- 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
87
85
  end
88
86
 
89
87
  def append_bits(item, bpi, addend)
90
- Factory.make('Handler::Append', item).execute(
91
- offset: bpi,
92
- value: addend
93
- )
88
+ (item << bpi) | addend
94
89
  end
95
90
 
96
91
  def increase_items_size(array, new_size, bpi)
@@ -113,10 +108,6 @@ class Bitary
113
108
  res
114
109
  end
115
110
 
116
- def increase_items_size!(value)
117
- @array = increase_items_size(@array, value, @bpi)
118
- end
119
-
120
111
  def decrease_items_size(array, new_size, bpi)
121
112
  array.each_with_object([]) do |item, acc|
122
113
  explode_item(item, new_size, bpi) do |new_item|
@@ -125,10 +116,6 @@ class Bitary
125
116
  end
126
117
  end
127
118
 
128
- def decrease_items_size!(value)
129
- @array = decrease_items_size(@array, value, @bpi)
130
- end
131
-
132
119
  def explode_item(item, new_size, bpi)
133
120
  mask = (2**new_size) - 1
134
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.7'
4
+ VERSION = '0.1.9'
5
5
  end
data/lib/bitary.rb CHANGED
@@ -2,11 +2,7 @@
2
2
 
3
3
  require_relative 'bitary/size'
4
4
  require_relative 'bitary/version'
5
- require_relative 'bitary/handler'
6
- require_relative 'bitary/factory'
7
5
  require_relative 'bitary/bitwarr'
8
- require_relative 'bitary/decorator'
9
- require_relative 'bitary/mapper'
10
6
 
11
7
  class Bitary
12
8
  include Size
@@ -15,7 +11,7 @@ class Bitary
15
11
  check_initial_data(initial_data)
16
12
  check_bpi(bpi)
17
13
 
18
- @bitwarr = Factory.make('Bitwarr', initial_data, bpi:)
14
+ @bitwarr = Bitwarr.new(initial_data, bpi:)
19
15
  end
20
16
 
21
17
  def [](index)
@@ -27,7 +23,7 @@ class Bitary
27
23
  def []=(index, value)
28
24
  check_bit_index(index)
29
25
 
30
- case Factory.make('Mapper::ObjToBit').map(value)
26
+ case obj_to_bit(value)
31
27
  when 0 then @bitwarr.unbit_at!(index)
32
28
  else @bitwarr.bit_at!(index)
33
29
  end
@@ -82,5 +78,20 @@ class Bitary
82
78
  raise IndexError if bit_index.negative? || bit_index >= @bitwarr.bitsize
83
79
  end
84
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
+
85
96
  alias at []
86
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.7
4
+ version: 0.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maximilien Ballesteros
@@ -25,18 +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/handler.rb
33
- - lib/bitary/handler/append.rb
34
- - lib/bitary/handler/get.rb
35
- - lib/bitary/handler/set.rb
36
- - lib/bitary/handler/unset.rb
37
- - lib/bitary/mapper.rb
38
- - lib/bitary/mapper/int_to_bit.rb
39
- - lib/bitary/mapper/obj_to_bit.rb
40
28
  - lib/bitary/size.rb
41
29
  - lib/bitary/version.rb
42
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,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Bitary
4
- class Handler
5
- class Append < Bitary::Handler
6
- def execute(**kwargs)
7
- (@value << kwargs[:offset]) | kwargs[:value]
8
- end
9
- end
10
- end
11
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Bitary
4
- class Handler
5
- class Get < Bitary::Handler
6
- def execute(**kwargs)
7
- (@value >> (kwargs[:size] - kwargs[:index] - 1)) & 0x1
8
- end
9
- end
10
- end
11
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Bitary
4
- class Handler
5
- class Set < Bitary::Handler
6
- def execute(**kwargs)
7
- @value | (2**(kwargs[:size] - kwargs[:index] - 1))
8
- end
9
- end
10
- end
11
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Bitary
4
- class Handler
5
- class Unset < Bitary::Handler
6
- def execute(**kwargs)
7
- size = kwargs[:size]
8
- index = kwargs[:index]
9
- @value & ((2**size) - 1 - (2**(size - index - 1)))
10
- end
11
- end
12
- end
13
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'handler/set'
4
- require_relative 'handler/unset'
5
- require_relative 'handler/get'
6
- require_relative 'handler/append'
7
-
8
- class Bitary
9
- class Handler
10
- attr_reader :value
11
-
12
- def initialize(value)
13
- @value = value
14
- end
15
-
16
- def execute(**kwargs)
17
- raise NotImplementedError
18
- end
19
- end
20
- 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