[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Help-smalltalk] [PATCH] #nextPutAll:
From: |
Paolo Bonzini |
Subject: |
[Help-smalltalk] [PATCH] #nextPutAll: |
Date: |
Thu, 23 Aug 2007 12:40:52 +0200 |
User-agent: |
Thunderbird 2.0.0.6 (Macintosh/20070728) |
It turns out we had half a dozen implementation, of varying degree of
efficiency. Now all a stream has to override is
#next:putAll:startingAt: (if they wish to).
Paolo
2007-08-23 Paolo Bonzini <address@hidden>
* kernel/ByteStream.st: Remove #nextPutAll:.
* kernel/FileDescr.st: Remove #nextPutAll: and #nextPutAllFlush:.
* kernel/FileStream.st: Remove #nextPutAll: and #nextPutAllFlush:.
* kernel/Stream.st: Use #nextHunk in #nextPutAll:, add
#nextPutAllFlush:.
* kernel/Transcript.st: Implement #next:putAll:startingAt:.
* kernel/WriteStream.st: Likewise.
* zlib/ZLibReadStream.st: Delay blocking until first access.
* zlib/ZLibWriteStream.st: Remove #nextPutAll:.
--- orig/kernel/ByteStream.st
+++ mod/kernel/ByteStream.st
@@ -161,32 +161,6 @@ nextPutByte: anInteger
^super nextPut: (int bitAnd: 255)
!
-nextPutAll: aCollection
- "Write all the objects in aCollection to the receiver"
- | collEnd relative lastCopied |
- aCollection isSequenceable
- ifFalse: [ ^super nextPutAll: aCollection ].
-
- aCollection isEmpty ifTrue: [ ^self ].
-
- collEnd := ptr + aCollection size - 1.
- relative := ptr - 1.
-
- [
- lastCopied := collEnd min: collection size.
- collection
- replaceFrom: ptr
- to: lastCopied
- with: aCollection
- startingAt: ptr - relative.
-
- (ptr := lastCopied + 1) > collEnd
- ] whileFalse: [
- ptr > endPtr ifTrue: [ endPtr := ptr ].
- self growCollection
- ].
-!
-
nextPutByteArray: aByteArray
"Store aByteArray on the byte array"
^self nextPutAll: aByteArray
--- orig/kernel/FileDescr.st
+++ mod/kernel/FileDescr.st
@@ -532,27 +532,6 @@ next: n putAll: aCollection startingAt:
"Put the characters in the supplied range of aCollection in the file"
^self write: aCollection from: position to: position + n - 1!
-nextPutAll: aCollection
- "Put all the characters in aCollection in the file"
- | stream |
- aCollection isSequenceable ifFalse: [
- [ stream := aCollection readStream ]
- on: MessageNotUnderstood
- do: [ :ex | ex return: aCollection asString readStream ].
-
- [ stream atEnd ] whileFalse: [ self write: stream nextHunk ].
- ^self ].
-
- self write: aCollection asString
-!
-
-nextPutAllFlush: aCollection
- "Put all the characters in aCollection in the file. For compatibility
- with FileStream (FileDescriptor is not buffered, thus this method is
- equivalent to nextPutAll:"
- self write: aCollection asString
-!
-
nextByteArray: anInteger
"Return the next 'anInteger' bytes from the stream, as a ByteArray."
^(self next: anInteger) asByteArray
--- orig/kernel/FileStream.st
+++ mod/kernel/FileStream.st
@@ -351,45 +351,6 @@ copyFrom: from to: to
!FileStream methodsFor: 'overriding inherited methods'!
-nextPutAllFlush: aCollection
- "Put all the characters in aCollection in the file, then flush the
- file buffers"
- | n coll written |
- coll := aCollection asString.
- n := coll size.
- written := collection size - ptr + 1 min: n.
- self next: written bufferAll: coll startingAt: 1; flush.
- written = n ifFalse: [ self write: coll from: written + 1 to: n ].
-!
-
-nextPutAll: aCollection
- "Put all the characters in aCollection in the file"
- | n coll written |
- "Just do 'coll := aCollection asString', but avoid expensive operations
- in the common case where aCollection is already a String."
- coll := aCollection isSequenceable
- ifTrue: [ aCollection ]
- ifFalse: [
- [ aCollection asString ]
- on: MessageNotUnderstood
- do: [ :ex |
- "If we are in a stream, try to facilitate buffering."
- [ aCollection atEnd ] whileFalse: [
- coll := aCollection nextHunk.
- self next: coll size putAll: coll startingAt: 1 ].
- ^self ] ].
-
- n := coll size.
- written := collection size - ptr + 1 min: n.
- self next: written bufferAll: coll startingAt: 1.
- written = n ifTrue: [ ^self ].
-
- self flush.
- n - written < collection size
- ifTrue: [ self next: n - written bufferAll: coll startingAt: written +
1 ]
- ifFalse: [ self write: coll from: written + 1 to: n ].
-!
-
next: n putAll: aCollection startingAt: pos
| written |
written := collection size - ptr + 1 min: n.
--- orig/kernel/Stream.st
+++ mod/kernel/Stream.st
@@ -201,11 +201,28 @@ next: n putAll: aCollection startingAt:
^aCollection
!
+nextPutAllFlush: aCollection
+ "Put all the elements of aCollection in the stream, then flush the
+ buffers if supported by the stream."
+ self nextPutAll: aCollection; flush
+!
+
nextPutAll: aCollection
"Write all the objects in aCollection to the receiver"
- aCollection isSequenceable
- ifTrue: [ self next: aCollection size putAll: aCollection startingAt: 1
]
- ifFalse: [ aCollection do: [ :element | self nextPut: element ] ].
+ | coll |
+ aCollection isSequenceable ifTrue: [
+ ^self next: aCollection size putAll: aCollection startingAt: 1 ].
+
+ "Try to detect a Stream."
+ [ aCollection atEnd ]
+ on: MessageNotUnderstood
+ do: [ :ex | ^self nextPutAll: (self species withAll: aCollection) ].
+
+ "If we are in a stream, try to facilitate buffering."
+ [ aCollection atEnd ] whileFalse: [
+ coll := aCollection nextHunk.
+ self next: coll size putAll: coll startingAt: 1 ].
+
^aCollection
!
--- orig/kernel/Transcript.st
+++ mod/kernel/Transcript.st
@@ -103,10 +103,10 @@ next: anInteger put: anObject
self nextPutAll: (String new: anInteger withAll: anObject)
!
-nextPutAll: aString
+next: n putAll: aString startingAt: pos
"Write aString to the Transcript"
semaphore critical: [
- self primNextPutAll: aString.
+ self primNextPutAll: (aString copyFrom: pos to: pos + n - 1).
Processor idle
]
!
--- orig/kernel/WriteStream.st
+++ mod/kernel/WriteStream.st
@@ -99,6 +99,27 @@ nextPut: anObject
^anObject
!
+next: n putAll: aCollection startingAt: pos
+ "Put n characters or bytes of aCollection, starting at the pos-th,
+ in the collection buffer."
+
+ | end written amount |
+ ptr = collection size ifTrue: [ self growCollection ].
+ written := 0.
+ [
+ end := collection size min: ptr + (n - written - 1).
+ end >= ptr ifTrue: [
+ collection
+ replaceFrom: ptr
+ to: end
+ with: aCollection
+ startingAt: pos + written.
+ written := written + (end - ptr + 1).
+ ptr := end + 1 ].
+ written < n
+ ] whileTrue: [ self growCollection ].
+ ptr > endPtr ifTrue: [ endPtr := ptr - 1 ]!
+
contents
"Returns a collection of the same type that the stream accesses, up to
and including the final element."
--- orig/packages/zlib/ZLibReadStream.st
+++ mod/packages/zlib/ZLibReadStream.st
@@ -145,9 +145,9 @@ position
!ZlibReadStream methodsFor: 'private'!
resetBuffer
+ ptr := 0.
delta := 0.
- endPtr := 0.
- self fillBuffer!
+ endPtr := 0!
initialize: aStream
super initialize: aStream.
--- orig/packages/zlib/ZLibWriteStream.st
+++ mod/packages/zlib/ZLibWriteStream.st
@@ -147,28 +147,6 @@ nextPut: aByte
inBytes at: ptr put: aByte.
ptr := ptr + 1!
-nextPutAll: aCollection
- "Put all the characters or bytes in aCollection in the deflation buffer."
-
- | n coll written |
- "Just do 'coll := aCollection asString', but avoid expensive operations
- in the common case where aCollection is already a String."
- ptr = inBytes size ifTrue: [ self flushBuffer ].
-
- coll := aCollection isSequenceable
- ifTrue: [ aCollection ]
- ifFalse: [
- [ aCollection asString ]
- on: MessageNotUnderstood
- do: [ :ex |
- "If we are in a stream, try to facilitate buffering."
- [ aCollection atEnd ] whileFalse: [
- coll := aCollection nextHunk.
- self next: coll size putAll: coll startingAt: 1 ].
- ^self ] ].
-
- self next: coll size putAll: coll startingAt: 1!
-
next: n putAll: aCollection startingAt: pos
"Put n characters or bytes of aCollection, starting at the pos-th,
in the deflation buffer."
- [Help-smalltalk] [PATCH] #nextPutAll:,
Paolo Bonzini <=