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 +4 -4
- data/.rubocop.yml +2 -0
- data/CHANGELOG.md +9 -0
- data/README.md +6 -6
- data/lib/bitary/bitwarr.rb +9 -25
- data/lib/bitary/decorator/single_method.rb +0 -1
- data/lib/bitary/decorator.rb +0 -1
- data/lib/bitary/handler/append.rb +0 -11
- data/lib/bitary/handler/get.rb +0 -17
- data/lib/bitary/handler/set.rb +0 -17
- data/lib/bitary/handler/unset.rb +3 -21
- data/lib/bitary/handler.rb +0 -11
- data/lib/bitary/version.rb +1 -1
- data/lib/bitary.rb +2 -2
- metadata +1 -3
- data/lib/bitary/decorator/kwargs_validator.rb +0 -174
- data/lib/bitary/decorator/single_method/truthy_enforcer.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bed2641b2bb380989c96dcc95710be56b64711c28723f3ca5f3f82fd7119bc7e
|
4
|
+
data.tar.gz: 8b7aaf05d552014d77d42707453c5c4c6d84aefb2bd5d382376cdb152ce52068
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fb6ad75f7e41ef52bdd71a78ac341381671264eb86e9b90cea66d36cbdbf751ff28e0a072a1479a9474bb68e111c983bcf093936ce08b1fac60b584ec2b7e5d0
|
7
|
+
data.tar.gz: bb66c485748c97732da3def70727dbc822704d21e1f2aad31cf810179db6e4154e3aa0c079a3a96a203c6e7e332865e8302428fada04b30f0671f314cbd8d772
|
data/.rubocop.yml
CHANGED
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
|
-
|
32
|
+
bpi: Bitary::BYTE # 8 bits
|
33
33
|
) # create based on some integer array
|
34
34
|
|
35
|
-
bit_array_sz.
|
36
|
-
bit_array_ar.
|
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.
|
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.
|
64
|
+
bit_array_sz.bpi # 64
|
65
65
|
bit_array_sz.to_a # [1_099_511_627_776, 0]
|
66
|
-
bit_array_sz.
|
66
|
+
bit_array_sz.bpi = Bitary::INT # 32 bits
|
67
67
|
bit_array_sz.to_a # [256, 0, 0, 0]
|
68
68
|
```
|
69
69
|
|
data/lib/bitary/bitwarr.rb
CHANGED
@@ -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
|
-
|
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:
|
109
|
+
index: index % @bpi,
|
126
110
|
size: @bpi
|
127
111
|
)
|
128
112
|
end
|
data/lib/bitary/decorator.rb
CHANGED
@@ -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
|
data/lib/bitary/handler/get.rb
CHANGED
@@ -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
|
data/lib/bitary/handler/set.rb
CHANGED
@@ -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
|
data/lib/bitary/handler/unset.rb
CHANGED
@@ -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
|
-
|
25
|
-
|
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
|
data/lib/bitary/handler.rb
CHANGED
@@ -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
|
|
data/lib/bitary/version.rb
CHANGED
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 =
|
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.
|
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
|
+
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
|