1// Copyright 2020 Peter Dimov
2// Distributed under the Boost Software License, Version 1.0.
3// https://www.boost.org/LICENSE_1_0.txt
4
5#include <boost/describe/members.hpp>
6#include <boost/describe/class.hpp>
7#include <boost/core/lightweight_test.hpp>
8
9class A1
10{
11public:
12
13 int m1;
14
15protected:
16
17 int m2;
18
19private:
20
21 int m3;
22
23 BOOST_DESCRIBE_CLASS(A1, (), (m1), (m2), (m3))
24};
25
26class A2
27{
28public:
29
30 int m1;
31
32protected:
33
34 int m2;
35
36private:
37
38 int m3;
39
40 BOOST_DESCRIBE_CLASS(A2, (), (m1), (m2), (m3))
41};
42
43class A3
44{
45public:
46
47 int m1;
48
49protected:
50
51 int m2;
52
53private:
54
55 int m3;
56
57 BOOST_DESCRIBE_CLASS(A3, (), (m1), (m2), (m3))
58};
59
60struct B: public A1, protected A2, private A3
61{
62public:
63
64 int m1;
65
66protected:
67
68 int m2;
69
70private:
71
72 int m3;
73
74 BOOST_DESCRIBE_CLASS(B, (A1, A2, A3), (m1), (m2), (m3))
75};
76
77#if !defined(BOOST_DESCRIBE_CXX14)
78
79#include <boost/config/pragma_message.hpp>
80
81BOOST_PRAGMA_MESSAGE("Skipping test because C++14 is not available")
82int main() {}
83
84#else
85
86#include <boost/mp11.hpp>
87
88int main()
89{
90 using namespace boost::describe;
91 using namespace boost::mp11;
92
93 {
94 using L = describe_members<B, mod_public | mod_inherited | mod_hidden>;
95
96 BOOST_TEST_EQ( mp_size<L>::value, 2 );
97
98 using D1 = mp_at_c<L, 0>;
99 using D2 = mp_at_c<L, 1>;
100
101 BOOST_TEST( D1::pointer == &B::A1::m1 );
102 BOOST_TEST_CSTR_EQ( D1::name, "m1" );
103 BOOST_TEST_EQ( D1::modifiers, mod_public | mod_inherited | mod_hidden );
104
105 BOOST_TEST( D2::pointer == &B::m1 );
106 BOOST_TEST_CSTR_EQ( D2::name, "m1" );
107 BOOST_TEST_EQ( D2::modifiers, mod_public );
108 }
109
110 {
111 using L = describe_members<B, mod_protected | mod_inherited | mod_hidden>;
112
113 BOOST_TEST_EQ( mp_size<L>::value, 4 );
114
115 using D1 = mp_at_c<L, 0>;
116 using D2 = mp_at_c<L, 1>;
117 using D3 = mp_at_c<L, 2>;
118 using D4 = mp_at_c<L, 3>;
119
120 // BOOST_TEST( D1::pointer == &B::A1::m2 );
121 BOOST_TEST_CSTR_EQ( D1::name, "m2" );
122 BOOST_TEST_EQ( D1::modifiers, mod_protected | mod_inherited | mod_hidden );
123
124 // BOOST_TEST( D2::pointer == &B::A2::m1 );
125 BOOST_TEST_CSTR_EQ( D2::name, "m1" );
126 BOOST_TEST_EQ( D2::modifiers, mod_protected | mod_inherited | mod_hidden );
127
128 // BOOST_TEST( D3::pointer == &B::A2::m2 );
129 BOOST_TEST_CSTR_EQ( D3::name, "m2" );
130 BOOST_TEST_EQ( D3::modifiers, mod_protected | mod_inherited | mod_hidden );
131
132 // BOOST_TEST( D4::pointer == &B::m2 );
133 BOOST_TEST_CSTR_EQ( D4::name, "m2" );
134 BOOST_TEST_EQ( D4::modifiers, mod_protected );
135 }
136
137 {
138 using L = describe_members<B, mod_private | mod_inherited | mod_hidden>;
139
140 BOOST_TEST_EQ( mp_size<L>::value, 6 );
141
142 using D1 = mp_at_c<L, 0>;
143 using D2 = mp_at_c<L, 1>;
144 using D3 = mp_at_c<L, 2>;
145 using D4 = mp_at_c<L, 3>;
146 using D5 = mp_at_c<L, 4>;
147 using D6 = mp_at_c<L, 5>;
148
149 // BOOST_TEST( D1::pointer == &B::A1::m3 );
150 BOOST_TEST_CSTR_EQ( D1::name, "m3" );
151 BOOST_TEST_EQ( D1::modifiers, mod_private | mod_inherited | mod_hidden );
152
153 // BOOST_TEST( D2::pointer == &B::A2::m3 );
154 BOOST_TEST_CSTR_EQ( D2::name, "m3" );
155 BOOST_TEST_EQ( D2::modifiers, mod_private | mod_inherited | mod_hidden );
156
157 // BOOST_TEST( D3::pointer == &B::A3::m1 );
158 BOOST_TEST_CSTR_EQ( D3::name, "m1" );
159 BOOST_TEST_EQ( D3::modifiers, mod_private | mod_inherited | mod_hidden );
160
161 // BOOST_TEST( D4::pointer == &B::A3::m2 );
162 BOOST_TEST_CSTR_EQ( D4::name, "m2" );
163 BOOST_TEST_EQ( D4::modifiers, mod_private | mod_inherited | mod_hidden );
164
165 // BOOST_TEST( D5::pointer == &B::A3::m3 );
166 BOOST_TEST_CSTR_EQ( D5::name, "m3" );
167 BOOST_TEST_EQ( D5::modifiers, mod_private | mod_inherited | mod_hidden );
168
169 // BOOST_TEST( D6::pointer == &B::m3 );
170 BOOST_TEST_CSTR_EQ( D6::name, "m3" );
171 BOOST_TEST_EQ( D6::modifiers, mod_private );
172 }
173
174 return boost::report_errors();
175}
176
177#endif // !defined(BOOST_DESCRIBE_CXX14)
178

source code of boost/libs/describe/test/members_test5.cpp