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: "Objects that may be compared according to a total order relation";
	note: "The basic operation is `<%' (less than); others are defined in terms of this operation and `is_equal%'.";
	status: "See notice at end of class";
	names: comparable, comparison;
	date: "$Date: 2007-03-30 19:10:11 +0000 (Fri, 30 Mar 2007) $";
	revision: "$Revision: 95354 $"

deferred class COMPARABLE

inherit
	PART_COMPARABLE
		redefine
			infix "<", infix "<=", infix ">", infix ">=", is_equal
		end

feature -- Comparison

	infix "<" (other: like Current): BOOLEAN is
			-- Is current object less than other?
		deferred
		ensure
			asymmetric: Result implies not(other < Current)
		end;

	infix "<=" (other: like Current): BOOLEAN is
			-- Is current object less than or equal to other?
		do
			Result := not(other < Current)
		ensure
			definition: Result = ((Current < other) or is_equal (other))
		end;

	infix ">" (other: like Current): BOOLEAN is
			-- Is current object greater than other?
		do
			Result := other < Current
		ensure
			definition: Result = (other < Current)
		end;

	infix ">=" (other: like Current): BOOLEAN is
			-- Is current object greater than or equal to other?
		do
			Result := not(Current < other)
		ensure
			definition: Result = (other <= Current)
		end;

	is_equal (other: like Current): BOOLEAN is
			-- Is other attached to an object of the same type
			-- as current object and identical to it?
		do
			Result := (not(Current < other) and not(other < Current))
		ensure
			trichotomy: Result = (not(Current < other) and not(other < Current))
		end;

	three_way_comparison (other: like Current): INTEGER is
			-- If current object equal to other, 0;
			-- if smaller, -1; if greater, 1
		require
			other_exists: other /= void
		do
			if Current < other then
				Result := -1
			elseif other < Current then
				Result := 1
			end
		ensure
			equal_zero: (Result = 0) = is_equal (other);
			smaller_negative: (Result = -1) = (Current < other);
			greater_positive: (Result = 1) = (Current > other)
		end;

	max (other: like Current): like Current is
			-- The greater of current object and other
		require
			other_exists: other /= void
		do
			if Current >= other then
				Result := Current
			else
				Result := other
			end
		ensure
			current_if_not_smaller: Current >= other implies Result = Current;
			other_if_smaller: Current < other implies Result = other
		end;

	min (other: like Current): like Current is
			-- The smaller of current object and other
		require
			other_exists: other /= void
		do
			if Current <= other then
				Result := Current
			else
				Result := other
			end
		ensure
			current_if_not_greater: Current <= other implies Result = Current;
			other_if_greater: Current > other implies Result = other
		end;

invariant

	irreflexive_comparison: not(Current < Current);

end -- class COMPARABLE