core/Xtreams__PositionWriteStream.st
author mkobetic
Tue, 31 Jan 2012 03:47:19 +0000
changeset 90 59f68d289949
parent 74 752e2d88fe73
child 94 7e6a328c5f8b
permissions -rw-r--r--
(none)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     1
"{ Package: 'stx:goodies/xtreams/core' }"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     2
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     3
"{ NameSpace: Xtreams }"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     4
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     5
WriteStream subclass:#PositionWriteStream
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     6
	instanceVariableNames:'buffer'
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     7
	classVariableNames:''
36
cf68c4beeb11 sockets and files
mkobetic
parents: 33
diff changeset
     8
	poolDictionaries:'XtreamsPool'
20
51de794993c3 added XtreamsPool to fix DefaultBufferSize; set proper category names
mkobetic
parents: 2
diff changeset
     9
	category:'Xtreams-Core'
2
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    10
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    11
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    12
PositionWriteStream comment:'Wraps a non-positionable stream and provides positioning capability by buffering written elements. Buffering strategy can be configured via different Buffer classes.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    13
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    14
Instance Variables
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    15
	buffer  <Buffer> holds written elements
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    16
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    17
'
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    18
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    19
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    20
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    21
!PositionWriteStream methodsFor:'accessing'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    22
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    23
insert: anInteger from: aSequenceableCollection at: startIndex
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    24
	^buffer insert: anInteger from: aSequenceableCollection at: startIndex
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    25
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    26
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    27
write: anInteger from: aSequenceableCollection at: startIndex
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    28
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    29
	| toFlush bufferFlush |
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    30
	(buffer hasFixedWriteSpace not or: [buffer writeSize >= anInteger ]) ifTrue: [
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    31
		buffer write: anInteger from: aSequenceableCollection at: startIndex.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    32
		^anInteger ].
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    33
	toFlush := buffer readSize + anInteger - buffer cacheSize.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    34
	bufferFlush := toFlush min: buffer readSize.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    35
	destination write: bufferFlush from: buffer.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    36
	(toFlush > bufferFlush) ifTrue: [
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    37
		toFlush := toFlush - bufferFlush.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    38
		destination write: toFlush from: aSequenceableCollection at: startIndex ].
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    39
	buffer write: anInteger - toFlush from: aSequenceableCollection at: startIndex + toFlush.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    40
	^anInteger
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    41
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    42
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    43
!PositionWriteStream methodsFor:'initialize-release'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    44
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    45
buffer
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    46
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    47
	^buffer
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    48
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    49
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    50
buffer: aBuffer
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    51
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    52
	buffer recycle.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    53
	buffer := aBuffer
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    54
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    55
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    56
close
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    57
	super close.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    58
	buffer recycle.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    59
	buffer := nil
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    60
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    61
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    62
contentsSpecies
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    63
	^destination contentsSpecies
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    64
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    65
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    66
flush
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    67
	buffer ifNil: [^self].
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    68
	destination write: buffer.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    69
	buffer clear
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    70
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    71
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    72
on: aDestination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    73
	buffer := Buffer new: DefaultBufferSize class: aDestination contentsSpecies.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    74
	super on: aDestination
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    75
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    76
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    77
!PositionWriteStream methodsFor:'printing'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    78
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    79
streamingPrintOn: aStream
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    80
	super streamingPrintOn: aStream.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    81
	aStream
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    82
		write: ' buffered: ';
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    83
		print: buffer writeSize.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    84
	buffer writeSize isZero ifTrue: [^self].
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    85
	aStream
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    86
		cr; tab;
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    87
		print: buffer contentsPast
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    88
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    89
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    90
!PositionWriteStream methodsFor:'seeking'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    91
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    92
++ anInteger
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    93
	| skipped |
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    94
	anInteger < 0 ifTrue: [ ^self -- anInteger negated ].
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    95
	skipped := buffer writeSkip: anInteger.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    96
	skipped = anInteger ifTrue: [^anInteger].
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    97
	[destination ++ (anInteger - skipped)] on: Incomplete do: [:incomplete |
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    98
		(Incomplete count: incomplete count + skipped) raise].
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    99
	^anInteger
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   100
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   101
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   102
-- anInteger
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   103
	| skipped |
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   104
	anInteger < 0 ifTrue: [ ^self ++ anInteger negated ].
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   105
	skipped := (buffer writeSkip: anInteger negated) negated.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   106
	skipped = anInteger ifTrue: [^anInteger].
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   107
	(Incomplete count: skipped) raise
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   108
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   109
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   110
available
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   111
	^buffer writeSize
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   112
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   113
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   114
length
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   115
	^buffer activeSize
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   116
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   117
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   118
position
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   119
	^buffer writePosition
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   120
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   121
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   122
position: aPosition
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   123
	| startPosition delta |
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   124
	aPosition < 0 ifTrue: [Incomplete zero raise].
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   125
	startPosition := buffer writePosition.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   126
	delta := aPosition - startPosition.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   127
	^[      self ++ delta. aPosition
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   128
	] on: Incomplete do: [ :ex |
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   129
		(Incomplete count: startPosition + ex count) raise ]
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   130
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   131
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   132
!PositionWriteStream methodsFor:'testing'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   133
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   134
isPositionable
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   135
	^true
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   136
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   137
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   138
!PositionWriteStream methodsFor:'transforming'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   139
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   140
positioning
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   141
	^self
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   142
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   143
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   144
!PositionWriteStream class methodsFor:'documentation'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   145
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   146
version_SVN
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   147
    ^ '$Id$'
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   148
! !