From: Marek <ficorax@gmail.com>
Subject: 2-dimensional view on 1 dimensional array
Date: Sun, 23 Oct 2022 14:31:22 +0200 [thread overview]
Message-ID: <tj3c6q$178e9$1@dont-email.me> (raw)
Hi.
Assume we have:
generic
type T is private;
type T_Array is array (Natural range <>) of aliased T;
type T_Array_Access is access all T_Array;
package Buffers is
type Row_Array is array (Natural range <>) of aliased
T_Array_Access;
type Row_Array_Access is access all Row_Array;
type Buffer is tagged
record
Raw_Buffer : T_Array_Access := null;
Rows_Table : Row_Array_Access := null;
Rows : Natural := 0;
Columns : Natural := 0;
Step : Integer := 0;
Max_Rows : Natural := 0;
end record;
procedure Init
(This : in out Buffer;
Buffer : T_Array_Access;
Rows : Natural;
Columns : Natural;
Step : Integer);
procedure Set_Value
(This : in out Buffer;
Value : T);
end Buffers;
..and:
with Ada.Unchecked_Deallocation;
package body Buffers is
type T_Access is access all T;
------------
-- Init --
------------
procedure Init
(This : in out Buffer;
Buffer : T_Array_Access;
Rows : Natural;
Columns : Natural;
Step : Integer)
is
procedure Free is
new Ada.Unchecked_Deallocation (Row_Array, Row_Array_Access);
Row_Index : Integer := 0;
begin
This.Raw_Buffer := Buffer;
This.Rows := Rows;
This.Columns := Columns;
This.Step := Step;
if Rows > This.Max_Rows then
if This.Rows_Table /= null then
Free (This.Rows_Table);
end if;
declare
New_Rows : constant Row_Array_Access :=
new Row_Array (0 .. Rows - 1);
begin
This.Rows_Table := New_Rows;
This.Max_Rows := Rows;
end;
end if;
for H in 0 .. Rows - 1 loop
declare
Row_Start : constant T_Access :=
This.Raw_Buffer (Row_Index * Step)'Access;
begin
This.Rows_Table (H) := ... -- What code here?
Row_Index := Row_Index + 1;
end;
end loop;
end Init;
-----------------
-- Set_Value --
-----------------
procedure Set_Value
(This : in out Buffer;
Value : T)
is
begin
if This.Rows > 0 then
for Y in 0 .. This.Rows - 1 loop
declare
Row : constant T_Array_Access := This.Rows_Table (Y);
begin
if This.Step > 0 then
for X in 0 .. This.Step - 1 loop
Row (X) := Value;
end loop;
end if;
end;
end loop;
end if;
end Set_Value;
end Buffers;
and finally:
with Buffers;
procedure Test is
type Float_Array is array (Natural range <>) of aliased Float;
type Float_Array_Access is access all Float_Array;
package Buffer_Package is
new Buffers (Float, Float_Array, Float_Array_Access);
use Buffer_Package;
A : aliased Float_Array := (0 .. 99 => 0.0);
B : Buffer_Package.Buffer;
begin
B.Init (A'Access, 10, 10, 10);
B.Set_Value (10.0);
end Test;
Is there any possibilities to get this working?
Idea is to have another (2 dimensional) view on 1 dimensional array.
Unchecked_Conversion is not working (different sizes of objects).
Address_To_Access conversion also (unconstrained array);
Marek
next reply other threads:[~2022-10-23 12:31 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-23 12:31 Marek [this message]
2022-10-24 10:31 ` 2-dimensional view on 1 dimensional array AdaMagica
2022-10-24 10:35 ` AdaMagica
2022-10-25 11:05 ` AdaMagica
2022-10-25 12:57 ` J-P. Rosen
2022-10-25 15:53 ` Jeffrey R.Carter
2022-10-25 19:55 ` J-P. Rosen
-- strict thread matches above, loose matches on Subject: below --
2022-10-25 16:59 Marek
2022-10-26 8:57 ` J-P. Rosen
2022-10-26 15:08 ` AdaMagica
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox