|
1 | 1 | #pragma once |
2 | 2 |
|
| 3 | +#include <initializer_list> // for initializer_list |
3 | 4 | #include <iterator> |
4 | 5 | #include <string> // for string |
5 | 6 |
|
@@ -188,13 +189,47 @@ class matrix : public matrix_slices<S> { |
188 | 189 |
|
189 | 190 | operator SEXP() const { return SEXP(vector_); } |
190 | 191 |
|
191 | | - // operator sexp() { return sexp(vector_); } |
| 192 | + auto attr(const char* name) { return vector_.attr(name); } |
192 | 193 |
|
193 | | - sexp attr(const char* name) const { return SEXP(vector_.attr(name)); } |
| 194 | + auto attr(const std::string& name) { return vector_.attr(name); } |
194 | 195 |
|
195 | | - sexp attr(const std::string& name) const { return SEXP(vector_.attr(name)); } |
| 196 | + auto attr(SEXP name) { return vector_.attr(name); } |
196 | 197 |
|
197 | | - sexp attr(SEXP name) const { return SEXP(vector_.attr(name)); } |
| 198 | + void attr(const char* name, SEXP value) { vector_.attr(name) = value; } |
| 199 | + |
| 200 | + void attr(const std::string& name, SEXP value) { vector_.attr(name) = value; } |
| 201 | + |
| 202 | + void attr(SEXP name, SEXP value) { vector_.attr(name) = value; } |
| 203 | + |
| 204 | + void attr(const char* name, std::initializer_list<SEXP> value) { |
| 205 | + SEXP attr = PROTECT(Rf_allocVector(VECSXP, value.size())); |
| 206 | + int i = 0; |
| 207 | + for (SEXP v : value) { |
| 208 | + SET_VECTOR_ELT(attr, i++, v); |
| 209 | + } |
| 210 | + vector_.attr(name) = attr; |
| 211 | + UNPROTECT(1); |
| 212 | + } |
| 213 | + |
| 214 | + void attr(const std::string& name, std::initializer_list<SEXP> value) { |
| 215 | + SEXP attr = PROTECT(Rf_allocVector(VECSXP, value.size())); |
| 216 | + int i = 0; |
| 217 | + for (SEXP v : value) { |
| 218 | + SET_VECTOR_ELT(attr, i++, v); |
| 219 | + } |
| 220 | + vector_.attr(name) = attr; |
| 221 | + UNPROTECT(1); |
| 222 | + } |
| 223 | + |
| 224 | + void attr(SEXP name, std::initializer_list<SEXP> value) { |
| 225 | + SEXP attr = PROTECT(Rf_allocVector(VECSXP, value.size())); |
| 226 | + int i = 0; |
| 227 | + for (SEXP v : value) { |
| 228 | + SET_VECTOR_ELT(attr, i++, v); |
| 229 | + } |
| 230 | + vector_.attr(name) = attr; |
| 231 | + UNPROTECT(1); |
| 232 | + } |
198 | 233 |
|
199 | 234 | r_vector<r_string> names() const { return r_vector<r_string>(vector_.names()); } |
200 | 235 |
|
|
0 commit comments