25 auto tmp_dir = std::filesystem::temp_directory_path();
27 std::random_device random_device;
28 std::mt19937 mersenne_prng(random_device());
29 std::uniform_int_distribution<uint64_t> uniform_int_distribution(0);
30 std::filesystem::path path;
32 std::stringstream string_stream;
33 string_stream << std::hex << uniform_int_distribution(mersenne_prng);
34 path = tmp_dir / (
"porytiles_" + string_stream.str());
35 if (std::filesystem::create_directory(path)) {
39 panic(
"create_tmpdir: exceeded maximum retries");
56[[nodiscard]]
inline bool files_are_identical(
const std::filesystem::path &file_a,
const std::filesystem::path &file_b)
58 if (!std::filesystem::exists(file_b)) {
61 if (std::filesystem::file_size(file_a) != std::filesystem::file_size(file_b)) {
65 std::ifstream stream_a{file_a, std::ios::binary};
66 std::ifstream stream_b{file_b, std::ios::binary};
67 if (!stream_a || !stream_b) {
70 return digest.
digest(stream_a) == digest.
digest(stream_b);
92 auto dir = path.parent_path();
93 auto filename = path.filename();
94 while (!filename.extension().empty()) {
95 filename = filename.stem();
100 return dir / filename;
Computes the MD5 digest of an input stream.
std::string digest(std::istream &stream) const
Computes the MD5 digest of an input stream.
void panic(const StringViewSourceLoc &s)
Unconditionally terminates the program with a panic message.
std::filesystem::path create_tmpdir()
Creates a unique temporary directory.
bool files_are_identical(const std::filesystem::path &file_a, const std::filesystem::path &file_b)
Checks if two files have identical contents.
std::filesystem::path strip_all_extensions(const std::filesystem::path &path)
Strips all extensions from a path, returning the path with only the stem.