comp.lang.ada
 help / color / mirror / Atom feed
From: Daniel Norte Moraes <danielcheagle@gmail.com>
Subject: Re: ? Is ok return a  type derived from ada.finalization.controlled from a "Pure_Function" ? thanks.
Date: Sat, 26 Jan 2019 09:02:15 -0800 (PST)
Date: 2019-01-26T09:02:15-08:00	[thread overview]
Message-ID: <61e9c444-de24-432a-a656-58aa1ccbbecd@googlegroups.com> (raw)
In-Reply-To: <db66050e-9606-4c79-bd21-6c0164913181@googlegroups.com>

Em quinta-feira, 24 de janeiro de 2019 21:56:12 UTC-2, Daniel Norte Moraes  escreveu:
> Hi!
> 
>   Is ok return a type derived from ada.finalization.controlled 
> from a function declared "Pure_Function" ?
> 
>   Or yet, is ok declare a fuction returning a 
> controlled type as "pure_function" ?
> 
>   Thanks in Advance!!!
>   
> []'s Dani. :-)
> 
>  note1 : the type has a access value.
>  note2 : initialize, adjust and finalize overrided and working :-)
> 
>  fragment example code:
> 
> ---------------------------------
> pragma Ada_2012;
> pragma Detect_Blocking;
> 
> with Ada.Finalization;
> 
> package Arbitrary
>   with preelaborate
> is
> 
>    type Arbitrary_Type (size : Positive) is
>      new Ada.Finalization.Controlled with private;
> 
>    function To_Arbitrary (value : Integer; precision : Integer)
>      return Arbitrary_Type
>       with inline; -- Can I add "pure_function" ?
> 
> private
> 
>   type Mantissa_Type is array (Positive range <>) of Integer;
>   type Mantissa_Pointer is access Mantissa_Type;
> 
>   type Arbitrary_Type (size : Positive) is
>     new Ada.Finalization.Controlled with record
>       mantissa    : Mantissa_Pointer;
>       exponent    : Integer;
>       sign        : Integer range -1 .. 1;
>       precision   : Positive := size;
>    end record;
> 
> end arbitrary;
> 
> -----------------------------------------------
> 
> 
> pragma Ada_2012;
> pragma Detect_Blocking;
> 
> with Ada.Unchecked_Deallocation;
> 
> package body Arbitrary is
> 
>   procedure Delete is new Ada.Unchecked_Deallocation (Mantissa_Type,
>     Mantissa_Pointer);
> 
>   -----------------------------------------------------------------------
>   -- Initialize an Arbitrary_Type
>   -----------------------------------------------------------------------
>   procedure Initialize (Object : in out Arbitrary_Type) is
>   begin
>     Object.mantissa     := new Mantissa_Type (1 .. Object.precision);
>     Object.exponent     := 0;
>     Object.sign         := 1;
>     -- "here" for diminish race condition from OS' s
>     Object.mantissa.all := (others => 0);
>   end Initialize;
> 
>   -----------------------------------------------------------------------
>   -- Fix an Arbitrary_Type after being assigned a value
>   -----------------------------------------------------------------------
>   procedure Adjust (Object : in out Arbitrary_Type) is
>   begin
>     Object.mantissa := new Mantissa_Type'(Object.mantissa.all);
>   end Adjust;
> 
>   -----------------------------------------------------------------------
>   -- Release an Arbitrary_Type;
>   -----------------------------------------------------------------------
>   procedure Finalize (Object : in out Arbitrary_Type) is
>   begin
>     if Object.mantissa /= null then
>       Delete (Object.mantissa);
>     end if;
>     Object.mantissa := null;
>   end Finalize;
>   
>   -----------------------------------------------------------------------
>   -- Convert an Integer type to an Arbitrary_Type
>   -----------------------------------------------------------------------
>   function To_Arbitrary (value : Integer; precision : Integer)
>     return Arbitrary_Type is
>     result    : Arbitrary_Type (precision);
>   begin
>     result.mantissa (result.exponent + 1) := value;
>     Normalize (result);
>     return result;
>   end To_Arbitrary;
> 
> end arbitrary;
> -------------------------------------------------------------------
> 
>  Really Thanks! :-)
>  []'s Dani. :-)

Thanks Randy,Shark8 and Simon! :-)

Continuing the work, I tested including pure_function and the craziest mistakes popped up.
gdb showed that pure_function interfered with "adjust" and "initialize" horribly. (I.e.
Thanks for the advice! at least in "to_arbitrary" add "Pure_Function" is a bad idea.


      parent reply	other threads:[~2019-01-26 17:02 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-24 23:56 ? Is ok return a type derived from ada.finalization.controlled from a "Pure_Function" ? thanks danielcheagle
2019-01-25 21:20 ` Randy Brukardt
2019-01-26  0:22 ` Shark8
2019-01-26 11:48 ` Simon Wright
2019-01-26 17:02 ` Daniel Norte Moraes [this message]
replies disabled

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