comp.lang.ada
 help / color / mirror / Atom feed
From: Daniel <danielnorberto@gmail.com>
Subject: Re: Visibility issue
Date: Mon, 14 Sep 2020 04:33:34 -0700 (PDT)	[thread overview]
Message-ID: <27269975-58eb-407b-98ca-344bee6894d2n@googlegroups.com> (raw)
In-Reply-To: <rjgor5$fhs$1@gioia.aioe.org>

Thank you for your answer Dmitry. Let me focus and change my example to easier go to the problem. I will write some question to your answer at the end of the example.

I didn't write it in the example for simplicity, but the user has to set a callback function.
This callback function is triggered in the internal implementation hierarchy packages. Let me show you the code within questions inside comments:

--- API SIDE: -----
package API.Callbacks
   type Handle is tagged private
   type pointer_to_Procedure is access procedure (Self : API.CAllbacks.Handle );
   procedure Set_Callback (Self: in out API_HandleCallBack; cp: CallbackProcedure  );
private
   type Handle is tagged record
      Hidden : Natural;
   end record;
  procedure Hidden_constructor (S: in out Handle'Class ; Hidden_content :Natural);
---------------
----- IMPLEMENTING SIDE: --------
private with API.Callbacks;
package body Internal.TASKS_Callbacks is

task body Caller is

 MyHandle : API.Handle;
 cp: CallbackProcedure := Get_from_pool_of_callbacks;
begin
  Hidden_Constructor (MyHandle, 6);
   --Cannot access to private part for API.Handle from here :(
  -- compiler says that Hidden_Constructor is not a visible entity of" Callbacks"
  -- I just wanted to build it to later call to the procedure:
   cp (MyHandle);
end Caller;

> Why is this a primitive operation? I would consider rather 
> 
> function Access_to_hide_content return User_type'Class; 
> 
> In presence of potential overriding things like these are usually 
> class-wide.
Using the updated example I've tried to use an Hidden_constructor using class-wide but compiler says
>"Hidden_Constructor" is not a visible entity of API.Callbacks.

.
> You can also use aggregation:
> type User_type is tagged with private;
> private 
> type User_type is tagged with record 
> Implementation : Private_Stuff; 
> end record; 
> 
> Private_Stuff may have its own hierarchy. This pattern works well with 
> limited types. You want the interface being non-limited, but the 
> implementation of limited in order to control/prevent excessive copying 
> and support in-place updates. So you make the interface a holder or a 
> smart pointer to the reference-counted implementation. 

Thank you for the idea, but I don't know if its really possible for the callback action I need to "call".
Lets say i extend Handle outside of API package hierarchy:

private with API.Callbacks;
package Internal.TASKS_Callbacks is
   type Handle_child is new API.Calbacks.Handle with null record;
  procedure Hidden_constructor (S: in out Handle_child; Hidden_content :Natural);
-------
package body Internal.TASKS_Callbacks is

task body Caller is

 MyHandle : Handle_child;
 mycall: CallbackProcedure := Get_from_pool_of_callbacks;
begin
  Hidden_Constructor (MyHandle, 6);
-- But now i need to trigger the callback procedure and that procedure is defined using Handle type, not the child Handle_child
-- how can i call the original callback procedure???
-- if I do the next 
mycall (MyHandle); --it raises that expect the father, not the child:

end task;

As you see.. how can i call from here the User callback procedure?


  reply	other threads:[~2020-09-14 11:33 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-11 10:37 Visibility issue Daniel
2020-09-11 11:51 ` Maxim Reznik
2020-09-11 20:11   ` Daniel
2020-09-11 14:23 ` Jeffrey R. Carter
2020-09-11 20:17   ` Daniel
2020-09-11 22:36     ` Jeffrey R. Carter
2020-09-14 10:47       ` Daniel
2020-09-14 16:10         ` Jeffrey R. Carter
2020-09-15 19:11           ` Daniel
2020-09-15 20:03             ` Jeffrey R. Carter
2020-09-11 21:05 ` Dmitry A. Kazakov
2020-09-14 11:33   ` Daniel [this message]
2020-09-14 14:42     ` Dmitry A. Kazakov
2020-09-15 19:35       ` Daniel
2020-09-16  7:14         ` Dmitry A. Kazakov
2020-09-16 10:23           ` Daniel
2020-09-16 10:58             ` Dmitry A. Kazakov
2020-09-16 14:35               ` Daniel
2020-09-16 14:49                 ` Jeffrey R. Carter
2020-09-16 15:05                 ` Dmitry A. Kazakov
2020-09-16 20:09                   ` Daniel
2020-09-16 21:48                     ` Simon Wright
2020-09-17 13:31                       ` Daniel
2020-09-17 15:00                         ` Dmitry A. Kazakov
2020-09-17 15:32                           ` Daniel
2020-09-17 16:47                             ` Dmitry A. Kazakov
2020-09-18  8:05                         ` Simon Wright
2020-09-14 16:18 ` Simon Wright
2020-09-17 15:58 ` Jere
2020-09-17 16:10 ` Jere
2020-09-18  8:08   ` Simon Wright
2020-09-17 21:47 ` Shark8
replies disabled

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