#ifndef SERIALIZE_H_ #define SERIALIZE_H_ #include #include #include #include #include #include "adjacent-matrix.hpp" namespace qflow { template inline void Save(FILE* fp, const Eigen::Matrix& m) { int r = m.rows(), c = m.cols(); fwrite(&r, sizeof(int), 1, fp); fwrite(&c, sizeof(int), 1, fp); std::vector buffer(r * c); for (int i = 0; i < r; ++i) { for (int j = 0; j < c; ++j) { buffer[i * c + j] = m(i, j); } } fwrite(buffer.data(), sizeof(T), r * c, fp); } template inline void Read(FILE* fp, Eigen::Matrix& m) { int r, c; fread(&r, sizeof(int), 1, fp); fread(&c, sizeof(int), 1, fp); std::vector buffer(r * c); fread(buffer.data(), sizeof(T), r * c, fp); m.resize(r, c); for (int i = 0; i < r; ++i) { for (int j = 0; j < c; ++j) { m(i, j) = buffer[i * c + j]; } } } inline void Save(FILE* fp, const Link& p) { fwrite(&p, sizeof(Link), 1, fp); } inline void Read(FILE* fp, Link& p) { fread(&p, sizeof(Link), 1, fp); } inline void Save(FILE* fp, const TaggedLink& p) { fwrite(&p, sizeof(TaggedLink), 1, fp); } inline void Read(FILE* fp, TaggedLink& p) { fread(&p, sizeof(TaggedLink), 1, fp); } inline void Save(FILE* fp, double p) { fwrite(&p, sizeof(double), 1, fp); } inline void Read(FILE* fp, double& p) { fread(&p, sizeof(double), 1, fp); } inline void Save(FILE* fp, int p) { fwrite(&p, sizeof(int), 1, fp); } inline void Read(FILE* fp, int& p) { fread(&p, sizeof(int), 1, fp); } template inline void Save(FILE* fp, const std::pair& p) { fwrite(&p.first, sizeof(T), 1, fp); fwrite(&p.second, sizeof(F), 1, fp); } template inline void Read(FILE* fp, std::pair& p) { fread(&p.first, sizeof(T), 1, fp); fread(&p.second, sizeof(F), 1, fp); } template inline void Save(FILE* fp, const std::map& p) { int num = p.size(); fwrite(&num, sizeof(int), 1, fp); for (auto& s : p) { fwrite(&s, sizeof(s), 1, fp); } } template inline void Read(FILE* fp, std::map& p) { int num; p.clear(); fread(&num, sizeof(int), 1, fp); for (int i = 0; i < num; ++i) { std::pair m; fread(&m, sizeof(m), 1, fp); p.insert(m); } } template void Save(FILE* fp, const std::vector& p) { int num = p.size(); fwrite(&num, sizeof(int), 1, fp); for (auto& q : p) { Save(fp, q); } } template void Read(FILE* fp, std::vector& p) { int num; fread(&num, sizeof(int), 1, fp); p.resize(num); for (auto& q : p) { Read(fp, q); } } template void Save(FILE* fp, const std::set& p) { std::vector buffer; buffer.insert(buffer.end(), p.begin(), p.end()); Save(fp, buffer); } template void Read(FILE* fp, std::set& p) { std::vector buffer; Read(fp, buffer); p.clear(); for (auto& q : buffer) p.insert(q); } } // namespace qflow #endif