diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2024-01-22 18:55:41 +0100 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2024-01-22 18:55:41 +0100 |
commit | 906f56a842c0e0e706087f80607ff6d816a23280 (patch) | |
tree | 730ed20091649482691baeaeae753dd40c468402 /loader | |
parent | 49f455887a29a2a879e330dca9e050296e617720 (diff) |
w
Diffstat (limited to 'loader')
-rw-r--r-- | loader/atlas.cpp | 2 | ||||
-rw-r--r-- | loader/impl.hpp | 2 | ||||
-rw-r--r-- | loader/loader.hpp | 2 | ||||
-rw-r--r-- | loader/wall-atlas.cpp | 43 |
4 files changed, 36 insertions, 13 deletions
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<const String> loader_impl::anim_atlas_list() std::shared_ptr<anim_atlas> 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_info> wall_atlas_array; std::vector<String> missing_wall_atlases; Pointer<wall_info> invalid_wall_atlas; - std::shared_ptr<class wall_atlas> wall_atlas(StringView name, bool fail_ok = true) override; + std::shared_ptr<class wall_atlas> wall_atlas(StringView name, loader_policy policy) override; ArrayView<const wall_info> 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<class ground_atlas> ground_atlas(StringView filename, loader_policy policy = loader_policy::DEFAULT) noexcept(false) = 0; virtual ArrayView<const String> anim_atlas_list() = 0; virtual std::shared_ptr<class anim_atlas> anim_atlas(StringView name, StringView dir = ANIM_PATH) noexcept(false) = 0; - virtual std::shared_ptr<class wall_atlas> wall_atlas(StringView name, bool fail_ok = false) noexcept(false) = 0; + virtual std::shared_ptr<class wall_atlas> wall_atlas(StringView name, loader_policy policy = loader_policy::DEFAULT) noexcept(false) = 0; virtual ArrayView<const wall_info> 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<class wall_atlas> loader_impl::wall_atlas(StringView name, bool fail_ok) noexcept(false) +std::shared_ptr<class wall_atlas> 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<class wall_atlas> 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()}; |