From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.5-pre1 (2020-06-20) on ip-172-31-74-118.ec2.internal X-Spam-Level: X-Spam-Status: No, score=-1.9 required=3.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.5-pre1 Path: eternal-september.org!reader02.eternal-september.org!aioe.org!5WHqCw2XxjHb2npjM9GYbw.user.gioia.aioe.org.POSTED!not-for-mail From: "Dmitry A. Kazakov" Newsgroups: comp.lang.ada Subject: Re: Better way to fill Storage_IO? Date: Mon, 17 May 2021 22:20:11 +0200 Organization: Aioe.org NNTP Server Message-ID: References: NNTP-Posting-Host: 5WHqCw2XxjHb2npjM9GYbw.user.gioia.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-Complaints-To: abuse@aioe.org User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.10.1 Content-Language: en-US X-Notice: Filtered by postfilter v. 0.9.2 Xref: reader02.eternal-september.org comp.lang.ada:62001 List-Id: On 2021-05-17 21:14, Simon Wright wrote: > Michael Hardeman writes: > >> So I've been messing around with the new Ada 2020 package >> Ada.Streams.Storage.Bounded/Unbounded; and if I'm understand it >> correctly it allows you to treat your program's memory like a stream >> without having to open file descriptors (which should make it >> faster?). That seems like a powerful abstraction to me and a great >> addition to the language. 1. It was always possible, since Ada 95, actually. So it is not that great addition. 2. The package as described is not a replacement for I/O, because it lacks blocking/synchronization and because it does not work between processes. E.g. at the end of the stream Read must rather block for an incoming Write. Both are quite possible to implement though. A great addition would be properly tagged protected objects and tasks. A blocking stream cannot support timed entry call syntax like this: select S := String'Input (Pipe'Access); -- This is not Ada! or delay 1.0; raise Timed_Out; end select; And note another problem. Entries do not work with indefinite objects. You cannot return String from an entry call. And yet another problem, you cannot use returned objects in many places, like in an entry call above. >> I was wondering if we could find a better way to fill the stream other >> than writing the variables into it? Can anyone figure out a good way >> to just stream a variable's bytes directly? Allocators, of course. I am using both allocators and memory-mapped streams (though of a greater variety, e.g. for blocked exchange, encryption, interporcess communication). > This *is* the way to just stream the variable's bytes directly. What > sort of syntax were you hoping for? Both allocators and streams require explicit specification of the type. Clearly, that is a way around multiple dispatch, but it is way too heavy. Access to stream is no more necessary in 'Input. It was not necessary when it was introduced in Ada 95. The Rosen's trick allows circumvent in- parameter modes, when necessary. -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de