rds2cpp
C++ library for parsing RDS files
Loading...
Searching...
No Matches
write_rds.hpp
Go to the documentation of this file.
1#ifndef RDS2CPP_WRITE_RDS_HPP
2#define RDS2CPP_WRITE_RDS_HPP
3
4#include <vector>
5#include <cstddef>
6
7#include "byteme/byteme.hpp"
8#include "sanisizer/sanisizer.hpp"
9
10#include "RdsFile.hpp"
11#include "RObject.hpp"
12#include "utils_write.hpp"
13#include "write_object.hpp"
14#include "SharedWriteInfo.hpp"
15
22namespace rds2cpp {
23
31 bool parallel = false;
32
37 std::size_t buffer_size = sanisizer::cap<std::size_t>(65536);
38};
39
48template<class Writer>
49void write_rds(const RdsFile& info, Writer& writer, const WriteRdsOptions& options) {
50 std::unique_ptr<byteme::BufferedWriter<unsigned char> > bufwriter;
51 if (options.parallel) {
52 bufwriter.reset(new byteme::ParallelBufferedWriter<unsigned char, Writer*>(&writer, options.buffer_size));
53 } else {
54 bufwriter.reset(new byteme::SerialBufferedWriter<unsigned char, Writer*>(&writer, options.buffer_size));
55 }
56
57 bufwriter->write("X\n");
58 inject_integer<std::int32_t>(info.format_version, *bufwriter);
59
60 // Mimic the behavior of the R_Version macro.
61 inject_integer<std::int32_t, std::int32_t>(
62 sanisizer::product_unsafe<std::int32_t>(info.writer_version.major, 65536) +
63 sanisizer::product_unsafe<std::int32_t>(info.writer_version.minor, 256) +
64 static_cast<std::int32_t>(info.writer_version.patch),
65 *bufwriter
66 );
67
68 inject_integer<std::int32_t, std::int32_t>(
69 sanisizer::product_unsafe<std::int32_t>(info.reader_version.major, 65536) +
70 sanisizer::product_unsafe<std::int32_t>(info.reader_version.minor, 256) +
71 static_cast<std::int32_t>(info.reader_version.patch),
72 *bufwriter
73 );
74
75 const std::string encoding = string_encoding_to_name(info.encoding);
76 inject_integer<std::int32_t>(sanisizer::cast<std::int32_t>(encoding.size()), *bufwriter);
77 bufwriter->write(encoding);
78
79 SharedWriteInfo shared(info.symbols, info.environments, info.external_pointers);
80 write_object(info.object.get(), *bufwriter, shared);
81}
82
90inline void write_rds(const RdsFile& info, const char* path, const WriteRdsOptions& options) {
91 byteme::GzipFileWriter writer(path, {});
92 write_rds(info, writer, options);
93}
94
102inline void write_rds(const RdsFile& info, std::string path, const WriteRdsOptions& options) {
103 write_rds(info, path.c_str(), options);
104}
105
106
107}
108
109#endif
Representations of unserialized R objects.
Information about an RDS file.
Parse an RDS file in C++.
Definition StringEncoding.hpp:12
void write_rds(const RdsFile &info, Writer &writer, const WriteRdsOptions &options)
Definition write_rds.hpp:49
Contents of the parsed RDS file.
Definition RdsFile.hpp:43
std::int32_t format_version
Definition RdsFile.hpp:47
std::unique_ptr< RObject > object
Definition RdsFile.hpp:67
std::vector< Symbol > symbols
Definition RdsFile.hpp:79
std::vector< ExternalPointer > external_pointers
Definition RdsFile.hpp:85
Version reader_version
Definition RdsFile.hpp:57
StringEncoding encoding
Definition RdsFile.hpp:62
Version writer_version
Definition RdsFile.hpp:52
std::vector< Environment > environments
Definition RdsFile.hpp:73
std::uint8_t patch
Definition RdsFile.hpp:37
std::int16_t major
Definition RdsFile.hpp:27
std::uint8_t minor
Definition RdsFile.hpp:32
Options for write_rds().
Definition write_rds.hpp:27
bool parallel
Definition write_rds.hpp:31
std::size_t buffer_size
Definition write_rds.hpp:37