expanded class interface BIT_N -- -- Indexed Bit sequences of length N. This class is a template, -- not a real class; to obtain a meaningful class, replace N -- with a positive integer throughout. -- -- An INTEGER index can be used to access each bit of the sequence. -- The leftmost bit has index 1 and the rightmost bit has index N. -- -- Note 1 : corresponding C mapping depends on actual N and is -- PLATFORM dependant (see class PLATFORM). -- When N is in range [0 .. Character_bits], C type -- is a simple "unsigned char". -- When N is in range [Character_bits+1 .. Integer_bits], -- C type is "unsigned". -- When N is greater than Integer_bits, C type is C array -- of "unsigned" of the form : -- "unsigned storage[N div Integer_bits]" -- The array is obviously big enough to fit with N. As -- for previous mapping, the left most bit (at index 1 in -- Eiffel) is always the left most in C memory. -- -- Note 2 : Eiffel BIT code is portable. Generated C code for class -- BIT may not be portable (because sizeof(int) may change). -- To produce a portable C code, you can compile your Eiffel -- code using a machine with very small sizeof(int). Also note -- that doing this may run a little bit slowly. -- feature(s) from BIT_N_REF out_in_tagged_out_memory -- Append terse printable represention of current object -- in tagged_out_memory. feature(s) from BIT_N_REF fill_tagged_out_memory -- Append terse printable represention of current object -- in tagged_out_memory. feature(s) from BIT_N -- Basic Accessing : count: INTEGER -- Number of bits in the sequence (the value of N). item (idx: INTEGER): BOOLEAN -- True if i-th bit is 1, false otherwise. require inside_bounds: 1 <= idx and then idx <= count put (value: BOOLEAN; idx: INTEGER) -- Set bit idx to 1 if value is true, 0 otherwise. require inside_bounds: 1 <= idx and idx <= count ensure value = item(idx) put_1 (idx: INTEGER) -- Set bit idx to 1. require inside_bounds: 1 <= idx and idx <= count ensure item(idx) put_0 (idx: INTEGER) -- Set bit idx to 0. require inside_bounds: 1 <= idx and idx <= count ensure not item(idx) feature(s) from BIT_N -- Rotating and shifting : infix "^" (s: INTEGER): like Current -- Sequence shifted by s positions (positive s shifts -- right, negative left; bits falling off the sequence's -- bounds are lost). -- See also infix "@>>" and infix "@<<". require s.abs < count infix "@>>" (s: INTEGER): like Current -- Sequence shifted right by s positions. -- Same as infix "^" when s is positive (may run a little -- bit faster). require s > 0 infix "@<<" (s: INTEGER): like Current -- Sequence shifted left by s positions. -- Same as infix "^" when s is negative (may run a little -- bit faster. require s > 0 infix "#" (s: INTEGER): like Current -- Sequence rotated by s positions (positive right, -- negative left). require s.abs < count infix "#>>" (s: INTEGER): like Current -- Sequence rotated by s positions right. require s >= 0; s < count infix "#<<" (s: INTEGER): like Current -- Sequence rotated by s positions left. require s >= 0; s < count feature(s) from BIT_N -- Bitwise Logical Operators : infix "and" (other: like Current): like Current -- Bitwise and of Current with other infix "implies" (other: like Current): like Current -- Bitwise implication of Current with other prefix "not": like Current -- Bitwise not of Current. infix "or" (other: like Current): like Current -- Bitwise or of Current with other infix "xor" (other: like Current): like Current -- Bitwise xor of Current with other feature(s) from BIT_N -- Conversions : to_string: STRING -- String representation of bit sequence. -- A zero bit is mapped to '0', a one bit to '1'. -- Leftmost bit is at index 1 in the returned string. -- -- Note: see append_in to save memory. ensure Result.count = count to_integer: INTEGER -- No sign-extension. require count <= Integer_bits to_character: CHARACTER require count <= Character_bits to_bit_string: BIT_STRING ensure count = Result.count feature(s) from BIT_N -- Others : all_cleared: BOOLEAN -- Are all bits set to 0 ? all_set: BOOLEAN -- Are all bits set to 1 ? feature(s) from BIT_N -- Printing : append_in (str: STRING) end of expanded BIT_N