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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ee481b52a264fe1e578b65f0228e9a9c6e4eb57a7fa7fb224fb4c1dd31d60f0c
4
- data.tar.gz: 2529e365b65266446aace9bce47369f49615869c4c4ab6ffe134b90c61422535
3
+ metadata.gz: 80cd57b662219349dc57edd47612599f95f5aeca086dbec30af067adb10fe587
4
+ data.tar.gz: dc630c61a13c74a20e3472a90f244dd995f4c7196fb6146ca15973efe02e310d
5
5
  SHA512:
6
- metadata.gz: 1b549423b7cbe533c07fc54b5a4f938612889508703530336b048206f4681356fbbcb04065b7d04a887ed3f03db6ad6cb94538a4b047a6e2e7eeb4904d0af5f9
7
- data.tar.gz: 4e4831d9dcb860c06067ca92e63b41d81ac90e0d3e7aa2f0ddfd48f80f8b8352bf77c6cedbc8b5002285d29f2c6c33b9e96b1456175b1a7ebb41a272a015ce87
6
+ metadata.gz: 9adf435f35e798c71a3a81213f408da0c178b2d3137ecae3619c84e3c95d564e060a4985d24a4746b93a0fb8e2d73fc4a209a38908c7dad25d87dfd728e575da
7
+ data.tar.gz: a6f136e8e5f140ad9455c14b13d94232d40bfc37e09e62b6827857888d03dacbc53fb027a9da1901dfa2d2f966144680a3e2d0a5dd57c4af563d4bd09af99326
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
- ## [Unreleased]
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
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Bitary
4
+ module Size
5
+ BYTE = 8
6
+ SHORT = 16
7
+ INT = 32
8
+ LONG = 64
9
+ end
10
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Bitary
4
- VERSION = '0.1.1'
4
+ VERSION = '0.1.2'
5
5
  end
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: 64)
9
- raise ArgumentError unless [8, 16, 32, 64].include?(bits_per_item)
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
- offset = compute_relative_offset(index, item_bit_size)
24
+ item = @internal_array[item_index]
22
25
 
23
- get_bit(@internal_array[item_index], offset)
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
- offset = compute_relative_offset(index, item_bit_size)
38
+ item = @internal_array[item_index]
33
39
 
34
40
  @internal_array[item_index] =
35
41
  if bit == 1
36
- set_bit(@internal_array[item_index], offset)
42
+ Handler::Set.new(item).execute(
43
+ index: index % @bits_per_item,
44
+ size: item_bit_size
45
+ )
37
46
  else
38
- unset_bit(
39
- @internal_array[item_index],
40
- offset,
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, 8, @bits_per_item)
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 [8, 16, 32, 64].include?(value)
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 |item, acc|
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] = append_bits(acc[-1], offset, item)
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.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-26 00:00:00.000000000 Z
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