core/Xtreams__Buffer.st
author mkobetic
Tue, 31 Jan 2012 03:47:19 +0000
changeset 90 59f68d289949
parent 74 752e2d88fe73
child 109 9587e2df7029
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
Object subclass:#Buffer
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     6
	instanceVariableNames:'cache readPosition writePosition dataLength'
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     7
	classVariableNames:''
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     8
	poolDictionaries:''
20
51de794993c3 added XtreamsPool to fix DefaultBufferSize; set proper category names
mkobetic
parents: 7
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
Buffer comment:'Buffer implements a buffering API over an in-memory cache. The cache will grow as required to fit new data in to the buffer. Two positions are kept, the read position and write position, allowing flexible usage of the buffer.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    13
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    14
API:
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    15
	read:into:startingAt: -- reads data from the cache and moves readPosition forward
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    16
	write:into:startingAt: -- writes data into the cache and moves writePosition forward
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    17
	readSkip:/writeSkip: -- moves either readPosition or writePosition forward without changing the cache
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    18
	readPosition/readPosition:/writePosition/writePosition: -- accessors to the read/write positions
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    19
	clear -- remove all the data from the cache
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    20
	trim -- remove all the read data and all the empty space for writing in to from the cache
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    21
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    22
Instance Variables
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    23
	cache   <SequenceableCollection>        the cache for our buffer
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    24
	dataLength      <ArithmeticValue>       the amount of data in our cache, not the size of the cache
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    25
	readPosition    <ArithmeticValue>       the position within our data that we''re reading from (0..dataLength)
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    26
	writePosition   <ArithmeticValue>       the position within our data that we''re writing from (0..dataLength)
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    27
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    28
'
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    29
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    30
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    31
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    32
!Buffer class methodsFor:'instance creation'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    33
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    34
new: anInteger class: aClass
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    35
	^self on: (aClass newRecycled: anInteger)
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    36
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    37
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    38
on: aSequenceableCollection
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    39
	^self new on: aSequenceableCollection
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    40
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    41
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    42
!Buffer methodsFor:'accessing'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    43
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    44
activeSize
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    45
	"The number of elements in the buffer that can be explored. This is <= cacheSize"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    46
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    47
	^dataLength
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
cache
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    51
	^cache
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    52
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    53
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    54
cacheSize
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    55
	"The size of the cache, which is >= dataLength"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    56
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    57
	^cache size
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    58
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    59
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    60
contentsFuture
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    61
	^cache copyFrom: readPosition + 1 to: readPosition + self readSize
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    62
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    63
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    64
contentsPast
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    65
	^cache copyFrom: 1 to: writePosition
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    66
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    67
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    68
inactiveSize
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    69
	"Free space to write in to"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    70
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    71
	^cache size - dataLength
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    72
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    73
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    74
readSize
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    75
	"The number of elements available to read"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    76
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    77
	^dataLength - readPosition
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    78
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    79
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    80
writeSize
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    81
	"The number of available slots to write in to, which might overwrite elements in dataLength; writeSize >= inactiveSize"
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    82
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    83
	^(cache size - writePosition + readPosition) min: cache size
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    84
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    85
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    86
!Buffer methodsFor:'accessing - reading'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    87
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    88
get
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    89
	dataLength = readPosition ifTrue: [Incomplete zero raise].
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    90
	readPosition := readPosition + 1.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    91
	^cache at: readPosition
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    92
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    93
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    94
read: anInteger into: aSequenceableCollection at: startIndex
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    95
	| count |
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    96
	count := anInteger min: (dataLength - readPosition).
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    97
	aSequenceableCollection replaceFrom: startIndex to: startIndex + count - 1 with: cache startingAt: readPosition + 1.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    98
	readPosition := readPosition + count.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    99
	count < anInteger ifTrue: [(Incomplete on: aSequenceableCollection count: count at: startIndex) raise].
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   100
	^anInteger
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   101
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   102
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   103
readPosition
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   104
	^readPosition
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   105
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   106
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   107
readPosition: aPosition
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   108
	readPosition := (aPosition max: 0) min: dataLength
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   109
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   110
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   111
readSkip: anInteger
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   112
	| old delta |
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   113
	old := readPosition.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   114
	self readPosition: old + anInteger.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   115
	delta := readPosition - old.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   116
	^delta
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   117
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   118
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   119
!Buffer methodsFor:'accessing - writing'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   120
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   121
insert: aStreamable
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   122
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   123
	^aStreamable streamingInsertInto: self
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   124
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   125
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   126
insert: anInteger from: aStreamable
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   127
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   128
	^aStreamable streamingInsert: anInteger into: self
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   129
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   130
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   131
insert: anInteger from: aSequenceableCollection at: startIndex
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   132
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   133
	dataLength + anInteger <= cache size ifFalse: [self growBy: anInteger].
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   134
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   135
	cache replaceFrom: writePosition + anInteger + 1 to: dataLength + anInteger with: cache startingAt: writePosition + 1.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   136
	cache replaceFrom: writePosition + 1 to: writePosition + anInteger with: aSequenceableCollection startingAt: startIndex.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   137
	writePosition := writePosition + anInteger.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   138
	dataLength := dataLength + anInteger.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   139
	^anInteger
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   140
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   141
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   142
put: anObject
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   143
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   144
	writePosition < cache size ifFalse: [self growBy: 1].
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   145
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   146
	cache at: writePosition + 1 put: anObject.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   147
	writePosition := writePosition + 1.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   148
	writePosition > dataLength ifTrue: [dataLength := writePosition].
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   149
	^anObject
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   150
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   151
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   152
write: aStreamable
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   153
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   154
	^aStreamable streamingWriteInto: self
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   155
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   156
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   157
write: anInteger from: aStreamable
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   158
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   159
	^aStreamable streamingWrite: anInteger into: self
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   160
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   161
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   162
write: anInteger from: aSequenceableCollection at: startIndex
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   163
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   164
	writePosition + anInteger <= cache size ifFalse: [self growBy: anInteger].
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   165
	self privateWrite: anInteger from: aSequenceableCollection at: startIndex.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   166
	^anInteger
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   167
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   168
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   169
writePosition
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   170
	^writePosition
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   171
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   172
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   173
writePosition: aPosition
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   174
	^writePosition := (aPosition max: 0) min: dataLength
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   175
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   176
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   177
writeSkip: anInteger
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   178
	| old delta |
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   179
	old := writePosition.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   180
	self writePosition: old + anInteger.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   181
	delta := writePosition - old.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   182
	^delta
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   183
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   184
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   185
!Buffer methodsFor:'compressing'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   186
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   187
clear
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   188
	self clearCache.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   189
	readPosition := writePosition := dataLength := 0
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   190
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   191
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   192
trim
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   193
	cache := cache copyFrom: readPosition + 1 to: writePosition.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   194
	readPosition := 0.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   195
	dataLength := writePosition := cache size
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   196
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   197
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   198
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   199
!Buffer methodsFor:'initialize-release'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   200
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   201
close
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   202
	dataLength := writePosition
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   203
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   204
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   205
contentsSpecies
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   206
	^cache species
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   207
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   208
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   209
on: aSequenceableCollection
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   210
	cache := aSequenceableCollection.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   211
	dataLength := 0.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   212
	readPosition := 0.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   213
	writePosition := 0
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   214
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   215
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   216
recycle
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   217
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   218
	cache recycle
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   219
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   220
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   221
!Buffer methodsFor:'printing'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   222
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   223
printOn: aStream
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   224
	| stream |
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   225
	stream := String new writing.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   226
	self streamingPrintOn: stream.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   227
	aStream nextPutAll: stream conclusion
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   228
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   229
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   230
streamingPrintOn: aStream
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   231
	aStream write: self class name;
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   232
		space; write: 'data: '; print: dataLength;
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   233
		space; write: 'read: '; print: self readPosition;
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   234
		space; write: 'write: '; print: self writePosition
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   235
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   236
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   237
!Buffer methodsFor:'private'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   238
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   239
clearCache
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   240
	cache := cache copyEmpty: 0
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   241
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   242
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   243
growBy: anInteger
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   244
	| replacement |
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   245
	replacement := cache copyEmpty: (cache size + anInteger) * 2.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   246
	replacement replaceFrom: 1 to: cache size with: cache startingAt: 1.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   247
	cache := replacement
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   248
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   249
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   250
privateWrite: anInteger from: aSequenceableCollection at: startIndex
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   251
	" Ensure we're only doing with (writePosition + anInteger) <= cache size "
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   252
	(writePosition + anInteger) <= cache size ifFalse: [self error: 'invalid privateWrite. Use the #write: protocol instead.'].
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   253
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   254
	cache replaceFrom: writePosition + 1 to: writePosition + anInteger with: aSequenceableCollection startingAt: startIndex.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   255
	writePosition := writePosition + anInteger.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   256
	writePosition > dataLength ifTrue: [dataLength := writePosition]
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   257
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   258
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   259
streamingInsert: anInteger into: aWriteStream
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   260
	| count |
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   261
	count := (writePosition - readPosition) min: anInteger.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   262
	count <= 0 ifTrue: [^0].
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   263
	aWriteStream insert: count from: cache at: readPosition + 1.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   264
	self readSkip: count
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   265
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   266
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   267
streamingInsertInto: aWriteStream
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   268
	| count |
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   269
	count := writePosition - readPosition.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   270
	count <= 0 ifTrue: [^0].
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   271
	self streamingInsert: count into: aWriteStream.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   272
	^count
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   273
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   274
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   275
streamingWrite: anInteger from: aReadStream
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   276
	"Implementing this method would allow the buffer to be treated like a stream sometimes. Currently this is not implemented, make a buffer stream on your buffer instead."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   277
	self error: 'not yet implemented'
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   278
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   279
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   280
streamingWrite: anInteger into: aWriteStream
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   281
	| count |
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   282
	count := (writePosition - readPosition) min: anInteger.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   283
	count <= 0 ifTrue: [^0].
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   284
	aWriteStream write: count from: cache at: readPosition + 1.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   285
	self readSkip: count.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   286
	^count
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   287
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   288
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   289
streamingWriteFrom: aReadStream
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   290
	"Implementing this method would allow the buffer to be treated like a stream sometimes. Currently this is not implemented, make a buffer stream on your buffer instead."
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   291
	self error: 'not yet implemented'
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   292
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   293
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   294
streamingWriteInto: aWriteStream
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   295
	| count |
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   296
	count := writePosition - readPosition.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   297
	count <= 0 ifTrue: [^0].
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   298
	self streamingWrite: count into: aWriteStream.
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   299
	^count
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   300
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   301
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   302
!Buffer methodsFor:'testing'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   303
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   304
hasDataToRead
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   305
	^readPosition < dataLength
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   306
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   307
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   308
hasFixedWriteSpace
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   309
	^false
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   310
!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   311
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   312
hasSpaceToWrite
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   313
	^true
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   314
! !
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   315
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   316
!Buffer class methodsFor:'documentation'!
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   317
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   318
version_SVN
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   319
    ^ '$Id$'
faf220cbe5b9 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   320
! !