[squeak-dev] The Trunk: Collections-nice.130.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-nice.130.mcz

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