Re: patch for wonders NSArray implementation

2013-06-06 Thread Johann Werner
Hi Oliver,

you are right that the behavior is a little different in Wonder. I looked into 
that method that had been changed to the current form in April 2009:

NSArray._findObjectInArray(…) is a private method so it cannot be called 
outside of NSArray which makes it easier to assess the implications of the 
different behaviors (code snippet at end of mail for illustration purposes). If 
that method is called with the param identical = true – like from 
NSArray.indexOfIdenticalObject(…) – the result is not affected by the different 
coding, thus everything is fine.
If that method is called with identical = false – like from 
NSArray.indexOfObject(…) – the result can differ. Let's make an example:

Integer one = new Integer(1),
Integer otherOne = new Integer(1);
NSArray array = new NSArray(new Integer[] { one, otherOne } );
int index = array.indexOfObject(otherOne);

With the original implementation of NSArray we would get an index of 1 as it 
will first check all objects on reference equality in the first run and then on 
value equality in a second run. With the Wonder version we will get an index of 
0 as that implementation checks every item on reference and on value equality 
before checking the next one. If you really wanted the exact index you would 
have to call

int index = array.indexOfIdenticalObject(otherOne);

To sum up, that code change in NSArray is an optimization compared to the 
original. Especially with big arrays that method will probably take much less 
time to return. You have to choose between indexOfObject and 
indexOfIdenticalObject in your code depending on if it is really important to 
you to get the identical object, though for the cases I can think of you should 
be fine getting the index of an object that could be either identical or equal. 
If not please elaborate :)

jw



Current Wonder code:

private final int _findObjectInArray(int index, int length, Object object, 
boolean identical) {
if (count() > 0) {
Object[] objects = objectsNoCopy();
int maxIndex = (index + length) - 1;
for (int i = index; i <= maxIndex; i++) {
if (objects[i] == object) {
return i;
} 
if (!identical && object.equals(objects[i])) {
return i;
}
}
}
return NotFound;
}


Original code:

private final int _findObjectInArray(int index, int length, Object object, 
boolean identical) {
if (count() > 0) {
Object[] objects = objectsNoCopy();
int maxIndex = (index + length) - 1;
for (int i = index; i <= maxIndex; i++) {
if (objects[i] == object) {
return i;
} 
}
if (!identical) {
for (int i = index; i <= maxIndex; i++) {
if (object.equals(objects[i])) {
return i;
}
}
}
}
return NotFound;
}



Am 18.02.2013 um 15:43 schrieb Oliver Egger :

> Hi all
> 
> During upgrading the wonder frameworks to the 6.0 versions we noticed a 
> changed behaviour
> in NSArray.
> 
> In the NSArray_findObjectInArray function, if identical is set to false, the 
> orginial version does not
> return an earlier equal object (as the wonder version does) but the first 
> object matching the same object.
> 
> Please consider to include the attached patch, if you need further 
> information do not hesitate to contact
> me.
> 
> Best regards
> Oliver
> 
> 
> @@ -510,10 +510,12 @@ public class NSArray implements Cloneable, 
> Serializable, NSCoding, NSKeyValue
> 
>if (objects[i] == object) {
> 
>return i;
> 
>} 
> 
> -  if (!identical && object.equals(objects[i])) {
> 
> +  }
> 
> +  if(!identical)
> 
> +  for (int i = index; i <= maxIndex; i++) {
> 
> +  if (object.equals(objects[i])) {
> 
>return i;
> 
>}
> 
> -
> 
>}
> 
>  
>}
> 
> 
> -- 
> -- 
> oliver egger


 ___
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list  (Webobjects-dev@lists.apple.com)
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

patch for wonders NSArray implementation

2013-02-18 Thread Oliver Egger
Hi all

During upgrading the wonder frameworks to the 6.0 versions we noticed a
changed behaviour
in NSArray.

In the NSArray_findObjectInArray function, if identical is set to false,
the orginial version does not
return an earlier equal object (as the wonder version does) but the first
object matching the same object.

Please consider to include the attached patch, if you need further
information do not hesitate to contact
me.

Best regards
Oliver


@@ -510,10 +510,12 @@ public class NSArray implements Cloneable,
Serializable, NSCoding, NSKeyValue

   if (objects[i] == object) {

return i;

   }

-  if (!identical && object.equals(objects[i])) {

+  }

+  if(!identical)

+  for (int i = index; i <= maxIndex; i++) {

+  if (object.equals(objects[i])) {

return i;

   }

-

   }



  }

-- 
-- 
oliver egger
 ___
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list  (Webobjects-dev@lists.apple.com)
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com