Skip to content

Commit

Permalink
Merge pull request #50 from EmilHvitfeldt/extract_default_double
Browse files Browse the repository at this point in the history
add extract_default_double() internal helper
  • Loading branch information
EmilHvitfeldt authored May 11, 2024
2 parents c5baade + c426a07 commit 17f163c
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 13 deletions.
20 changes: 7 additions & 13 deletions src/altrep-sparse-double.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,7 @@ SEXP alrep_sparse_double_Materialize(SEXP x) {

const R_xlen_t len = extract_len(x);

SEXP default_val = extract_default(x);
const double v_default_val = REAL_ELT(default_val, 0);
const double v_default_val = extract_default_double(x);

out = PROTECT(Rf_allocVector(REALSXP, len));
double* v_out = REAL(out);
Expand Down Expand Up @@ -226,8 +225,7 @@ static double altrep_sparse_double_Elt(SEXP x, R_xlen_t i) {

const R_xlen_t len = extract_len(x);

SEXP default_val = extract_default(x);
const double v_default_val = REAL_ELT(default_val, 0);
const double v_default_val = extract_default_double(x);

if (i > len) {
// OOB of vector itself
Expand Down Expand Up @@ -256,8 +254,7 @@ int altrep_sparse_double_Is_sorted(SEXP x) {
SEXP val = extract_val(x);
const double* v_val = REAL_RO(val);

SEXP default_val = extract_default(x);
const double v_default_val = REAL_ELT(default_val, 0);
const double v_default_val = extract_default_double(x);

// zero length vector are by def sorted
if (pos_len == 0) {
Expand Down Expand Up @@ -321,8 +318,7 @@ static SEXP altrep_sparse_double_Min_method(SEXP x, Rboolean na_rm) {
const double* v_val = REAL_RO(val);
const R_xlen_t val_len = Rf_xlength(val);

const SEXP default_val = extract_default(x);
const double v_default_val = REAL_ELT(default_val, 0);
const double v_default_val = extract_default_double(x);

if (val_len == 0) {
min = v_default_val;
Expand Down Expand Up @@ -355,8 +351,7 @@ static SEXP altrep_sparse_double_Max_method(SEXP x, Rboolean na_rm) {
const double* v_val = REAL_RO(val);
const R_xlen_t val_len = Rf_xlength(val);

const SEXP default_val = extract_default(x);
const double v_default_val = REAL_ELT(default_val, 0);
const double v_default_val = extract_default_double(x);

if (val_len == 0) {
max = v_default_val;
Expand Down Expand Up @@ -416,10 +411,9 @@ static SEXP altrep_sparse_double_Sum_method(SEXP x, Rboolean na_rm) {
}

// default can be non-zero
const SEXP default_val = extract_default(x);
const double v_default_val = REAL_ELT(default_val, 0);
const double v_default_val = extract_default_double(x);

if (default_val != 0) {
if (v_default_val != 0) {
sum = sum + (len - val_len) * v_default_val;
}

Expand Down
7 changes: 7 additions & 0 deletions src/sparse-utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,13 @@ SEXP extract_default(SEXP x) {
return out;
}

double extract_default_double(SEXP x) {
SEXP default_val = extract_default(x);
double out = REAL_ELT(default_val, 0);

return out;
}

bool is_altrep(SEXP x) {
return (bool) ALTREP(x);
}
Expand Down
2 changes: 2 additions & 0 deletions src/sparse-utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ R_xlen_t extract_len(SEXP x);

SEXP extract_default(SEXP x);

double extract_default_double(SEXP x);

bool is_altrep(SEXP x);

SEXP ffi_extract_altrep_class(SEXP x);
Expand Down

0 comments on commit 17f163c

Please sign in to comment.