comp.lang.ada
 help / color / mirror / Atom feed
* 2-dimensional view on 1 dimensional array
@ 2022-10-23 12:31 Marek
  2022-10-24 10:31 ` AdaMagica
  2022-10-25 12:57 ` J-P. Rosen
  0 siblings, 2 replies; 10+ messages in thread
From: Marek @ 2022-10-23 12:31 UTC (permalink / 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

^ permalink raw reply	[flat|nested] 10+ messages in thread
* Re: 2-dimensional view on 1 dimensional array
@ 2022-10-25 16:59 Marek
  2022-10-26  8:57 ` J-P. Rosen
  2022-10-26 15:08 ` AdaMagica
  0 siblings, 2 replies; 10+ messages in thread
From: Marek @ 2022-10-25 16:59 UTC (permalink / raw)


I want just to know if it is possible to make different "view" on 1 
dimensional array. And of course I meant not 2-dimensional array but 
array of arrays. Reason for that is that I want to use slicing on that view.

Ok, here is full specification:

     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);

       function Get_Buffer
         (This : Rendering_Buffer)
          return T_Array_Access
       is (This.Buffer);

       function Get_Rows_Table
         (This : Rendering_Buffer)
          return Row_Array_Access
       is (This.Rows);

       function Get_Columns
         (This : Rendering_Buffer)
          return Natural
       is (This.Columns);

       function Get_Rows
         (This : Rendering_Buffer)
          return Natural
       is (This.Rows);

       function Get_Step
         (This : Rendering_Buffer)
          return Integer
       is (This.Step);

       function Move_Start
         (This       : Rendering_Buffer;
          Col_Offset : Natural;
          Row_Offset : Natural)
          return T_Array_Access;

       function Row
         (This   : Rendering_Buffer;
          R      : Natural)
          return T_Array_Access;

       procedure Copy_From
         (This   : in out Rendering_Buffer;
          Source :        Rendering_Buffer);

     end Buffers;

I consider this package to be a kind of template that I can apply to the 
raw data and get what it expects. That is why I am using access types.
I know this is very C-ish but...

thank you for your answers everybody
Marek
p.s. Be aware that this group is read not only by software engineers. 
Carpenters may also happen ... :)

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2022-10-26 15:08 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-10-23 12:31 2-dimensional view on 1 dimensional array Marek
2022-10-24 10:31 ` 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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox