Nicolas Cellier uploaded a new version of Collections to project The Trunk:
http://source.squeak.org/trunk/Collections-nice.130.mcz ==================== Summary ==================== Name: Collections-nice.130 Author: nice Time: 14 September 2009, 8:48:49 am UUID: bd79631f-87b9-4d13-aeca-b819eb6390ca Ancestors: Collections-ar.129 add #removeAll suport to collections This is to solve both http://bugs.squeak.org/view.php?id=7177 http://bugs.squeak.org/view.php?id=6937 Comments about the implementation: The super implementation might be enhanced with a shallowCopy in order to provide a working implementation in more cases: self shallowCopy do: [:each | self remove: each]. I believe much subclasses will override, so I did not even bother. Subclass implementation tries to preserve original capacity. This choice is arbitrary and really depends on application side... CharacterSetComplement use a #become:. This is not efficient, but neither would be the addition of all existing characters to the complement (this set is defined by its complement as the name tells). Collection>>#removeAll: also has been modified to handle case of (self removeAll: self). This extends and supersedes the changes from kwl at http://bugs.squeak.org/view.php?id=6937 The big question is what should (self removeAll: self) return? My answer is simple: it returns self (an empty collection). Beware, this will break some chaining: (b removeAll: (a removeAll: a)) ~= (a removeAll: (b removeAll: a)). Anyway, that is not worse than current implementation which will not lead to the most predictible results. =============== Diff against Collections-ar.129 =============== Item was added: + ----- Method: Set>>removeAll (in category 'removing') ----- + removeAll + "remove all elements from this collection. + Preserve the capacity" + + self initialize: self capacity! Item was added: + ----- Method: WideCharacterSet>>removeAll (in category 'collection ops') ----- + removeAll + map removeAll! Item was changed: ----- Method: Collection>>removeAll: (in category 'removing') ----- removeAll: aCollection "Remove each element of aCollection from the receiver. If successful for each, answer aCollection. Otherwise create an error notification. ArrayedCollections cannot respond to this message." + aCollection == self ifTrue: [^self removeAll]. aCollection do: [:each | self remove: each]. ^ aCollection! Item was added: + ----- Method: OrderedCollection>>removeAll (in category 'removing') ----- + removeAll + "remove all the elements from this collection. + Keep same amount of storage" + + self setCollection: (Array new: array size)! Item was added: + ----- Method: CharacterSetComplement>>removeAll (in category 'collection ops') ----- + removeAll + | newSet | + newSet := CharacterSet new. + self become: newSet! Item was added: + ----- Method: Bag>>removeAll (in category 'removing') ----- + removeAll + "Implementation Note: as contents will be overwritten, a shallowCopy of self would be modified. + An alternative implementation preserving capacity would be to create a new contents: + self setContents: (self class contentsClass new: contents size)." + + contents removeAll! Item was added: + ----- Method: KeyedSet>>removeAll (in category 'removing') ----- + removeAll + "See super." + + | tmp | + tmp := keyBlock. + super removeAll. + keyBlock := tmp! Item was added: + ----- Method: WeakRegistry>>removeAll (in category 'removing') ----- + removeAll + "See super" + + self protected:[ + valueDictionary removeAll. + ].! Item was added: + ----- Method: Collection>>removeAll (in category 'removing') ----- + removeAll + "Remove each element from the receiver and leave it empty. + ArrayedCollections cannot respond to this message. + There are two good reasons why a subclass should override this message: + 1) the subclass does not support being modified while being iterated + 2) the subclass provides a much faster way than iterating through each element" + + self do: [:each | self remove: each].! Item was added: + ----- Method: LinkedList>>removeAll (in category 'removing') ----- + removeAll + "Implementation note: this has to be fast" + + firstLink := lastLink := nil! |
Free forum by Nabble | Edit this page |