note description: "String - Integer/Natural conversion overflow checker" library: "Free implementation of ELKS library" status: "See notice at end of class." legal: "See notice at end of class." date: "$Date: 2017-03-23 20:42:57 +0000 (Thu, 23 Mar 2017) $" revision: "$Revision: 100036 $" class INTEGER_OVERFLOW_CHECKER inherit NUMERIC_INFORMATION create make feature {NONE} -- Initialization make -- Initialize. do create integer_overflow_state1.make_empty (Type_count * 2 + 1); integer_overflow_state1.extend (0) create integer_overflow_state2.make_empty (Type_count * 2 + 1); integer_overflow_state2.extend (0); integer_overflow_state1.extend (({INTEGER_8}.max_value // 10).to_natural_64); integer_overflow_state2.extend (({INTEGER_8}.max_value \\ 10).to_natural_64); integer_overflow_state1.extend (({INTEGER_16}.max_value // 10).to_natural_64); integer_overflow_state2.extend (({INTEGER_16}.max_value \\ 10).to_natural_64); integer_overflow_state1.extend (({INTEGER_32}.max_value // 10).to_natural_64); integer_overflow_state2.extend (({INTEGER_32}.max_value \\ 10).to_natural_64); integer_overflow_state1.extend (({INTEGER_64}.max_value // 10).to_natural_64); integer_overflow_state2.extend (({INTEGER_64}.max_value \\ 10).to_natural_64); integer_overflow_state1.extend ((- ({INTEGER_8}.min_value // 10)).to_natural_64); integer_overflow_state2.extend ((- ({INTEGER_8}.min_value \\ 10)).to_natural_64); integer_overflow_state1.extend ((- ({INTEGER_16}.min_value // 10)).to_natural_64); integer_overflow_state2.extend ((- ({INTEGER_16}.min_value \\ 10)).to_natural_64); integer_overflow_state1.extend ((- ({INTEGER_32}.min_value // 10)).to_natural_64); integer_overflow_state2.extend ((- ({INTEGER_32}.min_value \\ 10)).to_natural_64); integer_overflow_state1.extend ((- ({INTEGER_64}.min_value // 10)).to_natural_64); integer_overflow_state2.extend ((- ({INTEGER_64}.min_value \\ 10)).to_natural_64) create natural_overflow_state1.make_empty (Type_count + 1); natural_overflow_state1.extend (0) create natural_overflow_state2.make_empty (Type_count + 1); natural_overflow_state2.extend (0); natural_overflow_state1.extend (({NATURAL_8}.max_value // 10).to_natural_64); natural_overflow_state2.extend (({NATURAL_8}.max_value \\ 10).to_natural_64); natural_overflow_state1.extend (({NATURAL_16}.max_value // 10).to_natural_64); natural_overflow_state2.extend (({NATURAL_16}.max_value \\ 10).to_natural_64); natural_overflow_state1.extend (({NATURAL_32}.max_value // 10).to_natural_64); natural_overflow_state2.extend (({NATURAL_32}.max_value \\ 10).to_natural_64); natural_overflow_state1.extend (({NATURAL_64}.max_value // 10).to_natural_64); natural_overflow_state2.extend (({NATURAL_64}.max_value \\ 10).to_natural_64) end feature -- Overflow checking will_overflow (part1: like max_natural_type; part2: like max_natural_type; type: INTEGER_32; sign: INTEGER_32): BOOLEAN -- Will part1 * 10 + part2 with sign overflow -- if we convert it to an number of type? require type_valid: integer_natural_type_valid (type) local l_index: INTEGER_32 do if type /= Type_no_limitation then if type = Type_integer_8 or type = Type_integer_16 or type = Type_integer_32 or type = Type_integer_64 then l_index := sign * 4 + type Result := part1 > integer_overflow_state1.item (l_index) or (part1 = integer_overflow_state1.item (l_index) and part2 > integer_overflow_state2.item (l_index)) elseif sign = 1 then Result := part1 > 0 or part2 > 0 else l_index := type - Type_integer_natural_separator Result := part1 > natural_overflow_state1.item (l_index) or (part1 = natural_overflow_state1.item (l_index) and part2 > natural_overflow_state2.item (l_index)) end end end feature {NONE} -- Implementation integer_overflow_state1: SPECIAL [like max_natural_type] integer_overflow_state2: SPECIAL [like max_natural_type] natural_overflow_state1: SPECIAL [like max_natural_type] natural_overflow_state2: SPECIAL [like max_natural_type] -- Arrays to check conversion overflow. note copyright: "Copyright (c) 1984-2017, Eiffel Software and others" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" source: "[ Eiffel Software 5949 Hollister Ave., 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 INTEGER_OVERFLOW_CHECKER
Generated by ISE EiffelStudio