On Sun, Jan 8, 2012 at 5:46 AM, Mariano Martinez Peck <marianopeck@gmail.com> wrote:
Hi guys. Some time ago Henry spot to us a small improvement for WriteStream >> nextPutAll: that we are using in Fuel, but I think it can be general. Henry comment was exactly:

Also: For variableBytes classes, if you rewrite:

WriteStream
nextPutAll: aCollection

���� | newEnd |
���� collection class instSpec == aCollection class instSpec ifFalse:
���� ��� [^ super nextPutAll: aCollection ].

���� newEnd := position + aCollection size.
���� newEnd > writeLimit ifTrue:
���� ��� [self growTo: newEnd + 10].

���� collection replaceFrom: position+1 to: newEnd� with: aCollection startingAt: 1.
���� position := newEnd.
���
��� ^ aCollection

You can now pass all variableByte classes (Like ByteString) directly to a stream with a ByteArray collection, and the replaceFrom:to:with:
startingAt: primitive will work correctly, just like the file primitive does
This means you don't need special Serializers for these either,� using f.ex. clunky nextStringPutAll: methods with manual asByteArray conversions.



So...if you agree, I can commit the patch.

Surely this will break special encoded strings where the encode/decode is done in at:/at:put:. �Moving the bytes isn't safe in general. �However, if the programmer knows they themselves can use next:putAll:startingAt: or some such. �I don't think your suggestion is safe in general for WriteStream. �Instead if �next:putAll:startingAt: doesn't do the job invent some new protocol that will.


Let me know.

--
Mariano
http://marianopeck.wordpress.com




--
best,
Eliot