Changeset: 038c0b3d7483 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=038c0b3d7483
Modified Files:
monetdb5/extras/rapi/converters.c
Branch: embedded
Log Message:
Embedded R: memcpy if possible
diffs (99 lines):
diff --git a/monetdb5/extras/rapi/converters.c
b/monetdb5/extras/rapi/converters.c
--- a/monetdb5/extras/rapi/converters.c
+++ b/monetdb5/extras/rapi/converters.c
@@ -1,32 +1,37 @@
#include <Rdefines.h>
#include "mal.h"
-#define BAT_TO_SXP(bat,tpe,retsxp,newfun,ptrfun,ctype,naval)\
+#define BAT_TO_SXP(bat,tpe,retsxp,newfun,ptrfun,ctype,naval,memcopy)\
do {
\
tpe v; size_t j;
\
ctype *valptr = NULL; \
+ tpe* p = (tpe*) Tloc(bat,BUNfirst(bat)); \
retsxp = PROTECT(newfun(BATcount(bat))); \
valptr = ptrfun(retsxp); \
if (bat->T->nonil && !bat->T->nil) { \
- for (j = 0; j < BATcount(bat); j++) { \
- valptr[j] = \
- (ctype) ((tpe*) Tloc(bat, BUNfirst(bat)))[j];\
- } \
+ if (memcopy) {
\
+ memcpy(valptr, Tloc(bat, BUNfirst(bat)), \
+ BATcount(bat) * sizeof(tpe));
\
+ } else { \
+ for (j = 0; j < BATcount(bat); j++) { \
+ valptr[j] = (ctype) p[j];
\
+ } \
+ }
\
} else { \
for (j = 0; j < BATcount(bat); j++) {
\
- v = ((tpe*) Tloc(bat, BUNfirst(bat)))[j];
\
+ v = p[j]; \
if ( v == tpe##_nil)
\
- valptr[j] = naval; \
+ valptr[j] = naval;
\
else
\
- valptr[j] = (ctype)v; \
+ valptr[j] = (ctype) v; \
}}
\
} while (0)
-#define BAT_TO_INTSXP(bat,tpe,retsxp)
\
- BAT_TO_SXP(bat,tpe,retsxp,NEW_INTEGER,INTEGER_POINTER,int,NA_INTEGER)\
+#define BAT_TO_INTSXP(bat,tpe,retsxp,memcopy)
\
+
BAT_TO_SXP(bat,tpe,retsxp,NEW_INTEGER,INTEGER_POINTER,int,NA_INTEGER,memcopy)\
-#define BAT_TO_REALSXP(bat,tpe,retsxp)
\
- BAT_TO_SXP(bat,tpe,retsxp,NEW_NUMERIC,NUMERIC_POINTER,double,NA_REAL)\
+#define BAT_TO_REALSXP(bat,tpe,retsxp,memcopy)
\
+
BAT_TO_SXP(bat,tpe,retsxp,NEW_NUMERIC,NUMERIC_POINTER,double,NA_REAL,memcopy)\
#define SCALAR_TO_INTSXP(tpe,retsxp) \
@@ -40,7 +45,7 @@
INTEGER_POINTER(retsxp)[0] = (int)v; \
} while (0)
-#define SCALAR_TO_REALSXP(tpe,retsxp) \
+#define SCALAR_TO_REALSXP(tpe,retsxp) \
do {
\
tpe v;
\
retsxp = PROTECT(NEW_NUMERIC(1));
\
@@ -83,27 +88,29 @@ static SEXP bat_to_sexp(BAT* b) {
// TODO: deal with SQL types (DECIMAL/DATE)
switch (ATOMstorage(getColumnType(b->T->type))) {
case TYPE_bte:
- BAT_TO_INTSXP(b, bte, varvalue);
+ BAT_TO_INTSXP(b, bte, varvalue,0);
break;
case TYPE_sht:
- BAT_TO_INTSXP(b, sht, varvalue);
+ BAT_TO_INTSXP(b, sht, varvalue,0);
break;
case TYPE_int:
- BAT_TO_INTSXP(b, int, varvalue);
+ // special case: memcpy for int-to-int conversion
without NULLs
+ BAT_TO_INTSXP(b, int, varvalue, 1);
break;
#ifdef HAVE_HGE
case TYPE_hge: /* R's integers are stored as int, so we cannot
be sure hge will fit */
- BAT_TO_REALSXP(b, hge, varvalue);
+ BAT_TO_REALSXP(b, hge, varvalue, 0);
break;
#endif
case TYPE_flt:
- BAT_TO_REALSXP(b, flt, varvalue);
+ BAT_TO_REALSXP(b, flt, varvalue, 0);
break;
case TYPE_dbl:
- BAT_TO_REALSXP(b, dbl, varvalue);
+ // special case: memcpy for double-to-double conversion
without NULLs
+ BAT_TO_REALSXP(b, dbl, varvalue, 1);
break;
case TYPE_lng: /* R's integers are stored as int, so we cannot
be sure long will fit */
- BAT_TO_REALSXP(b, lng, varvalue);
+ BAT_TO_REALSXP(b, lng, varvalue, 0);
break;
case TYPE_str: { // there is only one string type, thus no
macro here
BUN p = 0, q = 0, j = 0;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list