bitary 0.1.1 → 0.1.2

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