Andreas Raab uploaded a new version of Collections to project The Trunk:
http://source.squeak.org/trunk/Collections-ul.236.mcz ==================== Summary ==================== Name: Collections-ul.236 Author: ul Time: 1 December 2009, 4:54:17 am UUID: 7574c4aa-b907-1f4e-ba28-661aa9c084ae Ancestors: Collections-ul.235 - revert #do: #associationsDo: and the senders of #scanForEmptySlotFor: - removed preamble - add grow tweak to WeakSet - rehash everything at postscript =============== Diff against Collections-ul.235 =============== Item was changed: ----- Method: KeyedSet>>noCheckNoGrowFillFrom: (in category 'private') ----- noCheckNoGrowFillFrom: anArray "Add the elements of anArray except nils to me assuming that I don't contain any of them, they are unique and I have more free space than they require." 1 to: anArray size do: [ :index | | object | (object := anArray at: index) ifNotNil: [ array + at: (self scanForEmptySlotFor: (keyBlock value: object)) - at: (self scanFor: (keyBlock value: object)) put: object ] ]! Item was changed: ----- Method: WeakSet>>noCheckNoGrowFillFrom: (in category 'private') ----- noCheckNoGrowFillFrom: anArray "Add the elements of anArray except nils and flag to me assuming that I don't contain any of them, they are unique and I have more free space than they require." tally := 0. 1 to: anArray size do: [ :index | | object | ((object := anArray at: index) == flag or: [ object == nil ]) ifFalse: [ array + at: (self scanForEmptySlotFor: object) - at: (self scanFor: object) put: object. tally := tally + 1 ] ]! Item was changed: ----- Method: Set>>noCheckNoGrowFillFrom: (in category 'private') ----- noCheckNoGrowFillFrom: anArray "Add the elements of anArray except nils to me assuming that I don't contain any of them, they are unique and I have more free space than they require." 1 to: anArray size do: [ :index | | object | (object := anArray at: index) ifNotNil: [ array + at: (self scanForEmptySlotFor: object) - at: (self scanFor: object) put: object ] ]! Item was added: + ----- Method: WeakSet>>grow (in category 'private') ----- + grow + "Grow the elements array if needed. + Since WeakSets just nil their slots, a lot of the occupied (in the eyes of the set) slots are usually empty. Doubling size if unneeded can lead to BAD performance, therefore we see if reassigning the <live> elements to a Set of similiar size leads to a sufficiently (50% used here) empty set first" + + | oldTally | + oldTally := tally. + self rehash. + oldTally // 2 < tally ifTrue: [ super grow ]! Item was changed: ----- Method: Dictionary>>noCheckNoGrowFillFrom: (in category 'private') ----- noCheckNoGrowFillFrom: anArray "Add the elements of anArray except nils to me assuming that I don't contain any of them, they are unique and I have more free space than they require." 1 to: anArray size do: [ :index | | object | (object := anArray at: index) ifNotNil: [ array + at: (self scanForEmptySlotFor: object key) - at: (self scanFor: object key) put: object ] ]! Item was changed: ----- Method: WeakKeyDictionary>>noCheckNoGrowFillFrom: (in category 'private') ----- noCheckNoGrowFillFrom: anArray "Add the elements of anArray except nils and flag to me assuming that I don't contain any of them, they are unique and I have more free space than they require." tally := 0. 1 to: anArray size do:[ :i | | association | (association := anArray at: i) ifNotNil: [ array + at: (self scanForEmptySlotFor: association key) - at: (self scanFor: association key) put: association. tally := tally + 1 ] ]! Item was changed: ----- Method: WeakSet>>do: (in category 'public') ----- do: aBlock + tally = 0 ifTrue: [ ^self ]. + 1 to: array size do: [ :index | + | each | + ((each := array at: index) == nil or: [ each == flag ]) - tally = 0 ifTrue: [^self]. - array do: [ :each | - (each == nil or: [each == flag]) ifFalse: [ aBlock value: each ] ]! Item was changed: ----- Method: WeakKeyDictionary>>finalizeValues: (in category 'finalization') ----- finalizeValues: finiObjects "Remove all associations with key == nil and value is in finiObjects. This method is folded with #rehash for efficiency." | oldArray | oldArray := array. array := Array new: oldArray size. tally := 0. 1 to: array size do:[ :i | | association | (association := oldArray at: i) ifNotNil: [ | key | ((key := association key) == nil and: [ "Don't let the key go away" finiObjects includes: association value ]) ifFalse: [ array + at: (self scanForEmptySlotFor: key) - at: (self scanFor: key) put: association. tally := tally + 1 ] ] ]! Item was changed: Item was changed: ----- Method: WeakKeyToCollectionDictionary>>noCheckNoGrowFillFrom: (in category 'as yet unclassified') ----- noCheckNoGrowFillFrom: anArray "Add the elements of anArray except nils and associations with empty collections (or with only nils) to me assuming that I don't contain any of them, they are unique and I have more free space than they require." tally := 0. 1 to: anArray size do:[ :i | | association cleanedValue | ((association := anArray at: i) == nil or: [ (cleanedValue := association value copyWithout: nil) isEmpty ]) ifFalse: [ association value: cleanedValue. array + at: (self scanForEmptySlotFor: association key) - at: (self scanFor: association key) put: association. tally := tally + 1 ] ]! Item was changed: Item was changed: ----- Method: Dictionary>>associationsDo: (in category 'enumerating') ----- associationsDo: aBlock "Evaluate aBlock for each of the receiver's elements (key/value associations)." tally = 0 ifTrue: [ ^self]. + 1 to: array size do: [ :index | + | each | + (each := array at: index) + ifNotNil: [ aBlock value: each ] ]! - array do: [ :each | each ifNotNil: [ aBlock value: each ] ]! Item was changed: ----- Method: WeakSet>>growTo: (in category 'private') ----- growTo: anInteger "Grow the elements array and reinsert the old elements" | oldElements | - oldElements := array. array := WeakArray new: anInteger. array atAllPut: flag. self noCheckNoGrowFillFrom: oldElements! Item was changed: ----- Method: Set>>do: (in category 'enumerating') ----- do: aBlock tally = 0 ifTrue: [ ^self ]. + 1 to: array size do: [ :index | + | each | + (each := array at: index) + ifNotNil: [ aBlock value: each ] ]! - array do: [ :each | each ifNotNil: [ aBlock value: each ] ]! |
Free forum by Nabble | Edit this page |