expanded class interface CHARACTER
   -- 
   --  Note: An Eiffel CHARACTER is mapped as a C char or as a Java Byte.
   -- 

feature(s) from HASHABLE
   hash_code: INTEGER
      --  The hash-code value of Current.

      ensure
         good_hash_value: Result >= 0

feature(s) from COMPARABLE
   infix "<" (other: CHARACTER): BOOLEAN
      --  Comparison using code. 

      require
         other_exists: other /= Void
      ensure
         asymmetric: Result implies not (other < Current)

   infix "<=" (other: CHARACTER): BOOLEAN
      --  Comparison using code. 

      require
         other_exists: other /= Void
      ensure
         definition: Result = (Current < other or is_equal(other))

   infix ">" (other: CHARACTER): BOOLEAN
      --  Comparison using code. 

      require
         other_exists: other /= Void
      ensure
         definition: Result = (other < Current)

   infix ">=" (other: CHARACTER): BOOLEAN
      --  Comparison using code. 

      require
         other_exists: other /= Void
      ensure
         definition: Result = (other <= Current)

   in_range (lower, upper: like Current): BOOLEAN
      --  Return true if Current is in range [lower..upper]

      ensure
         Result = (Current >= lower and Current <= upper)

   compare (other: like Current): INTEGER
      --  If current object equal to other, 0;
      --  if smaller,  -1; if greater, 1.

      require
         other_exists: other /= Void
      ensure
         equal_zero: Result = 0 = is_equal(other);
         smaller_negative: Result = - 1 = Current < other;
         greater_positive: Result = 1 = Current > other

   three_way_comparison (other: like Current): INTEGER
      --  If current object equal to other, 0;
      --  if smaller,  -1; if greater, 1.

      require
         other_exists: other /= Void
      ensure
         equal_zero: Result = 0 = is_equal(other);
         smaller_negative: Result = - 1 = Current < other;
         greater_positive: Result = 1 = Current > other

   min (other: like Current): like Current
      --  Minimum of Current and other.

      require
         other /= Void
      ensure
         Result <= Current and then Result <= other;
         compare(Result) = 0 or else other.compare(Result) = 0

   max (other: like Current): like Current
      --  Maximum of Current and other.

      require
         other /= Void
      ensure
         Result >= Current and then Result >= other;
         compare(Result) = 0 or else other.compare(Result) = 0

feature(s) from CHARACTER_REF
   item: CHARACTER

feature(s) from CHARACTER_REF
   set_item (value: like item)

   code: INTEGER
      --  ASCII code of Current.
      --  No Sign-extended conversion.

      ensure
         Result >= 0

   to_upper: CHARACTER
      --  Conversion to the corresponding upper case.


   to_lower: CHARACTER
      --  Conversion to the corresponding lower case.


feature(s) from CHARACTER_REF
   --  Object Printing :

   out_in_tagged_out_memory
      --  Append terse printable represention of current object
      --  in tagged_out_memory.


feature(s) from CHARACTER_REF
   --  Object Printing :

   fill_tagged_out_memory
      --  Append terse printable represention of current object
      --  in tagged_out_memory.


feature(s) from CHARACTER
   to_integer: INTEGER
      --  Sign-extended conversion.


   value: INTEGER
      --  Gives the value of a decimal digit.

      require
         is_digit
      ensure
         Result.in_range(0,9)

   decimal_value: INTEGER
      --  Gives the value of a decimal digit.

      require
         is_digit
      ensure
         Result.in_range(0,9)

   binary_value: INTEGER
      --  Gives the value of a binary digit.

      require
         is_binary_digit
      ensure
         Result.in_range(0,1)

   octal_value: INTEGER
      --  Gives the value of an octal digit.

      require
         is_octal_digit
      ensure
         Result.in_range(0,7)

   hexadecimal_value: INTEGER
      --  Gives the value of an hexadecimal digit.

      require
         is_hexadecimal_digit
      ensure
         Result.in_range(0,15)

   same_as (other: CHARACTER): BOOLEAN
      --  Case insensitive comparison.
      --  No difference between upper/lower case letters.

      ensure
         Result implies to_lower = other or to_upper = other

   is_letter: BOOLEAN
      --  Is it a letter ?

      ensure
         Result = in_range('A','Z') or in_range('a','z')

   is_digit: BOOLEAN
      --  Belongs to '0'..'9'.

      ensure
         Result = in_range('0','9')

   is_decimal_digit: BOOLEAN
      --  Belongs to '0'..'9'.

      ensure
         Result = in_range('0','9')

   is_binary_digit: BOOLEAN
      --  Belongs to '0'..'1'.

      ensure
         Result = in_range('0','1')

   is_octal_digit: BOOLEAN
      --  Belongs to '0'..'7'.

      ensure
         Result = in_range('0','7')

   is_hexadecimal_digit: BOOLEAN
      --  Is it one character of "0123456789abcdefABCDEF" ?

      ensure
         Result = ("0123456789abcdefABCDEF").has(Current)

   is_lower: BOOLEAN
      --  Is item lowercase?


   is_upper: BOOLEAN
      --  Is item uppercase?


   is_separator: BOOLEAN
      --  True when character is a separator.


   is_letter_or_digit: BOOLEAN
      --  Is character a letter or digit ?

      ensure
         valid: Result = (is_letter or is_digit)

   is_ascii: BOOLEAN
      --  Is character a 8-bit ASCII character?


   is_bit: BOOLEAN
      --  True for 0 and 1.


   next: CHARACTER
      --  Give the next character (the following code);


   previous: CHARACTER
      --  Give the next character (the following code);

      require
         code > 0

feature(s) from CHARACTER
   --  Conversions :

   to_bit: BIT_N Character_bits

   to_hexadecimal: STRING
      --  Create a new STRING giving the code in hexadecimal.
      --  For example :
      --     (255).to_character.to_hexadecimal gives "FF".
      --  Note: see to_hexadecimal_in to save memory.

      ensure
         Result.count = 2

   to_hexadecimal_in (str: STRING)
      --  Append the equivalent of to_hexadecimal at the end of 
      --  str. Thus you can save memory because no other
      --  STRING is allocate for the job.

      ensure
         str.count = 2 + old str.count


end of expanded CHARACTER