#pragma once #include #include #include "CompoundFile.h" namespace StructuredStorage { class CompoundFileReaderWriter { public: CompoundFileReaderWriter(StructuredFile& file); template void Write(const T& value) { static_assert(std::is_trivially_copyable(), "T must be POD"); m_File.Write(&value, sizeof(value)); } template void Read(T& value) { static_assert(std::is_trivially_copyable(), "T must be POD"); m_File.Read(&value, sizeof(value)); } void Write(const std::wstring& value); void Read(std::wstring& value); void Write(const std::string& value); void Read(std::string& value); template void Write(const std::vector& vec) { auto count = static_cast(vec.size()); Write(count); if (std::is_pod::value) { m_File.Write(vec.data(), count * sizeof(T)); } else { for (const auto& item : vec) Write(item); } } template void Read(std::vector& vec) { uint32_t count; Read(count); if (count == 0) { vec.clear(); return; } vec.resize(count); if (std::is_pod::value) { m_File.Read(vec.data(), count * sizeof(T)); } else { for (uint32_t i = 0; i < count; ++i) { T value; Read(value); vec[i] = value; } } } template void Write(const std::pair& pair) { Write(pair.first); Write(pair.second); } template void Read(std::pair& pair) { Read(pair.first); Read(pair.second); } template void Write(const std::map& map) { Write(static_cast(map.size())); for (const auto& pair : map) Write(pair); } template void Read(std::map& map) { uint32_t count; Read(count); for (uint32_t i = 0; i < count; i++) { std::pair pair; Read(pair); map.insert(pair); } } private: StructuredFile& m_File; }; }