Is this range behaviour correct?
    Ali Çehreli 
    acehreli at yahoo.com
       
    Sat Mar 16 21:54:56 PDT 2013
    
    
  
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
    
    
More information about the Digitalmars-d-learn
mailing list