output ranges: by ref or by value?
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Sat Jan 2 21:51:46 PST 2010
Michel Fortin wrote:
> On 2010-01-02 21:46:57 -0500, "Steven Schveighoffer"
> <schveiguy at yahoo.com> said:
>
>> That was the point of the enum. It would be a synthetic difference,
>> but IMO so is save. If it turns out that the only usable times you
>> implement save all look like:
>>
>> auto save() { return *this; }
>>
>> then save gives you nothing. It's kind of a proof by induction (I
>> think).
>>
>> You say that algorithm A requires the ability to save the state of a
>> range. So I define a function save on a range which cannot be saved
>> by a simple assignment (i.e. a file). I use A on that range, and the
>> results are not what I expect or kill performance or consume unneeded
>> resources, I'd rather not use algorithm A on that range, negating the
>> need to define a save function in the first place.
>>
>> I think that's what we're going to end up with.
>
> This is making me think...
>
> First, opening files silently whenever an algorithm feels the need to
> save its state is just madness. What if the operating system decide to
> pop a security window when opening a restricted file? What if the file
> has been deleted or replaced in its directory while your program is
> still hanging on the old inode?
>
> One might want to save the position in a file in order to be able to
> return there later, but when you return there the last thing you
> actually want to do is to open the file a second time: what you might
> realistically want is to set the position to what it was before, calling
> fseek. So perhaps it would be more useful to have both save() to save
> the current state (the position in a file), and restore() which would
> restore the saved state (returning to the saved position in a file).
These are implementation matters. save() could lazily save information,
duplicate the file handle (cheap on many OSs), etc.
> For ranges with reference semantics -- please call them streams! --
> save() and restore() would work just as fpos and fseek for files, but
> they might also not be available like in a TCP stream or in a
> communication channel between threads.
>
> For ranges such as array slices, save and restore would just copy the
> range in one or the other direction. The only reason to have them is so
> they can be used as streams.
This I don't understand. Array slices' save is:
T[] save(T[] array) { return array; }
Andrei
More information about the Digitalmars-d
mailing list