Skip to content

Commit 215c131

Browse files
committed
BIG COMMIT: support for complex vectors!
1 parent da0817e commit 215c131

File tree

13 files changed

+1350
-8
lines changed

13 files changed

+1350
-8
lines changed

cpp4rtest/R/cpp4r.R

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@ grow_ <- function(n) {
8484
.Call(`_cpp4rtest_grow_`, n)
8585
}
8686

87+
grow_cplx_ <- function(n) {
88+
.Call(`_cpp4rtest_grow_cplx_`, n)
89+
}
90+
8791
cpp4r_insert_ <- function(num_sxp) {
8892
.Call(`_cpp4rtest_cpp4r_insert_`, num_sxp)
8993
}
@@ -236,6 +240,42 @@ sum_dbl_accumulate2_ <- function(x_sxp) {
236240
.Call(`_cpp4rtest_sum_dbl_accumulate2_`, x_sxp)
237241
}
238242

243+
sum_cplx_for_ <- function(x) {
244+
.Call(`_cpp4rtest_sum_cplx_for_`, x)
245+
}
246+
247+
sum_cplx_for_2_ <- function(x) {
248+
.Call(`_cpp4rtest_sum_cplx_for_2_`, x)
249+
}
250+
251+
sum_cplx_for_3_ <- function(x_sxp) {
252+
.Call(`_cpp4rtest_sum_cplx_for_3_`, x_sxp)
253+
}
254+
255+
sum_cplx_for_4_ <- function(x_sxp) {
256+
.Call(`_cpp4rtest_sum_cplx_for_4_`, x_sxp)
257+
}
258+
259+
sum_cplx_for_5_ <- function(x_sxp) {
260+
.Call(`_cpp4rtest_sum_cplx_for_5_`, x_sxp)
261+
}
262+
263+
sum_cplx_for_6_ <- function(x_sxp) {
264+
.Call(`_cpp4rtest_sum_cplx_for_6_`, x_sxp)
265+
}
266+
267+
sum_cplx_foreach_ <- function(x) {
268+
.Call(`_cpp4rtest_sum_cplx_foreach_`, x)
269+
}
270+
271+
sum_cplx_accumulate_ <- function(x) {
272+
.Call(`_cpp4rtest_sum_cplx_accumulate_`, x)
273+
}
274+
275+
sum_cplx_for2_ <- function(x_sxp) {
276+
.Call(`_cpp4rtest_sum_cplx_for2_`, x_sxp)
277+
}
278+
239279
sum_int_for_ <- function(x) {
240280
.Call(`_cpp4rtest_sum_int_for_`, x)
241281
}

