From a9ffceeffb98f0f5628d3ad347a4e3dbc93b66f3 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Fri, 12 Jan 2024 01:35:13 +0100 Subject: a --- serialize/world-impl.hpp | 6 ++---- serialize/world-reader.cpp | 20 ++++++++++++++++---- serialize/world-writer.cpp | 6 ++---- 3 files changed, 20 insertions(+), 12 deletions(-) (limited to 'serialize') diff --git a/serialize/world-impl.hpp b/serialize/world-impl.hpp index df0657ce..0ec1dee4 100644 --- a/serialize/world-impl.hpp +++ b/serialize/world-impl.hpp @@ -50,7 +50,7 @@ template constexpr inline T int_max = std::numeric_limits::max(); #define file_magic ".floormat.save" -constexpr inline proto_t proto_version = 17; +constexpr inline proto_t proto_version = 18; constexpr inline size_t atlas_name_max = 128; constexpr inline auto null_atlas = (atlasid)-1LL; @@ -62,9 +62,7 @@ constexpr inline proto_t min_proto_version = 1; constexpr inline auto chunk_magic = (uint16_t)~0xc0d3; constexpr inline auto scenery_magic = (uint16_t)~0xb00b; -using pass_mode_i = std::underlying_type_t; -constexpr inline pass_mode_i pass_mask = (1 << pass_mode_BITS)-1; -using object_type_i = std::underlying_type_t; +constexpr inline auto pass_mask = (1 << pass_mode_BITS)-1; template constexpr inline auto highbits = (T(1) << N)-1 << sizeof(T)*8-N-off; diff --git a/serialize/world-reader.cpp b/serialize/world-reader.cpp index 74023092..71d55cb7 100644 --- a/serialize/world-reader.cpp +++ b/serialize/world-reader.cpp @@ -250,10 +250,22 @@ void reader_state::read_chunks(reader_t& s) for (auto i = 0uz; i < object_count; i++) { - object_id _id; _id << s; - const auto oid = _id & lowbits<60, object_id>; - fm_soft_assert(oid != 0); - const auto type = object_type(_id >> 61); + object_id oid; + object_type type; + if (PROTO >= 18) [[likely]] + { + oid << s; + fm_soft_assert((oid & lowbits) == oid); + type = object_type(s.read>()); + fm_soft_assert(type < object_type::COUNT); + } + else + { + object_id _id; _id << s; + oid = _id & lowbits<60, object_id>; + fm_soft_assert(oid != 0); + type = object_type(_id >> 61); + } const auto local = local_coords{s.read()}; Vector2b offset; diff --git a/serialize/world-writer.cpp b/serialize/world-writer.cpp index 6dad7f07..6de452c2 100644 --- a/serialize/world-writer.cpp +++ b/serialize/world-writer.cpp @@ -185,7 +185,7 @@ template void write_object_flags(binary_writer& s, const U& e) { uint8_t flags = 0; - auto pass = (pass_mode_i)e.pass; + auto pass = std::to_underlying(e.pass); fm_assert((pass & pass_mask) == pass); flags |= pass; constexpr auto tag = object_type_::value; @@ -335,10 +335,8 @@ void writer_state::serialize_scenery(const chunk& c, writer_t& s) object_id oid = e.id; fm_assert((oid & lowbits) == e.id); const auto type = e.type(); - const auto type_ = (object_type_i)type; - fm_assert(type_ == (type_ & lowbits)); - oid |= (object_id)type << 64 - object_type_BITS; s << oid; + s << std::to_underlying(type); const auto local = e.coord.local(); s << local.to_index(); s << e.offset[0]; -- cgit v1.2.3