--- a/Stream.st Thu Sep 26 20:58:54 2019 +0200
+++ b/Stream.st Sat Sep 28 14:52:23 2019 +0200
@@ -3448,6 +3448,24 @@
"
|s|
+ s := '12345678901234567890' readStream.
+ s readLimit:5.
+ s upTo:$3.
+ self assert:(s position = 3).
+ s upTo:$x.
+ self assert:(s position = 5).
+ self assert:(s atEnd).
+ "
+ "
+ |s|
+ s := '12345678901234567890' readStream.
+ s upTo:$x.
+ self assert:(s position = 20).
+ self assert:(s atEnd).
+ "
+
+ "
+ |s|
s := ReadStream on:#(1 2 3 4 5 6 7 8).
Transcript showCR:(s upTo:4).
Transcript showCR:s next
@@ -3484,6 +3502,7 @@
"Modified: / 12-01-1998 / 21:58:38 / cg"
"Modified: / 10-01-2018 / 18:30:36 / stefan"
+ "Modified (comment): / 24-09-2019 / 14:35:36 / Stefan Vogel"
!
upTo:anObject into:aStream
@@ -3498,13 +3517,21 @@
|element|
- [
- element := self nextOrNil.
- ((element isNil and:[self atEnd]) or:[element = anObject]) ifTrue:[
- ^ self
+ anObject isImmediate ifTrue:[
+ "speed uo for anObject being an Integer or a Character <= 255
+ - identity compare is inlined and a lot faster"
+ [((element := aStream nextOrNil) notNil or:[self atEnd])
+ and:[element ~~ anObject]] whileTrue:[
+ aStream nextPut:element.
].
- aStream nextPut:element.
- ] loop.
+ ] ifFalse:[
+ [((element := aStream nextOrNil) notNil or:[self atEnd])
+ and:[element ~= anObject]] whileTrue:[
+ aStream nextPut:element.
+ ].
+ ].
+
+ "Modified (format): / 24-09-2019 / 14:35:01 / Stefan Vogel"
!
upToAllExcluding:aCollection