rds2cpp
Read and write RDS/RDA files in C++
Loading...
Searching...
No Matches
Version.hpp
Go to the documentation of this file.
1#ifndef RDS2CPP_VERSION_HPP
2#define RDS2CPP_VERSION_HPP
3
4#include <cstdint>
5
7
8#include "utils_parse.hpp"
9#include "utils_write.hpp"
10
17namespace rds2cpp {
18
22struct Version {
26 std::int16_t major = 3;
27
31 std::uint8_t minor = 5;
32
36 std::uint8_t patch = 0;
37};
38
42template<typename Source_>
43Version parse_version(Source_& src) {
44 // Using int32_t for the versions as the R_Version macro operates with signed integers AFIACT.
45 auto writer_version = quick_integer<std::int32_t>(src);
46 Version output;
47 output.major = (writer_version >> 16);
48 output.minor = (writer_version >> 8) & 255;
49 output.patch = writer_version & 255;
50 return output;
51}
52
53template<class BufferedWriter_>
54void write_version(const Version& version, BufferedWriter_& bufwriter) {
55 // Mimic the behavior of the R_Version macro.
56 inject_integer<std::int32_t, std::int32_t>(
57 sanisizer::product_unsafe<std::int32_t>(version.major, 65536) +
58 sanisizer::product_unsafe<std::int32_t>(version.minor, 256) +
59 static_cast<std::int32_t>(version.patch),
60 bufwriter
61 );
62}
67}
68
69#endif
Parse an RDS file in C++.
Definition StringEncoding.hpp:12
constexpr Dest_ product_unsafe(First_ first, Args_... more)
Major-minor-patch version number, usually of R itself.
Definition Version.hpp:22
std::uint8_t patch
Definition Version.hpp:36
std::int16_t major
Definition Version.hpp:26
std::uint8_t minor
Definition Version.hpp:31