On Sun, Nov 04, 2012 at 07:47:49PM -0800, Jonathan M Davis wrote:
[...]
> But in either case, all of the range types have to take it into
> account, complicating their implementations that much further, and
> fastRange would complicate those implementations far more than
> isTransient would, because it would require code duplication rather
> than just statically disallowing the transient range when it wouldn't
> work.
[...]

No code duplication is actually necessary, even when the range is
transient-capable. For example:

        // New version of byLine
        struct ByLine {
                char[] buffer;

                @property bool empty() {
                        ...
                }

                @property char[] front() {
                        // NOTE: non-transient by default
                        return buffer.dup;
                }

                void popFront() {
                        ...
                }

                auto transient() {
                        struct TransientByLine {
                                ByLine innerRange;

                                // This is the only code that needs to
                                // be "duplicated". Because it's
                                // actually different!
                                @property char[] front() {
                                        return innerRange.buffer;
                                }

                                // empty, popFront, etc., just "inherit"
                                // from the inner range. No code
                                // duplication needed.
                                alias innerRange this;
                        }
                        return TransientByLine(this);
                }
        }


T

-- 
Tech-savvy: euphemism for nerdy.

Reply via email to