[ENH] Minor Stream refactoring

Richard A. O'Keefe ok at atlas.otago.ac.nz
Tue May 8 23:51:49 UTC 2001


I had occasion to define a new Stream class recently.  I found that several
of the operations I wanted, that made perfect sense for my class and did
not depend on anything that wasn't already part of the Stream protocol,
were in the "wrong" classes.  This change set promotes some of the methods
from PositionableStream and WriteStream to Stream.  It was written in
Squeak 2.7, but has also been checked in Squeak 3.0.1.


'From Squeak2.7 of 5 January 2000 [latest update: #1782] on 9 May 2001 at 12:23:26 pm'!

!Stream methodsFor: 'accessing' stamp: 'raok 5/3/2001 18:13'!
next: anInteger putAll: aCollection startingAt: startIndex
	"Store the next anInteger elements from the given collection."
	0 to: anInteger-1 do: [:i|
		self nextPut: (aCollection at: startIndex + i).
	].
	^aCollection! !

!Stream methodsFor: 'character writing' stamp: 'raok 5/3/2001 18:35'!
cr
	"Append a return character to the receiver."

	self nextPut: Character cr! !

!Stream methodsFor: 'character writing' stamp: 'raok 5/3/2001 18:35'!
crtab
	"Append a return character, followed by a single tab character, to the 
	receiver."

	self nextPut: Character cr.
	self nextPut: Character tab! !

!Stream methodsFor: 'character writing' stamp: 'raok 5/3/2001 18:36'!
crtab: anInteger 
	"Append a return character, followed by anInteger tab characters, to the 
	receiver."

	self nextPut: Character cr.
	anInteger timesRepeat: [self nextPut: Character tab]! !

!Stream methodsFor: 'character writing' stamp: 'raok 5/3/2001 18:36'!
space
	"Append a space character to the receiver."

	self nextPut: Character space! !

!Stream methodsFor: 'character writing' stamp: 'raok 5/3/2001 18:37'!
space: anInteger
	"Append anInteger space characters to the receiver."

	anInteger timesRepeat: [self nextPut: Character space]! !

!Stream methodsFor: 'character writing' stamp: 'raok 5/3/2001 18:37'!
tab
	"Append a tab character to the receiver."

	self nextPut: Character tab! !

!Stream methodsFor: 'positioning' stamp: 'raok 5/8/2001 18:04'!
skip: anInteger
	"Skip over the next anInteger elements, not trying to read past end of stream.
	 Subclasses that can implement this more efficiently should do so."
	anInteger timesRepeat: [self atEnd ifTrue: [^self]. self next]
! !

!Stream methodsFor: 'positioning' stamp: 'raok 5/8/2001 18:07'!
skipLine
	"Skip the rest of the line, if there is any."
	^self skipTo: Character cr
! !

!Stream methodsFor: 'positioning' stamp: 'raok 5/8/2001 18:06'!
skipTo: anObject
	"Skip elements until either the next occurrence of anObject has just been reached
	 or the end of the stream is found.  Answer whether anObject was found.
	 This method is misnamed because it doesn't skip TO anObject but PAST it."

	[self atEnd] whileFalse: [self next = anObject ifTrue: [^true]].
	^false
! !


PositionableStream removeSelector: #skipTo:!
PositionableStream removeSelector: #next:putAll:startingAt:!
WriteStream removeSelector: #cr!
WriteStream removeSelector: #crtab!
WriteStream removeSelector: #tab!
WriteStream removeSelector: #crtab:!
WriteStream removeSelector: #space!





More information about the Squeak-dev mailing list