#pragma once #include #include #include "utils/endian.hpp" namespace devilution { template T ReadByte(std::ifstream &stream) { static_assert(sizeof(T) == 1, "invalid argument"); char buf; stream.read(&buf, 1); return static_cast(buf); } template T ReadLE16(std::ifstream &stream) { static_assert(sizeof(T) == 2, "invalid argument"); char buf[2]; stream.read(buf, 2); return static_cast(LoadLE16(buf)); } template T ReadLE32(std::ifstream &stream) { static_assert(sizeof(T) == 4, "invalid argument"); char buf[4]; stream.read(buf, 4); return static_cast(LoadLE32(buf)); } inline float ReadLEFloat(std::ifstream &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(std::ofstream &out, uint8_t val) { out.write(reinterpret_cast(&val), 1); } inline void WriteLE16(std::ofstream &out, uint16_t val) { char data[2]; WriteLE16(data, val); out.write(data, 2); } inline void WriteLE32(std::ofstream &out, uint32_t val) { char data[4]; WriteLE32(data, val); out.write(data, 4); } inline void WriteLEFloat(std::ofstream &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); out.write(data, 4); } } // namespace devilution