On Thursday, 19 September 2019 at 09:31:32 UTC, Joseph Rushton
Wakeling wrote:
For context, the use-case I have is a data structure which
stores an internal buffer as an array. A robust `save` method
would therefore have to duplicate the array (or at least the
active subset of its contents). This means a fresh heap
allocation per `save`, which has some nasty implications for
phobos algorithms that eagerly `.save` when they can.
In this case, it is probably better to separate the range from
the data structure it refers to. For example:
struct Container {
int[] data;
private static struct Range {
int[] contents;
bool empty() { return contents.length == 0; }
int front() { return contents[0]; }
void popFront() { contents = contents[1 .. $]; }
int back() { return contents[$ - 1]; }
void popBack() { contents = contents[0 .. $ - 1]; }
Range save() { return this; }
}
Range getRange() {
return Range(data[]);
}
}