Accessors, byLine, input ranges

Michel Fortin michel.fortin at michelf.com
Fri Jan 29 10:42:38 PST 2010


On 2010-01-29 12:53:27 -0500, Andrei Alexandrescu 
<SeeWebsiteForEmail at erdani.org> said:

> An algorithm can fail in many silent ways if it misuses the range 
> interface. None of std.algorithm algorithms uses front naively.

Easy to say. How did you verify that?

The problem is very subtle: if you call front after popFront on 
something like byLine which adds a buffer on top of another range, 
it'll eat one or more element on the downstream range that will be lost 
if you dispose of the filtering range. It won't have any effect on 
algorithms using the filtering range in itself, only on those using 
both the filtering range and the downstream range in tandem.

So basically, if you have an algorithm that calls front after popFront, 
that algorithm cannot be used reliably for ranges filtering a stream 
when that stream is also used directly, or used via other filtering 
ranges. There's no way to enforce that as it becomes the user's problem.

Whereas if input ranges only define 'take', it's pretty easy for the 
compiler to tell you an algorithm needs a buffer, so you add an 
intermediary buffer range yourself and you're now aware of the 
consequences.


> Can you run a basic algorithm on a Java stream and on an array as well?

Java lacks templates, and thus lack compile-time duck typing and work 
only with bytes. But you could iterate on an array as if it was a 
stream:

	class ArrayStream {
		byte[] array;
		int pos;

		ArrayStream(byte[] array) {
			this.array = array;
			pos = 0;
		}

		int read() {
			if (pos > array.length)
				return -1;
			else
				return array[pos++];
		}
	}

I'm not trying to say that Java streams are superior to ranges, but 
they don't have unintended buffering issues.

-- 
Michel Fortin
michel.fortin at michelf.com
http://michelf.com/




More information about the Digitalmars-d mailing list