--------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Gnostic is Ada Generic Neural Object System Engineering.                                                                                                --
-- Gnostic (C) Copyright 2016 Manuel De Girardi.                                                                                                           --
--------------------------------------------------------------------------------------------------------------------------------------------------------------
  
--------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Date        := 2016-11-27 23:02:04 ; 
-- Description : Ada Generic Neural Object System Engineering.                                                                                              --
-- Version     := 2016.17.1a ; 
-- Authors     : Manuel De Girardi.                                                                                                                         --
--------------------------------------------------------------------------------------------------------------------------------------------------------------
with Gnos.Parameters;
with Gnos.Machines;
with Gnos.lexical;
generic   
   Params : Parameters.Objects_Parameters_Type;
   

package Gnos.Objects is
   use Parameters;
   Machines_Params : constant Language_Parameters_Type := Language_Parameters_Type(params);
   package Language is new Gnos.Machines(Machines_Params);

   Objects_Params : Parameters.Objects_Parameters_Type := Params;
   
   use Language;
   use Language.Agnose_Projects;   

   package Name_8 is new Gnos.lexical.code_random(8);
   use Name_8;
   package Name_12 is new Gnos.lexical.code_random(12);
   use Name_12;
   package Name_16 is new Gnos.lexical.code_random(16);
   use Name_16;

   type Abstract_Object is abstract tagged null record;
   
   type Object_Access is access all Abstract_Object'Class;
   
      
   Objects_Max : Natural := Params.Objects_Max;
   
   type Object_Index_Type is new Natural range 0..Objects_Max;
   
   type Objects_Array_Type is array (Object_Index_Type range <>) of Object_Access;
   
     
   type Objects_Context_Record is new Language_Context_Record with
      record
	 Objects_Params : Parameters.Objects_Parameters_Type := Objects.Params;
	 Objects_Table  : Objects_Array_Type(1..Object_Index_Type'Last);
	 Object_Index   : Object_Index_Type := 0;
      end record;
   
   
   procedure initialize(Objects_Context : in out Objects_Context_Record;
			Objects_Params  : in Objects_Parameters_Type);
   
   procedure Load_project(Objects_Context : in out Objects_Context_Record;			
			Ada_Path : in String;
			Gtk_Path : in String;
			Aws_Path : in String;
			Project_Path : in String);
   
   function Check_Parameters(Objects_Context : in Objects_Context_Record'Class;
			    Params : in Objects_Parameters_Type'class) return Boolean;
   

   type Object_unit_record is new Language_unit_record with
      record
	 null;
      end record;
   type Object_Unit_Access is access all Language_Unit_record;
   type Objects_set_array_type is array (Positive) of Language_Unit_Access;
   type objects_set_access is access Language_Set_array_type;
   type objects_System is new Language_System with
	record
		Index : Natural := 0;
		Objects_set : Objects_set_access;
	end record;
	
end Gnos.Objects;