diff -r d03ce3caf3ca -r 0a9b58aeacf4 GeometricSeries.st --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/GeometricSeries.st Fri Feb 26 11:46:24 2016 +0100 @@ -0,0 +1,189 @@ +" + COPYRIGHT (c) 2000 by eXept Software AG + All Rights Reserved + + This software is furnished under a license and may be used + only in accordance with the terms of that license and with the + inclusion of the above copyright notice. This software may not + be provided or otherwise made available to, or used by, any + other person. No title to or ownership of the software is + hereby transferred. +" +"{ Package: 'stx:libbasic2' }" + +"{ NameSpace: Smalltalk }" + +ReadOnlySequenceableCollection subclass:#GeometricSeries + instanceVariableNames:'start stop factor' + classVariableNames:'' + poolDictionaries:'' + category:'Collections-Sequenceable' +! + +!GeometricSeries class methodsFor:'documentation'! + +copyright +" + COPYRIGHT (c) 2000 by eXept Software AG + All Rights Reserved + + This software is furnished under a license and may be used + only in accordance with the terms of that license and with the + inclusion of the above copyright notice. This software may not + be provided or otherwise made available to, or used by, any + other person. No title to or ownership of the software is + hereby transferred. +" +! + +documentation +" + Much like intervals (which have a constant difference between elements), + these have a constant factor between them. + GeometricSeries represent a collection (or range) of values specified by + a startValue, an endValue and a *factor*. + Like with intervals, the elements are computed, not stored. + For example, the GeometricSeries (1 to:100 byFactor:2) contains the elements + (1 2 4 8 16 32 64). + + examples: + + (1 to:100 byFactor:2) do:[:i | Transcript showCR:i] + (1 to:100 byFactor:1.1) do:[:i | Transcript showCR:i] + (1 to:100 byFactor:2) asArray + (1 to:128 byFactor:2) asArray + (128 to:2 byFactor:(1/2)) asArray + + Q: is GeometricSeries the correct word in english ? + + [author:] + Claus Gittinger +" +! ! + +!GeometricSeries class methodsFor:'instance creation'! + +from:start to:stop byFactor:factor + "return a new geometric series with elements from start + to stop by a factor" + + ^ self new setFrom:start to:stop byFactor:factor + + +! ! + +!GeometricSeries methodsFor:'enumerating'! + +do:aBlock + "evaluate the argument, aBlock for every element in the + receiver. + Redefined since SeqColl accesses the receiver with at:, which is + slow for intervals." + + |aValue iter| + + aValue := start. + aValue isInteger ifTrue:[ + factor < 1 ifTrue:[ + [stop <= aValue] whileTrue:[ + aBlock value:aValue. + aValue := aValue * factor + ] + ] ifFalse:[ + [stop >= aValue] whileTrue:[ + aBlock value:aValue. + aValue := aValue * factor + ] + ] + ] ifFalse:[ + "/ the code below avoids rounding errors + "/ to accumulate if floats are enumerated. + iter := 1. + factor < 1 ifTrue:[ + [stop <= aValue] whileTrue:[ + aBlock value:aValue. + aValue := start + (factor raisedTo:iter). + iter := iter + 1. + ] + ] ifFalse:[ + [stop >= aValue] whileTrue:[ + aBlock value:aValue. + aValue := start + (factor raisedTo:iter). + iter := iter + 1. + ] + ] + ] + + " + (1 to:128 byFactor:2) do:[:v | Transcript showCR:v] + (16 to:1 byFactor:(1/2)) do:[:v | Transcript showCR:v] + (1.0 to:128.0 byFactor:2) do:[:v | Transcript showCR:v] + + (GeometricSeries from:1 to:128 byFactor:2) do:[:v | Transcript showCR:v] + " + + +! + +size + |cnt| + + cnt := 0. + self do:[:each | cnt := cnt + 1]. + ^ cnt + + "Created: / 31.10.2001 / 15:06:31 / cg" +! ! + +!GeometricSeries methodsFor:'printing & storing'! + +printOn:aStream + "append a printed representation to aStream" + + start printOn:aStream. + aStream nextPutAll:' to:'. + stop printOn:aStream. + aStream nextPutAll:' byFactor:'. + factor printOn:aStream. + +! + +storeOn:aStream + "store a representation which can reconstruct the receiver to aStream" + + aStream nextPut:$(. + self printOn:aStream. + aStream nextPut:$). + + +! ! + +!GeometricSeries methodsFor:'private'! + +setFrom:startVal to:stopVal byFactor:factorVal + "set start, stop and factor components" + + start := startVal. + stop := stopVal. + factor := factorVal + + +! + +species + "return the type of collection to be returned by collect, select etc." + + ^ OrderedCollection + +! ! + +!GeometricSeries class methodsFor:'documentation'! + +version + ^ '$Header$' +! + +version_CVS + ^ '$Header$' +! ! +