@@ -226,6 +226,122 @@ void Set_Vector_Row(REBSER *ser, REBVAL *blk)
226
226
}
227
227
228
228
229
+ /***********************************************************************
230
+ **
231
+ */ REBVAL * Math_Op_Vector (REBVAL * v1 , REBVAL * v2 , REBCNT action )
232
+ /*
233
+ ** Do basic math operation on a vector
234
+ **
235
+ ***********************************************************************/
236
+ {
237
+ REBSER * vect = NULL ;
238
+ REBYTE * data ;
239
+ REBCNT bits ;
240
+ REBCNT len ;
241
+
242
+ REBVAL * left ;
243
+ REBVAL * right ;
244
+
245
+ REBI64 i = 0 ;
246
+ REBDEC f = 0 ;
247
+ REBCNT n = 0 ;
248
+
249
+ if (IS_VECTOR (v1 ) && IS_NUMBER (v2 )) {
250
+ left = v1 ;
251
+ right = v2 ;
252
+ } else if (IS_VECTOR (v2 ) && IS_NUMBER (v1 )) {
253
+ left = v2 ;
254
+ right = v1 ;
255
+ } else {
256
+ Trap_Action (VAL_TYPE (v1 ), action );
257
+ return NULL ;
258
+ }
259
+ vect = VAL_SERIES (left );
260
+ len = VAL_LEN (left );
261
+ bits = VECT_TYPE (vect );
262
+ data = vect -> data ;
263
+
264
+ if (IS_INTEGER (right )) {
265
+ i = VAL_INT64 (right );
266
+ f = (REBDEC )i ;
267
+ } else {
268
+ f = VAL_DECIMAL (right );
269
+ i = (REBI64 )f ;
270
+ }
271
+
272
+ n = VAL_INDEX (left );
273
+
274
+ switch (action ) {
275
+ case A_ADD :
276
+ switch (bits ) {
277
+ case VTSI08 : for (; n < len ; n ++ ) ( (i8 * )data )[n ] += ( i8 )i ; break ;
278
+ case VTSI16 : for (; n < len ; n ++ ) ((i16 * )data )[n ] += (i16 )i ; break ;
279
+ case VTSI32 : for (; n < len ; n ++ ) ((i32 * )data )[n ] += (i32 )i ; break ;
280
+ case VTSI64 : for (; n < len ; n ++ ) ((i64 * )data )[n ] += (i64 )i ; break ;
281
+ case VTUI08 : for (; n < len ; n ++ ) (( u8 * )data )[n ] += ( u8 )i ; break ;
282
+ case VTUI16 : for (; n < len ; n ++ ) ((u16 * )data )[n ] += (u16 )i ; break ;
283
+ case VTUI32 : for (; n < len ; n ++ ) ((u32 * )data )[n ] += (u32 )i ; break ;
284
+ case VTUI64 : for (; n < len ; n ++ ) ((i64 * )data )[n ] += (u64 )i ; break ;
285
+ case VTSF08 :
286
+ case VTSF16 :
287
+ case VTSF32 : for (; n < len ; n ++ ) (( float * )data )[n ] += (float )f ; break ;
288
+ case VTSF64 : for (; n < len ; n ++ ) ((double * )data )[n ] += f ; break ;
289
+ }
290
+ break ;
291
+ case A_SUBTRACT :
292
+ switch (bits ) {
293
+ case VTSI08 : for (; n < len ; n ++ ) (( i8 * )data )[n ] -= ( i8 )i ; break ;
294
+ case VTSI16 : for (; n < len ; n ++ ) ((i16 * )data )[n ] -= (i16 )i ; break ;
295
+ case VTSI32 : for (; n < len ; n ++ ) ((i32 * )data )[n ] -= (i32 )i ; break ;
296
+ case VTSI64 : for (; n < len ; n ++ ) ((i64 * )data )[n ] -= (i64 )i ; break ;
297
+ case VTUI08 : for (; n < len ; n ++ ) (( u8 * )data )[n ] -= ( u8 )i ; break ;
298
+ case VTUI16 : for (; n < len ; n ++ ) ((u16 * )data )[n ] -= (u16 )i ; break ;
299
+ case VTUI32 : for (; n < len ; n ++ ) ((u32 * )data )[n ] -= (u32 )i ; break ;
300
+ case VTUI64 : for (; n < len ; n ++ ) ((i64 * )data )[n ] -= (u64 )i ; break ;
301
+ case VTSF08 :
302
+ case VTSF16 :
303
+ case VTSF32 : for (; n < len ; n ++ ) (( float * )data )[n ] -= (float )f ; break ;
304
+ case VTSF64 : for (; n < len ; n ++ ) ((double * )data )[n ] -= f ; break ;
305
+ }
306
+ break ;
307
+ case A_MULTIPLY :
308
+ switch (bits ) {
309
+ case VTSI08 : for (; n < len ; n ++ ) (( i8 * )data )[n ] *= ( i8 )i ; break ;
310
+ case VTSI16 : for (; n < len ; n ++ ) ((i16 * )data )[n ] *= (i16 )i ; break ;
311
+ case VTSI32 : for (; n < len ; n ++ ) ((i32 * )data )[n ] *= (i32 )i ; break ;
312
+ case VTSI64 : for (; n < len ; n ++ ) ((i64 * )data )[n ] *= (i64 )i ; break ;
313
+ case VTUI08 : for (; n < len ; n ++ ) (( u8 * )data )[n ] *= ( u8 )i ; break ;
314
+ case VTUI16 : for (; n < len ; n ++ ) ((u16 * )data )[n ] *= (u16 )i ; break ;
315
+ case VTUI32 : for (; n < len ; n ++ ) ((u32 * )data )[n ] *= (u32 )i ; break ;
316
+ case VTUI64 : for (; n < len ; n ++ ) ((i64 * )data )[n ] *= (u64 )i ; break ;
317
+ case VTSF08 :
318
+ case VTSF16 :
319
+ case VTSF32 : for (; n < len ; n ++ ) (( float * )data )[n ] *= (float )f ; break ;
320
+ case VTSF64 : for (; n < len ; n ++ ) ((double * )data )[n ] *= f ; break ;
321
+ }
322
+ break ;
323
+ case A_DIVIDE :
324
+ if (i == 0 ) Trap0 (RE_ZERO_DIVIDE );
325
+ switch (bits ) {
326
+ case VTSI08 : for (; n < len ; n ++ ) (( i8 * )data )[n ] /= ( i8 )i ; break ;
327
+ case VTSI16 : for (; n < len ; n ++ ) ((i16 * )data )[n ] /= (i16 )i ; break ;
328
+ case VTSI32 : for (; n < len ; n ++ ) ((i32 * )data )[n ] /= (i32 )i ; break ;
329
+ case VTSI64 : for (; n < len ; n ++ ) ((i64 * )data )[n ] /= (i64 )i ; break ;
330
+ case VTUI08 : for (; n < len ; n ++ ) (( u8 * )data )[n ] /= ( u8 )i ; break ;
331
+ case VTUI16 : for (; n < len ; n ++ ) ((u16 * )data )[n ] /= (u16 )i ; break ;
332
+ case VTUI32 : for (; n < len ; n ++ ) ((u32 * )data )[n ] /= (u32 )i ; break ;
333
+ case VTUI64 : for (; n < len ; n ++ ) ((i64 * )data )[n ] /= (u64 )i ; break ;
334
+ case VTSF08 :
335
+ case VTSF16 :
336
+ case VTSF32 : for (; n < len ; n ++ ) (( float * )data )[n ] /= (float )f ; break ;
337
+ case VTSF64 : for (; n < len ; n ++ ) ((double * )data )[n ] /= f ; break ;
338
+ }
339
+ break ;
340
+ }
341
+ return left ;
342
+ }
343
+
344
+
229
345
/***********************************************************************
230
346
**
231
347
*/ REBINT Compare_Vector (REBVAL * v1 , REBVAL * v2 )
@@ -572,6 +688,13 @@ void Set_Vector_Row(REBSER *ser, REBVAL *blk)
572
688
Pick_Path (value , arg , D_ARG (3 ));
573
689
return R_ARG3 ;
574
690
691
+ case A_ADD :
692
+ case A_SUBTRACT :
693
+ case A_MULTIPLY :
694
+ case A_DIVIDE :
695
+ Math_Op_Vector (value , arg , action );
696
+ break ;
697
+
575
698
case A_MAKE :
576
699
// We only allow MAKE VECTOR! ...
577
700
if (!IS_DATATYPE (value )) goto bad_make ;
0 commit comments