I can't figure out how to make use of the full capacity of buffers that are allocated by readln. Take the example code from the documentation:

    // Read lines from $(D stdin) and count words

    void main()
    {
        char[] buf;
        size_t words = 0;

        while (!stdin.eof)
        {
            char[] line = buf;
            stdin.readln(line);
            if (line.length > buf.length)
                buf = line;

            words += line.split.length;
        }

        writeln(words);
    }

When buf is not large enough to hold the line, readln will allocate a new buffer to accomodate and this example shows how you can save that new buffer to reuse the next time. The problem is that the capacity of the new buffer is nowhere to be found. readln only returns the line that was read which is only a slice of the buffer that was allocated. The next time that readln is called, it will not read past the slice even if the capacity of the buffer it allocated was larger. This will cause a new allocation/copy every time you read a line that was larger than all the previous lines, even if a previous allocation was already large enough. This seems like a big oversight to me, I must be missing something right?

Reply via email to