On Sun, Jan 8, 2012 at 5:46 AM, Mariano Martinez Peck <[email protected] > 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
