diff -r b4195d4908da -r 8f617564556b Queue.st --- a/Queue.st Thu Nov 18 13:03:24 2004 +0100 +++ b/Queue.st Fri Nov 19 11:04:55 2004 +0100 @@ -243,6 +243,72 @@ contentsArray atAllPut:nil "/ to help the garbage collector ! +removeIdentical:anElement ifAbsent:exceptionalValue + |rPos "{ Class: SmallInteger }" + endPos "{ Class: SmallInteger }" + wPos "{ Class: SmallInteger }" + countRemoved + el sz| + + (tally == 0) ifTrue:[^ exceptionalValue value]. + sz := contentsArray size. + + rPos := wPos := readPosition. + endPos := writePosition. + + countRemoved := 0. + tally timesRepeat:[ + el := contentsArray at:rPos. + el == anElement ifTrue:[ + countRemoved := countRemoved + 1. + rPos == readPosition ifTrue:[ + readPosition == sz ifTrue:[ + readPosition := 1. + ] ifFalse:[ + readPosition := readPosition + 1. + ]. + ]. + ] ifFalse:[ + rPos ~~ wPos ifTrue:[ + contentsArray at:wPos put:el. + ]. + wPos == sz ifTrue:[ + wPos := 1. + ] ifFalse:[ + wPos := wPos + 1. + ]. + ]. + rPos == sz ifTrue:[ + rPos := 1. + ] ifFalse:[ + rPos := rPos + 1. + ]. + ]. + countRemoved == 0 ifTrue:[ + ^ exceptionalValue value + ]. + + wPos := wPos - 1. + wPos == 0 ifTrue:[ wPos := sz]. + writePosition := wPos. + tally := tally - countRemoved. + ^ anElement + + " + |q| + + q := Queue new:10. + q nextPut:1; nextPut:2; nextPutAll:(3 to:10). + q next. + q nextPut:11. + q next. + q nextPut:12. + q next. + q removeIdentical:5. + q + " +! + removeLast "return the last value in the queue; Return nil, if the queue is empty" @@ -349,5 +415,5 @@ !Queue class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libbasic2/Queue.st,v 1.28 2003-06-11 08:37:18 cg Exp $' + ^ '$Header: /cvs/stx/stx/libbasic2/Queue.st,v 1.29 2004-11-19 10:04:51 penk Exp $' ! !