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
9#if !defined(BOOST_DESCRIBE_CXX11)
10
11#include <boost/config/pragma_message.hpp>
12
13BOOST_PRAGMA_MESSAGE("Skipping test because C++11 is not available")
14int main() {}
15
16#else
17
18struct X
19{
20 static int m1;
21};
22
23int X::m1 = 1;
24
25BOOST_DESCRIBE_STRUCT(X, (), (m1))
26
27class Y
28{
29public:
30
31 int m1 = 1;
32 static int m2;
33
34private:
35
36 int m3 = 3;
37 static int m4;
38
39 BOOST_DESCRIBE_CLASS(Y, (), (m1, m2), (), (m3, m4))
40
41public:
42
43 using Pm = int Y::*;
44
45 static Pm pm3() noexcept
46 {
47 return &Y::m3;
48 }
49
50 static int * pm4() noexcept
51 {
52 return &m4;
53 }
54};
55
56int Y::m2 = 2;
57int Y::m4 = 4;
58
59#if !defined(BOOST_DESCRIBE_CXX14)
60
61#include <boost/config/pragma_message.hpp>
62
63BOOST_PRAGMA_MESSAGE("Skipping test because C++14 is not available")
64int main() {}
65
66#else
67
68#include <boost/mp11.hpp>
69
70int main()
71{
72 using namespace boost::describe;
73 using namespace boost::mp11;
74
75 {
76 using L = describe_members<X, mod_any_access>;
77
78 BOOST_TEST_EQ( mp_size<L>::value, 0 );
79 }
80
81 {
82 using L = describe_members<X, mod_any_access | mod_static>;
83
84 BOOST_TEST_EQ( mp_size<L>::value, 1 );
85
86 using D1 = mp_at_c<L, 0>;
87
88 BOOST_TEST( D1::pointer == &X::m1 );
89 BOOST_TEST_CSTR_EQ( D1::name, "m1" );
90 BOOST_TEST_EQ( D1::modifiers, mod_public | mod_static );
91 }
92
93 {
94 using L = describe_members<Y, mod_any_access>;
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 == &Y::m1 );
102 BOOST_TEST_CSTR_EQ( D1::name, "m1" );
103 BOOST_TEST_EQ( D1::modifiers, mod_public );
104
105 BOOST_TEST( D2::pointer == Y::pm3() );
106 BOOST_TEST_CSTR_EQ( D2::name, "m3" );
107 BOOST_TEST_EQ( D2::modifiers, mod_private );
108 }
109
110 {
111 using L = describe_members<Y, mod_any_access | mod_static>;
112
113 BOOST_TEST_EQ( mp_size<L>::value, 2 );
114
115 using D1 = mp_at_c<L, 0>;
116 using D2 = mp_at_c<L, 1>;
117
118 BOOST_TEST( D1::pointer == &Y::m2 );
119 BOOST_TEST_CSTR_EQ( D1::name, "m2" );
120 BOOST_TEST_EQ( D1::modifiers, mod_public | mod_static );
121
122 BOOST_TEST( D2::pointer == Y::pm4() );
123 BOOST_TEST_CSTR_EQ( D2::name, "m4" );
124 BOOST_TEST_EQ( D2::modifiers, mod_private | mod_static );
125 }
126
127 {
128 using L = describe_members<Y, mod_public>;
129
130 BOOST_TEST_EQ( mp_size<L>::value, 1 );
131
132 using D1 = mp_at_c<L, 0>;
133
134 BOOST_TEST( D1::pointer == &Y::m1 );
135 BOOST_TEST_CSTR_EQ( D1::name, "m1" );
136 BOOST_TEST_EQ( D1::modifiers, mod_public );
137 }
138
139 {
140 using L = describe_members<Y, mod_public | mod_static>;
141
142 BOOST_TEST_EQ( mp_size<L>::value, 1 );
143
144 using D1 = mp_at_c<L, 0>;
145
146 BOOST_TEST( D1::pointer == &Y::m2 );
147 BOOST_TEST_CSTR_EQ( D1::name, "m2" );
148 BOOST_TEST_EQ( D1::modifiers, mod_public | mod_static );
149 }
150
151 {
152 using L = describe_members<Y, mod_private>;
153
154 BOOST_TEST_EQ( mp_size<L>::value, 1 );
155
156 using D1 = mp_at_c<L, 0>;
157
158 BOOST_TEST( D1::pointer == Y::pm3() );
159 BOOST_TEST_CSTR_EQ( D1::name, "m3" );
160 BOOST_TEST_EQ( D1::modifiers, mod_private );
161 }
162
163 {
164 using L = describe_members<Y, mod_private | mod_static>;
165
166 BOOST_TEST_EQ( mp_size<L>::value, 1 );
167
168 using D1 = mp_at_c<L, 0>;
169
170 BOOST_TEST( D1::pointer == Y::pm4() );
171 BOOST_TEST_CSTR_EQ( D1::name, "m4" );
172 BOOST_TEST_EQ( D1::modifiers, mod_private | mod_static );
173 }
174
175 {
176 using L = describe_members<Y, mod_protected>;
177
178 BOOST_TEST_EQ( mp_size<L>::value, 0 );
179 }
180
181 {
182 using L = describe_members<Y, mod_protected | mod_static>;
183
184 BOOST_TEST_EQ( mp_size<L>::value, 0 );
185 }
186
187 return boost::report_errors();
188}
189
190#endif // !defined(BOOST_DESCRIBE_CXX14)
191
192#endif // !defined(BOOST_DESCRIBE_CXX11)
193

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