summaryrefslogtreecommitdiffhomepage
path: root/serialize/world-writer.cpp
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2024-01-20 17:47:03 +0100
committerStanislaw Halik <sthalik@misaki.pl>2024-01-20 17:47:03 +0100
commitf2b65d72880f5263696985ecbd8a09da919399e8 (patch)
tree12f1bb3e510891fd8470bfd279963c224001f758 /serialize/world-writer.cpp
parentc5596a0efa5aa940dc3ed4fe4b563ee814015955 (diff)
w
Diffstat (limited to 'serialize/world-writer.cpp')
-rw-r--r--serialize/world-writer.cpp20
1 files changed, 12 insertions, 8 deletions
diff --git a/serialize/world-writer.cpp b/serialize/world-writer.cpp
index 409b06ff..b6e5846b 100644
--- a/serialize/world-writer.cpp
+++ b/serialize/world-writer.cpp
@@ -404,7 +404,7 @@ ok: do_visit(intern_string(name), f);
do_visit(nchunks, f);
}
- template<typename F> void serialize_strings_(F&& f)
+ void serialize_strings_()
{
fm_assert(string_buf.empty());
size_t len = 0;
@@ -413,8 +413,10 @@ ok: do_visit(intern_string(name), f);
len += s.size() + 1;
buffer buf{len};
binary_writer b{&buf.data[0], buf.size};
+ b << (uint32_t)string_array.size();
for (const auto& s : string_array)
b.write_asciiz_string(s);
+ fm_assert(b.bytes_written() == b.bytes_allocated());
string_buf = std::move(buf);
}
@@ -424,9 +426,10 @@ ok: do_visit(intern_string(name), f);
fm_assert(atlas_array.empty());
fm_assert(chunk_array.empty());
fm_assert(header_buf.empty());
+ fm_assert(string_buf.empty());
for (auto& [coord, c] : non_const(w.chunks()))
- chunk_array.push_back(serialized_chunk{.c = &c });
+ chunk_array.push_back({.c = &c });
std::sort(chunk_array.begin(), chunk_array.end(), [](const auto& c1, const auto& c2) {
auto a = c1.c->coord(), b = c2.c->coord();
@@ -436,19 +439,20 @@ ok: do_visit(intern_string(name), f);
for (uint32_t i = 0; auto& [coord, c] : chunk_array)
serialize_chunk_(*c, chunk_array[i++].buf);
- size_t len = 0;
{
+ size_t len = 0;
fm_assert(header_buf.empty());
serialize_header_(size_counter{len});
fm_assert(len > 0);
- }
- buffer hdr{len};
- {
- binary_writer<char*> s{&hdr.data[0], hdr.size};
+
+ buffer hdr{len};
+ binary_writer s{&hdr.data[0], hdr.size};
serialize_header_(byte_writer{s});
fm_assert(s.bytes_written() == s.bytes_allocated());
+ header_buf = std::move(hdr);
}
- header_buf = std::move(hdr);
+
+ serialize_strings_();
}
template<typename F>