Is this range behaviour correct?

monarch_dodra monarchdodra at gmail.com
Thu Mar 14 07:51:41 PDT 2013


On Thursday, 14 March 2013 at 14:29:59 UTC, Andrea Fontana wrote:
> On Thursday, 14 March 2013 at 13:58:56 UTC, monarch_dodra wrote:
>> On Thursday, 14 March 2013 at 13:20:51 UTC, Andrea Fontana 
>> wrote:
>>> On Thursday, 14 March 2013 at 12:29:26 UTC, Andrei 
>>> Alexandrescu wrote:
>>>> On 3/14/13 6:45 AM, Andrea Fontana wrote:
>>>>> On Thursday, 14 March 2013 at 10:08:53 UTC, Andrea Fontana 
>>>>> wrote:
>>>>>> I'm trying to implement a db cursor as simple InputRange. 
>>>>>> I can't
>>>>>> implement as forward range because using c-api I can't 
>>>>>> clone/save cursor.
>>>> Add .save() to it.
>>>>
>>>> Andrei
>>>
>>> I can't add save and create a forward range: c-api doesn't 
>>> allow me to clone db cursor.
>>
>> But think about it. You say you can't save, but you want pass 
>> by value to preserve state. If you can preserve state, doesn't 
>> that mean you just saved?
>>
>> Once you've passed your "can't preserve state" to a foreach, 
>> then your range is consumed. So yes, it is correct behavior.
>>
>> Most input ranges should model reference semantics when 
>> passed/copied by value. If somebody modifies the range, all 
>> ranges are affected. The tough part is usually preserving 
>> correct state.
>
> I was hoping there's something I didn't know like rewind() to 
> implement :)
>
> Ok, I'll pray db developer to add a clone method or I'll use 
> something like
>
> auto res = cursor.array(); if needed

You *could* add rewind to your range, but it isn't quite the same 
as save: Rewind means you can move back and forth in your view of 
the file (or cursor/db), but it does not mean you can actually 
*duplicate* (save) your range, to have two distinct ranges with a 
distinct view of the your db.

For example, while the interface is different, a C "FILE*" is 
what you'd call a rewindable input range with reference semantics.


More information about the Digitalmars-d-learn mailing list