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]]! |
Free forum by Nabble | Edit this page |