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)));
58void LcfWriter::Write<int32_t>(int32_t val) {
63void LcfWriter::Write<bool>(
bool val) {
64 uint8_t x = val ? 1 : 0;
69void LcfWriter::Write<double>(
double val) {
75void LcfWriter::Write<bool>(
const std::vector<bool>& buffer) {
76 std::vector<bool>::const_iterator it;
77 for (it = buffer.begin(); it != buffer.end(); it++) {
78 uint8_t val = *it ? 1 : 0;
84void LcfWriter::Write<uint8_t>(
const std::vector<uint8_t>& buffer) {
85 Write(&buffer.front(), 1, buffer.size());
89void LcfWriter::Write<int16_t>(
const std::vector<int16_t>& buffer) {
90 std::vector<int16_t>::const_iterator it;
91 for (it = buffer.begin(); it != buffer.end(); it++)
96void LcfWriter::Write<int32_t>(
const std::vector<int32_t>& buffer) {
97 std::vector<int32_t>::const_iterator it;
98 for (it = buffer.begin(); it != buffer.end(); it++) {
107void LcfWriter::Write<uint32_t>(
const std::vector<uint32_t>& buffer) {
108 std::vector<uint32_t>::const_iterator it;
109 for (it = buffer.begin(); it != buffer.end(); it++)
113void LcfWriter::Write(
const std::string& _str) {
114 std::string str = Decode(_str);
116 Write(&*str.begin(), 1, str.size());
120void LcfWriter::Write(
const DBString& _str) {
121 std::string str = Decode(_str);
123 Write(&*str.begin(), 1, str.size());
127void LcfWriter::Write(
const DBBitArray& bits) {
128 for (
auto& b: bits) {
129 Write(
static_cast<uint8_t
>(b));
133uint32_t LcfWriter::Tell() {
134 return (uint32_t)stream.tellp();
137bool LcfWriter::IsOk()
const {
138 return stream.good() && encoder.IsOk();
141std::string LcfWriter::Decode(StringView str) {
142 auto copy = std::string(str);
143 encoder.Decode(copy);
147#ifdef WORDS_BIGENDIAN
148void LcfWriter::SwapByteOrder(uint16_t& us)
154void LcfWriter::SwapByteOrder(uint32_t& ui)
157 ((ui<<8) & 0x00FF0000) |
158 ((ui>>8) & 0x0000FF00) |
162void LcfWriter::SwapByteOrder(
double& d)
164 uint32_t *p =
reinterpret_cast<uint32_t *
>(&d);
172void LcfWriter::SwapByteOrder(uint16_t& ) {}
173void LcfWriter::SwapByteOrder(uint32_t& ) {}
174void LcfWriter::SwapByteOrder(
double& ) {}
177void LcfWriter::SwapByteOrder(int16_t& s)
179 SwapByteOrder((uint16_t&) s);
182void LcfWriter::SwapByteOrder(int32_t& s)
184 SwapByteOrder((uint32_t&) s);