substreams/Xtreams__LimitWriteSubstream.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Wed, 01 Feb 2012 00:41:14 +0000
changeset 99 677c81c943e4
parent 67 a87e5ce04545
child 107 de5fa7bcc01a
permissions -rw-r--r--
build files regenerated
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
PositionWriteSubstream subclass:#LimitWriteSubstream
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
LimitWriteSubstream comment:'Limits the number of elements that can be written into the destination 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
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    15
	limit	<Integer> maximum number of elements that can be written into this stream
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    16
	position	<Integer> number of elements already written into the stream
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
!LimitWriteSubstream 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: aDestination limit: anInteger
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    25
	^self new on: aDestination 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
!LimitWriteSubstream 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
insert: anInteger from: aSequenceableCollection at: startIndex
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    31
	| count |
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    32
	count := anInteger min: self available.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    33
	super insert: count from: aSequenceableCollection at: startIndex.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    34
	count < anInteger ifTrue: [(Incomplete on: aSequenceableCollection count: count at: startIndex) raise].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    35
	^anInteger
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    36
!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    37
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    38
put: anObject
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    39
	position = limit ifTrue: [Incomplete zero raise].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    40
	^super put: anObject
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
write: anInteger from: aSequenceableCollection at: startIndex
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    44
	| count |
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    45
	count := anInteger min: self available.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    46
	super write: count from: aSequenceableCollection at: startIndex.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    47
	count < anInteger ifTrue: [(Incomplete on: aSequenceableCollection count: count at: startIndex) raise].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    48
	^anInteger
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    49
! !
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    50
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    51
!LimitWriteSubstream methodsFor:'initialize-release'!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    52
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    53
on: aDestination limit: anInteger
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    54
	self on: aDestination.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    55
	limit := anInteger
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    56
!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    57
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    58
subseekend
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    59
	self isPositionable ifFalse: [^self].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    60
	self -= 0
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    61
! !
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    62
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    63
!LimitWriteSubstream methodsFor:'seeking'!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    64
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    65
-= anInteger
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    66
	| available |
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    67
	anInteger < 0 ifTrue: [Incomplete zero raise].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    68
	available := anInteger min: limit.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    69
	destination ++ (limit - position - available).
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    70
	position := limit - available.
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    71
	available = anInteger ifTrue: [^anInteger].
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    72
	^(Incomplete count: available) raise
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    73
!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    74
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    75
length
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    76
	^limit
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    77
! !
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    78
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    79
!LimitWriteSubstream class methodsFor:'documentation'!
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    80
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    81
version_SVN
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    82
    ^ '$Id$'
20abcbb9eb33 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    83
! !