#ifndef INNOEXTRACT_LOADINGUTILS_HPP #define INNOEXTRACT_LOADINGUTILS_HPP #include #include #include #include #include "Types.hpp" inline u8 fromLittleEndian(u8 value) { return value; } inline s8 fromLittleEndian(s8 value) { return value; } #ifdef BOOST_LITTLE_ENDIAN inline u16 fromLittleEndian(u16 value) { return value; } inline u32 fromLittleEndian(u32 value) { return value; } inline u64 fromLittleEndian(u64 value) { return value; } inline s16 fromLittleEndian(s16 value) { return value; } inline s32 fromLittleEndian(s32 value) { return value; } inline s64 fromLittleEndian(s64 value) { return value; } #else // TODO implement! #error "Host endianness not supported!" #endif struct BinaryString { std::string & data; inline BinaryString(std::string & target) : data(target) { } static void loadInto(std::istream & is, std::string & target); }; inline std::istream & operator>>(std::istream & is, const BinaryString & str) { BinaryString::loadInto(is, str.data); return is; } struct AnsiString { std::string & data; inline AnsiString(std::string & target) : data(target) { } static void loadInto(std::istream & is, std::string & target); }; inline std::istream & operator>>(std::istream & is, const AnsiString & str) { AnsiString::loadInto(is, str.data); return is; } struct WideString { std::string & data; bool wide; inline WideString(std::string & target, bool _wide /*= true*/) : data(target), wide(_wide) { } static void loadInto(std::istream & is, std::string & target); }; inline std::istream & operator>>(std::istream & is, const WideString & str) { str.wide ? WideString::loadInto(is, str.data) : AnsiString::loadInto(is, str.data); return is; } template inline T load(std::istream & is) { T value; is.read(reinterpret_cast(&value), sizeof(value)); return value; } template inline T loadNumber(std::istream & is) { return fromLittleEndian(load(is)); } template ::is_signed> struct compatible_integer { typedef void type; }; template struct compatible_integer { typedef u8 type; }; template struct compatible_integer { typedef s8 type; }; template struct compatible_integer { typedef u16 type; }; template struct compatible_integer { typedef s16 type; }; template struct compatible_integer { typedef u32 type; }; template struct compatible_integer { typedef s32 type; }; template struct compatible_integer { typedef u64 type; }; template struct compatible_integer { typedef s64 type; }; template T loadNumber(std::istream & is, size_t bits) { if(bits == 8) { return loadNumber::type>(is); } else if(bits == 16) { return loadNumber::type>(is); } else if(bits == 32) { return loadNumber::type>(is); } else { return loadNumber::type>(is); } } #endif // INNOEXTRACT_LOADINGUTILS_HPP