comp.lang.ada
 help / color / mirror / Atom feed
* How to Emulate C++ Macro with Static Local Variable?
@ 2003-09-24 22:06 taashlo
  2003-09-24 23:44 ` Robert I. Eachus
                   ` (2 more replies)
  0 siblings, 3 replies; 28+ messages in thread
From: taashlo @ 2003-09-24 22:06 UTC (permalink / raw)


Hello,

I'm trying to port a small C++ library to Ada95.  Most of it is going
quite well in that the Ada implementation is smaller, simpler, and
easier to follow than the C++ implementation.  But I've ran into a
hurdle with the following C++ construction:

class Test {
...
protected:
   struct s {
      int data[8];
   };
...
   void bar(s *t, int foo);
   #define BAR(foo_) if (1) { \
      static s t_; \
      bar(&t_, foo_);\
   } else ((void)0)
...
};

What happens is that when you do this:

BAR(10);

it expands to this:

if (1) {
  static s t_;
  bar(&t_, 10);
} else ((void)0);

This, in effect, creates a (hidden) static local variable for each call
to bar().  This static variable (actually a structure, t_) is used to
cache information for each unique call to bar() such that subsequent
calls from that location can be processed *much* faster.

For instance, the following code would create three of the hidden local
variables:

for (int i = 0; i < 55; ++i) {
   switch (wozit()) {
      case 1: BAR(10); break;
      case 2: BAR(20); break;
      case 3: BAR(30); break;
   }
}

The first time each BAR() is encountered, it does the full processing,
but subsequent calls to the *same* BAR() used it's unique cached
information and go much faster.

Any ideas on how I can achieve this with Ada95?

Thank you,

Tad



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

end of thread, other threads:[~2003-09-30 20:25 UTC | newest]

Thread overview: 28+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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
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

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