From 670d15fbe177ed7018d8102ad5dc04c0c4a2d783 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sat, 20 Jan 2024 19:01:20 +0100 Subject: w --- serialize/savegame.cpp | 67 ++++++++++++++++---------------------------------- 1 file changed, 21 insertions(+), 46 deletions(-) diff --git a/serialize/savegame.cpp b/serialize/savegame.cpp index 829459b7..765d0084 100644 --- a/serialize/savegame.cpp +++ b/serialize/savegame.cpp @@ -50,12 +50,14 @@ struct string_container StringView str; bool operator==(const string_container&) const = default; +#if 0 friend void swap(string_container& a, string_container& b) { auto tmp = a.str; a.str = b.str; b.str = tmp; } +#endif }; struct FILE_raii final @@ -68,26 +70,8 @@ private: FILE* s; }; -} // namespace - -} // namespace floormat::Serialize - -using floormat::Serialize::string_container; using floormat::Hash::fnvhash_buf; -template<> struct std::hash -{ - size_t operator()(const string_container& x) const noexcept - { - return fnvhash_buf(x.str.data(), x.str.size()); - } -}; - - -namespace floormat::Serialize { - -namespace { - template T& non_const(const T& value) { return const_cast(value); } template T& non_const(T& value) = delete; template T& non_const(T&& value) = delete; @@ -95,13 +79,6 @@ template T& non_const(const T&& value) = delete; constexpr size_t vector_initial_size = 128, hash_initial_size = vector_initial_size*2; -template -struct magic -{ - using type = T; - uint16_t magic; -}; - struct buffer { std::unique_ptr data; @@ -149,7 +126,7 @@ struct visitor_ template requires (std::is_arithmetic_v && std::is_fundamental_v) - void visit(T& x, F&& f) + static void visit(T& x, F&& f) { f(x); } @@ -161,14 +138,6 @@ struct visitor_ do_visit(x.data()[i], f); } -#if 0 - template - void visit(StringView str, F&& f) - { - f(str); - } -#endif - template requires std::is_enum_v void visit(E& x, F&& f) @@ -220,10 +189,16 @@ struct visitor_ struct writer final : visitor_ { + using string_hasher = decltype( + [](const string_container& x) { + return fnvhash_buf(x.str.data(), x.str.size()); + } + ); + const world& w; std::vector string_array{}; - tsl::robin_map string_map{hash_initial_size}; + tsl::robin_map string_map{hash_initial_size}; std::vector atlas_array{}; tsl::robin_map atlas_map{hash_initial_size}; @@ -232,7 +207,7 @@ struct writer final : visitor_ buffer header_buf{}, string_buf{}; - writer(const world& w) : w{w} { } // added to avoid spurious warning until GCC 14: warning: missing initializer for member writer:: + writer(const world& w) : w{w} { } // added to avoid spurious warning until GCC 14: warning: missing initializer for member :: struct size_counter { @@ -392,23 +367,23 @@ ok: do_visit(intern_string(name), f); void serialize_chunk_(chunk& c, buffer& buf) { + const auto fn = [this](chunk& c, auto&& f) { + do_visit(chunk_magic, f); + do_visit(c.coord(), f); + for (uint32_t i = 0; i < TILE_COUNT; i++) + serialize_tile_(c[i], f); + serialize_objects_(c, f); + }; + size_t len = 0; auto ctr = size_counter{len}; - do_visit(chunk_magic, ctr); - do_visit(c.coord(), ctr); + fn(c, ctr); fm_assert(len > 0); - for (uint32_t i = 0; i < TILE_COUNT; i++) - serialize_tile_(c[i], ctr); - serialize_objects_(c, ctr); buf = buffer{len}; binary_writer s{&buf.data[0], buf.size}; byte_writer b{s}; - do_visit(chunk_magic, b); - do_visit(c.coord(), b); - for (uint32_t i = 0; i < TILE_COUNT; i++) - serialize_tile_(c[i], b); - serialize_objects_(c, b); + fn(c, b); fm_assert(s.bytes_written() == s.bytes_allocated()); } -- cgit v1.2.3