comp.lang.ada
 help / color / mirror / Atom feed
From: adambeneschan@gmail.com
Subject: Re: Binary and XML serialization of types
Date: Thu, 23 Jan 2014 11:15:56 -0800 (PST)
Date: 2014-01-23T11:15:56-08:00	[thread overview]
Message-ID: <9e27abb7-e944-4bd4-a10c-600fe4da7872@googlegroups.com> (raw)
In-Reply-To: <20a36d96-850e-4020-8dfa-777eb9c944f4@googlegroups.com>

On Thursday, January 23, 2014 10:53:23 AM UTC-8, han...@gmail.com wrote:
> Hello,
> 
> I am an Ada beginner who is working on a private project.
> 
> The project is to implement a protocol which either does binary or xml serialization of the different defined records. 
> 
> I have tried to separate all the "encoding" details from the type declaration in a sub package like this:
> 
> 
> 
> package A.Types is
> 
>    type Guid_Array is array(1 .. 8) of Unsigned_8;
>    type Guid is  record
>       Data1 : Unsigned_32;
>       Data2 : Unsigned_16;
>       Data3 : Unsigned_16;
>       Data4 : Guid_Array;
>    end record;
> 
> end A.Types;

I think you simply want to do something like this.  Put the declaration of Guid_Write and the "for" clause in A.Types.  Then, in the body of A.Types:

    with A.Types.BinaryEncoder;
    package body A.Types is

       -- other stuff as needed

       procedure Guid_Write( 
           Stream : access Ada.Streams.Root_Stream_Type'Class; Item : Guid )
               renames A.Types.BinaryEncoder.Guid_Write;
                   -- this is called a "renaming-as-body"

or this, which amounts to the same thing:

    with A.Types.BinaryEncoder;
    package body A.Types is

       -- other stuff as needed

       procedure Guid_Write( 
           Stream : access Ada.Streams.Root_Stream_Type'Class; Item : Guid ) is
       begin
           A.Types.BinaryEncoder.Guid_Write (Stream, Item);
       end Guid_Write;

(Note: I think the "renames" will work, but I haven't tested it.  The second one will definitely work.)

Now you declare and implement Guid_Write in A.Types.BinaryEncoder as you were trying to do.  (You don't actually need to give it the same name.  You can call your "implementation" procedure Guid_Write_Impl, or Any_Other_Name_You_Feel_Like.)

What's going on is that if some client package says "with A.Types" and uses the Guid_Write type, and uses Guid_Write'Write(...) or Guid_Write'Output(...), the client has to know that there's a Write routine that isn't the default.  That's why the "for Guid_Write'Write use ..." has to be in the visible part of A.Types, so that other clients are allowed to know about it.
 
                            -- Adam


  reply	other threads:[~2014-01-23 19:15 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-01-23 18:53 Binary and XML serialization of types hanslad
2014-01-23 19:15 ` adambeneschan [this message]
2014-01-23 19:17   ` adambeneschan
2014-01-23 19:58     ` hanslad
2014-01-23 20:03       ` adambeneschan
2014-01-23 21:00       ` Dmitry A. Kazakov
2014-01-24  8:54         ` hanslad
2014-01-24 10:01           ` Dmitry A. Kazakov
2014-01-24 14:44             ` hanslad
2014-01-24 15:22               ` Dmitry A. Kazakov
2014-01-31  9:51                 ` hanslad
2014-01-31 10:49                   ` Dmitry A. Kazakov
2014-02-04 10:33                     ` AdaMagica
2014-02-04 11:14                       ` Dmitry A. Kazakov
2014-02-04 11:20                         ` AdaMagica
2014-02-04 13:04                           ` Dmitry A. Kazakov
2014-02-04 17:16                             ` AdaMagica
2014-02-04 17:57                               ` Dmitry A. Kazakov
2014-02-04 22:34                               ` Simon Wright
2014-02-05  9:02                                 ` AdaMagica
2014-02-05  9:39                                   ` Simon Wright
2014-02-05 10:35                                   ` Dmitry A. Kazakov
2014-02-05 13:03                                     ` AdaMagica
2014-02-05 13:44                                       ` G.B.
2014-02-05 15:34                                       ` Niklas Holsti
2014-02-06  1:32                                       ` adambeneschan
2014-01-24 17:36             ` Simon Wright
2014-01-24  8:44       ` Georg Bauhaus
2014-01-24 17:13         ` Simon Wright
2014-01-23 22:44   ` Simon Wright
2014-01-23 23:43     ` adambeneschan
2014-01-24  0:58       ` Randy Brukardt
2014-01-24  8:29       ` Oliver Kleinke
2014-01-24 16:22         ` adambeneschan
replies disabled

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