diff --git a/src/dspline.h b/src/dspline.h index 3482aa1..1a4b71b 100644 --- a/src/dspline.h +++ b/src/dspline.h @@ -8,12 +8,18 @@ using namespace Rcpp; // Simple utilities int fact(int k); -void CumSum(NumericVector v, int i); -void RevCumSum(NumericVector v, int i); -void Diff(NumericVector v, int i); -void RevDiff(NumericVector v, int i); -void GapWeight(NumericVector v, int i, NumericVector xd); -void InvGapWeight(NumericVector v, int i, NumericVector xd); +template +void CumSum(T& v, int i); +template +void RevCumSum(T& v, int i); +template +void Diff(T& v, int i); +template +void RevDiff(T& v, int i); +template +void GapWeight(T& v, int i, U& xd); +template +void InvGapWeight(T& v, int i, U& xd); /******************************************************************************/ // Divided differences, discrete derivatives, and discrete integrals diff --git a/src/utils.cpp b/src/utils.cpp index efba21d..0fd2eaa 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -2,6 +2,8 @@ // Simple utilities #include +#include +#include using namespace Rcpp; // Factorial @@ -12,43 +14,65 @@ int fact(int k) { } // Overwrite v with cumulative sums, starting at i -void CumSum(NumericVector v, int i) { +template +void CumSum(T& v, int i) { for (int j = i+1; j < v.size(); j++) { v[j] += v[j-1]; } } +template void CumSum(NumericVector& v, int i); +template void CumSum(Eigen::VectorXd& v, int i); // Overwrite v with reverse cumulative sums, ending at i -void RevCumSum(NumericVector v, int i) { +template +void RevCumSum(T& v, int i) { for (int j = v.size()-2; j >= i; j--) { v[j] += v[j+1]; } } +template void RevCumSum(NumericVector& v, int i); +template void RevCumSum(Eigen::VectorXd& v, int i); // Overwrite v with pairwise differences, starting at i -void Diff(NumericVector v, int i) { +template +void Diff(T& v, int i) { for (int j = v.size()-1; j >= i; j--) { v[j] -= v[j-1]; } } +template void Diff(NumericVector& v, int i); +template void Diff(Eigen::VectorXd& v, int i); // Overwrite v with reverse pairwise differences, ending at i -void RevDiff(NumericVector v, int i) { +template +void RevDiff(T& v, int i) { for (int j = i; j < v.size()-1; j++) { v[j] -= v[j+1]; } } +template void RevDiff(NumericVector& v, int i); +template void RevDiff(Eigen::VectorXd& v, int i); // Apply gap weighting to v (wrt xd), starting at i -void GapWeight(NumericVector v, int i, NumericVector xd) { +template +void GapWeight(T& v, int i, U& xd) { for (int j = i; j < v.size(); j++) { v[j] *= (xd[j] - xd[j-i]) / i; } } +template void GapWeight(NumericVector& v, int i, NumericVector& xd); +template void GapWeight(NumericVector& v, int i, Eigen::VectorXd& xd); +template void GapWeight(Eigen::VectorXd& v, int i, NumericVector& xd); +template void GapWeight(Eigen::VectorXd& v, int i, Eigen::VectorXd& xd); // Apply invesre gap weighting to v (wrt xd), starting at i -void InvGapWeight(NumericVector v, int i, NumericVector xd) { +template +void InvGapWeight(T& v, int i, U& xd) { for (int j = i; j < v.size(); j++) { v[j] /= (xd[j] - xd[j-i]) / i; } } +template void InvGapWeight(NumericVector& v, int i, NumericVector& xd); +template void InvGapWeight(NumericVector& v, int i, Eigen::VectorXd& xd); +template void InvGapWeight(Eigen::VectorXd& v, int i, NumericVector& xd); +template void InvGapWeight(Eigen::VectorXd& v, int i, Eigen::VectorXd& xd);