Generic range to read array or a file as a phobos range

Andrea Fontana nospam at example.com
Sun Mar 17 13:21:22 PDT 2013


On Sunday, 17 March 2013 at 18:36:17 UTC, bioinfornatics wrote:
> On Friday, 15 March 2013 at 16:40:26 UTC, Andrea Fontana wrote:
>> On Friday, 15 March 2013 at 16:11:38 UTC, bioinfornatics wrote:
>>> On Friday, 15 March 2013 at 14:40:17 UTC, Andrea Fontana 
>>> wrote:
>>>> On Friday, 15 March 2013 at 14:31:43 UTC, bioinfornatics 
>>>> wrote:
>>>>> Dear,
>>>>>
>>>>> By using CTFE I try to get a generic range to read array or 
>>>>> a file as a phobos range. code hosted here: 
>>>>> http://dpaste.dzfl.pl/1f2bcf39
>>>>>
>>>>> that works fine for array but for a File instance .eof seem 
>>>>> to not return true a right time.
>>>>>
>>>>> Soemone could say what happen ?
>>>>>
>>>>> Thanks
>>>>
>>>> Have you tried to cache front() result and read next block 
>>>> on popFront()?
>>>
>>> that is ok. Just missed the \n the followed code should work 
>>> http://dpaste.dzfl.pl/1f2bcf39
>>>
>>> You are welcome to take it :)
>>
>> int[] a = [ 0, 1, 1, 2, 3, 5, 8 ];
>> std.file.write("/tmp/filename", a);
>>
>> File f = File("/tmp/filename", "r");
>> auto r = GenericRange!File(f,1);
>>
>> r.filter!"a.length > 0 && a[0] != 0"().writeln;
>>
>> output:
>> [[0], [0], [0], [0], [0], [0]]
>>
>> but i think output expected is:
>> [[1], [1], [2], [3], [5], [8]]
>>
>> Caching front() and reading buffer from popFront() did the 
>> trick for me.
>
> As you said that do not works i update the code with some
> unittest could you please to share your version ? you can use
> fork from dpast -> http://dpaste.dzfl.pl/1f2bcf39e. Thanks

Your code works if you use .writeln instead of .array. This why 
*it seems* that struct member "U buffer" is returned by reference.

Check this. It passes unittest.
http://dpaste.dzfl.pl/828f7cc4

I move buffer inside popFront function, so "value = rawWrite(..)" 
assign every time a reference to a different "buffer". In your 
code it returns always the same member variable so, output array 
was an array of 8 identical reference to last read value (e.g. 
[8]) Maybe you can achieve the same in other way (for example 
using idup?).

I hope it works.


More information about the Digitalmars-d-learn mailing list