1 | #include <boost/archive/binary_oarchive.hpp>
|
---|
2 | #include <boost/archive/binary_iarchive.hpp>
|
---|
3 | #include <boost/serialization/split_member.hpp>
|
---|
4 | #include <boost/serialization/serialization.hpp>
|
---|
5 | #include <cstdio>
|
---|
6 | #include <fstream>
|
---|
7 |
|
---|
8 | template <class T>
|
---|
9 | struct Vector {
|
---|
10 | Vector() {}
|
---|
11 | Vector(int sz) : size(sz), data(new T[sz]) {}
|
---|
12 |
|
---|
13 | T& operator[](int i) { return data[i]; }
|
---|
14 |
|
---|
15 | template<class Archive>
|
---|
16 | void save(Archive& ar, int) {
|
---|
17 | }
|
---|
18 |
|
---|
19 | template<class Archive>
|
---|
20 | void save(Archive& ar, int) const {
|
---|
21 | ar & size;
|
---|
22 | for (int i = size; i-- > 0; ar & data[i]);
|
---|
23 | }
|
---|
24 |
|
---|
25 | template<class Archive>
|
---|
26 | void load(Archive& ar, int) {
|
---|
27 | ar & size;
|
---|
28 | data = new T[size];
|
---|
29 | for (int i = size; i-- > 0; ar & data[i]);
|
---|
30 | }
|
---|
31 |
|
---|
32 | template<class Archive>
|
---|
33 | void serialize(Archive& ar, int file_version) {
|
---|
34 | boost::serialization::split_member(ar, *this, file_version);
|
---|
35 | }
|
---|
36 |
|
---|
37 | int size;
|
---|
38 | T* data;
|
---|
39 | };
|
---|
40 |
|
---|
41 | struct Triggerable {
|
---|
42 | public:
|
---|
43 | virtual void trigger() = 0;
|
---|
44 | template<class Archive>
|
---|
45 | void serialize(Archive&, int) { }
|
---|
46 | };
|
---|
47 |
|
---|
48 | BOOST_IS_ABSTRACT(Triggerable);
|
---|
49 |
|
---|
50 | struct Event : Triggerable
|
---|
51 | {
|
---|
52 | Event() {}
|
---|
53 | void trigger() {}
|
---|
54 | template<class Archive>
|
---|
55 | void serialize(Archive& ar, int) {
|
---|
56 | ar & boost::serialization::base_object<Triggerable>(*this);
|
---|
57 | ar & a;
|
---|
58 | }
|
---|
59 | int a;
|
---|
60 | };
|
---|
61 |
|
---|
62 | struct Cell {
|
---|
63 | Cell() : e(0) {}
|
---|
64 | Event* e;
|
---|
65 | template<class Archive>
|
---|
66 | void serialize(Archive& ar, int) {
|
---|
67 | ar & e;
|
---|
68 | }
|
---|
69 | };
|
---|
70 |
|
---|
71 | struct EventQueue {
|
---|
72 | EventQueue() {}
|
---|
73 | EventQueue(int sz, bool full) : cells(sz), event(sz) {
|
---|
74 | for (int i = sz/2; i-- > 0; cells[2*i+1].e = cells[2*i].e = &event[i]);
|
---|
75 | }
|
---|
76 |
|
---|
77 | template<class Archive>
|
---|
78 | void serialize(Archive& ar, int) {
|
---|
79 | ar & cells & event ;
|
---|
80 | // ar & event & cells; // works fine
|
---|
81 | }
|
---|
82 |
|
---|
83 | Vector<Event> event;
|
---|
84 | Vector<Cell> cells;
|
---|
85 | };
|
---|
86 |
|
---|
87 | template<class T>
|
---|
88 | void store(const T& v) {
|
---|
89 | std::ofstream ofs("filename");
|
---|
90 | boost::archive::binary_oarchive oa(ofs);
|
---|
91 | oa << v;
|
---|
92 | }
|
---|
93 |
|
---|
94 | template<class T>
|
---|
95 | void restore(T& v) {
|
---|
96 | std::ifstream ifs("filename", std::ios::binary);
|
---|
97 | boost::archive::binary_iarchive ia(ifs);
|
---|
98 | ia >> v;
|
---|
99 | }
|
---|
100 |
|
---|
101 | int main(int argc, char**) {
|
---|
102 | EventQueue eq(5, argc > 1);
|
---|
103 | for (int i = 5; i-- > 0; printf("%d=%p\n",i,eq.cells[i].e)); fflush(stdout);
|
---|
104 | store(eq);
|
---|
105 | EventQueue neq;
|
---|
106 | restore(neq);
|
---|
107 | for (int i = 5; i-- > 0; printf("%d=%p\n",i,neq.cells[i].e)); fflush(stdout);
|
---|
108 | return 0;
|
---|
109 | }
|
---|
110 |
|
---|