1// Copyright 2021 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/detail/config.hpp>
6
7#if !defined(BOOST_DESCRIBE_CXX14)
8
9#include <boost/config/pragma_message.hpp>
10
11BOOST_PRAGMA_MESSAGE("Skipping test because C++14 is not available")
12int main() {}
13
14#else
15
16#include <boost/describe/detail/compute_base_modifiers.hpp>
17#include <boost/core/lightweight_test.hpp>
18#include <boost/core/lightweight_test_trait.hpp>
19
20struct X1
21{
22};
23
24struct X2
25{
26};
27
28struct X3
29{
30};
31
32struct V1
33{
34 V1(int);
35};
36
37struct V2
38{
39 V2(int);
40};
41
42struct V3
43{
44 V3(int);
45};
46
47struct Y: public X1, protected X2, private X3, public virtual V1, protected virtual V2, private virtual V3
48{
49};
50
51struct Z final: public X1, protected X2, private X3, public virtual V1, protected virtual V2, private virtual V3
52{
53};
54
55int main()
56{
57 using namespace boost::describe::detail;
58 using namespace boost::describe;
59
60 BOOST_TEST( (is_public_base_of<X1, Y>::value) );
61 BOOST_TEST( (!is_virtual_base_of<X1, Y>::value) );
62 BOOST_TEST_EQ( (compute_base_modifiers<Y, X1>()), mod_public );
63
64 BOOST_TEST( (!is_public_base_of<X2, Y>::value) );
65 BOOST_TEST( (is_protected_base_of<X2, Y>::value) );
66 BOOST_TEST( (!is_virtual_base_of<X2, Y>::value) );
67 BOOST_TEST_EQ( (compute_base_modifiers<Y, X2>()), mod_protected );
68
69 BOOST_TEST( (!is_public_base_of<X3, Y>::value) );
70 BOOST_TEST( (!is_protected_base_of<X3, Y>::value) );
71 BOOST_TEST( (!is_virtual_base_of<X3, Y>::value) );
72 BOOST_TEST_EQ( (compute_base_modifiers<Y, X3>()), mod_private );
73
74 BOOST_TEST( (is_public_base_of<V1, Y>::value) );
75 BOOST_TEST( (is_virtual_base_of<V1, Y>::value) );
76 BOOST_TEST_EQ( (compute_base_modifiers<Y, V1>()), mod_public | mod_virtual );
77
78 BOOST_TEST( (!is_public_base_of<V2, Y>::value) );
79 BOOST_TEST( (is_protected_base_of<V2, Y>::value) );
80 BOOST_TEST( (is_virtual_base_of<V2, Y>::value) );
81 BOOST_TEST_EQ( (compute_base_modifiers<Y, V2>()), mod_protected | mod_virtual );
82
83 BOOST_TEST( (!is_public_base_of<V3, Y>::value) );
84 BOOST_TEST( (!is_protected_base_of<V3, Y>::value) );
85 BOOST_TEST( (is_virtual_base_of<V3, Y>::value) );
86 BOOST_TEST_EQ( (compute_base_modifiers<Y, V3>()), mod_private | mod_virtual );
87
88 BOOST_TEST( (is_public_base_of<X1, Z>::value) );
89 BOOST_TEST( (!is_virtual_base_of<X1, Z>::value) );
90 BOOST_TEST_EQ( (compute_base_modifiers<Z, X1>()), mod_public );
91
92 BOOST_TEST( (!is_public_base_of<X2, Z>::value) );
93 BOOST_TEST( (!is_protected_base_of<X2, Z>::value) );
94 BOOST_TEST( (!is_virtual_base_of<X2, Z>::value) );
95 BOOST_TEST_EQ( (compute_base_modifiers<Z, X2>()), mod_private );
96
97 BOOST_TEST( (!is_public_base_of<X3, Z>::value) );
98 BOOST_TEST( (!is_protected_base_of<X3, Z>::value) );
99 BOOST_TEST( (!is_virtual_base_of<X3, Z>::value) );
100 BOOST_TEST_EQ( (compute_base_modifiers<Z, X3>()), mod_private );
101
102 BOOST_TEST( (is_public_base_of<V1, Z>::value) );
103 BOOST_TEST( (is_virtual_base_of<V1, Z>::value) );
104 BOOST_TEST_EQ( (compute_base_modifiers<Z, V1>()), mod_public | mod_virtual );
105
106 BOOST_TEST( (!is_public_base_of<V2, Z>::value) );
107 BOOST_TEST( (!is_protected_base_of<V2, Z>::value) );
108 BOOST_TEST( (is_virtual_base_of<V2, Z>::value) );
109 BOOST_TEST_EQ( (compute_base_modifiers<Z, V2>()), mod_private | mod_virtual );
110
111 BOOST_TEST( (!is_public_base_of<V3, Z>::value) );
112 BOOST_TEST( (!is_protected_base_of<V3, Z>::value) );
113 BOOST_TEST( (is_virtual_base_of<V3, Z>::value) );
114 BOOST_TEST_EQ( (compute_base_modifiers<Z, V3>()), mod_private | mod_virtual );
115
116 return boost::report_errors();
117}
118
119#endif // !defined(BOOST_DESCRIBE_CXX14)
120

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