alias :to_string :to_s
+ # Method to set the bits to "on" in an interval in a bit array.
+ # Returns the number of bits set.
+ def interval_set(start, stop)
+ raise BitArrayError, "interval start < 0 (#{start} < 0)" if start < 0
+ raise BitArrayError, "interval stop > bit array size (#{stop} > #{self.size})" if stop > self.size
+ raise BitArrayError, "interval stop < interval start (#{stop} < #{start})" if stop < start
+
+ (start ... stop).each do |pos|
+ self.bit_set(pos)
+ end
+
+ stop - start
+ end
+
+ # Method to set the bits to "off" in an interval in a bit array.
+ # Returns the number of bits unset.
+ def interval_unset(start, stop)
+ raise BitArrayError, "interval start < 0 (#{start} < 0)" if start < 0
+ raise BitArrayError, "interval stop > bit array size (#{stop} > #{self.size})" if stop > self.size
+ raise BitArrayError, "interval stop < interval start (#{stop} < #{start})" if stop < start
+
+ (start ... stop).each do |pos|
+ self.bit_unset(pos)
+ end
+
+ stop - start
+ end
+
+ # Method to locate intervals of bits set to "on" in a bit array.
+ # BitArray.each_interval -> Array
+ # BitArray.each_interval { |start, stop| } -> Fixnum
+ def each_interval
+ intervals = []
+ start = 0
+ stop = 0
+
+ while start < self.size
+ if self.bit_set?(start)
+ stop = start
+
+ while stop < self.size and self.bit_set?(stop)
+ stop += 1
+ end
+
+ if block_given?
+ yield start, stop
+ else
+ intervals << [start, stop]
+ end
+ end
+
+ stop > start ? start = stop : start += 1
+ end
+
+ return intervals unless block_given?
+ end
+
private
# Method to initialize the byte array (string) that constitutes the bit array.
@ba.bit_set(5)
ba.bit_set(5)
ba.bit_set(6)
- assert_equal( "0000010000", (@ba & ba).to_s)
+ assert_equal("0000010000", (@ba & ba).to_s)
end
def test_BitArray_OR_with_uneven_sizes_raises
@ba.bit_set(5)
ba.bit_set(5)
ba.bit_set(6)
- assert_equal( "0000111000", (@ba | ba).to_s)
+ assert_equal("0000111000", (@ba | ba).to_s)
end
def test_BitArray_XOR_with_uneven_sizes_raises
@ba.bit_set(5)
ba.bit_set(5)
ba.bit_set(6)
- assert_equal( "0000101000", (@ba ^ ba).to_s)
+ assert_equal("0000101000", (@ba ^ ba).to_s)
end
def test_BitArray_FLIP_returns_correctly
@ba.bit_set(0)
@ba.bit_set(9)
- assert_equal( "0111111110", (~@ba).to_s)
+ assert_equal("0111111110", (~@ba).to_s)
+ end
+
+ def test_interval_set_with_bad_interval_raises
+ assert_raise(BitArrayError) { @ba.interval_set(-1, 4) }
+ assert_raise(BitArrayError) { @ba.interval_set(1, 14) }
+ assert_raise(BitArrayError) { @ba.interval_set(4, 2) }
+ end
+
+ def test_interval_set_returns_correctly
+ @ba.interval_set(1, 9)
+
+ assert_equal("0111111110", @ba.to_s)
+ end
+
+ def test_interval_unset_with_bad_interval_raises
+ assert_raise(BitArrayError) { @ba.interval_unset(-1, 4) }
+ assert_raise(BitArrayError) { @ba.interval_unset(1, 14) }
+ assert_raise(BitArrayError) { @ba.interval_unset(4, 2) }
+ end
+
+ def test_interval_unset_returns_correctly
+ ~@ba
+ @ba.interval_unset(1, 9)
+
+ assert_equal("1000000001", @ba.to_s)
+ end
+
+ def test_each_interval_returns_correctly
+ @ba.fill!
+ @ba.bit_unset(4)
+
+ assert_equal([[0, 4], [5, 10]], @ba.each_interval.to_a)
end
end