[squeak-dev] The Trunk: Collections-nice.820.mcz
Chris Cunningham
cunningham.cb at gmail.com
Wed Feb 13 16:21:20 UTC 2019
Thank you. This was an angle I hadn't thought of - but definitely opens up
how to fix it correctly:
*>Definitively abandon SequenceableCollection equality tests based on equal
species. *
On Tue, Feb 12, 2019 at 2:56 PM <commits at source.squeak.org> wrote:
> Nicolas Cellier uploaded a new version of Collections to project The Trunk:
> http://source.squeak.org/trunk/Collections-nice.820.mcz
>
> ==================== Summary ====================
>
> Name: Collections-nice.820
> Author: nice
> Time: 12 February 2019, 11:56:35.262017 pm
> UUID: bb383133-067c-4133-987b-c481a7de69c7
> Ancestors: Collections-ul.819, Collections-cbc.813
>
> Definitively abandon SequenceableCollection equality tests based on equal
> species.
>
> Old behaviour can still be obtained thru hasEqualElements: but the default
> is to not try to support such trans-class equality feature because it is
> much too complex.
>
> Particularly Interval are no more equal to Arrays with same sequence. We
> can thus optimize hash a bit more and fix the old bugs of equa objects with
> different hashes. Merge Collections-cbc.813 for this and rehashAll in
> postscript.
>
> There are not so many classes concerned by this change, mainly RunArray,
> Interval and LinkedList:
>
> Collection withAllSubclasses select: [:e | [e basicNew species ~= e] on:
> Error do: [false]]
> -> an OrderedCollection(WeakRegistry LinkedList Interval ByteCharacterSet
> CharacterSetComplement LazyCharacterSet WideCharacterSet ShortRunArray
> Semaphore Mutex TextLineInterval WeakArray Monitor MCVersionName ByteSymbol
> WideSymbol)
>
> We will have to change the tests that rely on such equality.
>
> =============== Diff against Collections-ul.819 ===============
>
> Item was changed:
> ----- Method: FloatArray>>= (in category 'comparing') -----
> = aFloatArray
> - | length |
> <primitive: 'primitiveEqual' module: 'FloatArrayPlugin'>
> + ^super = aFloatArray!
> - aFloatArray class = self class ifFalse: [^ false].
> - length := self size.
> - length = aFloatArray size ifFalse: [^ false].
> - 1 to: self size do: [:i | (self at: i)
> - = (aFloatArray at: i) ifFalse: [^ false]].
> - ^ true!
>
> Item was changed:
> ----- Method: Interval>>= (in category 'comparing') -----
> = anObject
> -
> ^ self == anObject
> + or: [anObject isInterval
> + ifFalse: [super = anObject]
> + ifTrue:
> + [start = anObject first
> + and: [step = anObject increment
> + and: [self last = anObject last]]]]!
> - ifTrue: [true]
> - ifFalse: [anObject isInterval
> - ifTrue: [start = anObject first
> - and: [step = anObject increment
> - and: [self last = anObject last]]]
> - ifFalse: [super = anObject]]!
>
> Item was changed:
> ----- Method: Interval>>hash (in category 'comparing') -----
> hash
> "Hash is reimplemented because = is implemented."
> + ^((start hash hashMultiply bitXor: self last hash) hashMultiply
> + bitXor: self size)!
> -
> - ^(((start hash bitShift: 2)
> - bitOr: stop hash)
> - bitShift: 1)
> - bitOr: self size!
>
> Item was changed:
> ----- Method: RunArray>>= (in category 'comparing') -----
> = anObject
> + self == anObject ifTrue: [^ true].
> - "Test if all my elements are equal to those of anObject"
> -
> ^anObject class == self class
> + and:
> - ifTrue: "Faster test between two RunArrays"
> [(runs hasEqualElements: anObject runs)
> + and: [values hasEqualElements: anObject values]]!
> - and: [values hasEqualElements: anObject values]]
> - ifFalse:
> - [anObject isCollection and: [self
> hasEqualElements: anObject]]!
>
> Item was changed:
> ----- Method: SequenceableCollection>>= (in category 'comparing') -----
> = otherCollection
> "Answer true if the receiver is equivalent to the otherCollection.
> + First test for identity, then rule out different class and sizes of
> - First test for identity, then rule out different species and sizes
> of
> collections. As a last resort, examine each element of the receiver
> and the otherCollection."
>
> self == otherCollection ifTrue: [^ true].
> + self class == otherCollection class ifFalse: [^ false].
> - self species == otherCollection species ifFalse: [^ false].
> ^ self hasEqualElements: otherCollection!
>
> Item was changed:
> ----- Method: Symbol>>= (in category 'comparing') -----
> = aSymbol
> "Compare the receiver and aSymbol."
> self == aSymbol ifTrue: [^ true].
> + aSymbol isSymbol ifTrue: [^ false].
> - self class == aSymbol class ifTrue: [^ false].
> "Use String comparison otherwise"
> ^ super = aSymbol!
>
> Item was changed:
> + (PackageInfo named: 'Collections') postscript: 'Character
> initializeClassificationTable.
> + HashedCollection rehashAll.'!
> - (PackageInfo named: 'Collections') postscript: 'Character
> initializeClassificationTable'!
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20190213/0b91637d/attachment.html>
More information about the Squeak-dev
mailing list
|