ANY NONE
expanded class interface CHARACTER
   --
   -- Note: An Eiffel CHARACTER is mapped as a C unsigned 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
   is_equal (other: like Current): BOOLEAN
      -- Is other attached to an object considered equal to
      -- current object ?
      require
         other /= Void
      ensure
         trichotomy: Result = (not (Current < other) and not (other < Current));
         same_dynamic_type(other) implies Result = other.is_equal(Current)

   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
   to_integer: INTEGER_8
      -- Sign-extended conversion.

   code: INTEGER_16
      -- ASCII code of Current. (No Sign-extended conversion.)
      ensure
         Result.in_range(Minimum_character_code,Maximum_character_code)

   value: INTEGER_8
      -- Gives the value of a decimal digit.
      require
         is_digit
      ensure
         Result.in_range(0,9)

   decimal_value: INTEGER_8
      -- Gives the value of a decimal digit.
      require
         is_digit
      ensure
         Result.in_range(0,9)

   binary_value: INTEGER_8
      -- Gives the value of a binary digit.
      require
         is_binary_digit
      ensure
         Result.in_range(0,1)

   octal_value: INTEGER_8
      -- Gives the value of an octal digit.
      require
         is_octal_digit
      ensure
         Result.in_range(0,7)

   hexadecimal_value: INTEGER_8
      -- 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

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

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

   is_letter: BOOLEAN
      -- Is it a letter ('a' .. 'z' or 'A' .. 'Z') ?
      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 = (once "0123456789abcdefABCDEF").has(Current)

   is_lower: BOOLEAN
      -- Is it some lowercase letter ('a'..'z')?

   is_upper: BOOLEAN
      -- Is it some uppercase letter ('A'..'Z')?

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

   is_letter_or_digit: BOOLEAN
      -- Is it a letter (see is_letter) or a digit (see is_digit) ?
      ensure
         definition: 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 previous character (the code before)
      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

feature(s) from CHARACTER
   -- Object Printing:

   out_in_tagged_out_memory
      -- Append terse printable represention of current object
      -- in tagged_out_memory.
      ensure
         not_cleared: tagged_out_memory.count >= old tagged_out_memory.count;
         append_only: (old tagged_out_memory.twin).is_equal(tagged_out_memory.substring(1,old tagged_out_memory.count))

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

feature(s) from CHARACTER
   -- Miscellaneous:

   is_alpha: BOOLEAN
      -- See is_letter (yes this is just a call to is_letter).
      -- Isn't is_letter better English ;-)
      ensure
         Result = is_letter

feature(s) from CHARACTER
   -- For compatibility with the obsolete CHARACTER_REF style:

   item: CHARACTER

   set_item (item_value: like item)
      ensure
         item = item_value

feature(s)


end of expanded CHARACTER