cpp4rtest/src/cpp4r.cpp

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,13 @@ extern "C" SEXP _cpp4rtest_grow_(SEXP n) {
166166
return cpp4r::as_sexp(grow_(cpp4r::as_cpp<cpp4r::decay_t<R_xlen_t>>(n)));
167167
END_cpp4r
168168
}
169+
// grow.cpp
170+
cpp4r::writable::complexes grow_cplx_(R_xlen_t n);
171+
extern "C" SEXP _cpp4rtest_grow_cplx_(SEXP n) {
172+
BEGIN_cpp4r
173+
return cpp4r::as_sexp(grow_cplx_(cpp4r::as_cpp<cpp4r::decay_t<R_xlen_t>>(n)));
174+
END_cpp4r
175+
}
169176
// insert.cpp
170177
SEXP cpp4r_insert_(SEXP num_sxp);
171178
extern "C" SEXP _cpp4rtest_cpp4r_insert_(SEXP num_sxp) {
@@ -443,6 +450,69 @@ extern "C" SEXP _cpp4rtest_sum_dbl_accumulate2_(SEXP x_sxp) {
443450
return cpp4r::as_sexp(sum_dbl_accumulate2_(cpp4r::as_cpp<cpp4r::decay_t<SEXP>>(x_sxp)));
444451
END_cpp4r
445452
}
453+
// sum.cpp
454+
cpp4r::r_complex sum_cplx_for_(cpp4r::complexes x);
455+
extern "C" SEXP _cpp4rtest_sum_cplx_for_(SEXP x) {
456+
BEGIN_cpp4r
457+
return cpp4r::as_sexp(sum_cplx_for_(cpp4r::as_cpp<cpp4r::decay_t<cpp4r::complexes>>(x)));
458+
END_cpp4r
459+
}
460+
// sum.cpp
461+
cpp4r::complexes sum_cplx_for_2_(cpp4r::complexes x);
462+
extern "C" SEXP _cpp4rtest_sum_cplx_for_2_(SEXP x) {
463+
BEGIN_cpp4r
464+
return cpp4r::as_sexp(sum_cplx_for_2_(cpp4r::as_cpp<cpp4r::decay_t<cpp4r::complexes>>(x)));
465+
END_cpp4r
466+
}
467+
// sum.cpp
468+
std::complex<double> sum_cplx_for_3_(cpp4r::complexes x_sxp);
469+
extern "C" SEXP _cpp4rtest_sum_cplx_for_3_(SEXP x_sxp) {
470+
BEGIN_cpp4r
471+
return cpp4r::as_sexp(sum_cplx_for_3_(cpp4r::as_cpp<cpp4r::decay_t<cpp4r::complexes>>(x_sxp)));
472+
END_cpp4r
473+
}
474+
// sum.cpp
475+
std::complex<double> sum_cplx_for_4_(SEXP x_sxp);
476+
extern "C" SEXP _cpp4rtest_sum_cplx_for_4_(SEXP x_sxp) {
477+
BEGIN_cpp4r
478+
return cpp4r::as_sexp(sum_cplx_for_4_(cpp4r::as_cpp<cpp4r::decay_t<SEXP>>(x_sxp)));
479+
END_cpp4r
480+
}
481+
// sum.cpp
482+
SEXP sum_cplx_for_5_(SEXP x_sxp);
483+
extern "C" SEXP _cpp4rtest_sum_cplx_for_5_(SEXP x_sxp) {
484+
BEGIN_cpp4r
485+
return cpp4r::as_sexp(sum_cplx_for_5_(cpp4r::as_cpp<cpp4r::decay_t<SEXP>>(x_sxp)));
486+
END_cpp4r
487+
}
488+
// sum.cpp
489+
cpp4r::complexes sum_cplx_for_6_(SEXP x_sxp);
490+
extern "C" SEXP _cpp4rtest_sum_cplx_for_6_(SEXP x_sxp) {
491+
BEGIN_cpp4r
492+
return cpp4r::as_sexp(sum_cplx_for_6_(cpp4r::as_cpp<cpp4r::decay_t<SEXP>>(x_sxp)));
493+
END_cpp4r
494+
}
495+
// sum.cpp
496+
std::complex<double> sum_cplx_foreach_(cpp4r::complexes x);
497+
extern "C" SEXP _cpp4rtest_sum_cplx_foreach_(SEXP x) {
498+
BEGIN_cpp4r
499+
return cpp4r::as_sexp(sum_cplx_foreach_(cpp4r::as_cpp<cpp4r::decay_t<cpp4r::complexes>>(x)));
500+
END_cpp4r
501+
}
502+
// sum.cpp
503+
std::complex<double> sum_cplx_accumulate_(cpp4r::complexes x);
504+
extern "C" SEXP _cpp4rtest_sum_cplx_accumulate_(SEXP x) {
505+
BEGIN_cpp4r
506+
return cpp4r::as_sexp(sum_cplx_accumulate_(cpp4r::as_cpp<cpp4r::decay_t<cpp4r::complexes>>(x)));
507+
END_cpp4r
508+
}
509+
// sum.cpp
510+
std::complex<double> sum_cplx_for2_(SEXP x_sxp);
511+
extern "C" SEXP _cpp4rtest_sum_cplx_for2_(SEXP x_sxp) {
512+
BEGIN_cpp4r
513+
return cpp4r::as_sexp(sum_cplx_for2_(cpp4r::as_cpp<cpp4r::decay_t<SEXP>>(x_sxp)));
514+
END_cpp4r
515+
}
446516
// sum_int.cpp
447517
double sum_int_for_(cpp4r::integers x);
448518
extern "C" SEXP _cpp4rtest_sum_int_for_(SEXP x) {
@@ -574,6 +644,7 @@ static const R_CallMethodDef CallEntries[] = {
574644
{"_cpp4rtest_gibbs_rcpp", (DL_FUNC) &_cpp4rtest_gibbs_rcpp, 2},
575645
{"_cpp4rtest_gibbs_rcpp2", (DL_FUNC) &_cpp4rtest_gibbs_rcpp2, 2},
576646
{"_cpp4rtest_grow_", (DL_FUNC) &_cpp4rtest_grow_, 1},
647+
{"_cpp4rtest_grow_cplx_", (DL_FUNC) &_cpp4rtest_grow_cplx_, 1},
577648
{"_cpp4rtest_grow_strings_cpp4r_", (DL_FUNC) &_cpp4rtest_grow_strings_cpp4r_, 2},
578649
{"_cpp4rtest_grow_strings_manual_", (DL_FUNC) &_cpp4rtest_grow_strings_manual_, 2},
579650
{"_cpp4rtest_grow_strings_rcpp_", (DL_FUNC) &_cpp4rtest_grow_strings_rcpp_, 2},
@@ -615,6 +686,15 @@ static const R_CallMethodDef CallEntries[] = {
615686
{"_cpp4rtest_row_sums", (DL_FUNC) &_cpp4rtest_row_sums, 1},
616687
{"_cpp4rtest_string_proxy_assignment_", (DL_FUNC) &_cpp4rtest_string_proxy_assignment_, 0},
617688
{"_cpp4rtest_string_push_back_", (DL_FUNC) &_cpp4rtest_string_push_back_, 0},
689+
{"_cpp4rtest_sum_cplx_accumulate_", (DL_FUNC) &_cpp4rtest_sum_cplx_accumulate_, 1},
690+
{"_cpp4rtest_sum_cplx_for2_", (DL_FUNC) &_cpp4rtest_sum_cplx_for2_, 1},
691+
{"_cpp4rtest_sum_cplx_for_", (DL_FUNC) &_cpp4rtest_sum_cplx_for_, 1},
692+
{"_cpp4rtest_sum_cplx_for_2_", (DL_FUNC) &_cpp4rtest_sum_cplx_for_2_, 1},
693+
{"_cpp4rtest_sum_cplx_for_3_", (DL_FUNC) &_cpp4rtest_sum_cplx_for_3_, 1},
694+
{"_cpp4rtest_sum_cplx_for_4_", (DL_FUNC) &_cpp4rtest_sum_cplx_for_4_, 1},
695+
{"_cpp4rtest_sum_cplx_for_5_", (DL_FUNC) &_cpp4rtest_sum_cplx_for_5_, 1},
696+
{"_cpp4rtest_sum_cplx_for_6_", (DL_FUNC) &_cpp4rtest_sum_cplx_for_6_, 1},
697+
{"_cpp4rtest_sum_cplx_foreach_", (DL_FUNC) &_cpp4rtest_sum_cplx_foreach_, 1},
618698
{"_cpp4rtest_sum_dbl_accumulate2_", (DL_FUNC) &_cpp4rtest_sum_dbl_accumulate2_, 1},
619699
{"_cpp4rtest_sum_dbl_accumulate_", (DL_FUNC) &_cpp4rtest_sum_dbl_accumulate_, 1},
620700
{"_cpp4rtest_sum_dbl_for2_", (DL_FUNC) &_cpp4rtest_sum_dbl_for2_, 1},

cpp4rtest/src/grow.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include "cpp4r/complexes.hpp"
12
#include "cpp4r/doubles.hpp"
23

34
[[cpp4r::register]] cpp4r::writable::doubles grow_(R_xlen_t n) {
@@ -9,3 +10,14 @@
910

1011
return x;
1112
}
13+
14+
[[cpp4r::register]] cpp4r::writable::complexes grow_cplx_(R_xlen_t n) {
15+
cpp4r::writable::complexes x;
16+
R_xlen_t i = 0;
17+
while (i < n) {
18+
x.push_back(std::complex<double>(i, i));
19+
i++;
20+
}
21+
22+
return x;
23+
}

cpp4rtest/src/sum.cpp

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include <numeric>
22
#include "cpp4r/doubles.hpp"
3+
#include "cpp4r/complexes.hpp"
34

45
[[cpp4r::register]] double sum_dbl_for_(cpp4r::doubles x) {
56
double sum = 0.;
@@ -58,3 +59,111 @@
5859
const cpp4r::doubles x(x_sxp, false);
5960
return std::accumulate(x.cbegin(), x.cend(), 0.);
6061
}
62+
63+
// Pacha: Functions for complex data type
64+
65+
[[cpp4r::register]] cpp4r::r_complex sum_cplx_for_(cpp4r::complexes x) {
66+
std::complex<double> sum = {0.0, 0.0};
67+
R_xlen_t n = x.size();
68+
for (R_xlen_t i = 0; i < n; ++i) {
69+
// sum.real(sum.real() + x[i].real());
70+
// sum.imag(sum.imag() + x[i].imag());
71+
sum += x[i];
72+
}
73+
74+
return cpp4r::r_complex(sum.real(), sum.imag());
75+
}
76+
77+
[[cpp4r::register]] cpp4r::complexes sum_cplx_for_2_(cpp4r::complexes x) {
78+
std::complex<double> sum = {0.0, 0.0};
79+
R_xlen_t n = x.size();
80+
for (R_xlen_t i = 0; i < n; ++i) {
81+
// sum.real(sum.real() + x[i].real());
82+
// sum.imag(sum.imag() + x[i].imag());
83+
sum += x[i];
84+
}
85+
86+
cpp4r::writable::complexes result(1);
87+
// result[0] = cpp4r::r_complex(sum.real(), sum.imag());
88+
result[0] = sum;
89+
90+
return result;
91+
}
92+
93+
[[cpp4r::register]] std::complex<double> sum_cplx_for_3_(cpp4r::complexes x_sxp) {
94+
std::complex<double> sum = {0.0, 0.0};
95+
const cpp4r::complexes x(x_sxp, false);
96+
R_xlen_t n = x.size();
97+
for (R_xlen_t i = 0; i < n; ++i) {
98+
// sum.real(sum.real() + x[i].real());
99+
// sum.imag(sum.imag() + x[i].imag());
100+
sum += x[i];
101+
}
102+
103+
return sum;
104+
}
105+
106+
[[cpp4r::register]] std::complex<double> sum_cplx_for_4_(SEXP x_sxp) {
107+
std::complex<double> sum = {0.0, 0.0};
108+
const cpp4r::complexes x(x_sxp, false);
109+
R_xlen_t n = x.size();
110+
for (R_xlen_t i = 0; i < n; ++i) {
111+
// sum.real(sum.real() + x[i].real());
112+
// sum.imag(sum.imag() + x[i].imag());
113+
sum += x[i];
114+
}
115+
116+
return sum;
117+
}
118+
119+
[[cpp4r::register]] SEXP sum_cplx_for_5_(SEXP x_sxp) {
120+
std::complex<double> sum = {0.0, 0.0};
121+
const cpp4r::complexes x(x_sxp, false);
122+
R_xlen_t n = x.size();
123+
for (R_xlen_t i = 0; i < n; ++i) {
124+
// sum.real(sum.real() + x[i].real());
125+
// sum.imag(sum.imag() + x[i].imag());
126+
sum += x[i];
127+
}
128+
129+
return cpp4r::as_sexp(sum);
130+
}
131+
132+
[[cpp4r::register]] cpp4r::complexes sum_cplx_for_6_(SEXP x_sxp) {
133+
std::complex<double> sum = {0.0, 0.0};
134+
const cpp4r::complexes x(x_sxp, false);
135+
R_xlen_t n = x.size();
136+
for (R_xlen_t i = 0; i < n; ++i) {
137+
// sum.real(sum.real() + x[i].real());
138+
// sum.imag(sum.imag() + x[i].imag());
139+
sum += x[i];
140+
}
141+
142+
return cpp4r::as_sexp(sum);
143+
}
144+
145+
[[cpp4r::register]] std::complex<double> sum_cplx_foreach_(cpp4r::complexes x) {
146+
std::complex<double> sum = {0.0, 0.0};
147+
for (const auto&& val : x) {
148+
// sum.real(sum.real() + val.real());
149+
// sum.imag(sum.imag() + val.imag());
150+
sum += val;
151+
}
152+
153+
return sum;
154+
}
155+
156+
[[cpp4r::register]] std::complex<double> sum_cplx_accumulate_(cpp4r::complexes x) {
157+
return std::accumulate(x.cbegin(), x.cend(), std::complex<double>(0.0, 0.0));
158+
}
159+
160+
[[cpp4r::register]] std::complex<double> sum_cplx_for2_(SEXP x_sxp) {
161+
std::complex<double> sum = {0.0, 0.0};
162+
const cpp4r::complexes x(x_sxp);
163+
R_xlen_t n = x.size();
164+
for (R_xlen_t i = 0; i < n; ++i) {
165+
sum += x[i];
166+
}
167+
168+
return sum;
169+
}

0 commit comments

Comments
 (0)