    indexing
    	description: "String to real/double convertor"
    	legal: "See notice at end of class."
    	status: "See notice at end of class."
    	author: ""
    	date: "$Date: 2006-07-31 11:53:44 -0700 (Mon, 31 Jul 2006) $"
    	revision: "$Revision: 62126 $"

    class interface
    	STRING_TO_REAL_CONVERTOR

    create
    	make
    			-- Initialize.
    		ensure
    			leading_separators_set: leading_separators.is_equal (" ")
    			trailing_separators_set: trailing_separators.is_equal (" ")
    			leading_separators_not_acceptable: not leading_separators_acceptable
    			trailing_separatorsnot_acceptable: not trailing_separators_acceptable

    feature -- Access

    	generating_type: STRING_8
    			-- Name of current object's generating type
    			-- (type of which it is a direct instance)
    			-- (from ANY)

    	generator: STRING_8
    			-- Name of current object's generating class
    			-- (base class of the type of which it is a direct instance)
    			-- (from ANY)

    feature -- Comparison

    	frozen deep_equal (some: ANY; other: like arg #1): BOOLEAN
    			-- Are `some' and `other' either both void
    			-- or attached to isomorphic object structures?
    			-- (from ANY)
    		ensure -- from ANY
    			shallow_implies_deep: standard_equal (some, other) implies Result
    			both_or_none_void: (some = Void) implies (Result = (other = Void))
    			same_type: (Result and (some /= Void)) implies some.same_type (other)
    			symmetric: Result implies deep_equal (other, some)

    	frozen equal (some: ANY; other: like arg #1): BOOLEAN
    			-- Are `some' and `other' either both void or attached
    			-- to objects considered equal?
    			-- (from ANY)
    		ensure -- from ANY
    			definition: Result = (some = Void and other = Void) or else ((some /= Void and other /= Void) and then some.is_equal (other))

    	is_equal (other: like Current): BOOLEAN
    			-- Is `other' attached to an object considered
    			-- equal to current object?
    			-- (from ANY)
    		require -- from ANY
    			other_not_void: other /= Void
    		ensure -- from ANY
    			symmetric: Result implies other.is_equal (Current)
    			consistent: standard_is_equal (other) implies Result

    	frozen standard_equal (some: ANY; other: like arg #1): BOOLEAN
    			-- Are `some' and `other' either both void or attached to
    			-- field-by-field identical objects of the same type?
    			-- Always uses default object comparison criterion.
    			-- (from ANY)
    		ensure -- from ANY
    			definition: Result = (some = Void and other = Void) or else ((some /= Void and other /= Void) and then some.standard_is_equal (other))

    	frozen standard_is_equal (other: like Current): BOOLEAN
    			-- Is `other' attached to an object of the same type
    			-- as current object, and field-by-field identical to it?
    			-- (from ANY)
    		require -- from ANY
    			other_not_void: other /= Void
    		ensure -- from ANY
    			same_type: Result implies same_type (other)
    			symmetric: Result implies other.standard_is_equal (Current)

    feature -- Status report

    	conforms_to (other: ANY): BOOLEAN
    			-- Does type of current object conform to type
    			-- of `other' (as per Eiffel: The Language, chapter 13)?
    			-- (from ANY)
    		require -- from ANY
    			other_not_void: other /= Void

    	same_type (other: ANY): BOOLEAN
    			-- Is type of current object identical to type of `other'?
    			-- (from ANY)
    		require -- from ANY
    			other_not_void: other /= Void
    		ensure -- from ANY
    			definition: Result = (conforms_to (other) and other.conforms_to (Current))

    feature -- Status setting

    	reset (type: INTEGER_32)
    			-- Reset current convertor to parse real number string of type `type'.
    		require -- from STRING_TO_NUMERIC_CONVERTOR
    			type_valid: conversion_type_valid (type)
    		ensure -- from STRING_TO_NUMERIC_CONVERTOR
    			last_state_set: last_state = 0
    			sign_set: sign = 0
    			conversion_type_set: conversion_type = type
    			not_overflowed: not overflowed
    			not_underflowed: not underflowed
    			parse_successful: parse_successful
    		ensure then
    			natural_part_set: natural_part = 0
    			fractional_part_set: fractional_part = 0
    			fractional_divider_set: fractional_divider = 0
    			exponent_set: exponent = 0
    			is_negative_set: is_negative = False
    			has_negative_exponent_set: has_negative_exponent = False
    			has_fractional_part_set: has_fractional_part = False
    			needs_digit_set: needs_digit = False

    	set_leading_separators (separators: STRING_8)
    			-- Set leading_separators with `separators'.
    			-- (from STRING_TO_NUMERIC_CONVERTOR)
    		require -- from STRING_TO_NUMERIC_CONVERTOR
    			separators_not_void: separators /= Void
    			separators_valid: separators_valid (separators)
    		ensure -- from STRING_TO_NUMERIC_CONVERTOR
    			leading_separators_set: leading_separators.is_equal (separators)

    	set_leading_separators_acceptable (b: BOOLEAN)
    			-- Set leading_separators_acceptable to `b'.
    			-- (from STRING_TO_NUMERIC_CONVERTOR)
    		ensure -- from STRING_TO_NUMERIC_CONVERTOR
    			leading_separators_acceptable_set: leading_separators_acceptable = b

    	set_trailing_separators (separators: STRING_8)
    			-- Set trailing_separators with `separators'.
    			-- (from STRING_TO_NUMERIC_CONVERTOR)
    		require -- from STRING_TO_NUMERIC_CONVERTOR
    			separators_not_void: separators /= Void
    			separators_valid: separators_valid (separators)
    		ensure -- from STRING_TO_NUMERIC_CONVERTOR
    			trailing_separators_set: trailing_separators.is_equal (separators)

    	set_trailing_separators_acceptable (b: BOOLEAN)
    			-- Set trailing_separators_acceptable to `b'.
    			-- (from STRING_TO_NUMERIC_CONVERTOR)
    		ensure -- from STRING_TO_NUMERIC_CONVERTOR
    			trailing_separators_acceptable_set: trailing_separators_acceptable = b

    feature -- Duplication

    	copy (other: like Current)
    			-- Update current object using fields of object attached
    			-- to `other', so as to yield equal objects.
    			-- (from ANY)
    		require -- from ANY
    			other_not_void: other /= Void
    			type_identity: same_type (other)
    		ensure -- from ANY
    			is_equal: is_equal (other)

    	frozen deep_copy (other: like Current)
    			-- Effect equivalent to that of:
    			--		copy (`other' . deep_twin)
    			-- (from ANY)
    		require -- from ANY
    			other_not_void: other /= Void
    		ensure -- from ANY
    			deep_equal: deep_equal (Current, other)

    	frozen deep_twin: like Current
    			-- New object structure recursively duplicated from Current.
    			-- (from ANY)
    		ensure -- from ANY
    			deep_equal: deep_equal (Current, Result)

    	frozen standard_copy (other: like Current)
    			-- Copy every field of `other' onto corresponding field
    			-- of current object.
    			-- (from ANY)
    		require -- from ANY
    			other_not_void: other /= Void
    			type_identity: same_type (other)
    		ensure -- from ANY
    			is_standard_equal: standard_is_equal (other)

    	frozen standard_twin: like Current
    			-- New object field-by-field identical to `other'.
    			-- Always uses default copying semantics.
    			-- (from ANY)
    		ensure -- from ANY
    			standard_twin_not_void: Result /= Void
    			equal: standard_equal (Result, Current)

    	frozen twin: like Current
    			-- New object equal to `Current'
    			-- twin calls copy; to change copying/twining semantics, redefine copy.
    			-- (from ANY)
    		ensure -- from ANY
    			twin_not_void: Result /= Void
    			is_equal: Result.is_equal (Current)

    feature -- Basic operations

    	frozen default: like Current
    			-- Default value of object's type
    			-- (from ANY)

    	frozen default_pointer: POINTER
    			-- Default value of type `POINTER'
    			-- (Avoid the need to write `p'.default for
    			-- some `p' of type `POINTER'.)
    			-- (from ANY)

    	default_rescue
    			-- Process exception for routines with no Rescue clause.
    			-- (Default: do nothing.)
    			-- (from ANY)

    	frozen do_nothing
    			-- Execute a null action.
    			-- (from ANY)

    feature -- Output

    	io: STD_FILES
    			-- Handle to standard file setup
    			-- (from ANY)

    	out: STRING_8
    			-- New string containing terse printable representation
    			-- of current object
    			-- Was declared in ANY as synonym of tagged_out.
    			-- (from ANY)

    	print (some: ANY)
    			-- Write terse external representation of `some'
    			-- on standard output.
    			-- (from ANY)

    	frozen tagged_out: STRING_8
    			-- New string containing terse printable representation
    			-- of current object
    			-- Was declared in ANY as synonym of out.
    			-- (from ANY)

    feature -- Parse

    	parse_character (c: CHARACTER_8)
    			-- Parse character `c'.

    	parse_string_with_type (s: STRING_GENERAL; type: INTEGER_32)
    			-- Parse string `s' as real number of type `type'.
    		require -- from STRING_TO_NUMERIC_CONVERTOR
    			s_not_void: s /= Void
    			s_is_valid_as_string_8: s.is_valid_as_string_8
    			type_valid: conversion_type_valid (type)

    feature -- Platform

    	operating_environment: OPERATING_ENVIRONMENT
    			-- Objects available from the operating system
    			-- (from ANY)

    feature -- Status reporting

    	conversion_type: INTEGER_32
    			-- Type to which a string will be converted
    			-- See `NUMBER_INFORMATION' for more information.
    			-- (from STRING_TO_NUMERIC_CONVERTOR)

    	conversion_type_valid (type: INTEGER_32): BOOLEAN
    			-- Is conversion type `type' valid?

    	is_integral_double: BOOLEAN
    			-- Is character sequence that has been parsed represents a valid double?

    	is_integral_real: BOOLEAN
    			-- Is character sequence that has been parsed represents a valid real?

    	is_part_of_double: BOOLEAN
    			-- Is character sequence that has been parsed so far a valid start part of double?

    	is_part_of_real: BOOLEAN
    			-- Is character sequence that has been parsed so far a valid start part of real?

    	leading_separators: STRING_8
    			-- Leading separators
    			-- (from STRING_TO_NUMERIC_CONVERTOR)

    	leading_separators_acceptable: BOOLEAN
    			-- Are leading separators acceptable?
    			-- (from STRING_TO_NUMERIC_CONVERTOR)

    	overflowed: BOOLEAN
    			-- Is real number parsed so far overflowed?

    	parse_successful: BOOLEAN
    			-- This only means we didn't enter an invalid state when parsing,
    			-- it doesn't mean that we have got an valid double/real number.
    			-- You need to check `is_double' or `is_real'.

    	parsed_double: REAL_64
    			-- Parsed double value

    	parsed_real: REAL_32
    			-- Parsed real value

    	separators_valid (separators: STRING_8): BOOLEAN
    			-- Are separators contained in `separators' valid?
    		require -- from STRING_TO_NUMERIC_CONVERTOR
    			separators_not_void: separators /= Void

    	trailing_separators: STRING_8
    			-- Trailing separators
    			-- (from STRING_TO_NUMERIC_CONVERTOR)

    	trailing_separators_acceptable: BOOLEAN
    			-- Are trailing separators acceptable?
    			-- (from STRING_TO_NUMERIC_CONVERTOR)

    	underflowed: BOOLEAN
    			-- Is real number parsed so far underflowed?

    feature -- Type checking

    	double_type_valid (type: INTEGER_32): BOOLEAN
    			-- Is `type' a valid double type?
    			-- (from NUMERIC_INFORMATION)

    	integer_natural_type_valid (type: INTEGER_32): BOOLEAN
    			-- Is `type' a valid integer/natural type?
    			-- (from NUMERIC_INFORMATION)

    	integer_type_valid (type: INTEGER_32): BOOLEAN
    			-- Is `type' a valid integer type?
    			-- (from NUMERIC_INFORMATION)

    	natural_type_valid (type: INTEGER_32): BOOLEAN
    			-- Is `type' a valid natural type?
    			-- (from NUMERIC_INFORMATION)

    	read_type_valid (type: INTEGER_32): BOOLEAN
    			-- Is `type' a valid real type?
    			-- (from NUMERIC_INFORMATION)

    	real_double_type_valid (type: INTEGER_32): BOOLEAN
    			-- Is `type' a valid real/double type?
    			-- (from NUMERIC_INFORMATION)

    feature -- Types

    	max_integer_type: INTEGER_64
    			-- INTEGER type of max word length
    			-- (from NUMERIC_INFORMATION)

    	max_natural_type: NATURAL_64
    			-- NATURAL type of max word length
    			-- (from NUMERIC_INFORMATION)

    	type_count: INTEGER_32 is 4
    			-- Number of types of integer/natural in Eiffel
    			-- (from NUMERIC_INFORMATION)

    	type_double: INTEGER_32 is 101
    			-- Real/Double type indicators
    			-- (from NUMERIC_INFORMATION)

    	type_integer: INTEGER_32 is 3
    			-- Was declared in NUMERIC_INFORMATION as synonym of Type_integer_32.
    			-- (from NUMERIC_INFORMATION)

    	type_integer_16: INTEGER_32 is 2
    			-- (from NUMERIC_INFORMATION)

    	type_integer_32: INTEGER_32 is 3
    			-- Was declared in NUMERIC_INFORMATION as synonym of Type_integer.
    			-- (from NUMERIC_INFORMATION)

    	type_integer_64: INTEGER_32 is 4
    			-- (from NUMERIC_INFORMATION)

    	type_integer_8: INTEGER_32 is 1
    			-- (from NUMERIC_INFORMATION)

    	type_integer_natural_separator: INTEGER_32 is 10
    			-- (from NUMERIC_INFORMATION)

    	type_natural: INTEGER_32 is 13
    			-- Was declared in NUMERIC_INFORMATION as synonym of Type_natural_32.
    			-- (from NUMERIC_INFORMATION)

    	type_natural_16: INTEGER_32 is 12
    			-- (from NUMERIC_INFORMATION)

    	type_natural_32: INTEGER_32 is 13
    			-- Was declared in NUMERIC_INFORMATION as synonym of Type_natural.
    			-- (from NUMERIC_INFORMATION)

    	type_natural_64: INTEGER_32 is 14
    			-- Integer/natural type indicators
    			-- (from NUMERIC_INFORMATION)

    	type_natural_8: INTEGER_32 is 11
    			-- (from NUMERIC_INFORMATION)

    	type_no_limitation: INTEGER_32 is 0
    			-- Type representing a number sequence (no length limitation)
    			-- (from NUMERIC_INFORMATION)

    	type_real: INTEGER_32 is 100
    			-- (from NUMERIC_INFORMATION)

    invariant
    		-- from STRING_TO_NUMERIC_CONVERTOR
    	leading_separators_not_void: leading_separators /= Void
    	trailing_separators_not_void: trailing_separators /= Void

    		-- from ANY
    	reflexive_equality: standard_is_equal (Current)
    	reflexive_conformance: conforms_to (Current)

    indexing
    	library: "EiffelBase: Library of reusable components for Eiffel."
    	copyright: "Copyright (c) 1984-2006, Eiffel Software and others"
    	license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
    	source: "[
    		Eiffel Software
    		356 Storke Road, Goleta, CA 93117 USA
    		Telephone 805-685-1006, Fax 805-685-6869
    		Website http://www.eiffel.com
    		Customer support http://support.eiffel.com
    	]"

    end -- class STRING_TO_REAL_CONVERTOR