bitary 0.1.1 → 0.1.2
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/CHANGELOG.md +6 -1
- data/lib/bitary/handler/append.rb +20 -0
- data/lib/bitary/handler/get.rb +22 -0
- data/lib/bitary/handler/set.rb +22 -0
- data/lib/bitary/handler/unset.rb +22 -0
- data/lib/bitary/handler.rb +19 -0
- data/lib/bitary/size.rb +10 -0
- data/lib/bitary/version.rb +1 -1
- data/lib/bitary.rb +30 -35
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 80cd57b662219349dc57edd47612599f95f5aeca086dbec30af067adb10fe587
|
4
|
+
data.tar.gz: dc630c61a13c74a20e3472a90f244dd995f4c7196fb6146ca15973efe02e310d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9adf435f35e798c71a3a81213f408da0c178b2d3137ecae3619c84e3c95d564e060a4985d24a4746b93a0fb8e2d73fc4a209a38908c7dad25d87dfd728e575da
|
7
|
+
data.tar.gz: a6f136e8e5f140ad9455c14b13d94232d40bfc37e09e62b6827857888d03dacbc53fb027a9da1901dfa2d2f966144680a3e2d0a5dd57c4af563d4bd09af99326
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
|
-
## [
|
1
|
+
## [0.1.1] - 2024-03-26
|
2
|
+
|
3
|
+
- Change root namespace to a class, instead of a module
|
2
4
|
|
3
5
|
## [0.1.0] - 2024-03-26
|
4
6
|
|
5
7
|
- Initial release
|
8
|
+
- Basic implementation to set/unset/get bits from the bit array
|
9
|
+
- Ability to traverse each byte of the structure
|
10
|
+
- Increase/decrease the number of bits used internally per element
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Bitary
|
4
|
+
class Handler
|
5
|
+
class Append < Bitary::Handler
|
6
|
+
def execute(**kwargs)
|
7
|
+
raise ArgumentError unless kwargs.all? do |key, _value|
|
8
|
+
%i[offset value].include?(key)
|
9
|
+
end
|
10
|
+
|
11
|
+
offset = kwargs[:offset] or raise KeyError
|
12
|
+
value = kwargs[:value] or raise KeyError
|
13
|
+
raise ArgumentError unless offset.is_a?(Integer)
|
14
|
+
raise ArgumentError unless value.is_a?(Integer)
|
15
|
+
|
16
|
+
(@value << offset) | value
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Bitary
|
4
|
+
class Handler
|
5
|
+
class Get < Bitary::Handler
|
6
|
+
def execute(**kwargs)
|
7
|
+
raise ArgumentError unless kwargs.all? do |key, _value|
|
8
|
+
%i[index size].include?(key)
|
9
|
+
end
|
10
|
+
|
11
|
+
index = kwargs[:index] or raise KeyError
|
12
|
+
size = kwargs[:size] or raise KeyError
|
13
|
+
raise ArgumentError unless index.is_a?(Integer)
|
14
|
+
raise ArgumentError unless size.is_a?(Integer)
|
15
|
+
|
16
|
+
raise IndexError if index.negative? || index >= size
|
17
|
+
|
18
|
+
(@value >> (size - index - 1)) & 0x1
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Bitary
|
4
|
+
class Handler
|
5
|
+
class Set < Bitary::Handler
|
6
|
+
def execute(**kwargs)
|
7
|
+
raise ArgumentError unless kwargs.all? do |key, _value|
|
8
|
+
%i[index size].include?(key)
|
9
|
+
end
|
10
|
+
|
11
|
+
index = kwargs[:index] or raise KeyError
|
12
|
+
size = kwargs[:size] or raise KeyError
|
13
|
+
raise ArgumentError unless index.is_a?(Integer)
|
14
|
+
raise ArgumentError unless size.is_a?(Integer)
|
15
|
+
|
16
|
+
raise IndexError if index.negative? || index >= size
|
17
|
+
|
18
|
+
@value | (2**(size - index - 1))
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Bitary
|
4
|
+
class Handler
|
5
|
+
class Unset < Bitary::Handler
|
6
|
+
def execute(**kwargs)
|
7
|
+
raise ArgumentError unless kwargs.all? do |key, _value|
|
8
|
+
%i[index size].include?(key)
|
9
|
+
end
|
10
|
+
|
11
|
+
index = kwargs[:index] or raise KeyError
|
12
|
+
size = kwargs[:size] or raise KeyError
|
13
|
+
raise ArgumentError unless index.is_a?(Integer)
|
14
|
+
raise ArgumentError unless size.is_a?(Integer)
|
15
|
+
|
16
|
+
raise IndexError if index.negative? || index >= size
|
17
|
+
|
18
|
+
@value & (((2**size) - 1) - (2**(size - index - 1)))
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'handler/set'
|
4
|
+
|
5
|
+
class Bitary
|
6
|
+
class Handler
|
7
|
+
attr_reader :value
|
8
|
+
|
9
|
+
def initialize(value)
|
10
|
+
raise ArgumentError unless value.is_a?(Integer)
|
11
|
+
|
12
|
+
@value = value
|
13
|
+
end
|
14
|
+
|
15
|
+
def execute(**kwargs)
|
16
|
+
raise NotImplementedError
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/bitary/size.rb
ADDED
data/lib/bitary/version.rb
CHANGED
data/lib/bitary.rb
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative 'bitary/size'
|
3
4
|
require_relative 'bitary/version'
|
4
5
|
|
5
6
|
class Bitary
|
7
|
+
include Size
|
8
|
+
|
6
9
|
attr_reader :size, :bits_per_item
|
7
10
|
|
8
|
-
def initialize(initial_data, bits_per_item:
|
9
|
-
raise ArgumentError unless [
|
11
|
+
def initialize(initial_data, bits_per_item: LONG)
|
12
|
+
raise ArgumentError unless [BYTE, SHORT, INT, LONG].include?(bits_per_item)
|
10
13
|
|
11
14
|
@size = init_size(initial_data, bits_per_item)
|
12
15
|
@internal_array = init_internal_array(initial_data, @size, bits_per_item)
|
@@ -18,9 +21,12 @@ class Bitary
|
|
18
21
|
|
19
22
|
item_index = compute_item_index(index)
|
20
23
|
item_bit_size = compute_item_bit_size(item_index)
|
21
|
-
|
24
|
+
item = @internal_array[item_index]
|
22
25
|
|
23
|
-
|
26
|
+
Handler::Get.new(item).execute(
|
27
|
+
index: index % @bits_per_item,
|
28
|
+
size: item_bit_size
|
29
|
+
)
|
24
30
|
end
|
25
31
|
|
26
32
|
def []=(index, value)
|
@@ -29,22 +35,32 @@ class Bitary
|
|
29
35
|
bit = map_to_bit(value)
|
30
36
|
item_index = compute_item_index(index)
|
31
37
|
item_bit_size = compute_item_bit_size(item_index)
|
32
|
-
|
38
|
+
item = @internal_array[item_index]
|
33
39
|
|
34
40
|
@internal_array[item_index] =
|
35
41
|
if bit == 1
|
36
|
-
|
42
|
+
Handler::Set.new(item).execute(
|
43
|
+
index: index % @bits_per_item,
|
44
|
+
size: item_bit_size
|
45
|
+
)
|
37
46
|
else
|
38
|
-
|
39
|
-
@
|
40
|
-
|
41
|
-
item_bit_size
|
47
|
+
Handler::Unset.new(item).execute(
|
48
|
+
index: index % @bits_per_item,
|
49
|
+
size: item_bit_size
|
42
50
|
)
|
43
51
|
end
|
44
52
|
end
|
45
53
|
|
54
|
+
def set(index)
|
55
|
+
self[index] = 1
|
56
|
+
end
|
57
|
+
|
58
|
+
def unset(index)
|
59
|
+
self[index] = 0
|
60
|
+
end
|
61
|
+
|
46
62
|
def each_byte(&proc)
|
47
|
-
res = decrease_items_size(@internal_array,
|
63
|
+
res = decrease_items_size(@internal_array, BYTE, @bits_per_item)
|
48
64
|
proc ? res.each { |byte| proc.call(byte) } : res.each
|
49
65
|
end
|
50
66
|
|
@@ -59,7 +75,7 @@ class Bitary
|
|
59
75
|
end
|
60
76
|
|
61
77
|
def bits_per_item=(value)
|
62
|
-
raise ArgumentError unless [
|
78
|
+
raise ArgumentError unless [BYTE, SHORT, INT, LONG].include?(value)
|
63
79
|
|
64
80
|
@internal_array =
|
65
81
|
if value > @bits_per_item
|
@@ -110,29 +126,9 @@ class Bitary
|
|
110
126
|
index / @bits_per_item
|
111
127
|
end
|
112
128
|
|
113
|
-
def compute_relative_offset(index, size)
|
114
|
-
size - (index % @bits_per_item) - 1
|
115
|
-
end
|
116
|
-
|
117
|
-
def set_bit(value, offset)
|
118
|
-
value | (2**offset)
|
119
|
-
end
|
120
|
-
|
121
|
-
def unset_bit(value, offset, size)
|
122
|
-
value & (((2**size) - 1) - (2**offset))
|
123
|
-
end
|
124
|
-
|
125
|
-
def get_bit(value, offset)
|
126
|
-
(value >> offset) & 0x1
|
127
|
-
end
|
128
|
-
|
129
|
-
def append_bits(value, offset, bits)
|
130
|
-
(value << offset) | bits
|
131
|
-
end
|
132
|
-
|
133
129
|
def increase_items_size(array, new_size, bpi)
|
134
130
|
processed_bits = 0
|
135
|
-
array.each_with_object([0]) do |
|
131
|
+
array.each_with_object([0]) do |value, acc|
|
136
132
|
offset = bpi
|
137
133
|
if processed_bits >= new_size
|
138
134
|
offset = 0
|
@@ -140,7 +136,7 @@ class Bitary
|
|
140
136
|
processed_bits = 0
|
141
137
|
end
|
142
138
|
|
143
|
-
acc[-1] =
|
139
|
+
acc[-1] = Handler::Append.new(acc[-1]).execute(offset:, value:)
|
144
140
|
processed_bits += bpi
|
145
141
|
end
|
146
142
|
end
|
@@ -165,5 +161,4 @@ class Bitary
|
|
165
161
|
end
|
166
162
|
|
167
163
|
alias at []
|
168
|
-
alias set []=
|
169
164
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
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.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maximilien Ballesteros
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-03-
|
11
|
+
date: 2024-03-29 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Ruby-based implementation of the bit array data structure
|
14
14
|
email:
|
@@ -24,6 +24,12 @@ files:
|
|
24
24
|
- README.md
|
25
25
|
- Rakefile
|
26
26
|
- lib/bitary.rb
|
27
|
+
- lib/bitary/handler.rb
|
28
|
+
- lib/bitary/handler/append.rb
|
29
|
+
- lib/bitary/handler/get.rb
|
30
|
+
- lib/bitary/handler/set.rb
|
31
|
+
- lib/bitary/handler/unset.rb
|
32
|
+
- lib/bitary/size.rb
|
27
33
|
- lib/bitary/version.rb
|
28
34
|
- sig/bitary.rbs
|
29
35
|
homepage: https://github.com/Patacode/bitary
|