HF
This commit is contained in:
@ -16,13 +16,16 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <IACore/Vector.hpp>
|
||||||
|
#include <IACore/Exception.hpp>
|
||||||
|
|
||||||
namespace ia
|
namespace ia
|
||||||
{
|
{
|
||||||
class IStreamReader
|
class IStreamReader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
STATIC SharedPtr<IStreamReader> Create(IN PCCHAR filePath);
|
STATIC RefPtr<IStreamReader> Create(IN PCCHAR filePath);
|
||||||
STATIC SharedPtr<IStreamReader> Create(IN Vector<UINT8> &&data);
|
STATIC RefPtr<IStreamReader> Create(IN Vector<UINT8> &&data);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PURE_VIRTUAL(BOOL CompareBytes(IN PCUINT8 data, IN INT64 length) CONST);
|
PURE_VIRTUAL(BOOL CompareBytes(IN PCUINT8 data, IN INT64 length) CONST);
|
||||||
@ -44,20 +47,20 @@ namespace ia
|
|||||||
class MemoryStreamReader : public IStreamReader
|
class MemoryStreamReader : public IStreamReader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
STATIC SharedPtr<IStreamReader> Create(IN Vector<UINT8> &&data);
|
STATIC INLINE RefPtr<IStreamReader> Create(IN Vector<UINT8> &&data);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BOOL CompareBytes(IN PCUINT8 data, IN INT64 length) CONST;
|
INLINE BOOL CompareBytes(IN PCUINT8 data, IN INT64 length) CONST;
|
||||||
|
|
||||||
Vector<UINT8> Read();
|
INLINE Vector<UINT8> Read();
|
||||||
Vector<UINT8> Read(IN INT64 size);
|
INLINE Vector<UINT8> Read(IN INT64 size);
|
||||||
VOID Read(IN INT64 size, IN PUINT8 buffer);
|
INLINE VOID Read(IN INT64 size, IN PUINT8 buffer);
|
||||||
Vector<UINT8> ReadAndInflate(IN INT64 size);
|
INLINE Vector<UINT8> ReadAndInflate(IN INT64 size);
|
||||||
|
|
||||||
UINT8 Read8();
|
INLINE UINT8 Read8();
|
||||||
UINT16 Read16();
|
INLINE UINT16 Read16();
|
||||||
UINT32 Read32();
|
INLINE UINT32 Read32();
|
||||||
UINT64 Read64();
|
INLINE UINT64 Read64();
|
||||||
|
|
||||||
VOID Skip(IN INT64 size)
|
VOID Skip(IN INT64 size)
|
||||||
{
|
{
|
||||||
@ -79,28 +82,28 @@ namespace ia
|
|||||||
Vector<UINT8> m_buffer;
|
Vector<UINT8> m_buffer;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MemoryStreamReader(IN Vector<UINT8> &&data);
|
INLINE MemoryStreamReader(IN Vector<UINT8> &&data);
|
||||||
};
|
};
|
||||||
|
|
||||||
class FileStreamReader : public IStreamReader
|
class FileStreamReader : public IStreamReader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
STATIC SharedPtr<IStreamReader> Create(IN PCCHAR filePath);
|
STATIC INLINE RefPtr<IStreamReader> Create(IN PCCHAR filePath);
|
||||||
|
|
||||||
~FileStreamReader();
|
INLINE ~FileStreamReader();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BOOL CompareBytes(IN PCUINT8 data, IN INT64 length) CONST;
|
INLINE BOOL CompareBytes(IN PCUINT8 data, IN INT64 length) CONST;
|
||||||
|
|
||||||
Vector<UINT8> Read();
|
INLINE Vector<UINT8> Read();
|
||||||
Vector<UINT8> Read(IN INT64 size);
|
INLINE Vector<UINT8> Read(IN INT64 size);
|
||||||
VOID Read(IN INT64 size, IN PUINT8 buffer);
|
INLINE VOID Read(IN INT64 size, IN PUINT8 buffer);
|
||||||
Vector<UINT8> ReadAndInflate(IN INT64 size);
|
INLINE Vector<UINT8> ReadAndInflate(IN INT64 size);
|
||||||
|
|
||||||
UINT8 Read8();
|
INLINE UINT8 Read8();
|
||||||
UINT16 Read16();
|
INLINE UINT16 Read16();
|
||||||
UINT32 Read32();
|
INLINE UINT32 Read32();
|
||||||
UINT64 Read64();
|
INLINE UINT64 Read64();
|
||||||
|
|
||||||
VOID Skip(IN INT64 size)
|
VOID Skip(IN INT64 size)
|
||||||
{
|
{
|
||||||
@ -121,15 +124,15 @@ namespace ia
|
|||||||
FILE *m_filePtr{};
|
FILE *m_filePtr{};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
FileStreamReader(IN PCCHAR filePath);
|
INLINE FileStreamReader(IN PCCHAR filePath);
|
||||||
};
|
};
|
||||||
|
|
||||||
SharedPtr<IStreamReader> IStreamReader::Create(IN PCCHAR filePath)
|
INLINE RefPtr<IStreamReader> IStreamReader::Create(IN PCCHAR filePath)
|
||||||
{
|
{
|
||||||
return FileStreamReader::Create(filePath);
|
return FileStreamReader::Create(filePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedPtr<IStreamReader> IStreamReader::Create(IN Vector<UINT8> &&data)
|
INLINE RefPtr<IStreamReader> IStreamReader::Create(IN Vector<UINT8> &&data)
|
||||||
{
|
{
|
||||||
return MemoryStreamReader::Create(std::move(data));
|
return MemoryStreamReader::Create(std::move(data));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
namespace ia
|
namespace ia
|
||||||
{
|
{
|
||||||
SharedPtr<IStreamReader> MemoryStreamReader::Create(IN Vector<UINT8> &&data)
|
RefPtr<IStreamReader> MemoryStreamReader::Create(IN Vector<UINT8> &&data)
|
||||||
{
|
{
|
||||||
struct make_shared_enabler : public MemoryStreamReader
|
struct make_shared_enabler : public MemoryStreamReader
|
||||||
{
|
{
|
||||||
@ -39,7 +39,7 @@ namespace ia
|
|||||||
|
|
||||||
BOOL MemoryStreamReader::CompareBytes(IN PCUINT8 data, IN INT64 length) const
|
BOOL MemoryStreamReader::CompareBytes(IN PCUINT8 data, IN INT64 length) const
|
||||||
{
|
{
|
||||||
DXF_ASSERT((m_cursor + length) <= m_buffer.size());
|
IA_RELEASE_ASSERT((m_cursor + length) <= m_buffer.size());
|
||||||
return !memcmp(&m_buffer[m_cursor], data, length);
|
return !memcmp(&m_buffer[m_cursor], data, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,26 +61,20 @@ namespace ia
|
|||||||
|
|
||||||
VOID MemoryStreamReader::Read(IN INT64 size, IN PUINT8 buffer)
|
VOID MemoryStreamReader::Read(IN INT64 size, IN PUINT8 buffer)
|
||||||
{
|
{
|
||||||
DXF_ASSERT((m_cursor + size) <= m_buffer.size());
|
IA_RELEASE_ASSERT((m_cursor + size) <= m_buffer.size());
|
||||||
memcpy_s(buffer, size, &m_buffer[m_cursor], size);
|
memcpy_s(buffer, size, &m_buffer[m_cursor], size);
|
||||||
m_cursor += size;
|
m_cursor += size;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<UINT8> MemoryStreamReader::ReadAndInflate(IN INT64 size)
|
|
||||||
{
|
|
||||||
const auto d = Read(size);
|
|
||||||
return Inflate(d.data(), d.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
UINT8 MemoryStreamReader::Read8()
|
UINT8 MemoryStreamReader::Read8()
|
||||||
{
|
{
|
||||||
DXF_ASSERT((m_cursor + 1) <= m_buffer.size());
|
IA_RELEASE_ASSERT((m_cursor + 1) <= m_buffer.size());
|
||||||
return m_buffer[m_cursor++];
|
return m_buffer[m_cursor++];
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT16 MemoryStreamReader::Read16()
|
UINT16 MemoryStreamReader::Read16()
|
||||||
{
|
{
|
||||||
DXF_ASSERT((m_cursor + 2) <= m_buffer.size());
|
IA_RELEASE_ASSERT((m_cursor + 2) <= m_buffer.size());
|
||||||
const auto r = *reinterpret_cast<UINT16 *>(&m_buffer[m_cursor]);
|
const auto r = *reinterpret_cast<UINT16 *>(&m_buffer[m_cursor]);
|
||||||
m_cursor += 2;
|
m_cursor += 2;
|
||||||
return r;
|
return r;
|
||||||
@ -88,7 +82,7 @@ namespace ia
|
|||||||
|
|
||||||
UINT32 MemoryStreamReader::Read32()
|
UINT32 MemoryStreamReader::Read32()
|
||||||
{
|
{
|
||||||
DXF_ASSERT((m_cursor + 4) <= m_buffer.size());
|
IA_RELEASE_ASSERT((m_cursor + 4) <= m_buffer.size());
|
||||||
const auto r = *reinterpret_cast<UINT32 *>(&m_buffer[m_cursor]);
|
const auto r = *reinterpret_cast<UINT32 *>(&m_buffer[m_cursor]);
|
||||||
m_cursor += 4;
|
m_cursor += 4;
|
||||||
return r;
|
return r;
|
||||||
@ -96,7 +90,7 @@ namespace ia
|
|||||||
|
|
||||||
UINT64 MemoryStreamReader::Read64()
|
UINT64 MemoryStreamReader::Read64()
|
||||||
{
|
{
|
||||||
DXF_ASSERT((m_cursor + 8) <= m_buffer.size());
|
IA_RELEASE_ASSERT((m_cursor + 8) <= m_buffer.size());
|
||||||
const auto r = *reinterpret_cast<UINT64 *>(&m_buffer[m_cursor]);
|
const auto r = *reinterpret_cast<UINT64 *>(&m_buffer[m_cursor]);
|
||||||
m_cursor += 8;
|
m_cursor += 8;
|
||||||
return r;
|
return r;
|
||||||
@ -105,7 +99,7 @@ namespace ia
|
|||||||
|
|
||||||
namespace ia
|
namespace ia
|
||||||
{
|
{
|
||||||
SharedPtr<IStreamReader> FileStreamReader::Create(IN PCCHAR filePath)
|
RefPtr<IStreamReader> FileStreamReader::Create(IN PCCHAR filePath)
|
||||||
{
|
{
|
||||||
struct make_shared_enabler : public FileStreamReader
|
struct make_shared_enabler : public FileStreamReader
|
||||||
{
|
{
|
||||||
@ -121,7 +115,7 @@ namespace ia
|
|||||||
{
|
{
|
||||||
fopen_s(&m_filePtr, filePath, "rb");
|
fopen_s(&m_filePtr, filePath, "rb");
|
||||||
if (!m_filePtr)
|
if (!m_filePtr)
|
||||||
throw RuntimeError(BuildString("No such file or directory: ", filePath));
|
THROW_FILE_OPEN_READ(filePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
FileStreamReader ::~FileStreamReader()
|
FileStreamReader ::~FileStreamReader()
|
||||||
@ -132,78 +126,71 @@ namespace ia
|
|||||||
|
|
||||||
BOOL FileStreamReader::CompareBytes(IN PCUINT8 data, IN INT64 length) CONST
|
BOOL FileStreamReader::CompareBytes(IN PCUINT8 data, IN INT64 length) CONST
|
||||||
{
|
{
|
||||||
DXF_RELEASE_ASSERT(m_filePtr);
|
IA_RELEASE_ASSERT(m_filePtr);
|
||||||
STATIC Vector<UINT8> TmpBuffer;
|
STATIC Vector<UINT8> TmpBuffer;
|
||||||
if (TmpBuffer.size() < length)
|
if (TmpBuffer.size() < length)
|
||||||
TmpBuffer.resize(length);
|
TmpBuffer.resize(length);
|
||||||
DXF_RELEASE_ASSERT(fread(TmpBuffer.data(), 1, length, m_filePtr) == length);
|
IA_RELEASE_ASSERT(fread(TmpBuffer.data(), 1, length, m_filePtr) == length);
|
||||||
return !memcmp(TmpBuffer.data(), data, length);
|
return !memcmp(TmpBuffer.data(), data, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<UINT8> FileStreamReader::Read()
|
Vector<UINT8> FileStreamReader::Read()
|
||||||
{
|
{
|
||||||
DXF_RELEASE_ASSERT(m_filePtr);
|
IA_RELEASE_ASSERT(m_filePtr);
|
||||||
Vector<UINT8> result;
|
Vector<UINT8> result;
|
||||||
const auto s = ftell(m_filePtr);
|
const auto s = ftell(m_filePtr);
|
||||||
fseek(m_filePtr, 0, SEEK_END);
|
fseek(m_filePtr, 0, SEEK_END);
|
||||||
const auto e = ftell(m_filePtr);
|
const auto e = ftell(m_filePtr);
|
||||||
fseek(m_filePtr, s, SEEK_SET);
|
fseek(m_filePtr, s, SEEK_SET);
|
||||||
result.resize(e - s);
|
result.resize(e - s);
|
||||||
DXF_RELEASE_ASSERT(fread(result.data(), 1, result.size(), m_filePtr) == result.size());
|
IA_RELEASE_ASSERT(fread(result.data(), 1, result.size(), m_filePtr) == result.size());
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<UINT8> FileStreamReader::Read(IN INT64 size)
|
Vector<UINT8> FileStreamReader::Read(IN INT64 size)
|
||||||
{
|
{
|
||||||
DXF_RELEASE_ASSERT(m_filePtr);
|
IA_RELEASE_ASSERT(m_filePtr);
|
||||||
Vector<UINT8> result;
|
Vector<UINT8> result;
|
||||||
result.resize(size);
|
result.resize(size);
|
||||||
DXF_RELEASE_ASSERT(fread(result.data(), 1, size, m_filePtr) == size);
|
IA_RELEASE_ASSERT(fread(result.data(), 1, size, m_filePtr) == size);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID FileStreamReader::Read(IN INT64 size, IN PUINT8 buffer)
|
VOID FileStreamReader::Read(IN INT64 size, IN PUINT8 buffer)
|
||||||
{
|
{
|
||||||
DXF_RELEASE_ASSERT(m_filePtr);
|
IA_RELEASE_ASSERT(m_filePtr);
|
||||||
DXF_RELEASE_ASSERT(fread(buffer, 1, size, m_filePtr) == size);
|
IA_RELEASE_ASSERT(fread(buffer, 1, size, m_filePtr) == size);
|
||||||
}
|
|
||||||
|
|
||||||
Vector<UINT8> FileStreamReader::ReadAndInflate(IN INT64 size)
|
|
||||||
{
|
|
||||||
DXF_RELEASE_ASSERT(m_filePtr);
|
|
||||||
const auto d = Read(size);
|
|
||||||
return Inflate(d.data(), d.size());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT8 FileStreamReader::Read8()
|
UINT8 FileStreamReader::Read8()
|
||||||
{
|
{
|
||||||
DXF_RELEASE_ASSERT(m_filePtr);
|
IA_RELEASE_ASSERT(m_filePtr);
|
||||||
UINT8 result;
|
UINT8 result;
|
||||||
DXF_RELEASE_ASSERT(fread(&result, 1, 1, m_filePtr) == 1);
|
IA_RELEASE_ASSERT(fread(&result, 1, 1, m_filePtr) == 1);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT16 FileStreamReader::Read16()
|
UINT16 FileStreamReader::Read16()
|
||||||
{
|
{
|
||||||
DXF_RELEASE_ASSERT(m_filePtr);
|
IA_RELEASE_ASSERT(m_filePtr);
|
||||||
UINT16 result;
|
UINT16 result;
|
||||||
DXF_RELEASE_ASSERT(fread(&result, 2, 1, m_filePtr) == 1);
|
IA_RELEASE_ASSERT(fread(&result, 2, 1, m_filePtr) == 1);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT32 FileStreamReader::Read32()
|
UINT32 FileStreamReader::Read32()
|
||||||
{
|
{
|
||||||
DXF_RELEASE_ASSERT(m_filePtr);
|
IA_RELEASE_ASSERT(m_filePtr);
|
||||||
UINT32 result;
|
UINT32 result;
|
||||||
DXF_RELEASE_ASSERT(fread(&result, 4, 1, m_filePtr) == 1);
|
IA_RELEASE_ASSERT(fread(&result, 4, 1, m_filePtr) == 1);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT64 FileStreamReader::Read64()
|
UINT64 FileStreamReader::Read64()
|
||||||
{
|
{
|
||||||
DXF_RELEASE_ASSERT(m_filePtr);
|
IA_RELEASE_ASSERT(m_filePtr);
|
||||||
UINT64 result;
|
UINT64 result;
|
||||||
DXF_RELEASE_ASSERT(fread(&result, 8, 1, m_filePtr) == 1);
|
IA_RELEASE_ASSERT(fread(&result, 8, 1, m_filePtr) == 1);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
} // namespace ia
|
} // namespace ia
|
||||||
@ -38,6 +38,11 @@ namespace ia
|
|||||||
|
|
||||||
StringStream& operator<<(IN CONST String& v) { m_impl << v.c_str(); return *this; }
|
StringStream& operator<<(IN CONST String& v) { m_impl << v.c_str(); return *this; }
|
||||||
|
|
||||||
|
VOID clear()
|
||||||
|
{
|
||||||
|
m_impl.clear();
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::stringstream m_impl;
|
std::stringstream m_impl;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user