Ticket #1036: bugasert418.cpp

File bugasert418.cpp, 2.0 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
8struct I {
9 virtual void m() = 0;
10 template<class Archive> void serialize(Archive& ar, int) { }
11};
12
13struct J {
14 virtual void m() = 0;
15 template<class Archive> void serialize(Archive& ar, int) { }
16};
17
18struct D;
19
20struct C {
21 int v;
22 I* i;
23 J* j;
24 D* d;
25 template<class Archive> void serialize(Archive& ar, int) { ar & v
26 & i
27 & j
28 & d; }
29};
30
31struct D {
32 int v;
33 J* j;
34 C* c;
35 template<class Archive> void serialize(Archive& ar, int) { ar & v
36 & j
37 & c; }
38};
39
40struct E : C, I {
41 E(int) { i = this; }
42 void m() { }
43 template<class Archive> void serialize(Archive& ar, int)
44 { ar & boost::serialization::base_object<C>(*this)
45 & boost::serialization::base_object<I>(*this); }
46};
47
48struct A {
49 A(int foo) : e(foo) { }
50 void m();
51 int v;
52 E e;
53 template<class Archive> void serialize(Archive& ar, int) { ar & v
54 & e; }
55};
56
57struct B : J {
58 B(int) { d.j = this; }
59 void m() { }
60 int v;
61 D d;
62 template<class Archive> void serialize(Archive& ar, int)
63 { ar & boost::serialization::base_object<J>(*this)
64 & v
65 & d; }
66};
67
68struct T {
69 T(int foo) : a(foo), b(foo) {
70 a.e.j = &b;
71 a.e.d = &b.d;
72 b.d.c = &a.e;
73 }
74 A a;
75 B b;
76 template<class Archive>
77 void serialize(Archive& ar, int) { ar & a & b; }
78};
79
80template<class T>
81void store(const T& v) {
82 std::ofstream ofs("filename");
83 boost::archive::binary_oarchive oa(ofs);
84 oa << v;
85}
86
87int main(int, char**)
88{
89 T t(0);
90 store(t);
91 return 0;
92}
93