Levente Uzonyi uploaded a new version of Collections to project The Trunk:
http://source.squeak.org/trunk/Collections-ul.729.mcz ==================== Summary ==================== Name: Collections-ul.729 Author: ul Time: 25 December 2016, 4:16:33.349302 pm UUID: dedb0ac7-ea11-42b9-8a91-2839a52866c7 Ancestors: Collections-nice.728 - minor OrderedCollection optimizations =============== Diff against Collections-nice.728 =============== Item was changed: ----- Method: OrderedCollection>>asArray (in category 'converting') ----- asArray "Overriden for speed" + | result size | + result := Array new: (size := self size). - | result | - result := Array new: self size. result replaceFrom: 1 + to: size - to: result size with: array startingAt: firstIndex. ^result! Item was changed: ----- Method: OrderedCollection>>makeRoomAtFirst (in category 'private') ----- makeRoomAtFirst "Make some empty slots at the front of the array. If we have more than 50% free space, then just move the elements, so that the first 50% of the slots are free, otherwise add new free slots to the front by growing. Precondition: firstIndex = 1" + | tally newFirstIndex newLastIndex capacity | - | tally newFirstIndex newLastIndex | tally := self size. + capacity := array size. + tally * 2 >= capacity ifTrue: [ ^self growAtFirst ]. + tally = 0 ifTrue: [ ^self resetTo: capacity + 1 ]. + newFirstIndex := capacity // 2 + 1. - tally * 2 >= array size ifTrue: [ ^self growAtFirst ]. - tally = 0 ifTrue: [ ^self resetTo: array size + 1 ]. - newFirstIndex := array size // 2 + 1. newLastIndex := newFirstIndex - firstIndex + lastIndex. 0 to: tally - 1 do: [ :offset | array at: newLastIndex - offset put: (array at: lastIndex - offset) ]. array from: firstIndex to: newFirstIndex - 1 put: nil. firstIndex := newFirstIndex. lastIndex := newLastIndex! Item was added: + ----- Method: OrderedCollection>>replace: (in category 'enumerating') ----- + replace: aBlock + "Evaluate aBlock with each of my elements as the argument. Collect the resulting values into myself. + Override superclass in order to work on the internal array directly." + + firstIndex to: lastIndex do: [ :index | + array at: index put: (aBlock value: (array at: index)) ]! Item was changed: ----- Method: OrderedCollection>>with:collect: (in category 'enumerating') ----- with: otherCollection collect: twoArgBlock "Collect and return the result of evaluating twoArgBlock with corresponding elements from this collection and otherCollection." + + | result offset size | + (size := self size) = otherCollection size ifFalse: [ self error: 'otherCollection must be the same size' ]. + result := self species new: size. + offset := 1 - firstIndex. + firstIndex to: lastIndex do: [ :index | + result addLast: ( + twoArgBlock + value: (array at: index) + value: (otherCollection at: index + offset)) ]. + ^result! - | result | - otherCollection size = self size ifFalse: [self error: 'otherCollection must be the same size']. - result := self species new: self size. - 1 to: self size do: - [:index | result addLast: (twoArgBlock value: (self at: index) - value: (otherCollection at: index))]. - ^ result! Item was changed: ----- Method: OrderedCollection>>withIndexCollect: (in category 'enumerating') ----- withIndexCollect: elementAndIndexBlock "Just like with:collect: except that the iteration index supplies the second argument to the block. Override superclass in order to use addLast:, not at:put:." + | newCollection offset | - | newCollection | newCollection := self species new: self size. + offset := 1 - firstIndex. firstIndex to: lastIndex do: [:index | newCollection addLast: (elementAndIndexBlock value: (array at: index) + value: index + offset) ]. - value: index - firstIndex + 1)]. ^ newCollection! |
Free forum by Nabble | Edit this page |