On 03/15/2013 02:57 AM, Andrea Fontana wrote:
> On Friday, 15 March 2013 at 03:44:51 UTC, Ali Çehreli wrote:

>>>> I had toyed with the idea of making a ForwardRange from an InputRange
>>>> by caching the elements. Without any guarantees, :) here is the code:

> It *seems* to work :) Funny. The only problem is that caching db results
> maybe it's not a good idea if i read too much data.

Agreed but that's the only feature of the range. :) The way the data is "uncached" is by moving the slice forward by this code:

        /* Nobody is using the first part of the cache anymore */
        cache = cache[(minPtr - cache.ptr) .. $];

I think it is sufficient for the GC to free the previous first part of the array. The following program keeps running without consuming the memory:

void main()
{
    int[] a;
    while (true) {
        a ~= 42;
        a = a[1 .. $];
    }
}

> I'm not sure if it's fine or not but:
> - I've changed AsForwardRange from class to struct

Good idea. It looks like I had already made it a struct in my local copy of it.

> - I've added a method (it's an "hack" to make it works):
> this(this)
> {
> auto dummy = lazyCache.newView(lazyCache.cache.ptr);
> myId = dummy.myId;
> }

I am not sure why that was necessary. Additionally, some of the member functions like empty() can be made const.

> - I've add @property to save() -> isForwardRange gives false without this.

Agreed.

> I did this to make it similar to other ranges (original topic!)
> Shouldn't a view unregister pointer on its d-tor?

That's a good idea too. :)

Ali

Reply via email to