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[]);
    }
}

Reply via email to