[squeak-dev] The Trunk: Collections-ar.142.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[squeak-dev] The Trunk: Collections-ar.142.mcz

commits-2
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]]!