note
	description: "Routines that ought to be in class INTEGER"
	library: "Gobo Eiffel Kernel Library"
	copyright: "Copyright (c) 1999-2018, Eric Bezault and others"
	license: "MIT License"
	date: "$Date: 2019-02-07 22:54:15 +0000 (Thu, 07 Feb 2019) $"
	revision: "$Revision: 102807 $"

class interface
	KL_INTEGER_ROUTINES

create 
	default_create

feature -- Conversion

	to_character (an_int: INTEGER_32): CHARACTER_8
			-- Character whose code is an_int
		require
			an_int_large_enough: an_int >= Platform.Minimum_character_code
			an_int_small_enough: an_int <= Platform.Maximum_character_code
		ensure
			instance_free: class
			valid_character_code: Result.code = an_int

	to_hexadecimal (an_int: INTEGER_32; uppercase: BOOLEAN): STRING_8
			-- Hexadecimal representation of an_int;
			-- Return a new string at each call.
		require
			an_int_positive: an_int >= 0
		ensure
			instance_free: class
			hexadecimal_not_void: Result /= Void
			is_string: Any_.same_types (Result, "")

	to_decimal (an_int: INTEGER_32): STRING_8
			-- Decimal representation of an_int;
			-- Return a new string at each call.
		ensure
			instance_free: class
			decimal_not_void: Result /= Void
			is_string: Any_.same_types (Result, "")

	to_octal (an_int: INTEGER_32): STRING_8
			-- Octal representation of an_int;
			-- Return a new string at each call.
		require
			an_int_positive: an_int >= 0
		ensure
			instance_free: class
			octal_not_void: Result /= Void
			is_string: Any_.same_types (Result, "")

	to_integer (an_int: INTEGER_32): INTEGER_32
			-- Return an_int;
			-- This can be used to force integer manifest constants to
			-- be of INTEGER type -- some versions of SmartEiffel use
			-- the smallest possible INTEGER_* type. A manifest array
			-- can thus be forced to be of type ARRAY [INTEGER].
		ensure
			instance_free: class
			definition: Result = an_int

	to_integer_8 (an_int: INTEGER_32): INTEGER_8
			-- Convert to INTEGER_8
		require
			an_int_large_enouh: an_int >= -128
			an_int_small_enouh: an_int <= 127
		ensure
			instance_free: class
	
feature -- Output

	append_decimal_integer (an_int: INTEGER_32; a_string: STRING_8)
			-- Append decimal representation of an_int to a_string.
			-- Note: works even when a_string is a UC_STRING.
		require
			a_string_not_void: a_string /= Void
		ensure
			instance_free: class

	append_octal_integer (an_int: INTEGER_32; a_string: STRING_8)
			-- Append octal representation of an_int to a_string.
			-- Note: works even when a_string is a UC_STRING.
		require
			an_int_positive: an_int >= 0
			a_string_not_void: a_string /= Void
		ensure
			instance_free: class

	append_hexadecimal_integer (an_int: INTEGER_32; a_string: STRING_8; uppercase: BOOLEAN)
			-- Append a hexadecimal representation of an_int to a_string.
			-- Note: works even when a_string is a UC_STRING.
		require
			an_int_positive: an_int >= 0
			a_string_not_void: a_string /= Void
		ensure
			instance_free: class
	
feature -- Operation(s)

	div (x, n: INTEGER_32): INTEGER_32
			-- Integer division of x by n
			-- (Use ISO C99 specification)
		require
			divisible: n /= 0
			overflow: x = Platform.Minimum_integer implies n /= -1
		ensure
			instance_free: class
			definition: Result * n + mod (x, n) = x

	mod (x, n: INTEGER_32): INTEGER_32
			-- Reminder of the integer division of x by n
			-- (Use ISO C99 specification)
		require
			divisible: n /= 0
		ensure
			instance_free: class
			definition1: n /= Platform.Minimum_integer implies Result.abs < n.abs
			definition2: n = Platform.Minimum_integer implies Result.abs <= Platform.Maximum_integer
			iso_c99: Result /= 0 implies Result.sign = x.sign

	power (x, n: INTEGER_32): INTEGER_32
			-- Integer x to the power of n (x ^ n)
		require
			positive_n: n >= 0
		ensure
			instance_free: class
			zero_power_n: x = 0 and n /= 0 implies Result = 0
			x_power_0: n = 0 implies Result = 1
			recursive_definition: n > 0 implies (Result = x * power (x, n - 1))

	bit_and (m, n: INTEGER_32): INTEGER_32
			-- Bitwise 'and' between m and n
		ensure
			instance_free: class

	bit_or (m, n: INTEGER_32): INTEGER_32
			-- Bitwise 'or' between m and n
		ensure
			instance_free: class

	bit_xor (m, n: INTEGER_32): INTEGER_32
			-- Bitwise 'xor' between m and n
		ensure
			instance_free: class

	bit_not (n: INTEGER_32): INTEGER_32
			-- Bitwise 'not' of n
		ensure
			instance_free: class

	bit_shift_left (m, n: INTEGER_32): INTEGER_32
			-- m shifted n bits to left;
			-- Note: The new bits added on the right are 0.
		require
			thirty_two_bit_shift: 0 <= n and n < 32
		ensure
			instance_free: class

	bit_shift_right (m, n: INTEGER_32): INTEGER_32
			-- m shifted n bits to right;
			-- Note: If the first bit of m is set (i.e. the sign bit), then
			-- the new bits added on the left are 1; otherwise they are 0.
		require
			thirty_two_bit_shift: 0 <= n and n < 32
		ensure
			instance_free: class
	
feature -- Status report

	is_even (an_int: INTEGER_32): BOOLEAN
			-- Is an_int an even integer?
		ensure
			instance_free: class
			definition: Result = (an_int \\ 2 = 0)
	
end -- class KL_INTEGER_ROUTINES

Generated by ISE EiffelStudio