From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=BAYES_00,INVALID_MSGID, REPLYTO_WITHOUT_TO_CC autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,941b3f6b2986b386 X-Google-Attributes: gid103376,public From: Ben Brosgol Subject: Re: access function in strings.maps Date: 1997/04/26 Message-ID: <336187D4.42A7@world.std.com>#1/1 X-Deja-AN: 237438045 Sender: news@world.std.com (Mr Usenet Himself) References: <336154D9.4E0A@calpoly.edu> Organization: The World @ Software Tool & Die Reply-To: brosgol@world.std.com Newsgroups: comp.lang.ada Date: 1997-04-26T00:00:00+00:00 List-Id: Dennis W. Butler wrote: > > I've been exploring the string handling capabilities of Ada95 and have > stumbled across a Thing I can't figure out. In the strings.maps package > (LRM section A.4.2), there is a type definition that reads: > > type Character_Mapping_Function is access function (From : in character) > return character; > > I would have thought a Character_Mapping_Function would be more like: > > function Character_Mapping_Function (The_Map: in Character_Mapping; > Domain_Character: in Character) return Character; -- range character The latter is in fact present as the Value function: function Value( Map : in Character_Mapping; Element : in Character ) return Character; > Although I read LRM section 3.10, I couldn't figure out the access > function type definition. Where can I get an explanation of what the > type definition does and how I can use it? I did note that the LRM says > that the Character_mapping_Function is used for transformational > mappings in the Translate subprograms...does this mean I'm not supposed > to worry about it? A good place to look is the Rationale; here's what it says in Part Three, Section A.2.4: "There is another possible representation for mappings [besides an array whose index subtype and element subtype are both Character], namely an access value denoting a function whose domain and range are the character type in question. This would be useful where the domain and range are very large sets, and in fact is used in the string handling packages for Wide_Character and Wide_String. To avoid unnecessary differences between the String and Wide_String packages, we have supplied the analogous access-to-subprogram type in Strings.Maps: type Character_Mapping_Function is access function( From : in Character ) return Character; Each subprogram that takes a Character_Mapping parameter is overloaded with a version that takes a Character_Mapping_Function." For example, suppose you want to translate a string where each character is to map to its successor, with wrap around. You could compose a Character_Mapping by calling To_Mapping, supplying domain and range character sequences, but the notation is somewhat clumsy. If you can tolerate the additional run-time overhead, then use a Character_Mapping_Function instead: function Successor( From : Character ) return Character is begin return Character'Val( Interfaces.Unsigned_8( Character'Pos(From) ) + 1 ); end Successor; ... Translate( My_String, Successor'Access ); > > Thanks, > > Dennis Butler > Computer Science Department > Cal Poly, San Luis Obispo You're welcome, Ben Brosgol Aonix 200 Wheeler Rd. Burlington, MA 01803 brosgol@aonix.com