Andrei Alexandrescu napisał:

> > I know about Steven's proposal but it applies only to user types not 
> > primitives. Either way std.conv.to would need a buffered output range as 
> > integers are written from the right. Any chance for an abstraction 
> > analogous to buffered input ranges discussed recently?  
> 
> Generally I found it more difficult to define a solid output buffer 
> abstraction. This is a great motivating example though.
> 
> To my surprise, an API of the same form seems to be what the doctor 
> prescribed. Here's a semi-formal definition:
> 
> A buffered output range R is defined as such:
> 
> R.front returns the currently uncommitted buffer of type T[]
> 
> R.moreFront(n) makes n more elements available for writing
> 
> R.commitFront(n) writes the first n elements in front()
> 
> R.flushFront() writes the buffer currently held in front() and makes 
> another buffer available (initially empty).

I was thinking along the same lines. There's one missing:

R.skipFront(n) skips the first n elements without outputting

Why? Look at integral conversions in std.conv.to. It first calculates maximum 
string size, then writes numbers to the char array back to front, then returns 
result[$ - ndigits .. $] where ndigits is how long the string turned out.

Returning to Steven's DIP, I think writeTo should take the above rather than 
void delegate(char[]). With the latter you still have to allocate the pieces. 
Our buffered output range is friends with polymorphism too. If you set T=char, 
its API is devoid of generics. Such interface can be placed in object.d with an 
official blessing.

-- 
Tomek

Reply via email to