12#include "lcf/writer_lcf.h"
16LcfWriter::LcfWriter(std::ostream& filestream, EngineVersion engine, std::string encoding)
18 , encoder(std::move(encoding))
23void LcfWriter::Write(
const void *ptr,
size_t size,
size_t nmemb) {
24 stream.write(
reinterpret_cast<const char*
>(ptr), size*nmemb);
25 assert(stream.good());
29void LcfWriter::Write<int8_t>(int8_t val) {
34void LcfWriter::Write<uint8_t>(uint8_t val) {
39void LcfWriter::Write<int16_t>(int16_t val) {
45void LcfWriter::Write<uint32_t>(uint32_t val) {
50void LcfWriter::WriteInt(
int val) {
51 uint32_t value = (uint32_t) val;
52 for (
int i = 28; i >= 0; i -= 7)
53 if (value >= (1U << i) || i == 0)
54 Write<uint8_t>((uint8_t)(((value >> i) & 0x7F) | (i > 0 ? 0x80 : 0)));
57void LcfWriter::WriteUInt64(uint64_t value) {
58 for (
int i = 56; i >= 0; i -= 7)
59 if (value >= (1LL << i) || i == 0)
60 Write<uint8_t>((uint8_t)(((value >> i) & 0x7F) | (i > 0 ? 0x80 : 0)));
64void LcfWriter::Write<int32_t>(int32_t val) {
69void LcfWriter::Write<bool>(
bool val) {
70 uint8_t x = val ? 1 : 0;
75void LcfWriter::Write<double>(
double val) {
81void LcfWriter::Write<bool>(
const std::vector<bool>& buffer) {
82 std::vector<bool>::const_iterator it;
83 for (it = buffer.begin(); it != buffer.end(); it++) {
84 uint8_t val = *it ? 1 : 0;
90void LcfWriter::Write<uint8_t>(
const std::vector<uint8_t>& buffer) {
91 Write(&buffer.front(), 1, buffer.size());
95void LcfWriter::Write<int16_t>(
const std::vector<int16_t>& buffer) {
96 std::vector<int16_t>::const_iterator it;
97 for (it = buffer.begin(); it != buffer.end(); it++)
102void LcfWriter::Write<int32_t>(
const std::vector<int32_t>& buffer) {
103 std::vector<int32_t>::const_iterator it;
104 for (it = buffer.begin(); it != buffer.end(); it++) {
113void LcfWriter::Write<uint32_t>(
const std::vector<uint32_t>& buffer) {
114 std::vector<uint32_t>::const_iterator it;
115 for (it = buffer.begin(); it != buffer.end(); it++)
119void LcfWriter::Write(
const std::string& _str) {
120 std::string str = Decode(_str);
122 Write(&*str.begin(), 1, str.size());
126void LcfWriter::Write(
const DBString& _str) {
127 std::string str = Decode(_str);
129 Write(&*str.begin(), 1, str.size());
133void LcfWriter::Write(
const DBBitArray& bits) {
134 for (
auto& b: bits) {
135 Write(
static_cast<uint8_t
>(b));
139uint32_t LcfWriter::Tell() {
140 return (uint32_t)stream.tellp();
143bool LcfWriter::IsOk()
const {
144 return stream.good() && encoder.IsOk();
147std::string LcfWriter::Decode(StringView str) {
148 auto copy = std::string(str);
149 encoder.Decode(copy);
153#ifdef WORDS_BIGENDIAN
154void LcfWriter::SwapByteOrder(uint16_t& us)
160void LcfWriter::SwapByteOrder(uint32_t& ui)
163 ((ui<<8) & 0x00FF0000) |
164 ((ui>>8) & 0x0000FF00) |
168void LcfWriter::SwapByteOrder(
double& d)
170 char *p =
reinterpret_cast<char*
>(&d);
171 std::swap(p[0], p[7]);
172 std::swap(p[1], p[6]);
173 std::swap(p[2], p[5]);
174 std::swap(p[3], p[4]);
177void LcfWriter::SwapByteOrder(uint16_t& ) {}
178void LcfWriter::SwapByteOrder(uint32_t& ) {}
179void LcfWriter::SwapByteOrder(
double& ) {}
182void LcfWriter::SwapByteOrder(int16_t& s)
184 SwapByteOrder((uint16_t&) s);
187void LcfWriter::SwapByteOrder(int32_t& s)
189 SwapByteOrder((uint32_t&) s);