substreams/Xtreams__LimitReadSubstream.st
author joe
Fri, 15 Mar 2013 19:54:41 -0400
changeset 113 c0df9d2ad5d3
parent 109 9587e2df7029
permissions -rw-r--r--
* make InifiniteReadingWritingTests abstract
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     1
"{ Package: 'stx:goodies/xtreams/substreams' }"
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     2
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     3
"{ NameSpace: Xtreams }"
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     4
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     5
PositionReadSubstream subclass:#LimitReadSubstream
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     6
	instanceVariableNames:'limit'
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     7
	classVariableNames:''
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     8
	poolDictionaries:''
22
e0653bbdbe61 added XtreamsPool to fix DefaultBufferSize; set proper category names
mkobetic
parents: 4
diff changeset
     9
	category:'Xtreams-Substreams'
4
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    10
!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    11
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    12
LimitReadSubstream comment:'Limits the number of elements that can be read from the source stream.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    13
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    14
Instance Variables
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
    15
	limit   <Integer> maximum number of elements that can be read from this stream
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
    16
	position        <Integer> number of elements already read from the stream
4
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    17
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    18
'
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    19
!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    20
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    21
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    22
!LimitReadSubstream class methodsFor:'instance creation'!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    23
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    24
on: aSource limit: anInteger
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    25
	^self new on: aSource limit: anInteger
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    26
! !
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    27
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    28
!LimitReadSubstream methodsFor:'accessing'!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    29
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    30
get
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    31
	position = limit ifTrue: [Incomplete zero raise].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    32
	^super get
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    33
!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    34
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    35
read: anInteger into: aSequenceableCollection at: startIndex
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    36
	| count |
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    37
	count := anInteger min: self available.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    38
	super read: count into: aSequenceableCollection at: startIndex.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    39
	count < anInteger ifTrue: [(Incomplete on: aSequenceableCollection count: count at: startIndex) raise].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    40
	^anInteger
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    41
! !
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    42
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    43
!LimitReadSubstream methodsFor:'initialize-release'!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    44
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    45
on: aSource limit: anInteger
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    46
	self on: aSource.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    47
	limit := anInteger
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    48
!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    49
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    50
subseekend
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    51
	self isPositionable ifFalse: [^self].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    52
	self -= 0
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    53
! !
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    54
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    55
!LimitReadSubstream methodsFor:'seeking'!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    56
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    57
-= anInteger
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    58
	| available |
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    59
	anInteger < 0 ifTrue: [Incomplete zero raise].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    60
	available := anInteger min: limit.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    61
	source ++ (limit - position - available).
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    62
	position := limit - available.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    63
	available = anInteger ifTrue: [^anInteger].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    64
	^(Incomplete count: available) raise
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    65
!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    66
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    67
length
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    68
	^limit
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    69
! !
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    70
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    71
!LimitReadSubstream class methodsFor:'documentation'!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    72
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
    73
version_HG
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
    74
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
    75
    ^ '$Changeset: <not expanded> $'
4
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    76
! !
109
9587e2df7029 Merged in latest version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 67
diff changeset
    77