foreach() behavior on ranges

Ali Çehreli acehreli at yahoo.com
Tue Aug 24 21:46:36 UTC 2021


On 8/24/21 1:44 PM, Ferhat Kurtulmuş wrote:

 > Just out of curiosity, if a range implementation uses malloc in save, is
 > it only possible to free the memory with the dtor?

Yes but It depends on the specific case. For example, if the type has a 
clear() function that does clean up, then one might call that. I don't 
see it as being different from any other resource management.

 > Is a save function only meaningful for GC ranges?

save() is to store the iteration state of a range. It should seldom 
require memory allocation unless we're dealing with e.g. stdin where we 
would have to store input lines just to support save(). It would not be 
a good design to hide such  potentilly expensive storage of lines behind 
save().

To me, save() should mostly be as trivial as returning a copy of the 
struct object to preserve the state of the original range. Here is a 
trivial generator:

import std.range;

struct Squares {
   int current;

   enum empty = false;

   int front() const {
     return current * current;
   }

   void popFront() {
     ++current;
   }

   auto save() {
     return this;
   }
}

void main() {
   auto r = Squares(0);
   r.popFront();  // Drop 0 * 0
   r.popFront();  // Drop 1 * 1

   auto copy = r.save;
   copy.popFront();  // Drop 2 * 2 only from the copy

   assert(r.front == 2 * 2);  // Saved original still has 2 * 2
}

Ali




More information about the Digitalmars-d-learn mailing list