Ticket #1037: pointerconflict.cpp

File pointerconflict.cpp, 2.3 KB (added by anonymous, 15 years ago)
Line 
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
8template <class T>
9struct 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
41struct Triggerable {
42public:
43 virtual void trigger() = 0;
44 template<class Archive>
45 void serialize(Archive&, int) { }
46};
47
48BOOST_IS_ABSTRACT(Triggerable);
49
50struct 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
62struct Cell {
63 Cell() : e(0) {}
64 Event* e;
65 template<class Archive>
66 void serialize(Archive& ar, int) {
67 ar & e;
68 }
69};
70
71struct 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
87template<class T>
88void store(const T& v) {
89 std::ofstream ofs("filename");
90 boost::archive::binary_oarchive oa(ofs);
91 oa << v;
92}
93
94template<class T>
95void restore(T& v) {
96 std::ifstream ifs("filename", std::ios::binary);
97 boost::archive::binary_iarchive ia(ifs);
98 ia >> v;
99}
100
101int 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