#include #include #include #include "usenetsearch/Database.h" #include "usenetsearch/UsenetClient.h" #include "usenetsearch/Serialize.h" namespace usenetsearch { SerializableFile& operator<<( SerializableFile& out, const std::vector& arr) { const std::uint64_t size = arr.size(); out << size; for (const auto value: arr) { out << value; } return out; } SerializableFile& operator>>( SerializableFile& in, std::vector& arr) { std::uint64_t size; in >> size; for (std::uint64_t n = 0; n != size; ++n) { std::uint64_t value; in >> value; arr.emplace_back(value); } return in; } SerializableFile& operator<<( SerializableFile& out, const ArticleEntry& obj) { const char preMagic[1]{24}; out.write(preMagic, sizeof(preMagic)); out << obj.searchString; out << obj.articleIDs; const char postMagic[1]{42}; out.write(postMagic, sizeof(postMagic)); return out; } SerializableFile& operator>>(SerializableFile& in, ArticleEntry& obj) { char preMagic[1]{}; in.read(preMagic, sizeof(preMagic)); if (preMagic[0] != 24) { throw SerializeException(EBADMSG, "Bad magic number in entry header."); } in >> obj.searchString; in >> obj.articleIDs; char postMagic[1]{}; in.read(postMagic, sizeof(postMagic)); if (postMagic[0] != 42) { throw SerializeException(EBADMSG, "Bad magic number in entry footer."); } return in; } SerializableFile& operator<<(SerializableFile& out, const std::string& str) { const std::uint64_t size = str.size(); out.write(reinterpret_cast(&size), sizeof(size)); out.write(reinterpret_cast(str.c_str()), size); return out; } SerializableFile& operator>>(SerializableFile& in, std::string& str) { std::uint64_t size{0}; in.read(reinterpret_cast(&size), sizeof(size)); char buf[size + 1]; in.read(buf, size); buf[size] = 0; str = buf; return in; } SerializableFile& operator<<(SerializableFile& out, const std::wstring& str) { const std::uint64_t size = str.size(); out.write(reinterpret_cast(&size), sizeof(size)); out.write( reinterpret_cast(str.c_str()), size * sizeof(wchar_t) ); return out; } SerializableFile& operator>>(SerializableFile& in, std::wstring& str) { std::uint64_t size{0}; in.read(reinterpret_cast(&size), sizeof(size)); wchar_t buf[size + 1]; in.read(reinterpret_cast(buf), size * sizeof(wchar_t)); buf[size] = 0; str = buf; return in; } SerializableFile& operator<<(SerializableFile& out, const NntpHeader& obj) { out.write( reinterpret_cast(&obj.articleID), sizeof(obj.articleID) ); out << obj.subject; return out; } SerializableFile& operator>>(SerializableFile& in, NntpHeader& obj) { in.read( reinterpret_cast(&obj.articleID), sizeof(obj.articleID) ); in >> obj.articleID; in >> obj.subject; return in; } SerializableFile& operator<<(SerializableFile& out, const NntpListEntry& obj) { out.write(reinterpret_cast(&obj.count), sizeof(obj.count)); out.write(reinterpret_cast(&obj.high), sizeof(obj.high)); out.write(reinterpret_cast(&obj.low), sizeof(obj.low)); out << obj.name; out << obj.status; return out; } SerializableFile& operator>>(SerializableFile& in, NntpListEntry& obj) { in.read(reinterpret_cast(&obj.count), sizeof(obj.count)); in.read(reinterpret_cast(&obj.high), sizeof(obj.high)); in.read(reinterpret_cast(&obj.low), sizeof(obj.low)); in >> obj.name; in >> obj.status; return in; } SerializableFile& operator<<(SerializableFile& out, const uint64_t& obj) { out.write(reinterpret_cast(&obj), sizeof(obj)); return out; } SerializableFile& operator>>(SerializableFile& in, uint64_t& obj) { in.read(reinterpret_cast(&obj), sizeof(obj)); return in; } } // namespace usenetsearch