diff --git a/packages/nimble/inst/include/nimble/NimArr.h b/packages/nimble/inst/include/nimble/NimArr.h index 8d134dc8a..a1a126f42 100644 --- a/packages/nimble/inst/include/nimble/NimArr.h +++ b/packages/nimble/inst/include/nimble/NimArr.h @@ -72,7 +72,8 @@ template target.getVptrRef() = ans; target.mapCopy(val); } else { - std::copy(val.getConstPtr(), val.getConstPtr() + length, *ans); + if(length > 0) + std::copy(val.getConstPtr(), val.getConstPtr() + length, *ans); } } @@ -172,7 +173,8 @@ class NimArr<1, T> : public NimArrBase { if (NimArrBase::own_v) nimble_free(NimArrBase::v); NimArrBase::v = nimble_malloc(size1); NimArrBase::own_v = true; - std::copy(other.v, other.v + size1, NimArrBase::v); + if (size1 > 0) + std::copy(other.v, other.v + size1, NimArrBase::v); } NimArrBase::setVptr(); return *this; @@ -211,7 +213,8 @@ class NimArr<1, T> : public NimArrBase { if (NimArrBase::own_v) nimble_free(NimArrBase::v); NimArrBase::v = nimble_malloc(NimArrBase::NAlength); NimArrBase::own_v = true; - std::copy(other.v, other.v + NimArrBase::NAlength, NimArrBase::v); + if (NimArrBase::NAlength > 0) + std::copy(other.v, other.v + NimArrBase::NAlength, NimArrBase::v); } NimArrBase::setVptr(); return (*this); @@ -238,7 +241,8 @@ class NimArr<1, T> : public NimArrBase { } else { NimArrBase::v = nimble_malloc(size1); NimArrBase::own_v = true; - std::copy(other.v, other.v + size1, NimArrBase::v); + if (size1 > 0) + std::copy(other.v, other.v + size1, NimArrBase::v); } NimArrBase::setVptr(); } @@ -421,7 +425,8 @@ class NimArr<2, T> : public NimArrBase { if (NimArrBase::own_v) nimble_free(NimArrBase::v); NimArrBase::v = nimble_malloc(NimArrBase::NAlength); NimArrBase::own_v = true; - std::copy(other.v, other.v + NimArrBase::NAlength, NimArrBase::v); + if (NimArrBase::NAlength > 0) + std::copy(other.v, other.v + NimArrBase::NAlength, NimArrBase::v); } NimArrBase::setVptr(); return *this; @@ -454,7 +459,8 @@ class NimArr<2, T> : public NimArrBase { } else { NimArrBase::v = nimble_malloc(NimArrBase::NAlength); NimArrBase::own_v = true; - std::copy(other.v, other.v + NimArrBase::NAlength, NimArrBase::v); + if (NimArrBase::NAlength > 0) + std::copy(other.v, other.v + NimArrBase::NAlength, NimArrBase::v); } NimArrBase::setVptr(); } @@ -666,7 +672,8 @@ class NimArr<3, T> : public NimArrBase { if (NimArrBase::own_v) nimble_free(NimArrBase::v); NimArrBase::v = nimble_malloc(NimArrBase::NAlength); NimArrBase::own_v = true; - std::copy(other.v, other.v + NimArrBase::NAlength, NimArrBase::v); + if (NimArrBase::NAlength > 0) + std::copy(other.v, other.v + NimArrBase::NAlength, NimArrBase::v); } NimArrBase::setVptr(); return *this; @@ -704,7 +711,8 @@ class NimArr<3, T> : public NimArrBase { } else { NimArrBase::v = nimble_malloc(NimArrBase::NAlength); NimArrBase::own_v = true; - std::copy(other.v, other.v + NimArrBase::NAlength, NimArrBase::v); + if (NimArrBase::NAlength > 0) + std::copy(other.v, other.v + NimArrBase::NAlength, NimArrBase::v); } NimArrBase::setVptr(); } @@ -949,7 +957,8 @@ class NimArr<4, T> : public NimArrBase { if (NimArrBase::own_v) nimble_free(NimArrBase::v); NimArrBase::v = nimble_malloc(NimArrBase::NAlength); NimArrBase::own_v = true; - std::copy(other.v, other.v + NimArrBase::NAlength, NimArrBase::v); + if (NimArrBase::NAlength > 0) + std::copy(other.v, other.v + NimArrBase::NAlength, NimArrBase::v); } NimArrBase::setVptr(); return *this; @@ -994,7 +1003,8 @@ class NimArr<4, T> : public NimArrBase { } else { NimArrBase::v = nimble_malloc(NimArrBase::NAlength); NimArrBase::own_v = true; - std::copy(other.v, other.v + NimArrBase::NAlength, NimArrBase::v); + if (NimArrBase::NAlength > 0) + std::copy(other.v, other.v + NimArrBase::NAlength, NimArrBase::v); } NimArrBase::setVptr(); } @@ -1270,7 +1280,8 @@ class NimArr<5, T> : public NimArrBase { if (NimArrBase::own_v) nimble_free(NimArrBase::v); NimArrBase::v = nimble_malloc(NimArrBase::NAlength); NimArrBase::own_v = true; - std::copy(other.v, other.v + NimArrBase::NAlength, NimArrBase::v); + if (NimArrBase::NAlength > 0) + std::copy(other.v, other.v + NimArrBase::NAlength, NimArrBase::v); } NimArrBase::setVptr(); return *this; @@ -1321,7 +1332,8 @@ class NimArr<5, T> : public NimArrBase { } else { NimArrBase::v = nimble_malloc(NimArrBase::NAlength); NimArrBase::own_v = true; - std::copy(other.v, other.v + NimArrBase::NAlength, NimArrBase::v); + if (NimArrBase::NAlength > 0) + std::copy(other.v, other.v + NimArrBase::NAlength, NimArrBase::v); } NimArrBase::setVptr(); } @@ -1626,7 +1638,8 @@ class NimArr<6, T> : public NimArrBase { if (NimArrBase::own_v) nimble_free(NimArrBase::v); NimArrBase::v = nimble_malloc(NimArrBase::NAlength); NimArrBase::own_v = true; - std::copy(other.v, other.v + NimArrBase::NAlength, NimArrBase::v); + if (NimArrBase::NAlength > 0) + std::copy(other.v, other.v + NimArrBase::NAlength, NimArrBase::v); } NimArrBase::setVptr(); return *this; @@ -1683,7 +1696,8 @@ class NimArr<6, T> : public NimArrBase { } else { NimArrBase::v = nimble_malloc(NimArrBase::NAlength); NimArrBase::own_v = true; - std::copy(other.v, other.v + NimArrBase::NAlength, NimArrBase::v); + if (NimArrBase::NAlength > 0) + std::copy(other.v, other.v + NimArrBase::NAlength, NimArrBase::v); } NimArrBase::setVptr(); } diff --git a/packages/nimble/inst/include/nimble/RcppNimbleUtils.h b/packages/nimble/inst/include/nimble/RcppNimbleUtils.h index 14d149e3b..5cea58c92 100644 --- a/packages/nimble/inst/include/nimble/RcppNimbleUtils.h +++ b/packages/nimble/inst/include/nimble/RcppNimbleUtils.h @@ -245,13 +245,15 @@ void SEXP_2_NimArr(SEXP Sn, NimArr &ans) { ans.setSize(inputDims); int nn = LENGTH(Sn); if(Rf_isReal(Sn)) { - std::copy(REAL(Sn), REAL(Sn) + nn, ans.getPtr() ); + if(nn > 0) + std::copy(REAL(Sn), REAL(Sn) + nn, ans.getPtr() ); } else { NIM_ASSERT3(Rf_isInteger(Sn) || Rf_isLogical(Sn), "could not handle input of type %s to SEXP_2_NimArr<%d, double>\n", Rf_type2char(TYPEOF(Sn)), ndim); int *iSn = Rf_isInteger(Sn) ? INTEGER(Sn) : LOGICAL(Sn); - std::copy(iSn, iSn + nn, ans.getPtr()); //v); + if(nn > 0) + std::copy(iSn, iSn + nn, ans.getPtr()); //v); } } @@ -269,13 +271,15 @@ void SEXP_2_NimArr(SEXP Sn, NimArr &ans) { ans.setSize(inputDims); int nn = LENGTH(Sn); if(Rf_isReal(Sn)) { - std::copy(REAL(Sn), REAL(Sn) + nn, ans.getPtr() ); + if(nn > 0) + std::copy(REAL(Sn), REAL(Sn) + nn, ans.getPtr() ); } else { NIM_ASSERT3(Rf_isInteger(Sn) || Rf_isLogical(Sn), "could not handle input type %s to SEXP_2_NimArr<%d, int>\n", Rf_type2char(TYPEOF(Sn)), ndim); int *iSn = Rf_isInteger(Sn) ? INTEGER(Sn) : LOGICAL(Sn); - std::copy(iSn, iSn + nn, ans.getPtr()); //v); + if(nn > 0) + std::copy(iSn, iSn + nn, ans.getPtr()); //v); } } @@ -292,13 +296,15 @@ void SEXP_2_NimArr(SEXP Sn, NimArr &ans) { ans.setSize(inputDims); int nn = LENGTH(Sn); if(Rf_isReal(Sn)) { - std::copy(REAL(Sn), REAL(Sn) + nn, ans.getPtr() ); + if(nn > 0) + std::copy(REAL(Sn), REAL(Sn) + nn, ans.getPtr() ); } else { NIM_ASSERT3(Rf_isInteger(Sn) || Rf_isLogical(Sn), "could not handle input type %s to SEXP_2_NimArr<%d, bool>\n", Rf_type2char(TYPEOF(Sn)), ndim); int *iSn = Rf_isInteger(Sn) ? INTEGER(Sn) : LOGICAL(Sn); - std::copy(iSn, iSn + nn, ans.getPtr()); //v); + if(nn > 0) + std::copy(iSn, iSn + nn, ans.getPtr()); //v); } } diff --git a/packages/nimble/inst/include/nimble/accessorClasses.h b/packages/nimble/inst/include/nimble/accessorClasses.h index 99ab9ed65..3868aab8c 100644 --- a/packages/nimble/inst/include/nimble/accessorClasses.h +++ b/packages/nimble/inst/include/nimble/accessorClasses.h @@ -739,9 +739,10 @@ class NodeVectorClassNew_derivs : public NodeVectorClassNew { NimArrVars.setSize(length_wrt); getValues(NimArrVars, model_wrt_accessor); - std::copy(NimArrVars.getPtr(), - NimArrVars.getPtr() + length_wrt, - independentVars.begin()); + if(length_wrt > 0) + std::copy(NimArrVars.getPtr(), + NimArrVars.getPtr() + length_wrt, + independentVars.begin()); //std::cout<<"done runTape_setInd"< &independentVars, if (ordersFound[0]) { ansList->value.setSize(res_dimy_o0, false, false); if(outAlly_o0) { - std::copy(value_ans.begin(), value_ans.end(), ansList->value.getPtr()); + if(!value_ans.empty()) + std::copy(value_ans.begin(), value_ans.end(), ansList->value.getPtr()); } else { BASE *LHS = ansList->value.getPtr(); for(size_t iii=0;iii 0) + std::copy(NimArrVars.getPtr(), + NimArrVars.getPtr() + length_wrt, + ADinfo.independentVars.begin()); /* set dynamic */ // Copy extraInput (CppAD "dynamic") values from the model into the dynamicVars // *and* set them in the tape.