diff --git a/source/mijin/io/archive.hpp b/source/mijin/io/archive.hpp index a522ae9..af70f01 100644 --- a/source/mijin/io/archive.hpp +++ b/source/mijin/io/archive.hpp @@ -49,9 +49,20 @@ using Archive = ArchiveBase; using OwningArchive = ArchiveBase>; +template +struct PODWrapper +{ + TContent* content; +}; + +template +PODWrapper pod(TContent& content) MIJIN_NOEXCEPT +{ + return PODWrapper(&content); +} template requires (std::is_const_v) -Task<> c_serialize(ArchiveBase& archive, TValue& value) noexcept +Task<> c_serialize(ArchiveBase& archive, TValue& value) MIJIN_NOEXCEPT { if (archive.getMode() != ArchiveMode::WRITE) { @@ -63,7 +74,7 @@ Task<> c_serialize(ArchiveBase& archive, TValue& value) noexcept } template -Task<> c_serialize(ArchiveBase& archive, std::string& value) noexcept +Task<> c_serialize(ArchiveBase& archive, std::string& value) MIJIN_NOEXCEPT { if (archive.getError() != StreamError::SUCCESS) { @@ -81,7 +92,7 @@ Task<> c_serialize(ArchiveBase& archive, std::string& value) noexcept } template requires (!std::is_const_v && (std::is_arithmetic_v || std::is_enum_v)) -Task<> c_serialize(ArchiveBase& archive, TValue& value) noexcept +Task<> c_serialize(ArchiveBase& archive, TValue& value) MIJIN_NOEXCEPT { if (archive.getError() != StreamError::SUCCESS) { @@ -99,7 +110,7 @@ Task<> c_serialize(ArchiveBase& archive, TValue& value) noexcept } template -Task<> c_serialize(ArchiveBase& archive, std::vector& value) noexcept +Task<> c_serialize(ArchiveBase& archive, std::vector& value) MIJIN_NOEXCEPT { if (archive.getError() != StreamError::SUCCESS) { @@ -129,7 +140,7 @@ Task<> c_serialize(ArchiveBase& archive, std::vector -Task<> c_serialize(ArchiveBase archive, Optional& value) noexcept +Task<> c_serialize(ArchiveBase archive, Optional& value) MIJIN_NOEXCEPT { if (archive.getError() != StreamError::SUCCESS) { @@ -155,6 +166,32 @@ Task<> c_serialize(ArchiveBase archive, Optional& value) noe } } } + +template +Task<> c_serialize(ArchiveBase& archive, PODWrapper value) MIJIN_NOEXCEPT +{ + if (archive.getError() != StreamError::SUCCESS) + { + co_return; + } + if (archive.getMode() == ArchiveMode::READ) + { + if constexpr (std::is_const_v) + { + MIJIN_ERROR("Attempt to write to a const object."); + archive.setError(StreamError::IO_ERROR); + } + else + { + archive.setError(co_await archive.getStream().c_read(*value.content)); + } + } + else + { + archive.setError(co_await archive.getStream().c_write(*value.content)); + } + co_return; +} } // namespace mijin #endif // !defined(MIJIN_IO_ARCHIVE_HPP_INCLUDED)