Generic range to read array or a file as a phobos range
Andrea Fontana
nospam at example.com
Mon Mar 18 01:57:18 PDT 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)
More information about the Digitalmars-d-learn
mailing list