Files
panopainter/src/platform_api/asset_file_load_policy.cpp

80 lines
2.0 KiB
C++

#include "platform_api/asset_file_load_policy.h"
#include <string>
#include <sys/stat.h>
namespace pp::platform {
AssetFileLoadDecision plan_asset_file_load_with_probe(
PlatformFamily family,
bool already_loaded,
std::int64_t previous_last_write_time,
AssetFileTimestampProbe probe) noexcept
{
if (platform_uses_asset_file_mtime_reload(family))
{
if (!probe.file_exists)
return { false, false, previous_last_write_time };
if (probe.last_write_time <= previous_last_write_time)
return { false, false, previous_last_write_time };
return { true, true, probe.last_write_time };
}
if (already_loaded)
return { false, true, previous_last_write_time };
return { true, true, previous_last_write_time };
}
AssetFileLoadDecision plan_asset_file_load_for_platform(
PlatformFamily family,
std::string_view absolute_path,
bool already_loaded,
std::int64_t previous_last_write_time)
{
if (!platform_uses_asset_file_mtime_reload(family))
{
return plan_asset_file_load_with_probe(
family,
already_loaded,
previous_last_write_time,
{});
}
struct stat file_info {};
const std::string path(absolute_path);
if (stat(path.c_str(), &file_info) != 0)
{
return plan_asset_file_load_with_probe(
family,
already_loaded,
previous_last_write_time,
{});
}
return plan_asset_file_load_with_probe(
family,
already_loaded,
previous_last_write_time,
{
true,
static_cast<std::int64_t>(file_info.st_mtime),
});
}
AssetFileLoadDecision plan_asset_file_load(
std::string_view absolute_path,
bool already_loaded,
std::int64_t previous_last_write_time)
{
return plan_asset_file_load_for_platform(
current_platform_family(),
absolute_path,
already_loaded,
previous_last_write_time);
}
}