[squeak-dev] The Trunk: Collections-nice.158.mcz
commits at source.squeak.org
commits at source.squeak.org
Mon Oct 5 08:23:41 UTC 2009
Nicolas Cellier uploaded a new version of Collections to project The Trunk:
http://source.squeak.org/trunk/Collections-nice.158.mcz
==================== Summary ====================
Name: Collections-nice.158
Author: nice
Time: 5 October 2009, 10:23:31 am
UUID: 27baf0fe-4d19-0e4e-841a-1f3abfcf7901
Ancestors: Collections-nice.157
Apply patch from http://bugs.squeak.org/view.php?id=6535
keyBlock and sortBlock are lost when creating a collection of the same species.
Unlike http://bugs.squeak.org/view.php?id=6535 initial solution, avoid defining a basicShallowCopy.
This requires using postCopy paradigm as pre-requisite.
If new methods are added before old methods are modified, this patch should load without problem in MC, else I will revert...
=============== Diff against Collections-nice.157 ===============
Item was added:
+ ----- Method: Set>>copyEmpty (in category 'copying') -----
+ copyEmpty
+ "Answer an empty copy of this collection"
+
+ "Note: this code could be moved to super"
+
+ ^self species new!
Item was added:
+ ----- Method: Set>>select: (in category 'enumerating') -----
+ select: aBlock
+ "Use copyEmpty instead of self species new to give subclasses a chance to initialize additional inst vars."
+
+ "Note: this code could be moved to super"
+
+ | newCollection |
+ newCollection := self copyEmpty.
+ self do: [:each | (aBlock value: each) ifTrue: [newCollection add: each]].
+ ^newCollection!
Item was added:
+ ----- Method: PluggableDictionary>>copyEmpty (in category 'copying') -----
+ copyEmpty
+ ^super copyEmpty
+ hashBlock: hashBlock;
+ equalBlock: equalBlock!
Item was changed:
----- Method: Dictionary>>select: (in category 'enumerating') -----
select: aBlock
"Evaluate aBlock with each of my values as the argument. Collect into a new dictionary, only those associations for which aBlock evaluates to true."
| newCollection |
+ newCollection := self copyEmpty.
- newCollection := self species new.
self associationsDo: [ :each |
(aBlock value: each value) ifTrue: [
newCollection add: each copy ] ].
^newCollection!
Item was added:
+ ----- Method: PluggableSet>>copyEmpty (in category 'copying') -----
+ copyEmpty
+ ^super copyEmpty
+ hashBlock: hashBlock;
+ equalBlock: equalBlock!
Item was added:
+ ----- Method: KeyedSet>>copyEmpty (in category 'copying') -----
+ copyEmpty
+ ^super copyEmpty
+ keyBlock: keyBlock!
Item was changed:
----- Method: OrderedCollection>>copyFrom:to: (in category 'copying') -----
copyFrom: startIndex to: endIndex
"Answer a copy of the receiver that contains elements from position
startIndex to endIndex."
+ ^self shallowCopy postCopyFrom: startIndex to: endIndex!
- | targetCollection |
- endIndex < startIndex ifTrue: [^self species new: 0].
- targetCollection := self species new: endIndex + 1 - startIndex.
- startIndex to: endIndex do: [:index | targetCollection addLast: (self at: index)].
- ^ targetCollection!
Item was added:
+ ----- Method: OrderedCollection>>postCopyFrom:to: (in category 'copying') -----
+ postCopyFrom: startIndex to: endIndex
+ "finish copying the array in a certain range."
+
+ endIndex < startIndex ifFalse: [
+ "Because actual size of the array may be greater than used size,
+ postCopyFrom:to: may fail to fail and answer an incorrect result
+ if this sanity check were not applied"
+ (startIndex between: 1 and: self size) ifFalse: [^self error: 'startIndex is out of bounds'].
+ (endIndex between: 1 and: self size) ifFalse: [^self error: 'endIndex is out of bounds']].
+
+ "Add a protection that lacks in Array>>postcopy"
+ array := array copyFrom: startIndex + firstIndex - 1 to: (endIndex max: startIndex - 1) + firstIndex - 1.
+ firstIndex := 1.
+ lastIndex := array size!
More information about the Squeak-dev
mailing list
|