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.