Thread overview
Generic range to read array or a file as a phobos range
Mar 15, 2013
bioinfornatics
Mar 15, 2013
Andrea Fontana
Mar 15, 2013
bioinfornatics
Mar 15, 2013
Andrea Fontana
Mar 17, 2013
bioinfornatics
Mar 17, 2013
Andrea Fontana
Mar 17, 2013
bioinfornatics
Mar 18, 2013
Andrea Fontana
March 15, 2013
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


March 15, 2013
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()?
March 15, 2013
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 :)
March 15, 2013
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.

March 17, 2013
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
March 17, 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.
March 17, 2013
On Sunday, 17 March 2013 at 20:21:23 UTC, Andrea Fontana wrote:
> 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.

yes that was a reference problem using dup fix it. Thanks
March 18, 2013
On Sunday, 17 March 2013 at 22:12:42 UTC, bioinfornatics wrote:
> On Sunday, 17 March 2013 at 20:21:23 UTC, Andrea Fontana wrote:
>> 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.
>
> yes that was a reference problem using dup fix it. Thanks

Maybe you should check for dup vs local var performance (on big file, of course)