with Tiles.Matrices; use Tiles.Matrices;
private with Ada.Containers;
private with Ada.Containers.Hashed_Maps;
private with Ada.Containers.Vectors;
private with Ada.Unchecked_Conversion;
private package Tiles.Indices is
type Tile_Index is private;
type A_Tile_Index is access all Tile_Index;
pragma No_Strict_Aliasing( A_Tile_Index );
function Create_Tile_Index return A_Tile_Index;
pragma Postcondition( Create_Tile_Index'Result /= null );
function Load_Index( archive : not null A_Archive;
filename : String ) return A_Tile_Index;
pragma Postcondition( filename'Length > 0 );
procedure Add_Matrix( index : not null A_Tile_Index; matrix : in out A_Tile_Matrix );
pragma Precondition( matrix /= null );
pragma Postcondition( matrix = null );
procedure Add_Tile( index : not null A_Tile_Index; tile : in out A_Tile );
pragma Postcondition( tile = null );
procedure Delete( index : in out A_Tile_Index );
pragma Postcondition( index = null );
function Get_Matrix( index : not null A_Tile_Index; num : Natural ) return A_Tile_Matrix;
function Get_Matrix_Count( index : not null A_Tile_Index ) return Natural;
function Get_Progress( index : not null A_Tile_Index ) return Natural;
pragma Postcondition( Get_Progress'Result <= 100 );
function Get_Slot( index : not null A_Tile_Index; id : Natural ) return Natural;
function Get_Tile( index : not null A_Tile_Index; id : Natural ) return A_Tile;
function Get_Tile( index : not null A_Tile_Index; name : String ) return A_Tile;
pragma Precondition( name'Length > 0 );
function Get_Tile_At_Slot( index : not null A_Tile_Index;
slot : Natural ) return A_Tile;
function Get_Tile_Count( index : not null A_Tile_Index ) return Natural;
procedure Iterate_Tiles( index : not null A_Tile_Index;
examine : not null access procedure( tile : A_Tile ) );
procedure Load_Complete( index : not null A_Tile_Index );
procedure Load_Images( index : not null A_Tile_Index;
archive : not null A_Archive );
procedure Prioritize_Tile( index : not null A_Tile_Index; tile : not null A_Tile );
function Write_Index( index : not null A_Tile_Index;
filename : String ) return Boolean;
pragma Precondition( filename'Length > 0 );
function Index_Extension return String;
pragma Postcondition( Index_Extension'Result'Length > 0 );
function Index_Identifier return String;
pragma Postcondition( Index_Identifier'Result'Length > 0 );
DUPLICATE_TILE : exception;
private
use Ada.Containers;
protected type Tile_Queue is
procedure Add_Back( tile : not null A_Tile );
function Get_Progress return Natural;
pragma Postcondition( Get_Progress'Result <= 100 );
procedure Prioritize( tile : not null A_Tile );
procedure Remove( tile : out A_Tile );
procedure Stop;
private
queue : Tile_Lists.List;
total : Natural := 0;
loaded : Natural := 0;
stopped : Boolean := False;
end Tile_Queue;
type A_Tile_Queue is access all Tile_Queue;
procedure Delete( queue : in out A_Tile_Queue );
pragma Postcondition( queue = null );
function Hash is new Ada.Unchecked_Conversion( Integer, Hash_Type );
package Integer_Vectors is new Ada.Containers.Vectors( Positive, Natural, "=" );
package Matrix_Vectors is new Ada.Containers.Vectors( Positive, A_Tile_Matrix, "=" );
package Tile_Maps is new Ada.Containers.Hashed_Maps( Integer, A_Tile, Hash, "=", "=" );
type Tile_Index is
record
idmap : Tile_Maps.Map;
list : Integer_Vectors.Vector;
matlist : Matrix_Vectors.Vector;
loadlist : A_Tile_Queue;
end record;
function A_Tile_Index_Input( stream : access Root_Stream_Type'Class ) return A_Tile_Index;
for A_Tile_Index'Input use A_Tile_Index_Input;
procedure A_Tile_Index_Output( stream : access Root_Stream_Type'Class; index : A_Tile_Index );
for A_Tile_Index'Write use A_Tile_Index_Output;
for A_Tile_Index'Output use A_Tile_Index_Output;
end Tiles.Indices;