#pragma once #include #include #include "utils/endian.hpp" namespace devilution { template T ReadByte(FILE *stream) { static_assert(sizeof(T) == 1, "invalid argument"); char buf; std::fread(&buf, sizeof(buf), 1, stream); return static_cast(buf); } template T ReadLE16(FILE *stream) { static_assert(sizeof(T) == 2, "invalid argument"); char buf[2]; std::fread(buf, sizeof(buf), 1, stream); return static_cast(LoadLE16(buf)); } template T ReadLE32(FILE *stream) { static_assert(sizeof(T) == 4, "invalid argument"); char buf[4]; std::fread(buf, sizeof(buf), 1, stream); return static_cast(LoadLE32(buf)); } inline float ReadLEFloat(FILE *stream) { static_assert(sizeof(float) == sizeof(uint32_t), "invalid float size"); const uint32_t val = ReadLE32(stream); float result; memcpy(&result, &val, sizeof(float)); return result; } inline void WriteByte(FILE *out, uint8_t val) { std::fwrite(&val, sizeof(val), 1, out); } inline void WriteLE16(FILE *out, uint16_t val) { char data[2]; WriteLE16(data, val); std::fwrite(data, sizeof(data), 1, out); } inline void WriteLE32(FILE *out, uint32_t val) { char data[4]; WriteLE32(data, val); std::fwrite(data, sizeof(data), 1, out); } inline void WriteLEFloat(FILE *out, float val) { static_assert(sizeof(float) == sizeof(uint32_t), "invalid float size"); uint32_t intVal; memcpy(&intVal, &val, sizeof(uint32_t)); char data[4]; WriteLE32(data, intVal); std::fwrite(data, sizeof(data), 1, out); } } // namespace devilution