comp.lang.ada
 help / color / mirror / Atom feed
From: Jean-Marc Bourguet <jbourguet@free.fr>
Subject: Re: Compile time executed functions
Date: Fri, 30 Mar 2001 16:47:03 GMT
Date: 2001-03-30T16:47:03+00:00	[thread overview]
Message-ID: <3AC4B7F9.7C73455A@free.fr> (raw)
In-Reply-To: xg2x6.2153$db7.413856821@newssvr10-int.news.prodigy.com

Ken Garlington wrote:
> 
> "Jean-Marc Bourguet" <jbourguet@free.fr> wrote in message
> news:3AC46252.B7E54EA6@free.fr...
> : Ken Garlington wrote:
> :
> : > Could you post an example of such a template, and what in the C++
> standard
> : > you rely upon to guarantee compile-time calculations?
> :
> : First feature, things like
> :    enum { foo = x+y*z; }
> : are valid as long as x, y and z value are known at compile time and have
> : to be evaluated at compile time.
> 
> Isn't this usually resolvable as a constant by most Ada compilers? At least
> the ones I know will usually do so.

It is quite difficult to come with the equivalent in Ada.  One is
   foo : constant = x+y*z;
is indeed resolvable by most Ada compiler.

> More to the point, does the C++ standard _require_ that foo not generate any
> assembly instructions to be executed at run-time? If so, what does it say?

I've not checked what the standard says precisely.  The enum values are
a compile time constant.  They may be used in context like case label
which are to be fixed at compile time.  This

enum { a = 2, b = 3, c = 4, d = 7 };
enum { foo = a+b*c };
enum { bar = a*d };

void f() {
  int foobar;
  switch(foobar) {
    case foo:
      break;
    case bar:
      break;
  }
}

is required to produce a diagnostic as foo and bar have the same value.

> : Second feature it is possible to provide "specialization" for template,
> : that is provide a different implementation when some template parameter
> : have some constant value.
> :
> : The first ensure that evaluation is made at compile time.  The second
> : that it is possible to make some test.  Looping is available with
> : recursion so finally you have a computationnally complete language at
> : compile time.  It is painfull to write and even more painfull to use but
> : some like abusing the language...
> :
> : An example, how to compute factorial
> :
> : #include <iostream>
> :
> : template <int F>
> : struct factorial {
> :    enum { RET = factorial<F-1>::RET*F };
> : };
> :
> : template <>
> : struct factorial<1> {
> :    enum { RET = 1 };
> : };
> :
> : int main() {
> :    std::cout << factorial<10>::RET << std::endl;
> : }
> 
> Are you claiming that this resolves to a single constant value prior to
> execution? 

Yes.  factorial<10>::RET is a single constant value.

> I don't see how...

factorial<10>::RET is defined to be factorial<9>::RET*10
...
factorial<2>::RET is defined to be factorial<1>::RET*2
factorial<1>::RET is defined to be 1 by the specialization (template<>
...)

using template as compile time language is very functionnal.

> : > Also, does
> : > "compile-time" include "link-time", or are you not allowed to have
> anything
> : > in the table that uses addresses?
> :
> : As some C++ compilers do template instanciation at "link-time", I think
> : the answer is yes.
> 
> I don't think we're talking about the same thing here...

I don't think your are allowed to do pointer arithmetic in this
context.  Does that answer better your question?

-- Jean-Marc
BTW, template in C++ is so complex and this kind of thing push the limit
so much that you have to code taking into account the compiler bugs and
limitation.  So such code is very difficult to port.



  reply	other threads:[~2001-03-30 16:47 UTC|newest]

