add_array_sum_and_mean_with_u.diff

Patch to add sum and mean features - danielc192 (Daniel Cohen), 11/01/2009 10:52 pm

Download (1.7 kB)

array.c 2009-10-31 19:44:04.000000000 -0400
43 43
    }
44 44
}
45 45

  
46

  
46 47
# define ARY_SHARED_P(ary) \
47 48
    (assert(!FL_TEST(ary, ELTS_SHARED) || !FL_TEST(ary, RARRAY_EMBED_FLAG)), \
48 49
     FL_TEST(ary,ELTS_SHARED)!=0)
......
1406 1407

  
1407 1408
/*
1408 1409
 *  call-seq:
1410
 *  		array.sum	->	double
1411
 *
1412
 *  Finds the sum of all the values in <i>self</i>.
1413
 *  All of the values must be numbers, 
1414
 *  otherwise, the function raises a TypeError.
1415
 * 
1416
 *  a = [1, 2, 3]
1417
 *  a.sum	#=>		6
1418
 *
1419
 *  
1420
*/
1421

  
1422
static VALUE
1423
rb_ary_sum(VALUE ary)
1424
{
1425
	long i;
1426
	double sum = 0.0;
1427
	
1428
	
1429
	for (i=0; i<RARRAY_LEN(ary); i++) {
1430
	if( TYPE(RARRAY_PTR(ary)[i]) == T_STRING) {
1431
		rb_raise(rb_eTypeError, "Element is not a number!");
1432
	} else {
1433
		sum = sum +  NUM2DBL(RARRAY_PTR(ary)[i]);
1434
	}
1435
	}
1436
	return DBL2NUM(sum);
1437
}
1438

  
1439
/*
1440
 * call-seq:
1441
 * 		array.mean	->	double
1442
 *
1443
 *  Finds the mean of values in <i>self</i>. All values must be numbers,
1444
 *  otherwise, the function raises a TypeError.
1445
 *
1446
 *  a = [1, 2, 3]
1447
 *  a.mean	#=>		2
1448
 *
1449
 */
1450
	
1451
static VALUE
1452
rb_ary_mean(VALUE ary)
1453
{
1454
	return DBL2NUM(NUM2DBL(rb_ary_sum(ary)) / RARRAY_LEN(ary));	
1455
}
1456

  
1457
/*
1458
 *  call-seq:
1409 1459
 *     array.each_index {|index| block }  ->  array
1410 1460
 *
1411 1461
 *  Same as <code>Array#each</code>, but passes the index of the element
......
4151 4201
    rb_define_method(rb_cArray, "take_while", rb_ary_take_while, 0);
4152 4202
    rb_define_method(rb_cArray, "drop", rb_ary_drop, 1);
4153 4203
    rb_define_method(rb_cArray, "drop_while", rb_ary_drop_while, 0);
4204
    
4205
    rb_define_method(rb_cArray, "sum", rb_ary_sum, 0);
4206
    rb_define_method(rb_cArray, "mean", rb_ary_mean, 0);
4154 4207

  
4155 4208
    id_cmp = rb_intern("<=>");
4156 4209
}