with Ada.Streams; use Ada.Streams;
with Objects; use Objects;
private with Ada.Strings.Unbounded;
package Values is
type Value is abstract new Object with private;
type A_Value is access all Value'Class;
function Create_Value( val : Boolean ) return A_Value;
pragma Postcondition( Create_Value'Result /= null );
function Create_Value( val : Integer ) return A_Value;
pragma Postcondition( Create_Value'Result /= null );
function Create_Value( val : String ) return A_Value;
pragma Postcondition( Create_Value'Result /= null );
function As_Boolean( this : access Value ) return Boolean;
function As_Integer( this : access Value ) return Integer;
function As_String( this : access Value ) return String;
function Object_Input( stream : access Root_Stream_Type'Class ) return Value is abstract;
function Copy( src : A_Value ) return A_Value;
pragma Postcondition( Copy'Result /= src or else src = null );
procedure Delete( this : in out A_Value );
pragma Postcondition( this = null );
VALUE_NOT_FOUND,
INVALID_CONVERSION : exception;
private
use Ada.Strings.Unbounded;
type Value is abstract new Object with null record;
procedure Object_Read( stream : access Root_Stream_Type'Class; obj : out Value );
for Value'Read use Object_Read;
procedure Object_Write( stream : access Root_Stream_Type'Class; obj : Value );
for Value'Write use Object_Write;
function A_Value_Input( stream : access Root_Stream_Type'Class ) return A_Value;
for A_Value'Input use A_Value_Input;
procedure A_Value_Output( stream : access Root_Stream_Type'Class; obj : A_Value );
for A_Value'Output use A_Value_Output;
procedure A_Value_Read( stream : access Root_Stream_Type'Class; obj : out A_Value );
for A_Value'Read use A_Value_Read;
procedure A_Value_Write( stream : access Root_Stream_Type'Class; obj : A_Value );
for A_Value'Write use A_Value_Write;
type Val_Bool is new Value with
record
bool : Boolean;
end record;
function As_Boolean( this : access Val_Bool ) return Boolean;
function As_Integer( this : access Val_Bool ) return Integer;
function As_String( this : access Val_Bool ) return String;
function Object_Input( stream : access Root_Stream_Type'Class ) return Val_Bool;
for Val_Bool'Input use Object_Input;
procedure Object_Read( stream : access Root_Stream_Type'Class; obj : out Val_Bool );
for Val_Bool'Read use Object_Read;
procedure Object_Write( stream : access Root_Stream_Type'Class; obj : Val_Bool );
for Val_Bool'Write use Object_Write;
function To_String( this : access Val_Bool ) return String;
type Val_Int is new Value with
record
int : Integer;
end record;
function As_Boolean( this : access Val_Int ) return Boolean;
function As_Integer( this : access Val_Int ) return Integer;
function As_String( this : access Val_Int ) return String;
function Object_Input( stream : access Root_Stream_Type'Class ) return Val_Int;
for Val_Int'Input use Object_Input;
procedure Object_Read( stream : access Root_Stream_Type'Class; obj : out Val_Int );
for Val_Int'Read use Object_Read;
procedure Object_Write( stream : access Root_Stream_Type'Class; obj : Val_Int );
for Val_Int'Write use Object_Write;
function To_String( this : access Val_Int ) return String;
type Val_String is new Value with
record
str : Unbounded_String;
end record;
procedure Adjust( this : access Val_String );
function As_String( this : access Val_String ) return String;
function Object_Input( stream : access Root_Stream_Type'Class ) return Val_String;
for Val_String'Input use Object_Input;
procedure Object_Read( stream : access Root_Stream_Type'Class; obj : out Val_String );
for Val_String'Read use Object_Read;
procedure Object_Write( stream : access Root_Stream_Type'Class; obj : Val_String );
for Val_String'Write use Object_Write;
function To_String( this : access Val_String ) return String;
end Values;