Thread overview: 86+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-03-27  7:10 Compile time executed functions Mats Karlssohn
2001-03-27 13:30 ` Ken Garlington
2001-03-28  7:08   ` Mats Karlssohn
2001-03-28 19:07     ` Phaedrus
2001-03-29  7:41       ` Mats Karlssohn
2001-03-29  5:02     ` Ken Garlington
2001-03-29  7:58       ` Mats Karlssohn
2001-03-29 14:28         ` Ken Garlington
2001-03-29 14:48           ` Ted Dennison
2001-04-04  7:52             ` Mats Karlssohn
2001-04-04 14:05               ` Ted Dennison
2001-04-05  6:30                 ` Mats Karlssohn
2001-03-29 19:48           ` Simon Wright
2001-03-31 19:30             ` Ken Garlington
2001-04-04  7:53             ` Mats Karlssohn
2001-03-30 10:41           ` Jean-Marc Bourguet
2001-03-30 16:13             ` Ken Garlington
2001-03-30 16:47               ` Jean-Marc Bourguet [this message]
2001-03-30 18:54                 ` Stephen Leake
2001-04-01  8:42                   ` Jean-Marc Bourguet
2001-03-31 19:30                 ` Ken Garlington
2001-04-01  8:59                   ` Jean-Marc Bourguet
2001-04-01 18:22                     ` Ken Garlington
2001-04-02  9:30                       ` Jean-Marc Bourguet
2001-04-02 12:42                         ` Robert A Duff
2001-04-02 14:16                           ` Jean-Marc Bourguet
2001-04-03  0:33                           ` Pat Rogers
2001-04-02 13:09                         ` Ken Garlington
2001-04-02 13:40                           ` Robert A Duff
2001-04-02 23:29                             ` Ken Garlington
2001-04-13 23:11                               ` Robert A Duff
2001-04-02 14:32                           ` Jean-Marc Bourguet
2001-04-04  7:59             ` Mats Karlssohn
2001-04-04  7:47           ` Mats Karlssohn
2001-04-06  0:33             ` Ken Garlington
2001-04-09 12:21               ` Mats Karlssohn
2001-04-13 15:51                 ` Tucker Taft
2001-03-27 14:39 ` Ted Dennison
2001-03-27 16:40   ` Mark Biggar
2001-03-27 18:14   ` Florian Weimer
2001-03-27 18:15   ` Florian Weimer
2001-03-27 18:57     ` Ted Dennison
2001-03-27 19:22       ` Florian Weimer
2001-03-27 20:23         ` Ted Dennison
2001-03-27 22:15           ` Florian Weimer
2001-03-27 23:30             ` Georg Bauhaus
2001-03-28  9:54               ` Florian Weimer
2001-03-28 15:20             ` Ted Dennison
2001-03-28 16:12               ` David C. Hoos, Sr.
2001-03-28 21:15               ` Robert A Duff
2001-03-28 21:56                 ` Brian Rogoff
2001-03-29  8:18                 ` Mats Karlssohn
2001-03-29  8:11               ` Mats Karlssohn
2001-03-29 14:37                 ` Ted Dennison
2001-03-29 16:35                   ` Mark Biggar
2001-03-29 19:27                     ` Florian Weimer
2001-03-29 19:28                     ` Florian Weimer
2001-03-30  3:41                       ` Ken Garlington
2001-03-30  4:32                         ` Brian Rogoff
2001-03-30 14:27                           ` Compile time executed functions [OT] Karel Thönissen
2001-03-30 17:30                             ` Scheveningen (Re: Compile time executed functions [OT]) Ray Blaak
2001-03-30 17:39                             ` More {OT] (Was " Brian Rogoff
2001-03-30 23:39                               ` Karel Thönissen
2001-03-30 17:47                         ` Compile time executed functions Brian Hanson
2001-03-30  0:06                     ` Robert A Duff
2001-03-30 15:02                       ` Ted Dennison
2001-03-30 20:57                         ` Robert A Duff
2001-04-02 14:26                           ` Ted Dennison
2001-03-30 17:33                       ` Ray Blaak
2001-03-29  8:25               ` Florian Weimer
2001-03-28  7:17   ` Mats Karlssohn
2001-03-29  1:35   ` Jon S Anthony
2001-03-27 14:39 ` Robert A Duff
2001-03-27 15:09   ` Ted Dennison
2001-03-27 16:33     ` Robert A Duff
2001-03-27 23:36     ` Ken Garlington
2001-03-28 20:47     ` Mark Lundquist
2001-03-28  7:29   ` Mats Karlssohn
2001-03-28 22:15     ` Robert A Duff
2001-03-29  8:43       ` Mats Karlssohn
2001-03-31  4:12         ` Robert A Duff
2001-04-05  7:06           ` Mats Karlssohn
2001-04-13 23:18             ` Robert A Duff
2001-03-29  5:02     ` Ken Garlington
2001-03-28  7:31 ` Mats Karlssohn
2001-03-30  8:57 ` Georg Bauhaus
replies disabled

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