(class side)

#new: 

(instance side)

#growAtFirst
#growAtLast
#makeRoomAtFirst
#makeRoomAtLast

        
> On 23 Feb 2015, at 21:15, Mariano Martinez Peck <marianop...@gmail.com> wrote:
> 
> 
> 
> On Fri, Feb 20, 2015 at 5:48 AM, Clément Bera <bera.clem...@gmail.com> wrote:
> It depends on your OrderedCollection implementation.
> 
> OrderedCollection has a variable size in memory. When instantiated, it has 
> for example 10 slots, and if you have more than 10 objects, it needs to 
> change its size to hold more slots. 
> 
> 
> I thought that was the case too, but I cannot find in code what you say. 
> OrderedCollection nor it's parents are created with #variableSubclass... As 
> you can see, "OrderedCollection isVariable" answers false. So where is that 
> "variable size in memory" ?
> 
> Thanks, 
>  
> The current implementation relies on an indirection to an array, when the 
> array overflows, the orderedCollection allocates a new bigger array and copy 
> the slots from the existing array. There are some heuristics on array size to 
> avoid having to grow the array too often.
> 
> If you want the shallowCopy to work, you have to use the old implementation 
> of OrderedCollection, which encodes in its field directly the values it 
> holds. In this case however when the collection overflows you create a new 
> orderedCollection so you need to use #become: to migrate references to the 
> old orderedCollection to the new one. This used to be a bad idea because the 
> become primitive was slow, but since we have Spur, it may be relevant to look 
> at it again. This old implementation is more memory efficient too.
> 
> 2015-02-20 8:05 GMT+01:00 Marcus Denker <marcus.den...@inria.fr>:
> 
>> On 20 Feb 2015, at 06:23, S Krish <krishnamachari.sudha...@gmail.com> wrote:
>> 
>> 
>> I presumed shallowCopy for literal arrays / OrderedCollection should have 
>> been a true copy. Perhaps need to understand this.. 
>> 
> 
> OrderdCollection is not just one object, but it holds on to an Array that has 
> it’s content. You copy the outside collection object, but share
> the Array.
> 
>> shallowCopy
>>     "Answer a copy of the receiver which shares the receiver's instance 
>> variables. It should never be overridden. I'm invoked from the copy template 
>> method. Subclasses that need to specialize the copy should specialize the 
>> postCopy hook method."
>>    ...
>>     <primitive: 148>
>>     class := self class.
>>     class isVariable
>>         ifTrue: 
>>             [...   newObject := class basicNew: index. ....]
>>         ifFalse: [newObject := class basicNew].
>>     ..
>>         whileTrue: 
>>             [newObject instVarAt: index put: (self instVarAt: index).
>>            ...
>>     ^ newObject
>> 
>> On Wed, Feb 18, 2015 at 10:52 PM, Marcus Denker <marcus.den...@inria.fr> 
>> wrote:
>> 
>>> On 18 Feb 2015, at 18:13, Cameron Sanders via Pharo-users 
>>> <pharo-users@lists.pharo.org> wrote:
>>> 
>>> 
>>> Date: 18 Feb 2015 18:12:33 CET
>>> Subject: i feel dumb / Pharo3 > OrderedCollection >> do:
>>> From: Cameron Sanders <camsand...@aol.com>
>>> To: Any question about pharo is welcome <pharo-users@lists.pharo.org>
>>> 
>>> 
>>> I must be making some silly error here that i cannot see clearly. Why does 
>>> the following leave anything in the list 'a'? Run it in a workspace. With 
>>> or without the shallowCopy, i am left with a list with half of the elements 
>>> in it. Always half.
>>> 
>>> This version of Pharo3 (21.0) was downloaded last week. I am running on a 
>>> Mac.
>>> 
>>> Thanks in advance. ... Maybe I just need more coffee.
>>> -Cam
>>> 
>>> | a  |
>>> a := {  #a. #b. #c. #d. } asOrderedCollection.
>>> a shallowCopy do: [ :item | (a includes: item) ifTrue: [ a remove: item ]].
>>> a size
>>> 
>> 
>> shallowCopy is not enough… OrderedCollection is made up of an internal array.
>> 
>> #copy does the right thing, just copies the array:
>> 
>> postCopy
>>      array := array copy
>> 
>> and for Array, copy is a shallowCopy.
>> 
>>      Marcus
>> 
>> 
>> 
>> 
> 
> 
> 
> 
> 
> -- 
> Mariano
> http://marianopeck.wordpress.com


Reply via email to