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: aCollectionstartingAt: 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