package Values.Numbers is
type Number_Value is new Value with private;
type Number_Ptr is new Value_Ptr with private;
function Create( val : Integer ) return Number_Ptr;
function Create( val : Long_Float ) return Number_Ptr;
overriding
function Clone( this : access Number_Value ) return Value_Ptr'Class;
overriding
function Compare( this : Number_Value; other : Value'Class ) return Integer;
overriding
function Get_Type( this : Number_Value ) return Value_Type;
overriding
function Image( this : Number_Value ) return String;
function To_Float( this : Number_Value ) return Float;
function To_Int( this : Number_Value ) return Integer;
function "-"( l : Number_Value ) return Number_Ptr'Class; pragma Inline( "-" );
function "abs"( l : Number_Value ) return Number_Ptr'Class; pragma Inline( "abs" );
function "+"( l, r : Number_Value ) return Number_Ptr'Class; pragma Inline( "+" );
function "-"( l, r : Number_Value ) return Number_Ptr'Class; pragma Inline( "-" );
function "*"( l, r : Number_Value ) return Number_Ptr'Class; pragma Inline( "*" );
function "/"( l, r : Number_Value ) return Number_Ptr'Class; pragma Inline( "/" );
function "**"( l, r : Number_Value ) return Number_Ptr'Class; pragma Inline( "**" );
function "mod"( l, r : Number_Value ) return Number_Ptr'Class; pragma Inline( "mod" );
function "rem"( l, r : Number_Value ) return Number_Ptr'Class; pragma Inline( "rem" );
function As_Number( ptr : Value_Ptr'Class ) return Number_Ptr;
function As_Value( this : Number_Ptr ) return Value_Ptr;
function Get( this : Number_Ptr ) return access Number_Value'Class; pragma Inline( Get );
function "-"( l : Number_Ptr ) return Number_Ptr; pragma Inline( "-" );
function "abs"( l : Number_Ptr ) return Number_Ptr; pragma Inline( "abs" );
function "+"( l, r : Number_Ptr ) return Number_Ptr; pragma Inline( "+" );
function "-"( l, r : Number_Ptr ) return Number_Ptr; pragma Inline( "-" );
function "*"( l, r : Number_Ptr ) return Number_Ptr; pragma Inline( "*" );
function "/"( l, r : Number_Ptr ) return Number_Ptr; pragma Inline( "/" );
function "**"( l, r : Number_Ptr ) return Number_Ptr; pragma Inline( "**" );
function "mod"( l, r : Number_Ptr ) return Number_Ptr; pragma Inline( "mod" );
function "rem"( l, r : Number_Ptr ) return Number_Ptr; pragma Inline( "rem" );
function "="( l : Number_Ptr; r : Integer ) return Boolean; pragma Inline( "=" );
function "="( l : Number_Ptr; r : Long_Float ) return Boolean; pragma Inline( "=" );
function "<"( l : Number_Ptr; r : Integer ) return Boolean; pragma Inline( "<" );
function "<"( l : Number_Ptr; r : Long_Float ) return Boolean; pragma Inline( "<" );
function ">"( l : Number_Ptr; r : Integer ) return Boolean; pragma Inline( ">" );
function ">"( l : Number_Ptr; r : Long_Float ) return Boolean; pragma Inline( ">" );
function "<="( l : Number_Ptr; r : Integer ) return Boolean; pragma Inline( "<=" );
function "<="( l : Number_Ptr; r : Long_Float ) return Boolean; pragma Inline( "<=" );
function ">="( l : Number_Ptr; r : Integer ) return Boolean; pragma Inline( ">=" );
function ">="( l : Number_Ptr; r : Long_Float ) return Boolean; pragma Inline( ">=" );
function "+"( l : Number_Ptr; r : Integer ) return Number_Ptr; pragma Inline( "+" );
function "+"( l : Number_Ptr; r : Long_Float ) return Number_Ptr; pragma Inline( "+" );
function "-"( l : Number_Ptr; r : Integer ) return Number_Ptr; pragma Inline( "-" );
function "-"( l : Number_Ptr; r : Long_Float ) return Number_Ptr; pragma Inline( "-" );
function "*"( l : Number_Ptr; r : Integer ) return Number_Ptr; pragma Inline( "*" );
function "*"( l : Number_Ptr; r : Long_Float ) return Number_Ptr; pragma Inline( "*" );
function "/"( l : Number_Ptr; r : Integer ) return Number_Ptr; pragma Inline( "/" );
function "/"( l : Number_Ptr; r : Long_Float ) return Number_Ptr; pragma Inline( "/" );
function "**"( l : Number_Ptr; r : Integer ) return Number_Ptr; pragma Inline( "**" );
function "**"( l : Number_Ptr; r : Long_Float ) return Number_Ptr; pragma Inline( "**" );
function "mod"( l : Number_Ptr; r : Integer ) return Number_Ptr; pragma Inline( "mod" );
function "rem"( l : Number_Ptr; r : Integer ) return Number_Ptr; pragma Inline( "rem" );
function "="( l : Integer; r : Number_Ptr ) return Boolean; pragma Inline( "=" );
function "="( l : Long_Float; r : Number_Ptr ) return Boolean; pragma Inline( "=" );
function "<"( l : Integer; r : Number_Ptr ) return Boolean; pragma Inline( "<" );
function "<"( l : Long_Float; r : Number_Ptr ) return Boolean; pragma Inline( "<" );
function ">"( l : Integer; r : Number_Ptr ) return Boolean; pragma Inline( ">" );
function ">"( l : Long_Float; r : Number_Ptr ) return Boolean; pragma Inline( ">" );
function "<="( l : Integer; r : Number_Ptr ) return Boolean; pragma Inline( "<=" );
function "<="( l : Long_Float; r : Number_Ptr ) return Boolean; pragma Inline( "<=" );
function ">="( l : Integer; r : Number_Ptr ) return Boolean; pragma Inline( ">=" );
function ">="( l : Long_Float; r : Number_Ptr ) return Boolean; pragma Inline( ">=" );
function "+"( l : Integer; r : Number_Ptr ) return Number_Ptr; pragma Inline( "+" );
function "+"( l : Long_Float; r : Number_Ptr ) return Number_Ptr; pragma Inline( "+" );
function "-"( l : Integer; r : Number_Ptr ) return Number_Ptr; pragma Inline( "-" );
function "-"( l : Long_Float; r : Number_Ptr ) return Number_Ptr; pragma Inline( "-" );
function "*"( l : Integer; r : Number_Ptr ) return Number_Ptr; pragma Inline( "*" );
function "*"( l : Long_Float; r : Number_Ptr ) return Number_Ptr; pragma Inline( "*" );
function "/"( l : Integer; r : Number_Ptr ) return Number_Ptr; pragma Inline( "/" );
function "/"( l : Long_Float; r : Number_Ptr ) return Number_Ptr; pragma Inline( "/" );
function "**"( l : Integer; r : Number_Ptr ) return Number_Ptr; pragma Inline( "**" );
function "**"( l : Long_Float; r : Number_Ptr ) return Number_Ptr; pragma Inline( "**" );
function "mod"( l : Integer; r : Number_Ptr ) return Number_Ptr; pragma Inline( "mod" );
function "rem"( l : Integer; r : Number_Ptr ) return Number_Ptr; pragma Inline( "rem" );
Nul : constant Number_Ptr;
private
type Number_Value is new Value with
record
val : Long_Float := 0.0;
end record;
type A_Naked_Number is access all Number_Value'Class;
overriding
function Value_Input( stream : access Root_Stream_Type'Class ) return Number_Value;
for Number_Value'Input use Value_Input;
overriding
procedure Value_Read( stream : access Root_Stream_Type'Class; this : out Number_Value );
for Number_Value'Read use Value_Read;
procedure Value_Write( stream : access Root_Stream_Type'Class; this : Number_Value );
for Number_Value'Write use Value_Write;
type Number_Ptr is new Value_Ptr with null record;
Nul : constant Number_Ptr := (Value_Ptr with others => <>);
end Values.Numbers;