rds2cpp
C++ library for parsing RDS files
Loading...
Searching...
No Matches
RObject.hpp
Go to the documentation of this file.
1#ifndef RDS2CPP_ROBJECT_HPP
2#define RDS2CPP_ROBJECT_HPP
3
4#include <vector>
5#include <cstdint>
6#include <complex>
7
8#include "SEXPType.hpp"
9#include "StringEncoding.hpp"
10
17namespace rds2cpp {
18
22struct RObject {
26 RObject() {}
27 virtual ~RObject() {}
28
29 // Rule of 5'ing.
30 RObject& operator=(const RObject& rhs) = default;
31 RObject(const RObject& rhs) = default;
32 RObject& operator=(RObject&& rhs) = default;
33 RObject(RObject&& rhs) = default;
41 virtual SEXPType type() const = 0;
42};
43
47struct Null : public RObject {
48 SEXPType type() const { return SEXPType::NIL; }
49};
50
54struct SymbolIndex : public RObject {
58 SymbolIndex(size_t i = -1) : index(i) {}
59
60
61 SEXPType type() const { return SEXPType::SYM; }
62
66 size_t index;
67};
68
72struct EnvironmentIndex : public RObject {
78 EnvironmentIndex(SEXPType e = SEXPType::GLOBALENV_) : index(-1), env_type(e) {}
79
85 EnvironmentIndex(size_t i): index(i), env_type(SEXPType::ENV) {}
86
91 SEXPType type() const { return env_type; }
92
97 size_t index;
98
104};
105
113 ExternalPointerIndex(size_t i = -1) : index(i) {}
114
115
116 SEXPType type() const { return SEXPType::EXTPTR; }
117
121 size_t index;
122};
123
131 std::vector<std::string> names;
132
136 std::vector<StringEncoding> encodings;
137
141 std::vector<std::unique_ptr<RObject> > values;
142
151 void add(std::string n, RObject* v, StringEncoding enc = StringEncoding::UTF8) {
152 names.emplace_back(std::move(n));
153 encodings.emplace_back(enc);
154 values.emplace_back(v);
155 }
156
164 void add(std::string n, std::unique_ptr<RObject> v, StringEncoding enc = StringEncoding::UTF8) {
165 names.emplace_back(std::move(n));
166 encodings.emplace_back(enc);
167 values.emplace_back(std::move(v));
168 }
169};
170
177template<typename ElementType, SEXPType stype>
178struct AtomicVector : public RObject {
182 AtomicVector(size_t n = 0) : data(n) {}
183 static constexpr SEXPType vector_sexp_type = stype;
188 SEXPType type() const { return stype; }
189
193 std::vector<ElementType> data;
194
199};
200
205
210
215
220
225
229struct StringVector : public RObject {
233 StringVector(size_t n = 0) : data(n), encodings(n), missing(n) {}
238 SEXPType type() const { return SEXPType::STR; }
239
243 std::vector<std::string> data;
244
248 std::vector<StringEncoding> encodings;
249
254 std::vector<char> missing;
255
262 void add(std::string d, StringEncoding enc = StringEncoding::UTF8) {
263 data.push_back(std::move(d));
264 encodings.push_back(enc);
265 missing.push_back(false);
266 }
267
271 void add() {
272 data.push_back("");
273 encodings.push_back(StringEncoding::NONE);
274 missing.push_back(true);
275 }
276
281};
282
286struct GenericVector : public RObject {
290 GenericVector(size_t n = 0) : data(n) {}
295 SEXPType type() const { return SEXPType::VEC; }
296
300 std::vector<std::unique_ptr<RObject> > data;
301
306};
307
311struct PairList : public RObject {
312 SEXPType type() const { return SEXPType::LIST; }
313
317 std::vector<std::unique_ptr<RObject> > data;
318
323 std::vector<unsigned char> has_tag;
324
329 std::vector<std::string> tag_names;
330
334 std::vector<StringEncoding> tag_encodings;
335
343 void add(std::string t, std::unique_ptr<RObject> d, StringEncoding enc = StringEncoding::UTF8) {
344 data.push_back(std::move(d));
345 has_tag.push_back(true);
346 tag_names.push_back(std::move(t));
347 tag_encodings.push_back(enc);
348 }
349
358 void add(std::string t, RObject* d, StringEncoding enc = StringEncoding::UTF8) {
359 data.emplace_back(d);
360 has_tag.push_back(true);
361 tag_names.push_back(std::move(t));
362 tag_encodings.push_back(enc);
363 }
364
370 void add(std::unique_ptr<RObject> d) {
371 data.push_back(std::move(d));
372 has_tag.push_back(false);
373 tag_names.push_back("");
374 tag_encodings.push_back(StringEncoding::NONE);
375 }
376
383 void add(RObject* d) {
384 data.emplace_back(d);
385 has_tag.push_back(false);
386 tag_names.push_back("");
387 tag_encodings.push_back(StringEncoding::NONE);
388 }
389
394};
395
399struct S4Object : public RObject {
400 SEXPType type() const { return SEXPType::S4; }
401
405 std::string class_name;
406
410 StringEncoding class_encoding = StringEncoding::UTF8;
411
415 std::string package_name;
416
420 StringEncoding package_encoding = StringEncoding::UTF8;
421
427};
428
432struct BuiltInFunction : public RObject {
433 SEXPType type() const { return SEXPType::BUILTIN; }
434
438 std::string name;
439};
440
444struct LanguageObject : public RObject {
445
446 SEXPType type() const { return SEXPType::LANG; }
447
451 std::string function_name;
452
456 StringEncoding function_encoding = StringEncoding::UTF8;
457
462 std::vector<std::unique_ptr<RObject> > argument_values;
463
468 std::vector<std::string> argument_names;
469
474 std::vector<unsigned char> argument_has_name;
475
480 std::vector<StringEncoding> argument_encodings;
481
490 void add_argument(std::string n, RObject* d, StringEncoding enc = StringEncoding::UTF8) {
491 argument_names.push_back(std::move(n));
492 argument_values.emplace_back(d);
493 argument_has_name.push_back(true);
494 argument_encodings.push_back(enc);
495 }
496
504 void add_argument(std::string n, std::unique_ptr<RObject> d, StringEncoding enc = StringEncoding::UTF8) {
505 argument_names.push_back(std::move(n));
506 argument_values.push_back(std::move(d));
507 argument_has_name.push_back(true);
508 argument_encodings.push_back(enc);
509 }
510
518 argument_names.resize(argument_names.size() + 1);
519 argument_values.emplace_back(d);
520 argument_has_name.push_back(false);
521 argument_encodings.push_back(StringEncoding::NONE);
522 }
523
529 void add_argument(std::unique_ptr<RObject> d) {
530 argument_names.resize(argument_names.size() + 1);
531 argument_values.push_back(std::move(d));
532 argument_has_name.push_back(false);
533 argument_encodings.push_back(StringEncoding::NONE);
534 }
535
540};
541
545struct ExpressionVector : public RObject {
549 ExpressionVector(size_t n = 0) : data(n) {}
554 SEXPType type() const { return SEXPType::EXPR; }
555
560 std::vector<std::unique_ptr<RObject> > data;
561
566};
567
568}
569
570#endif
R data types.
String encodings.
Parse an RDS file in C++.
Definition StringEncoding.hpp:10
AtomicVector< unsigned char, SEXPType::RAW > RawVector
Raw vector.
Definition RObject.hpp:219
AtomicVector< int32_t, SEXPType::LGL > LogicalVector
Logical vector.
Definition RObject.hpp:209
AtomicVector< double, SEXPType::REAL > DoubleVector
Double-precision vector.
Definition RObject.hpp:214
StringEncoding
Definition StringEncoding.hpp:15
AtomicVector< int32_t, SEXPType::INT > IntegerVector
Integer vector.
Definition RObject.hpp:204
SEXPType
Definition SEXPType.hpp:31
AtomicVector< std::complex< double >, SEXPType::CPLX > ComplexVector
Complex vector.
Definition RObject.hpp:224
Vector of some atomic type.
Definition RObject.hpp:178
Attributes attributes
Definition RObject.hpp:198
SEXPType type() const
Definition RObject.hpp:188
std::vector< ElementType > data
Definition RObject.hpp:193
Attribute names and values.
Definition RObject.hpp:127
std::vector< std::string > names
Definition RObject.hpp:131
std::vector< std::unique_ptr< RObject > > values
Definition RObject.hpp:141
void add(std::string n, RObject *v, StringEncoding enc=StringEncoding::UTF8)
Definition RObject.hpp:151
void add(std::string n, std::unique_ptr< RObject > v, StringEncoding enc=StringEncoding::UTF8)
Definition RObject.hpp:164
std::vector< StringEncoding > encodings
Definition RObject.hpp:136
Built-in function.
Definition RObject.hpp:432
SEXPType type() const
Definition RObject.hpp:433
std::string name
Definition RObject.hpp:438
Reference to an environment.
Definition RObject.hpp:72
SEXPType env_type
Definition RObject.hpp:103
size_t index
Definition RObject.hpp:97
SEXPType type() const
Definition RObject.hpp:91
EnvironmentIndex(size_t i)
Definition RObject.hpp:85
EnvironmentIndex(SEXPType e=SEXPType::GLOBALENV_)
Definition RObject.hpp:78
Expression vector.
Definition RObject.hpp:545
std::vector< std::unique_ptr< RObject > > data
Definition RObject.hpp:560
Attributes attributes
Definition RObject.hpp:565
SEXPType type() const
Definition RObject.hpp:554
Reference to an external pointer.
Definition RObject.hpp:109
ExternalPointerIndex(size_t i=-1)
Definition RObject.hpp:113
SEXPType type() const
Definition RObject.hpp:116
size_t index
Definition RObject.hpp:121
Generic vector, i.e., an ordinary R list.
Definition RObject.hpp:286
SEXPType type() const
Definition RObject.hpp:295
Attributes attributes
Definition RObject.hpp:305
std::vector< std::unique_ptr< RObject > > data
Definition RObject.hpp:300
Language object, i.e., a function call.
Definition RObject.hpp:444
std::vector< std::string > argument_names
Definition RObject.hpp:468
std::vector< StringEncoding > argument_encodings
Definition RObject.hpp:480
void add_argument(std::string n, RObject *d, StringEncoding enc=StringEncoding::UTF8)
Definition RObject.hpp:490
void add_argument(std::string n, std::unique_ptr< RObject > d, StringEncoding enc=StringEncoding::UTF8)
Definition RObject.hpp:504
StringEncoding function_encoding
Definition RObject.hpp:456
std::vector< std::unique_ptr< RObject > > argument_values
Definition RObject.hpp:462
Attributes attributes
Definition RObject.hpp:539
std::string function_name
Definition RObject.hpp:451
void add_argument(RObject *d)
Definition RObject.hpp:517
SEXPType type() const
Definition RObject.hpp:446
void add_argument(std::unique_ptr< RObject > d)
Definition RObject.hpp:529
std::vector< unsigned char > argument_has_name
Definition RObject.hpp:474
R's NULL value.
Definition RObject.hpp:47
SEXPType type() const
Definition RObject.hpp:48
Pairlist, i.e., a linked list.
Definition RObject.hpp:311
Attributes attributes
Definition RObject.hpp:393
std::vector< std::unique_ptr< RObject > > data
Definition RObject.hpp:317
std::vector< std::string > tag_names
Definition RObject.hpp:329
void add(RObject *d)
Definition RObject.hpp:383
SEXPType type() const
Definition RObject.hpp:312
std::vector< StringEncoding > tag_encodings
Definition RObject.hpp:334
void add(std::unique_ptr< RObject > d)
Definition RObject.hpp:370
void add(std::string t, std::unique_ptr< RObject > d, StringEncoding enc=StringEncoding::UTF8)
Definition RObject.hpp:343
void add(std::string t, RObject *d, StringEncoding enc=StringEncoding::UTF8)
Definition RObject.hpp:358
std::vector< unsigned char > has_tag
Definition RObject.hpp:323
Virtual class for all unserialized R objects.
Definition RObject.hpp:22
virtual SEXPType type() const =0
S4 object.
Definition RObject.hpp:399
StringEncoding package_encoding
Definition RObject.hpp:420
std::string class_name
Definition RObject.hpp:405
StringEncoding class_encoding
Definition RObject.hpp:410
std::string package_name
Definition RObject.hpp:415
SEXPType type() const
Definition RObject.hpp:400
Attributes attributes
Definition RObject.hpp:426
String vector.
Definition RObject.hpp:229
void add(std::string d, StringEncoding enc=StringEncoding::UTF8)
Definition RObject.hpp:262
std::vector< StringEncoding > encodings
Definition RObject.hpp:248
std::vector< char > missing
Definition RObject.hpp:254
std::vector< std::string > data
Definition RObject.hpp:243
SEXPType type() const
Definition RObject.hpp:238
void add()
Definition RObject.hpp:271
Attributes attributes
Definition RObject.hpp:280
Reference to a language symbol.
Definition RObject.hpp:54
SymbolIndex(size_t i=-1)
Definition RObject.hpp:58
SEXPType type() const
Definition RObject.hpp:61
size_t index
Definition RObject.hpp:66