This site contains older material on Eiffel. For the main Eiffel page, see http://www.eiffel.com.

EiffelBase class
(HTML page generated by ISE Eiffel 4.2)

Eiffel Class
indexing
	description: "Bit sequences of length `count%', with binary operations";
	status: "See notice at end of class";
	date: "$Date: 2007-03-30 19:10:11 +0000 (Fri, 30 Mar 2007) $";
	revision: "$Revision: 95354 $"

class BIT_REF

inherit
	ANY
		redefine
			c_standard_is_equal, c_standard_copy, c_standard_clone, out, generator, conforms_to
		end

feature -- Access

	item (i: INTEGER): BOOLEAN is
			-- i-th bit
			-- Was declared in BIT_REF as synonym of item and @.
		require
			index_large_enough: i >= 1;
			index_small_enough: i <= count
		do
			Result := b_item ($Current, i)
		end;

	infix "@" (i: INTEGER): BOOLEAN is
			-- i-th bit
			-- Was declared in BIT_REF as synonym of item and @.
		require
			index_large_enough: i >= 1;
			index_small_enough: i <= count
		do
			Result := b_item ($Current, i)
		end;

	generator: STRING is
			-- Name of the current object's generating class.
		do
			create Result.make (10);
			Result.append ("BIT ");
			Result.append_integer (count)
		end;

	conforms_to (other: BIT_REF): BOOLEAN is
			-- Is dynamic type of current object a descendant of
			-- dynamic type of other?
		do
			Result := count <= other.count
		end;

feature -- Measurement

	count: INTEGER is
			-- Size of the current bit object
		do
			Result := b_count ($Current)
		end;

feature -- Element change

	put (value: BOOLEAN; i: INTEGER) is
			-- Set the i-th bit to 1 if value is True, 0 if False
		require
			index_large_enough: i >= 1;
			index_small_enough: i <= count
		do
			b_put ($Current, value, i)
		ensure
			value_inserted: item (i) = value
		end;

feature -- Basic operations

	infix "^" (s: INTEGER): like Current is
			-- Result of shifting bit sequence by s positions
			-- (Positive s shifts right, negative s shifts left;
			-- bits falling off the sequence's bounds are lost.)
		do
			Result := b_shift ($Current, s)
		end;

	infix "#" (s: INTEGER): like Current is
			-- Result of rotating bit sequence by s positions
			-- (Positive s rotates right, negative s rotates left.)
		do
			Result := b_rotate ($Current, s)
		end;

	infix "and" (other: BIT_REF): BIT_REF is
			-- Bit-by-bit boolean conjunction with other
		require
			other_exists: other /= void;
			conformance: other.count <= count
		do
			Result := b_and ($Current, $other)
		end;

	infix "implies" (other: BIT_REF): BIT_REF is
			-- Bit-by-bit boolean implication of other
		require
			other_exists: other /= void;
			conformance: other.count <= count
		do
			Result := b_implies ($Current, $other)
		end;

	infix "or" (other: BIT_REF): BIT_REF is
			-- Bit-by-bi boolean disjunction with other
		require
			other_exists: other /= void;
			conformance: other.count <= count
		do
			Result := b_or ($Current, $other)
		end;

	infix "xor" (other: BIT_REF): BIT_REF is
			-- Bit-by-bit exclusive or with other
		require
			other_exists: other /= void;
			conformance: other.count <= count
		do
			Result := b_xor ($Current, $other)
		end;

	prefix "not": like Current is
			-- Bit-by-bit negation
		do
			Result := b_not ($Current)
		end;

feature -- Output

	out: STRING is
			-- Tagged printable representation.
		do
			Result := c_out ($Current)
		end;

feature {NONE} -- Implementation

	b_item (a_bit: POINTER; index: INTEGER): BOOLEAN is
			-- Boolean item at position i in a_bit
		external
			"C | %"eif_bits.h%""
		end;

	b_count (a_bit: POINTER): INTEGER is
			-- Size of a_bit
		external
			"C | %"eif_bits.h%""
		end;

	c_standard_is_equal (target, source: POINTER): BOOLEAN is
			-- C external performing standard equality
		external
			"C | %"eif_bits.h%""
		alias
			"b_equal"
		end;

	b_shift (a_bit: POINTER; s: INTEGER): BIT_REF is
			-- Result of shifting a_bit by s positions
		external
			"C | %"eif_bits.h%""
		end;

	b_rotate (a_bit: POINTER; s: INTEGER): BIT_REF is
			-- Result of rotating a_bit by s positions
		external
			"C | %"eif_bits.h%""
		end;

	b_and (a_bit1, a_bit2: POINTER): BIT_REF is
			-- Conjunction of a_bit1 with a_bit2
		external
			"C | %"eif_bits.h%""
		end;

	b_implies (a_bit1, a_bit2: POINTER): BIT_REF is
			-- Implication for a_bit1 of a_bit2
		external
			"C | %"eif_bits.h%""
		end;

	b_or (a_bit1, a_bit2: POINTER): BIT_REF is
			-- Disjunction of a_bit1 with a_bit2
		external
			"C | %"eif_bits.h%""
		end;

	b_xor (a_bit1, a_bit2: POINTER): BIT_REF is
			-- Exclusive or of a_bit1 with a_bit2
		external
			"C | %"eif_bits.h%""
		end;

	b_not (a_bit: POINTER): BIT_REF is
			-- Negation of a_bit
		external
			"C | %"eif_bits.h%""
		end;

	c_standard_copy (source, target: POINTER) is
			-- Copy of bit sequence
		external
			"C | %"eif_bits.h%""
		alias
			"b_copy"
		end;

	c_standard_clone (other: POINTER): BIT_REF is
			-- New object of same dynamic type as other
		external
			"C | %"eif_bits.h%""
		alias
			"b_clone"
		end;

	b_put (a_bit: POINTER; val: BOOLEAN; index: INTEGER) is
			-- Put val in a_bit at position index.
		external
			"C | %"eif_bits.h%""
		end;

	c_out (b: POINTER): STRING is
			-- Out representation of Current
		external
			"C | %"eif_bits.h%""
		alias
			"b_eout"
		end;

end -- class BIT_REF