comp.lang.ada
 help / color / mirror / Atom feed
From: Gautier Write-only <gautier@fakeaddress.nil>
Subject: Re: How to Emulate C++ Macro with Static Local Variable?
Date: Sun, 28 Sep 2003 10:42:06 +0200
Date: 2003-09-28T10:42:06+02:00	[thread overview]
Message-ID: <3F769EDE.D9D4744F@fakeaddress.nil> (raw)
In-Reply-To: 5917f4d0.0309251006.29cd9421@posting.google.com

Tad Ashlock:

> What happens to cache when Test_Static_in_generic exits?  In the
> C++ implementation, the next time Test_Static_in_generic is
> entered, the individual cache's still retain their previous
> contents.  Is that the case here?  (Sorry, but I'm not familar
> enough with Ada to be certain about how a generic package defined
> within a procedure behaves exactly.)

Since the cache is defined inside of "Test_Static_in_generic" it
is effectively lost when at exit. If you define it outside of it
(e.g. in a package at the same level as Test_Static_in_generic)
it will remain. If Test_Static_in_generic is at "level 0" it could
look like this:

--8<----8<----8<----8<----8<----8<--
package BARs is

  type S is array(0..7) of Integer;

  generic
    foo: Integer;
  package P is
    procedure BAR;
  end;
  
end;

with Ada.Text_IO, Ada.Integer_Text_IO; use Ada.Text_IO, Ada.Integer_Text_IO;

package body BARs is

  package body P is
    initialized: Boolean:= False;
    cache: S;
    procedure BAR is
    begin
      if not initialized then
        cache:= (others=> foo);
        New_Line;
        Put_Line("[Filling cache for instance]" & Integer'image(foo));
        initialized:= True;
      end if;
      Put(cache(cache'last));
    end;
  end;

end BARs;

with BARs;

pragma Elaborate_all(BARs);

package Inst_BARs is

  package P10 is new BARs.P(10);
  package P20 is new BARs.P(20);
  package P30 is new BARs.P(30);

end;

with Ada.Text_IO, Ada.Integer_Text_IO; use Ada.Text_IO, Ada.Integer_Text_IO;
with Inst_Bars; use Inst_Bars;

procedure Test_Static_in_generic_2 is

begin
  Put_Line("Starting...");
  for count in 1..4 loop
    for i in 1..3 loop
      case i is
        when 1=> P10.BAR;
        when 2=> P20.BAR;
        when 3=> P30.BAR;
      end case;
    end loop;
    New_Line;
  end loop;
end;

with Test_Static_in_generic_2;

procedure Test_Static_in_generic_3 is
begin
  for i in 1..3 loop
    Test_Static_in_generic_2;
  end loop;
end;
--8<----8<----8<----8<----8<----8<--

But you also could avoid these instances (as translation of
expanded macros) by making an array of caches, according to
the efficiency tradeoff "place taken by the machine code of
instances (and RAM caching!)" vs. "access to 1 cache via the
array (once per call)". To be tested...

HTH
________________________________________________________
Gautier  --  http://www.mysunrise.ch/users/gdm/gsoft.htm

NB: For a direct answer, e-mail address on the Web site!



  reply	other threads:[~2003-09-28  8:42 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-09-24 22:06 How to Emulate C++ Macro with Static Local Variable? taashlo
2003-09-24 23:44 ` Robert I. Eachus
2003-09-25  3:27   ` Hyman Rosen
2003-09-25  4:53     ` tmoran
2003-09-25 15:57       ` Robert I. Eachus
2003-09-25 19:09         ` tmoran
2003-09-29 14:57           ` taashlo
2003-09-29 18:12             ` Jeffrey Carter
2003-09-29 18:51               ` taashlo
2003-09-30  1:32                 ` Jeffrey Carter
2003-09-30  1:54                   ` tmoran
2003-09-30 13:02                   ` taashlo
2003-09-30 20:25                     ` Jeffrey Carter
2003-09-30  2:45             ` Robert I. Eachus
2003-09-30  3:24               ` tmoran
2003-09-25 13:43     ` Stephen Leake
2003-09-25 12:59   ` Tad Ashlock
2003-09-25 16:11     ` Robert I. Eachus
2003-09-25 18:13       ` Randy Brukardt
2003-09-25 23:40         ` Robert I. Eachus
2003-09-25 11:54 ` Gautier
2003-09-25 16:14   ` Robert I. Eachus
2003-09-25 18:06   ` Tad Ashlock
2003-09-28  8:42     ` Gautier Write-only [this message]
2003-09-28 20:06       ` Jeffrey Carter
2003-09-29  2:13         ` Gautier Write-only
2003-09-25 13:41 ` Stephen Leake
2003-09-25 17:23   ` Tad Ashlock
replies disabled

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