Author: rfm
Date: Wed May 18 15:11:45 2016
New Revision: 39776

URL: http://svn.gna.org/viewcvs/gnustep?rev=39776&view=rev
Log:
attempt fiox for bug #47619

Modified:
    libs/base/trunk/ChangeLog
    libs/base/trunk/Source/NSPredicate.m

Modified: libs/base/trunk/ChangeLog
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/ChangeLog?rev=39776&r1=39775&r2=39776&view=diff
==============================================================================
--- libs/base/trunk/ChangeLog   (original)
+++ libs/base/trunk/ChangeLog   Wed May 18 15:11:45 2016
@@ -1,3 +1,7 @@
+2016-05-18  Richard Frith-Macdonald <[email protected]>
+
+       * Source/NSPredicate.m: attempt fix for bug #47619
+
 2016-05-18  Eric Heintzmann <[email protected]>
 
        * ChangeLog.2:

Modified: libs/base/trunk/Source/NSPredicate.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/NSPredicate.m?rev=39776&r1=39775&r2=39776&view=diff
==============================================================================
--- libs/base/trunk/Source/NSPredicate.m        (original)
+++ libs/base/trunk/Source/NSPredicate.m        Wed May 18 15:11:45 2016
@@ -1523,7 +1523,7 @@
     }
   // apply method selector
   return [self performSelector: _selector
-                      withObject: eargs];
+                    withObject: eargs];
 }
 
 - (void) dealloc;
@@ -1543,6 +1543,20 @@
   return copy;
 }
 
+- (NSEnumerator*) _enum: (NSArray *)expressions
+{
+  id    o;
+
+  /* Check to see if this is aggregating over a collection.
+   */
+  if (1 == _argc && [(o = [expressions lastObject])
+    respondsToSelector: @selector(objectEnumerator)])
+    {
+      return [o objectEnumerator];
+    }
+  return [expressions objectEnumerator];
+}
+
 - (id) _expressionWithSubstitutionVariables: (NSDictionary *)variables
 {
   NSMutableArray *args = [NSMutableArray arrayWithCapacity: _argc];
@@ -1593,7 +1607,8 @@
   id left = [expressions objectAtIndex: 0];
   id right = [expressions objectAtIndex: 1];
 
-  return [NSNumber numberWithDouble: pow([left doubleValue], [right 
doubleValue])];
+  return [NSNumber numberWithDouble:
+    pow([left doubleValue], [right doubleValue])];
 }
 
 - (id) _eval__mul: (NSArray *)expressions
@@ -1637,70 +1652,66 @@
 
 - (id) _eval_avg: (NSArray *)expressions 
 {
-  unsigned int i;
-  double sum = 0.0;
+  NSEnumerator  *e = [self _enum: expressions];
+  double        sum = 0.0;
+  unsigned      count = 0;
+  id            o;
     
-  for (i = 0; i < _argc; i++)
-    {
-      sum += [[expressions objectAtIndex: i] doubleValue];
-    }
-  return [NSNumber numberWithDouble: sum / _argc];
+  while (nil != (o = [e nextObject]))
+    {
+      sum += [o doubleValue];
+      count++;
+    }
+  return [NSNumber numberWithDouble: sum / count];
+}
+
+- (id) _eval_max: (NSArray *)expressions
+{
+  NSEnumerator  *e = [self _enum: expressions];
+  id            o = [e nextObject];
+  double        max = (nil == o) ? 0.0 : [o doubleValue];
+  double        cur;
+  
+  while (nil != (o = [e nextObject]))
+    {
+      cur = [o doubleValue];
+      if (max < cur)
+        {
+          max = cur;
+        }
+    }
+  return [NSNumber numberWithDouble: max];
+}
+
+- (id) _eval_min: (NSArray *)expressions
+{
+  NSEnumerator  *e = [self _enum: expressions];
+  id            o = [e nextObject];
+  double        min = (nil == o ? 0.0 : [o doubleValue]);
+  double        cur;
+
+  while (nil != (o = [e nextObject]))
+    {
+      cur = [o doubleValue];
+      if (min > cur)
+        {
+          min = cur;
+        }
+    }
+  return [NSNumber numberWithDouble: min];
 }
 
 - (id) _eval_sum: (NSArray *)expressions
 {
-  unsigned int i;
-  double sum = 0.0;
-    
-  for (i = 0; i < _argc; i++)
-    {
-      sum += [[expressions objectAtIndex: i] doubleValue];
+  NSEnumerator  *e = [self _enum: expressions];
+  double        sum = 0.0;
+  id            o;
+
+  while (nil != (o = [e nextObject]))
+    {
+      sum += [o doubleValue];
     }
   return [NSNumber numberWithDouble: sum];
-}
-
-- (id) _eval_min: (NSArray *)expressions
-{
-  unsigned int i;
-  double min = 0.0;
-  double cur;
-  
-  if (_argc > 0)
-    {
-      min = [[expressions objectAtIndex: 0] doubleValue];
-    }
-
-  for (i = 1; i < _argc; i++)
-    {
-      cur = [[expressions objectAtIndex: i] doubleValue];
-      if (min > cur)
-        {
-          min = cur;
-        }
-    }
-  return [NSNumber numberWithDouble: min];
-}
-
-- (id) _eval_max: (NSArray *)expressions
-{
-  unsigned int i;
-  double max = 0.0;
-  double cur;
-  
-  if (_argc > 0)
-    {
-      max = [[expressions objectAtIndex: 0] doubleValue];
-    }
-
-  for (i = 1; i < _argc; i++)
-    {
-      cur = [[expressions objectAtIndex: i] doubleValue];
-      if (max < cur)
-        {
-          max = cur;
-        }
-    }
-  return [NSNumber numberWithDouble: max];
 }
 
 // add arithmetic functions: average, median, mode, stddev, sqrt, log, ln, 
exp, floor, ceiling, abs, trunc, random, randomn, now


_______________________________________________
Gnustep-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs

Reply via email to