summaryrefslogtreecommitdiffhomepage
path: root/loader
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2024-01-22 18:55:41 +0100
committerStanislaw Halik <sthalik@misaki.pl>2024-01-22 18:55:41 +0100
commit906f56a842c0e0e706087f80607ff6d816a23280 (patch)
tree730ed20091649482691baeaeae753dd40c468402 /loader
parent49f455887a29a2a879e330dca9e050296e617720 (diff)
w
Diffstat (limited to 'loader')
-rw-r--r--loader/atlas.cpp2
-rw-r--r--loader/impl.hpp2
-rw-r--r--loader/loader.hpp2
-rw-r--r--loader/wall-atlas.cpp43
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()};