Andreas Raab uploaded a new version of Collections to project The Trunk: http://source.squeak.org/trunk/Collections-ar.142.mcz
==================== Summary ====================
Name: Collections-ar.142 Author: ar Time: 29 September 2009, 10:04:47 am UUID: 03cd4bc2-d806-7740-a2b3-5a4024943d81 Ancestors: Collections-ar.141, Collections-ul.141
Merging Collections-ul.141:
- rewritten Set >> #fixCollisionsFrom: and WeakSet >> #fixCollisionsFrom:, they use #scanFor: instead of #findElementOrNil: - replaced KeyedSet >> #fixCollisionsFrom: with #keyAt:
- added #postCopy to Set and subclasses, to replace it's similar but unique mechanism with #copy and #withArray:, these methods have to be removed in another version, but MethodDictionary >> #postCopy has to be added first.
- Dictionary >> #values doesn't create an unnecessary copy of the result anymore.
=============== Diff against Collections-ar.141 ===============
Item was changed: ----- Method: Dictionary>>values (in category 'accessing') ----- values "Answer a Collection containing the receiver's values." + + ^Array new: self size streamContents: [ :stream | + self valuesDo: [ :value | stream nextPut: value] ]! - | out | - out := WriteStream on: (Array new: self size). - self valuesDo: [:value | out nextPut: value]. - ^ out contents!
Item was added: + ----- Method: KeyedSet>>keyAt: (in category 'private') ----- + keyAt: index + + ^keyBlock value: (array at: index)!
Item was added: + ----- Method: Set>>postCopy (in category 'copying') ----- + postCopy + + array := array shallowCopy!
Item was changed: ----- Method: WeakSet>>fixCollisionsFrom: (in category 'private') ----- + fixCollisionsFrom: start + "The element at start has been removed and replaced by flag. - fixCollisionsFrom: index - "The element at index has been removed and replaced by nil. This method moves forward from there, relocating any entries + that had been placed below due to collisions with this one. + We can be sure that there is an empty slot in this collection + so it's safe to use #scanFor: instead of #findElementOrNil:." - that had been placed below due to collisions with this one"
+ | element newIndex | + start + 1 to: array size do: [ :index | + (element := self keyAt: index) == flag ifTrue: [ ^self ]. + (newIndex := self scanFor: element) = index ifFalse: [ + self swap: index with: newIndex ] ]. + 1 to: start do: [ :index | + (element := self keyAt: index) == flag ifTrue: [ ^self ]. + (newIndex := self scanFor: element) = index ifFalse: [ + self swap: index with: newIndex ] ] + ! - | length oldIndex newIndex element | - - oldIndex := index. - length := array size. - [oldIndex = length - ifTrue: [oldIndex := 1] - ifFalse: [oldIndex := oldIndex + 1]. - (element := self keyAt: oldIndex) == flag] - whileFalse: - [newIndex := self findElementOrNil: element. - oldIndex = newIndex ifFalse: [self swap: oldIndex with: newIndex]]!
Item was added: + ----- Method: Dictionary>>postCopy (in category 'copying') ----- + postCopy + "Must copy the associations, or later store will affect both the + original and the copy" + + array := array collect: [ :association | + association ifNotNil: [ association copy ] ]!
Item was changed: ----- Method: Set>>fixCollisionsFrom: (in category 'private') ----- + fixCollisionsFrom: start + "The element at start has been removed and replaced by nil. - fixCollisionsFrom: index - "The element at index has been removed and replaced by nil. This method moves forward from there, relocating any entries + that had been placed below due to collisions with this one. + We can be sure that there is an empty slot in this collection + so it's safe to use #scanFor: instead of #findElementOrNil:." - that had been placed below due to collisions with this one"
+ | element newIndex | + start + 1 to: array size do: [ :index | + (element := self keyAt: index) ifNil: [ ^self ]. + (newIndex := self scanFor: element) = index ifFalse: [ + self swap: index with: newIndex ] ]. + 1 to: start do: [ :index | + (element := self keyAt: index) ifNil: [ ^self ]. + (newIndex := self scanFor: element) = index ifFalse: [ + self swap: index with: newIndex ] ]! - | length oldIndex newIndex element | - - oldIndex := index. - length := array size. - [oldIndex = length - ifTrue: [oldIndex := 1] - ifFalse: [oldIndex := oldIndex + 1]. - (element := self keyAt: oldIndex) == nil] - whileFalse: - [newIndex := self findElementOrNil: element. - oldIndex = newIndex ifFalse: [self swap: oldIndex with: newIndex]]!
Item was removed: - ----- Method: KeyedSet>>fixCollisionsFrom: (in category 'private') ----- - fixCollisionsFrom: index - "The element at index has been removed and replaced by nil. - This method moves forward from there, relocating any entries - that had been placed below due to collisions with this one" - | length oldIndex newIndex element | - oldIndex := index. - length := array size. - [oldIndex = length - ifTrue: [oldIndex := 1] - ifFalse: [oldIndex := oldIndex + 1]. - (element := self keyAt: oldIndex) == nil] - whileFalse: - [newIndex := self findElementOrNil: (keyBlock value: element). - oldIndex = newIndex ifFalse: [self swap: oldIndex with: newIndex]]!
squeak-dev@lists.squeakfoundation.org