From 906f56a842c0e0e706087f80607ff6d816a23280 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Mon, 22 Jan 2024 18:55:41 +0100 Subject: w --- loader/atlas.cpp | 2 +- loader/impl.hpp | 2 +- loader/loader.hpp | 2 +- loader/wall-atlas.cpp | 43 +++++++++++++++++++++++++++++++++---------- 4 files changed, 36 insertions(+), 13 deletions(-) (limited to 'loader') diff --git a/loader/atlas.cpp b/loader/atlas.cpp index 100f638e..555a2b02 100644 --- a/loader/atlas.cpp +++ b/loader/atlas.cpp @@ -56,7 +56,7 @@ ArrayView loader_impl::anim_atlas_list() std::shared_ptr loader_impl::anim_atlas(StringView name, StringView dir) noexcept(false) { - fm_soft_assert(dir && dir[dir.size()-1] == '/'); + fm_soft_assert(!dir || dir[dir.size()-1] == '/'); char buf[FILENAME_MAX]; auto path = make_atlas_path(buf, dir, name); diff --git a/loader/impl.hpp b/loader/impl.hpp index fd51b4f3..9308baba 100644 --- a/loader/impl.hpp +++ b/loader/impl.hpp @@ -50,7 +50,7 @@ struct loader_impl final : loader_ std::vector wall_atlas_array; std::vector missing_wall_atlases; Pointer invalid_wall_atlas; - std::shared_ptr wall_atlas(StringView name, bool fail_ok = true) override; + std::shared_ptr wall_atlas(StringView name, loader_policy policy) override; ArrayView wall_atlas_list() override; void get_wall_atlas_list(); const wall_info& make_invalid_wall_atlas(); diff --git a/loader/loader.hpp b/loader/loader.hpp index be132751..63740aa7 100644 --- a/loader/loader.hpp +++ b/loader/loader.hpp @@ -41,7 +41,7 @@ struct loader_ virtual std::shared_ptr ground_atlas(StringView filename, loader_policy policy = loader_policy::DEFAULT) noexcept(false) = 0; virtual ArrayView anim_atlas_list() = 0; virtual std::shared_ptr anim_atlas(StringView name, StringView dir = ANIM_PATH) noexcept(false) = 0; - virtual std::shared_ptr wall_atlas(StringView name, bool fail_ok = false) noexcept(false) = 0; + virtual std::shared_ptr wall_atlas(StringView name, loader_policy policy = loader_policy::DEFAULT) noexcept(false) = 0; virtual ArrayView wall_atlas_list() = 0; virtual void destroy() = 0; static loader_& default_loader() noexcept; diff --git a/loader/wall-atlas.cpp b/loader/wall-atlas.cpp index b2505fbc..6e66478b 100644 --- a/loader/wall-atlas.cpp +++ b/loader/wall-atlas.cpp @@ -68,21 +68,38 @@ const wall_info& loader_impl::make_invalid_wall_atlas() return *invalid_wall_atlas; } -std::shared_ptr loader_impl::wall_atlas(StringView name, bool fail_ok) noexcept(false) +std::shared_ptr loader_impl::wall_atlas(StringView name, loader_policy policy) noexcept(false) { - fm_assert(fail_ok || name != INVALID); - fm_soft_assert(check_atlas_name(name)); + (void)wall_atlas_list(); + switch (policy) + { + case loader_policy::error: + fm_assert(name != INVALID); + break; + case loader_policy::ignore: + case loader_policy::warn: + break; + default: + fm_abort("invalid loader_policy"); + } + + fm_soft_assert(check_atlas_name(name)); auto it = wall_atlas_map.find(name); if (it != wall_atlas_map.end()) [[likely]] { if (it->second == (wall_info*)-1) [[unlikely]] { - if (fail_ok) [[likely]] - goto missing_ok; - else + switch (policy) + { + case loader_policy::error: goto error; + case loader_policy::warn: + case loader_policy::ignore: + goto missing_ok; + } + std::unreachable(); } else if (!it->second->atlas) return it->second->atlas = get_wall_atlas(name, loader.WALL_TILESET_PATH); @@ -91,13 +108,19 @@ std::shared_ptr loader_impl::wall_atlas(StringView name, bool } else { - if (fail_ok) [[likely]] - goto missing; - else + switch (policy) + { + case loader_policy::error: goto error; + case loader_policy::warn: + goto missing_warn; + case loader_policy::ignore: + goto missing_ok; + } + std::unreachable(); } -missing: +missing_warn: { missing_wall_atlases.push_back(String { AllocatedInit, name }); auto string_view = StringView{missing_wall_atlases.back()}; -- cgit v1.2.3