comp.lang.ada
 help / color / mirror / Atom feed
From: Jeffrey Carter <spam@spam.com>
Subject: Re: generics in Ada 83
Date: Tue, 13 Sep 2005 15:16:04 -0700
Date: 2005-09-13T15:16:04-07:00	[thread overview]
Message-ID: <FcIVe.5$Fv6.3@dfw-service2.ext.ray.com> (raw)
In-Reply-To: <1126637616.954302.85630@f14g2000cwb.googlegroups.com>

REH wrote:
> 
> Well I guess there is always a better way.  Here is my actual problem.
> My team maintains a set of middleware services for various
> applications.  We have a Client/Server package as part of this.  It
> defines a header type for transmitting messages across TCP/IP.  One
> application group has requested the ability to define their own header.
>  There are certain pieces of information our software needs to know
> from the header, such as the message length.  So I re-defined the
> package thus:
> 
> generic
>     type Header_Type is private;
> 
>     with function Get_Length(Header : in Header_Type) return Integer;
> 
>     with procedure Set_Length(Header : in out Header_Type;
>                               Length : in Integer);
> package Client_Server;
> 
> This works fine for using most of the services in the package.  But the
> thorn is the package provides a "synchronous send" feature that does a
> request/response type of transaction over a network.  This requires
> several more fields to be present in the header and accessed at various
> times.  Thus, I have added get and set subprograms for those.  But I
> don't want a client application that does not use this feature to have
> to define stubs for all these.  Which is where I am tried to find a way
> to "default" them.

Then you're in good shape. 1st, define your complete generic for using 
the synchronous send feature:

generic -- Client_Server_With_Synchronous_Send
    type Header_Type is private;

    -- many formal subprograms
package Client_Server_With_Synchronous_Send is
    procedure Op (Header : in out Header_Type);

    ...
end Client_Server_With_Synchronous_Send;

then define your shorter generic:

generic -- Client_Server
    type Header_Type is private;

    with function Get_Length(Header : in Header_Type) return Integer;

    with procedure Set_Length(Header : in out Header_Type;
                              Length : in Integer);
package Client_Server is
    -- presumably a smaller set of operations than
    -- Client_Server_With_Synchronous_Send
    procedure Op (Header : in out Header_Type);

    ...
end Client_Server;

Now, the body of Client_Server instantiates 
Client_Server_With_Synchronous_Send and implements its operations in 
terms of Client_Server_With_Synchronous_Send's operations:

with Client_Server_With_Synchronous_Send;
package body Client_Server is
    -- Define stub subprograms for instantiation here.

    package Synchronous is new Client_Server_With_Synchronous_Send
       (Header_Type => Header_Type,
        Get_Length  => Get_Length,
        Set_Length  => Set_Length, ...);

    procedure Op (Header : in out Header_Type) renames Synchronous.Op;

    ...
end Client_Server;

-- 
Jeffrey Carter
"Now go away or I shall taunt you a second time."
Monty Python and the Holy Grail
E-mail: jeffrey_r_carter-nr [commercial-at]
         raytheon [period | full stop] com



  reply	other threads:[~2005-09-13 22:16 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-09-13 13:26 generics in Ada 83 REH
2005-09-13 13:30 ` Georg Bauhaus
2005-09-13 16:25   ` REH
2005-09-13 19:23     ` Georg Bauhaus
2005-09-13 13:50 ` Martin Dowie
2005-09-13 16:30   ` REH
2005-09-13 16:41     ` Martin Dowie
2005-09-13 18:43       ` REH
2005-09-13 19:37         ` Ludovic Brenta
2005-09-13 19:53           ` REH
2005-09-13 16:56 ` Jeffrey Carter
2005-09-13 18:53   ` REH
2005-09-13 22:16     ` Jeffrey Carter [this message]
2005-09-13 22:44       ` REH
2005-09-14  8:14   ` Jean-Pierre Rosen
2005-09-14 12:40     ` REH
2005-09-14 13:15     ` Hyman Rosen
2005-09-14 14:08       ` Jean-Pierre Rosen
2005-09-14 15:23         ` Hyman Rosen
2005-09-14 15:41           ` Robert A Duff
2005-09-19 17:58             ` REH
2005-09-20  4:58               ` Hyman Rosen
2005-09-20 12:36                 ` REH
2005-09-20  1:34             ` adaworks
2005-09-20  4:14               ` Jim Rogers
2005-09-21 22:58               ` Robert A Duff
2005-09-22 15:18                 ` adaworks
replies disabled

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