Queue.st
author claus
Mon, 08 Nov 1993 03:31:40 +0100
changeset 5 78a5b7c73feb
child 14 ca0b5fbc8131
permissions -rw-r--r--
Initial revision
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5
78a5b7c73feb Initial revision
claus
parents:
diff changeset
     1
"
78a5b7c73feb Initial revision
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1993 by Claus Gittinger
78a5b7c73feb Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
78a5b7c73feb Initial revision
claus
parents:
diff changeset
     4
78a5b7c73feb Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
78a5b7c73feb Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
78a5b7c73feb Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
78a5b7c73feb Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
78a5b7c73feb Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    11
"
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    12
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    13
Object subclass:#Queue
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    14
         instanceVariableNames:'contentsArray readPosition writePosition tally'
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    15
         classVariableNames:''
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    16
         poolDictionaries:''
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    17
         category:'Collections-Ordered'
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    18
!
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    19
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    20
Queue comment:'
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    21
Queues provides a simple implementation of a queue - it is not
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    22
safe when two processes access Queues simultanously - see SharedQueue
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    23
for this.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    24
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    25
$Header: /cvs/stx/stx/libbasic2/Queue.st,v 1.1 1993-11-08 02:31:40 claus Exp $
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    26
'!
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    27
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    28
!Queue class methodsFor:'instance creation'!
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    29
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    30
new:size
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    31
    "return a new queue with space for size elements"
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    32
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    33
    ^ super new init:size
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    34
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    35
    "
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    36
     |q|
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    37
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    38
     q := Queue new.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    39
     q nextPut:1.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    40
     q nextPut:2.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    41
     q nextPut:3.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    42
     q nextPut:4.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    43
     q nextPut:5.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    44
     Transcript show:(q next) printString; space.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    45
     Transcript show:(q next) printString; space.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    46
     Transcript show:(q next) printString; space.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    47
     Transcript show:(q next) printString; space.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    48
     q nextPut:6.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    49
     q nextPut:7.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    50
     q nextPut:8.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    51
     q nextPut:9.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    52
     q nextPut:10.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    53
     Transcript show:(q next) printString; space.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    54
     Transcript show:(q next) printString; space.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    55
     Transcript show:(q next) printString; space.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    56
     Transcript show:(q next) printString; space.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    57
     Transcript show:(q next) printString; space.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    58
     Transcript show:(q next) printString; space.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    59
     Transcript show:(q next) printString; space.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    60
     Transcript show:(q next) printString; space.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    61
     Transcript show:(q next) printString; space.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    62
     Transcript show:(q next) printString; space.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    63
    "
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    64
!
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    65
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    66
new
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    67
    "return a new queue with space for 10 elements"
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    68
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    69
    ^ self new:10
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    70
! !
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    71
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    72
!Queue methodsFor:'initialization'!
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    73
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    74
init:size
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    75
    contentsArray := Array new:size.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    76
    readPosition := writePosition := 1.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    77
    tally := 0.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    78
! !
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    79
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    80
!Queue methodsFor:'accessing'!
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    81
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    82
next
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    83
    "return the next value in the queue; if it its empty, return nil"
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    84
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    85
    |value|
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    86
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    87
    (tally == 0) ifTrue:[^ nil].
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    88
    value := contentsArray at:readPosition.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    89
    readPosition := readPosition + 1.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    90
    readPosition > contentsArray size ifTrue:[
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    91
        readPosition := 1
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    92
    ].
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    93
    tally := tally - 1.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    94
    ^ value
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    95
!
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    96
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    97
nextPut:anObject
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    98
    "enter anObject into the queue - if the queue is full, report an error"
78a5b7c73feb Initial revision
claus
parents:
diff changeset
    99
78a5b7c73feb Initial revision
claus
parents:
diff changeset
   100
    (tally == contentsArray size) ifTrue:[
78a5b7c73feb Initial revision
claus
parents:
diff changeset
   101
        self error:'queue is full'.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
   102
        ^ self
78a5b7c73feb Initial revision
claus
parents:
diff changeset
   103
    ].
78a5b7c73feb Initial revision
claus
parents:
diff changeset
   104
    contentsArray at:writePosition put:anObject.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
   105
    writePosition := writePosition + 1.
78a5b7c73feb Initial revision
claus
parents:
diff changeset
   106
    writePosition > contentsArray size ifTrue:[
78a5b7c73feb Initial revision
claus
parents:
diff changeset
   107
        writePosition := 1
78a5b7c73feb Initial revision
claus
parents:
diff changeset
   108
    ].
78a5b7c73feb Initial revision
claus
parents:
diff changeset
   109
    tally := tally + 1
78a5b7c73feb Initial revision
claus
parents:
diff changeset
   110
! !
78a5b7c73feb Initial revision
claus
parents:
diff changeset
   111
78a5b7c73feb Initial revision
claus
parents:
diff changeset
   112
!Queue methodsFor:'queries'!
78a5b7c73feb Initial revision
claus
parents:
diff changeset
   113
78a5b7c73feb Initial revision
claus
parents:
diff changeset
   114
size
78a5b7c73feb Initial revision
claus
parents:
diff changeset
   115
    "return the number of elements in the queue"
78a5b7c73feb Initial revision
claus
parents:
diff changeset
   116
78a5b7c73feb Initial revision
claus
parents:
diff changeset
   117
    ^ tally
78a5b7c73feb Initial revision
claus
parents:
diff changeset
   118
! !