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 <cstddef>
7#include <complex>
8
9#include "SEXPType.hpp"
10#include "StringEncoding.hpp"
11#include "utils_other.hpp"
12
13#include "sanisizer/sanisizer.hpp"
14
21namespace rds2cpp {
22
26struct RObject {
30 RObject() {}
31 virtual ~RObject() {}
32
33 // Rule of 5'ing.
34 RObject& operator=(const RObject& rhs) = default;
35 RObject(const RObject& rhs) = default;
36 RObject& operator=(RObject&& rhs) = default;
37 RObject(RObject&& rhs) = default;
45 virtual SEXPType type() const = 0;
46};
47
51struct Null : public RObject {
52 SEXPType type() const { return SEXPType::NIL; }
53};
54
58struct SymbolIndex : public RObject {
62 SymbolIndex(std::size_t i = -1) : index(i) {}
63
64
65 SEXPType type() const { return SEXPType::SYM; }
66
70 std::size_t index;
71};
72
76struct EnvironmentIndex : public RObject {
82 EnvironmentIndex(SEXPType e = SEXPType::GLOBALENV_) : index(-1), env_type(e) {}
83
89 EnvironmentIndex(std::size_t i): index(i), env_type(SEXPType::ENV) {}
90
95 SEXPType type() const { return env_type; }
96
101 std::size_t index;
102
108};
109
117 ExternalPointerIndex(std::size_t i = -1) : index(i) {}
118
119
120 SEXPType type() const { return SEXPType::EXTPTR; }
121
125 std::size_t index;
126};
127
135 std::vector<std::string> names;
136
140 std::vector<StringEncoding> encodings;
141
145 std::vector<std::unique_ptr<RObject> > values;
146
155 void add(std::string n, RObject* v, StringEncoding enc = StringEncoding::UTF8) {
156 names.emplace_back(std::move(n));
157 encodings.emplace_back(enc);
158 values.emplace_back(v);
159 }
160
168 void add(std::string n, std::unique_ptr<RObject> v, StringEncoding enc = StringEncoding::UTF8) {
169 names.emplace_back(std::move(n));
170 encodings.emplace_back(enc);
171 values.emplace_back(std::move(v));
172 }
173};
174
181template<typename ElementType, SEXPType stype>
182struct AtomicVector : public RObject {
186 AtomicVector(std::size_t n = 0) :
187 data(sanisizer::cast<I<decltype(data.size())> >(n))
188 {}
189
190 static constexpr SEXPType vector_sexp_type = stype;
195 SEXPType type() const { return stype; }
196
200 std::vector<ElementType> data;
201
206};
207
212
217
222
227
232
236struct StringVector : public RObject {
240 StringVector(std::size_t n = 0) :
241 data(sanisizer::cast<I<decltype(data.size())> >(n)),
242 encodings(sanisizer::cast<I<decltype(encodings.size())> >(n)),
243 missing(sanisizer::cast<I<decltype(missing.size())> >(n))
244 {}
249 SEXPType type() const { return SEXPType::STR; }
250
254 std::vector<std::string> data;
255
259 std::vector<StringEncoding> encodings;
260
265 std::vector<char> missing;
266
273 void add(std::string d, StringEncoding enc = StringEncoding::UTF8) {
274 data.push_back(std::move(d));
275 encodings.push_back(enc);
276 missing.push_back(false);
277 }
278
282 void add() {
283 data.push_back("");
284 encodings.push_back(StringEncoding::NONE);
285 missing.push_back(true);
286 }
287
292};
293
297struct GenericVector : public RObject {
301 GenericVector(std::size_t n = 0) :
302 data(sanisizer::cast<I<decltype(data.size())> >(n))
303 {}
308 SEXPType type() const { return SEXPType::VEC; }
309
313 std::vector<std::unique_ptr<RObject> > data;
314
319};
320
324struct PairList : public RObject {
325 SEXPType type() const { return SEXPType::LIST; }
326
330 std::vector<std::unique_ptr<RObject> > data;
331
336 std::vector<unsigned char> has_tag;
337
342 std::vector<std::string> tag_names;
343
347 std::vector<StringEncoding> tag_encodings;
348
356 void add(std::string t, std::unique_ptr<RObject> d, StringEncoding enc = StringEncoding::UTF8) {
357 data.push_back(std::move(d));
358 has_tag.push_back(true);
359 tag_names.push_back(std::move(t));
360 tag_encodings.push_back(enc);
361 }
362
371 void add(std::string t, RObject* d, StringEncoding enc = StringEncoding::UTF8) {
372 data.emplace_back(d);
373 has_tag.push_back(true);
374 tag_names.push_back(std::move(t));
375 tag_encodings.push_back(enc);
376 }
377
383 void add(std::unique_ptr<RObject> d) {
384 data.push_back(std::move(d));
385 has_tag.push_back(false);
386 tag_names.push_back("");
387 tag_encodings.push_back(StringEncoding::NONE);
388 }
389
396 void add(RObject* d) {
397 data.emplace_back(d);
398 has_tag.push_back(false);
399 tag_names.push_back("");
400 tag_encodings.push_back(StringEncoding::NONE);
401 }
402
407};
408
412struct S4Object : public RObject {
413 SEXPType type() const { return SEXPType::S4; }
414
418 std::string class_name;
419
423 StringEncoding class_encoding = StringEncoding::UTF8;
424
428 std::string package_name;
429
433 StringEncoding package_encoding = StringEncoding::UTF8;
434
440};
441
445struct BuiltInFunction : public RObject {
446 SEXPType type() const { return SEXPType::BUILTIN; }
447
451 std::string name;
452};
453
457struct LanguageObject : public RObject {
458
459 SEXPType type() const { return SEXPType::LANG; }
460
464 std::string function_name;
465
469 StringEncoding function_encoding = StringEncoding::UTF8;
470
475 std::vector<std::unique_ptr<RObject> > argument_values;
476
481 std::vector<std::string> argument_names;
482
487 std::vector<unsigned char> argument_has_name;
488
493 std::vector<StringEncoding> argument_encodings;
494
503 void add_argument(std::string n, RObject* d, StringEncoding enc = StringEncoding::UTF8) {
504 argument_names.push_back(std::move(n));
505 argument_values.emplace_back(d);
506 argument_has_name.push_back(true);
507 argument_encodings.push_back(enc);
508 }
509
517 void add_argument(std::string n, std::unique_ptr<RObject> d, StringEncoding enc = StringEncoding::UTF8) {
518 argument_names.push_back(std::move(n));
519 argument_values.push_back(std::move(d));
520 argument_has_name.push_back(true);
521 argument_encodings.push_back(enc);
522 }
523
531 argument_names.emplace_back();
532 argument_values.emplace_back(d);
533 argument_has_name.push_back(false);
534 argument_encodings.push_back(StringEncoding::NONE);
535 }
536
542 void add_argument(std::unique_ptr<RObject> d) {
543 argument_names.emplace_back();
544 argument_values.push_back(std::move(d));
545 argument_has_name.push_back(false);
546 argument_encodings.push_back(StringEncoding::NONE);
547 }
548
553};
554
558struct ExpressionVector : public RObject {
562 ExpressionVector(std::size_t n = 0) :
563 data(sanisizer::cast<I<decltype(data.size())> >(n))
564 {}
569 SEXPType type() const { return SEXPType::EXPR; }
570
575 std::vector<std::unique_ptr<RObject> > data;
576
581};
582
583}
584
585#endif
R data types.
String encodings.
Parse an RDS file in C++.
Definition StringEncoding.hpp:12
AtomicVector< unsigned char, SEXPType::RAW > RawVector
Raw vector.
Definition RObject.hpp:226
AtomicVector< double, SEXPType::REAL > DoubleVector
Double-precision vector.
Definition RObject.hpp:221
StringEncoding
Definition StringEncoding.hpp:17
AtomicVector< std::int32_t, SEXPType::INT > IntegerVector
Integer vector.
Definition RObject.hpp:211
AtomicVector< std::int32_t, SEXPType::LGL > LogicalVector
Logical vector.
Definition RObject.hpp:216
SEXPType
Definition SEXPType.hpp:31
AtomicVector< std::complex< double >, SEXPType::CPLX > ComplexVector
Complex vector.
Definition RObject.hpp:231
Vector of some atomic type.
Definition RObject.hpp:182
Attributes attributes
Definition RObject.hpp:205
SEXPType type() const
Definition RObject.hpp:195
std::vector< ElementType > data
Definition RObject.hpp:200
Attribute names and values.
Definition RObject.hpp:131
std::vector< std::string > names
Definition RObject.hpp:135
std::vector< std::unique_ptr< RObject > > values
Definition RObject.hpp:145
void add(std::string n, RObject *v, StringEncoding enc=StringEncoding::UTF8)
Definition RObject.hpp:155
void add(std::string n, std::unique_ptr< RObject > v, StringEncoding enc=StringEncoding::UTF8)
Definition RObject.hpp:168
std::vector< StringEncoding > encodings
Definition RObject.hpp:140
Built-in function.
Definition RObject.hpp:445
SEXPType type() const
Definition RObject.hpp:446
std::string name
Definition RObject.hpp:451
Reference to an environment.
Definition RObject.hpp:76
std::size_t index
Definition RObject.hpp:101
SEXPType env_type
Definition RObject.hpp:107
SEXPType type() const
Definition RObject.hpp:95
EnvironmentIndex(SEXPType e=SEXPType::GLOBALENV_)
Definition RObject.hpp:82
EnvironmentIndex(std::size_t i)
Definition RObject.hpp:89
Expression vector.
Definition RObject.hpp:558
std::vector< std::unique_ptr< RObject > > data
Definition RObject.hpp:575
Attributes attributes
Definition RObject.hpp:580
SEXPType type() const
Definition RObject.hpp:569
Reference to an external pointer.
Definition RObject.hpp:113
ExternalPointerIndex(std::size_t i=-1)
Definition RObject.hpp:117
SEXPType type() const
Definition RObject.hpp:120
std::size_t index
Definition RObject.hpp:125
Generic vector, i.e., an ordinary R list.
Definition RObject.hpp:297
SEXPType type() const
Definition RObject.hpp:308
Attributes attributes
Definition RObject.hpp:318
std::vector< std::unique_ptr< RObject > > data
Definition RObject.hpp:313
Language object, i.e., a function call.
Definition RObject.hpp:457
std::vector< std::string > argument_names
Definition RObject.hpp:481
std::vector< StringEncoding > argument_encodings
Definition RObject.hpp:493
void add_argument(std::string n, RObject *d, StringEncoding enc=StringEncoding::UTF8)
Definition RObject.hpp:503
void add_argument(std::string n, std::unique_ptr< RObject > d, StringEncoding enc=StringEncoding::UTF8)
Definition RObject.hpp:517
StringEncoding function_encoding
Definition RObject.hpp:469
std::vector< std::unique_ptr< RObject > > argument_values
Definition RObject.hpp:475
Attributes attributes
Definition RObject.hpp:552
std::string function_name
Definition RObject.hpp:464
void add_argument(RObject *d)
Definition RObject.hpp:530
SEXPType type() const
Definition RObject.hpp:459
void add_argument(std::unique_ptr< RObject > d)
Definition RObject.hpp:542
std::vector< unsigned char > argument_has_name
Definition RObject.hpp:487
R's NULL value.
Definition RObject.hpp:51
SEXPType type() const
Definition RObject.hpp:52
Pairlist, i.e., a linked list.
Definition RObject.hpp:324
Attributes attributes
Definition RObject.hpp:406
std::vector< std::unique_ptr< RObject > > data
Definition RObject.hpp:330
std::vector< std::string > tag_names
Definition RObject.hpp:342
void add(RObject *d)
Definition RObject.hpp:396
SEXPType type() const
Definition RObject.hpp:325
std::vector< StringEncoding > tag_encodings
Definition RObject.hpp:347
void add(std::unique_ptr< RObject > d)
Definition RObject.hpp:383
void add(std::string t, std::unique_ptr< RObject > d, StringEncoding enc=StringEncoding::UTF8)
Definition RObject.hpp:356
void add(std::string t, RObject *d, StringEncoding enc=StringEncoding::UTF8)
Definition RObject.hpp:371
std::vector< unsigned char > has_tag
Definition RObject.hpp:336
Virtual class for all unserialized R objects.
Definition RObject.hpp:26
virtual SEXPType type() const =0
S4 object.
Definition RObject.hpp:412
StringEncoding package_encoding
Definition RObject.hpp:433
std::string class_name
Definition RObject.hpp:418
StringEncoding class_encoding
Definition RObject.hpp:423
std::string package_name
Definition RObject.hpp:428
SEXPType type() const
Definition RObject.hpp:413
Attributes attributes
Definition RObject.hpp:439
String vector.
Definition RObject.hpp:236
void add(std::string d, StringEncoding enc=StringEncoding::UTF8)
Definition RObject.hpp:273
std::vector< StringEncoding > encodings
Definition RObject.hpp:259
std::vector< char > missing
Definition RObject.hpp:265
std::vector< std::string > data
Definition RObject.hpp:254
SEXPType type() const
Definition RObject.hpp:249
void add()
Definition RObject.hpp:282
Attributes attributes
Definition RObject.hpp:291
Reference to a language symbol.
Definition RObject.hpp:58
SymbolIndex(std::size_t i=-1)
Definition RObject.hpp:62
SEXPType type() const
Definition RObject.hpp:65
std::size_t index
Definition RObject.hpp:70