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
         |