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