123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- #ifndef LPJ_GUESS_ARCHIVE_H
- #define LPJ_GUESS_ARCHIVE_H
- #include <ostream>
- #include <istream>
- #include <vector>
- class ArchiveStream {
- public:
-
- virtual bool save() const = 0;
-
-
- virtual void transfer(char* s, std::streamsize n) = 0;
- };
- class ArchiveInStream : public ArchiveStream {
- public:
- ArchiveInStream(std::istream& strm);
- bool save() const;
- void transfer(char* s, std::streamsize n);
- private:
-
- std::istream& in;
- };
- class ArchiveOutStream : public ArchiveStream {
- public:
- ArchiveOutStream(std::ostream& strm);
- bool save() const;
- void transfer(char* s, std::streamsize n);
- private:
-
- std::ostream& out;
- };
- class Serializable {
- public:
-
- virtual void serialize(ArchiveStream& arch) = 0;
- };
- inline bool inheritsFromSerializable(...) {
- return false;
- }
- inline bool inheritsFromSerializable(const Serializable& s) {
- return true;
- }
- template<typename T>
- ArchiveStream& operator&(ArchiveStream& stream, T& data) {
- if (inheritsFromSerializable(data)) {
- ((Serializable&)data).serialize(stream);
- }
- else {
- stream.transfer((char*)&data, sizeof(data));
- }
- return stream;
- }
- template<typename T>
- ArchiveStream& operator&(ArchiveStream& stream, std::vector<T>& data) {
- if (stream.save()) {
- size_t size = data.size();
- stream & size;
- }
- else {
- size_t size;
- stream & size;
- data.resize(size);
- }
- for (size_t i = 0; i < data.size(); ++i) {
- stream & data[i];
- }
- return stream;
- }
- #endif
|