[squeak-dev] The Inbox: Collections-nice.825.mcz

commits at source.squeak.org commits at source.squeak.org
Sun Apr 7 21:10:20 UTC 2019


Nicolas Cellier uploaded a new version of Collections to project The Inbox:
http://source.squeak.org/inbox/Collections-nice.825.mcz

==================== Summary ====================

Name: Collections-nice.825
Author: nice
Time: 7 April 2019, 11:10:11.564693 pm
UUID: c9836c60-9acc-45eb-83b2-851f147b70ca
Ancestors: Collections-nice.824

Try to improve some Interval of Float Behavior.

- change #last so that it agrees with (self at: self size)
 Note that last behavior slightly changes for empty Interval: (3 to: 0) last is now 2 instead of 0 previously. I don't know of any code impacted, but it's not a completely neutral change

Note: this solves 2 out of the 3 failures of #testIntervalOfFloatLast... The last element might still overshoot the prescribed upper bound. I can also fix it, but implementation of #last is getting overkill.

- implement a ReversedInterval that lazily reverse an Interval of Float, and resolves #testIntervalOfFloatReversed.

The alternative would be resorting to an Array...

- renounce fuzzy inclusion test. As exhibited by #testSurprisingFuzzyInclusionBehavior, it creates more weirdness than it tries to solve. There will be two more test failing, asserting this fuzzy inclusion, but we can later change them.

=============== Diff against Collections-nice.824 ===============

Item was changed:
  ----- Method: Interval>>indexOf:startingAt: (in category 'accessing') -----
  indexOf: anElement startingAt: startIndex
  	"startIndex is an positive integer, the collection index where the search is started."
- 	"during the computation of val , floats are only used when the receiver	contains floats"
  
+ 	| index |
- 	| index val |
  	(self rangeIncludes: anElement) ifFalse: [ ^0 ].
+ 	index := (anElement - start / step) rounded + 1.
- 	val := anElement - self first / self increment.
- 	val isFloat
- 		ifTrue: [
- 			(val - val rounded) abs * 100000000 < 1 ifFalse: [ ^0 ].
- 			index := val rounded + 1 ]
- 		ifFalse: [
- 			val isInteger ifFalse: [ ^0 ].
- 			index := val + 1 ].
- 	"finally, the value of startIndex comes into play:"
  	(index between: startIndex and: self size) ifFalse: [ ^0 ].
+ 	(self at: index) = anElement ifFalse: [ ^0 ].
  	^index!

Item was changed:
  ----- Method: Interval>>last (in category 'accessing') -----
  last 
  	"Refer to the comment in SequenceableCollection|last."
  
+ 	^start + (step * (self size - 1))!
- 	^stop - (stop - start \\ step)!

Item was changed:
  ----- Method: Interval>>reversed (in category 'converting') -----
  reversed
  	self isEmpty ifTrue: [^stop to: start by: step negated].
+ 	(start isFraction and: [step isFraction]) ifFalse: [^ReversedInterval newFrom: self].
  	^self last to: start by: step negated!

Item was added:
+ SequenceableCollection subclass: #ReversedInterval
+ 	instanceVariableNames: 'original'
+ 	classVariableNames: ''
+ 	poolDictionaries: ''
+ 	category: 'Collections-Sequenceable'!
+ 
+ !ReversedInterval commentStamp: 'nice 4/6/2019 16:30' prior: 0!
+ A ReversedInterval is an Interval reversed.
+ An Interval reversed is generally an Interval, except when made of Float.
+ This is because Float arithmetic does not guarantee reversible operations.
+ 
+ Instead of transforming the reversed Float Interval into an Array, I keep a lazier and cheaper representation.
+ I can even pretend being an Interval myself. As long as I quake like a duck...
+ 
+ Instance Variables
+ 	original:		<Interval>
+ 
+ original
+ 	- the Interval being reversed
+ !

Item was added:
+ ----- Method: ReversedInterval class>>newFrom: (in category 'as yet unclassified') -----
+ newFrom: aCollection 
+ 	"Answer an instance of me containing the same elements as aCollection, reversed."
+ 
+ 	aCollection isInterval ifTrue: [^self basicNew setOriginal: aCollection].
+ 	^(Interval newFrom: aCollection) reversed!

Item was added:
+ ----- Method: ReversedInterval>>+ (in category 'arithmetic') -----
+ + aNumber
+ 	^(original + aNumber) reversed!

Item was added:
+ ----- Method: ReversedInterval>>- (in category 'arithmetic') -----
+ - aNumber
+ 	^(original - aNumber) reversed!

Item was added:
+ ----- Method: ReversedInterval>>= (in category 'comparing') -----
+ = anObject
+ 	^ self == anObject
+ 		or: [anObject class = self class
+ 			and: [original = anObject reversed]]!

Item was added:
+ ----- Method: ReversedInterval>>at: (in category 'accessing') -----
+ at: anInteger
+ 	^original at: original size + 1 - anInteger!

Item was added:
+ ----- Method: ReversedInterval>>copyFrom:to: (in category 'copying') -----
+ copyFrom: startIndex to: stopIndex
+ 	(startIndex = 1 and: [stopIndex = self size]) ifTrue: [^self].
+ 	stopIndex < startIndex ifTrue: [^self copyEmpty].
+ 	^((self at: stopIndex) to: (self at: startIndex) by: original increment) reversed!

Item was added:
+ ----- Method: ReversedInterval>>do: (in category 'enumerating') -----
+ do: aBlock
+ 	original reverseDo: aBlock!

Item was added:
+ ----- Method: ReversedInterval>>hash (in category 'comparing') -----
+ hash
+ 	^original hash bitXor: SmallInteger maxVal!

Item was added:
+ ----- Method: ReversedInterval>>isEmpty (in category 'testing') -----
+ isEmpty
+ 	^self size = 0!

Item was added:
+ ----- Method: ReversedInterval>>printOn: (in category 'printing') -----
+ printOn: aStream
+ 	aStream
+ 		nextPut: $(;
+ 		print: original;
+ 		nextPut: $);
+ 		space;
+ 		nextPutAll: #reversed!

Item was added:
+ ----- Method: ReversedInterval>>reverseDo: (in category 'enumerating') -----
+ reverseDo: aBlock
+ 	original do: aBlock!

Item was added:
+ ----- Method: ReversedInterval>>reversed (in category 'converting') -----
+ reversed
+ 	^original!

Item was added:
+ ----- Method: ReversedInterval>>setOriginal: (in category 'private') -----
+ setOriginal: anInterval
+ 	original := anInterval!

Item was added:
+ ----- Method: ReversedInterval>>size (in category 'accessing') -----
+ size
+ 	^original size!

Item was added:
+ ----- Method: ReversedInterval>>sorted (in category 'sorting') -----
+ sorted
+ 	original increment > 0 ifTrue: [^original].
+ 	^self!

Item was added:
+ ----- Method: ReversedInterval>>species (in category 'private') -----
+ species
+ 
+ 	^original species!

Item was added:
+ ----- Method: ReversedInterval>>storeOn: (in category 'printing') -----
+ storeOn: aStream
+ 	aStream
+ 		nextPut: $(;
+ 		store: original;
+ 		nextPut: $);
+ 		space;
+ 		nextPutAll: #reversed!

Item was added:
+ ----- Method: ReversedInterval>>sum (in category 'accessing') -----
+ sum
+ 	^original sum!



More information about the Squeak-dev mailing list