work in progress | character

Class CHARACTER

Halstenbach Eiffel 3.1


indexing

   description: "Characters, with comparison operations and an ASCII code"

expanded class interface

   CHARACTER

feature -- Access

   code: INTEGER
      -- Associated integer value

   hash_code: INTEGER
      -- Hash code value
      ensure -- from HASHABLE
         good_hash_value: Result >= 0

   item: CHARACTER
      -- Character value
      -- (from CHARACTER_REF)
        
feature -- Comparison

   is_equal (other: like Current): BOOLEAN
      -- Is `other' attached to an object of the same type
      -- as current object and identical to it?
      -- (from CHARACTER_REF)
      require -- COMPARABLE
         precursor: True
      require -- from GENERAL
         other_not_void: other /= void
      ensure then -- from COMPARABLE
         trichotomy: Result = (not (Current < other) and not
          (other < Current))
      ensure -- from GENERAL
         symmetric: Result implies other.is_equal (Current);
         consistent: standard_is_equal (other) implies Result

   max (other: like Current): like Current
      -- The greater of current object and `other'
      require -- from COMPARABLE
         other_exists: other /= void
      ensure -- from COMPARABLE
         current_if_not_smaller: Current >= other implies
          Result = Current;
         other_if_smaller: Current < other implies Result = other

   min (other: like Current): like Current
      -- The smaller of current object and `other'
      require -- from COMPARABLE
         other_exists: other /= void
      ensure -- from COMPARABLE
         current_if_not_greater: Current <= other implies
          Result = Current;
         other_if_greater: Current > other implies Result = other

   three_way_comparison (other: like Current): INTEGER
      -- If current object equal to `other', 0;
      -- if smaller, -1; if greater, 1
      require -- from COMPARABLE
         other_exists: other /= void
      ensure -- from COMPARABLE
         equal_zero: (Result = 0) = is_equal (other);
         smaller_negative: (Result = - 1) = (Current < other);
         greater_positive: (Result = 1) = (Current > other)

   infix "<" (other: like Current): BOOLEAN
      -- Is `other' greater than current character?
      require -- from PART_COMPARABLE
         other_exists: other /= void
      ensure then -- from COMPARABLE
         asymmetric: Result implies not (other < Current)

   infix "<=" (other: like Current): BOOLEAN
      -- Is current object less than or equal to `other'?
      require -- from PART_COMPARABLE
         other_exists: other /= void
      ensure then -- from COMPARABLE
         definition: Result = (Current < other) or is_equal (other)

   infix ">" (other: like Current): BOOLEAN
      -- Is current object greater than `other'?
      require -- from PART_COMPARABLE
         other_exists: other /= void
      ensure then -- from COMPARABLE
         definition: Result = (other < Current)

   infix ">=" (other: like Current): BOOLEAN
      -- Is current object greater than or equal to `other'?
      require -- from PART_COMPARABLE
         other_exists: other /= void
      ensure then -- from COMPARABLE
         definition: Result = (other <= Current)
        
feature -- Status report

   is_alpha: BOOLEAN
      -- Is `Current' alphabetic?
      -- Alphabetic is `is_upper' or `is_lower'

   is_digit: BOOLEAN
      -- Is `Current' a digit?
      -- A digit is one of 0123456789

   is_hashable: BOOLEAN
      -- May current object be hashed?
      -- (True if it is not its type's default.)
      ensure -- from HASHABLE
         ok_if_not_default: Result implies (Current /= default)

   is_lower: BOOLEAN
      -- Is `Current' lowercase?

   is_upper: BOOLEAN
      -- Is `Current' uppercase?
        
feature -- Element change

   set_item (c: CHARACTER)
      -- Make `c' the `item' value.
      -- (from CHARACTER_REF)
        
feature -- Conversion

   lower: CHARACTER
      -- Lowercase value of `Current'
      -- Returns `Current' if not `is_upper'

   upper: CHARACTER
      -- Uppercase value of `Current'
      -- Returns `Current' if not `is_lower'
        
feature -- Output

   out: STRING
      -- Printable representation of character
        
feature -- Basic routines

   next: CHARACTER
      -- Next character
      require -- from CHARACTER_REF
         valid_character: item /= '%/255/'
      ensure -- from CHARACTER_REF
         valid_result: Result |-| item = 1

   previous: CHARACTER
      -- Previous character
      require -- from CHARACTER_REF
         valid_character: item /= '%U'
      ensure -- from CHARACTER_REF
         valid_result: Result |-| item = - 1

   infix "+" (incr: INTEGER): CHARACTER
      -- Add `incr' to the code of `Current'
      require -- from CHARACTER_REF
         valid_upper_increment: item.code + incr <= 255;
         valid_lower_increment: item.code + incr >= 0
      ensure -- from CHARACTER_REF
         valid_result: Result |-| item = incr

   infix "-" (decr: INTEGER): CHARACTER
      -- Subtract `decr' to the code of `Current'
      require -- from CHARACTER_REF
         valid_upper_decrement: item.code - decr <= 255;
         valid_lower_decrement: item.code - decr >= 0
      ensure -- from CHARACTER_REF
         valid_result: item |-| Result = decr

   infix "|-|" (other: CHARACTER): INTEGER
      -- Difference between the codes of `Current' and `other'
      ensure -- from CHARACTER_REF
         valid_result: other + Result = item
        
invariant

   -- from GENERAL
   reflexive_equality: standard_is_equal (Current);
   reflexive_conformance: conforms_to (Current);
   -- from COMPARABLE
   irreflexive_comparison: not (Current < Current);

end -- class CHARACTER