Skip to content

Commit 11ac825

Browse files
committed
copy complex numbers/vectors/matrices from R to C++ and viceversa - replaces #427
1 parent c9def8e commit 11ac825

File tree

7 files changed

+1181
-0
lines changed

7 files changed

+1181
-0
lines changed

cpp11test/src/grow.cpp

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

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

1011
return x;
1112
}
13+
14+
[[cpp11::register]] cpp11::writable::complexes grow_cplx_(R_xlen_t n) {
15+
cpp11::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+
}

cpp11test/src/sum.cpp

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

45
[[cpp11::register]] double sum_dbl_for_(cpp11::doubles x) {
@@ -58,3 +59,111 @@
5859
const cpp11::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+
[[cpp11::register]] cpp11::r_complex sum_cplx_for_(cpp11::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 cpp11::r_complex(sum.real(), sum.imag());
75+
}
76+
77+
[[cpp11::register]] cpp11::complexes sum_cplx_for_2_(cpp11::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+
cpp11::writable::complexes result(1);
87+
// result[0] = cpp11::r_complex(sum.real(), sum.imag());
88+
result[0] = sum;
89+
90+
return result;
91+
}
92+
93+
[[cpp11::register]] std::complex<double> sum_cplx_for_3_(cpp11::complexes x_sxp) {
94+
std::complex<double> sum = {0.0, 0.0};
95+
const cpp11::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+
[[cpp11::register]] std::complex<double> sum_cplx_for_4_(SEXP x_sxp) {
107+
std::complex<double> sum = {0.0, 0.0};
108+
const cpp11::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+
[[cpp11::register]] SEXP sum_cplx_for_5_(SEXP x_sxp) {
120+
std::complex<double> sum = {0.0, 0.0};
121+
const cpp11::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 cpp11::as_sexp(sum);
130+
}
131+
132+
[[cpp11::register]] cpp11::complexes sum_cplx_for_6_(SEXP x_sxp) {
133+
std::complex<double> sum = {0.0, 0.0};
134+
const cpp11::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 cpp11::as_sexp(sum);
143+
}
144+
145+
[[cpp11::register]] std::complex<double> sum_cplx_foreach_(cpp11::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+
[[cpp11::register]] std::complex<double> sum_cplx_accumulate_(cpp11::complexes x) {
157+
return std::accumulate(x.cbegin(), x.cend(), std::complex<double>(0.0, 0.0));
158+
}
159+
160+
[[cpp11::register]] std::complex<double> sum_cplx_for2_(SEXP x_sxp) {
161+
std::complex<double> sum = {0.0, 0.0};
162+
const cpp11::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)